(+)
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено Уэф 13 апреля 2005 г. 14:32
В ответ на: А примера организации прерывания на IAR ASM не ни у кого. отправлено ВинниПух 13 апреля 2005 г. 14:05

Говорилиж напишите модуль на си и скомпилируйте.. впрочем если хочется все ручками
Обратите внимание на
ORG 64
`??INTVEC 64`:
JMP ISR_T1_Overflow
Файл получен именно тем способом что я говорил


NAME WaveInt

RSEG CSTACK:DATA:NOROOT(0)
RSEG RSTACK:DATA:NOROOT(0)

EXTERN ?Register_R15_is_global_regvar

PUBWEAK `??INTVEC 64`
PUBLIC ISR_T1_Overflow
PUBWEAK _A_OCR0
PUBWEAK __?EEARH
PUBWEAK __?EEARL
PUBWEAK __?EECR
PUBWEAK __?EEDR
PUBWEAK sys_event

EXTERN _A_x_SWa
EXTERN auc_SinParam

// J:\PORT_MOST\WaveInt.c
// 1 #include
// 2 #include "GlobVar.h"

ASEGN REGVAR_AN:DATA:ROOT,0fH
// unsigned char volatile __regvar sys_event
sys_event:
DS 1
// 3 extern __flash unsigned char auc_SinParam[];
// 4
// 5 extern struct
// 6 {
// 7 unsigned char x_SWa; // step width of high frequency
// 8 unsigned int i_CurSinValA; // position freq. A in LUT (extended format)
// 9 unsigned char x_SWb; // step width of low frequency
// 10 unsigned int i_CurSinValB; // position freq. B in LUT (extended format)
// 11 };
// 12 #pragma optimize=s
// 13 #pragma vector=TIMER0_OVF_vect

RSEG CODE:CODE:NOROOT(1)
// 14 __interrupt void ISR_T1_Overflow (void)
ISR_T1_Overflow:
// 15 {
ST -Y, R25
ST -Y, R24
ST -Y, R31
ST -Y, R30
ST -Y, R21
ST -Y, R20
ST -Y, R19
ST -Y, R18
ST -Y, R17
ST -Y, R16
IN R19, 0x3F
REQUIRE ?Register_R15_is_global_regvar
// 16 if((sys_event & (1< MOV R16, R15
SBRS R16, 0
RJMP ??ISR_T1_Overflow_0
// 17 {
// 18 unsigned int i_TmpSinValA; // position freq. A in LUT (actual position)
// 19 unsigned int i_TmpSinValB; // position freq. B in LUT (actual position)
// 20
// 21 sys_event&=~(1< CLT
BLD R15, 0
// 22
// 23 i_TmpSinValA = (char)(((i_CurSinValA+4) >> 3)&(0x007F));
LDI R30, LOW(_A_x_SWa)
LDI R31, (_A_x_SWa) >> 8
LDD R24, Z+1
LDD R25, Z+2
ADIW R25:R24, 4
LSR R25
ROR R24
LSR R25
ROR R24
LSR R25
ROR R24
ANDI R24, 0x7F
MOV R16, R24
LDI R17, 0
// 24 i_TmpSinValB = (char)(((i_CurSinValB+4) >> 3)&(0x007F));
LDD R24, Z+4
LDD R25, Z+5
ADIW R25:R24, 4
LSR R25
ROR R24
LSR R25
ROR R24
LSR R25
ROR R24
ANDI R24, 0x7F
// 25 i_CurSinValA += x_SWa;
LD R18, Z
LDD R20, Z+1
LDD R21, Z+2
ADD R20, R18
ADC R21, R17
STD Z+1, R20
STD Z+2, R21
// 26 i_CurSinValB += x_SWb;
LDD R18, Z+3
LDD R20, Z+4
LDD R21, Z+5
ADD R20, R18
ADC R21, R17
STD Z+4, R20
STD Z+5, R21
// 27
// 28 OCR0 = (auc_SinParam[i_TmpSinValA] + (auc_SinParam[i_TmpSinValB]-(auc_SinParam[i_TmpSinValB]>>2)));
LDI R30, LOW(auc_SinParam)
LDI R31, (auc_SinParam) >> 8
ADD R30, R24
ADC R31, R17
LPM R18, Z
LDI R30, LOW(auc_SinParam)
LDI R31, (auc_SinParam) >> 8
ADD R30, R16
ADC R31, R17
LPM R16, Z
ADD R16, R18
LSR R18
LSR R18
SUB R16, R18
OUT 0x31, R16
RJMP ??ISR_T1_Overflow_1
// 29 }
// 30 else sys_event|=(1<??ISR_T1_Overflow_0:
SET
BLD R15, 0
// 31
// 32
// 33 }
??ISR_T1_Overflow_1:
OUT 0x3F, R19
LD R16, Y+
LD R17, Y+
LD R18, Y+
LD R19, Y+
LD R20, Y+
LD R21, Y+
LD R30, Y+
LD R31, Y+
LD R24, Y+
LD R25, Y+
RETI

COMMON INTVEC:CODE:ROOT(1)
ORG 64
`??INTVEC 64`:
JMP ISR_T1_Overflow

ASEGN ABSOLUTE:DATA:NOROOT,051H
// union volatile __io _A_OCR0
_A_OCR0:
DS 1

ASEGN ABSOLUTE:DATA:NOROOT,01cH
__?EECR:

ASEGN ABSOLUTE:DATA:NOROOT,01dH
__?EEDR:

ASEGN ABSOLUTE:DATA:NOROOT,01eH
__?EEARL:

ASEGN ABSOLUTE:DATA:NOROOT,01fH
__?EEARH:

END

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru