Добрый день, Askold! You wrote to Vladimir Ivanov on Wed, 28 Jul 2004 02:26:39 +0000 (UTC):
AV> Vladimir Ivanov писал к All 27.07.2004:
VI>> Не смог разобраться, почему в данной версии не работают макросы
VI>> SREG_Bit7 = 0; VI>> SREG_Bit7 = 1;
VI>> а функции
VI>> __disable_interrupt(); VI>> __enable_interrupt();
VI>> работают корректно...
VI>> Другие регистры обрабатываются вышеуказанными макросами правильно. VI>> Проблемы только с SREG.
AV> А в чем проблема-то? У меня эти макросы компилируются в команды CLI и AV> SEI соответственно. Чего тебе еще-то для счастья надо?
ВОТ КУСОК ПРОГРАММЫ:
********************
********************
__C_task void main (void) { SREG_Bit7 = 0; //iauaa cai?auaiea i?a?uaaiee PORTB = 0x08; //eieoeaeecaoey ii?oia aaiaa/auaiaa DDRB = 0xFF; PORTD = 0xBF; DDRD = 0x40; MCUCR = 0x0E; //i?a?uaaiey INT0,INT1 ii o?iioo GIFR = ((1<<INTF1)+(1<<INTF0));//na?ineou ei?iua oeaae i?a?uaaiee INT0,INT1 TIFR = 0xEA; //na?ineou ei?iua oeaae i?a?uaaiee io oaeia?ia GIMSK = (1<<INT0)+(1<<INT1); //?ac?aoeou INT0,INT1 TIMSK = ((1<<TOIE1)+(1<<TOIE0)); //?ac?aoeou i?a?uaaiey ii ia?aiieiaie? oaeia?ia TCCR0 = T0PredDividerT; //ione oaeia?a 0 SREG_Bit7 = 1; //iauaa ?ac?aoaiea i?a?uaaiee /***************************************************************************
******/ #ifndef DEBUG { } #endif
#ifdef DEBUG { } #endif /***************************************************************************
******/ //iniiaiie ?aai÷ee oeee Work: CLRBIT(PORTB,HL); SETBIT(PORTD,LED); Delay(1000); SETBIT(PORTB,HL); CLRBIT(PORTD,LED); Delay(1000); goto Work; } /
***************************************************************************
******/
А ВОТ ЛИСТИНГ КОМПИЛЯТОРА:
**************************
**************************
\ In segment CODE, align 2, keep-with-next 14 __C_task void main (void) \ main: 15 { 16 SREG_Bit7 = 0; //iauaa cai?auaiea i?a?uaaiee 17 PORTB = 0x08; //eieoeaeecaoey ii?oia aaiaa/auaiaa \ 00000000 E008 LDI R16,8 \ 00000002 BB08 OUT 0x18,R16 18 DDRB = 0xFF; \ 00000004 EF0F LDI R16,255 \ 00000006 BB07 OUT 0x17,R16 19 PORTD = 0xBF; \ 00000008 EB0F LDI R16,191 \ 0000000A BB02 OUT 0x12,R16 20 DDRD = 0x40; \ 0000000C E400 LDI R16,64 \ 0000000E BB01 OUT 0x11,R16 21 MCUCR = 0x0E; //i?a?uaaiey INT0,INT1 ii o?iioo \ 00000010 E00E LDI R16,14 \ 00000012 BF05 OUT 0x35,R16 22 GIFR = ((1<<INTF1)+(1<<INTF0));//na?ineou ei?iua oeaae i?a?uaaiee INT0,INT1 \ 00000014 EC00 LDI R16,192 \ 00000016 BF0A OUT 0x3A,R16 23 TIFR = 0xEA; //na?ineou ei?iua oeaae i?a?uaaiee io oaeia?ia \ 00000018 EE0A LDI R16,234 \ 0000001A BF08 OUT 0x38,R16 24 GIMSK = (1<<INT0)+(1<<INT1); //?ac?aoeou INT0,INT1 \ 0000001C EC00 LDI R16,192 \ 0000001E BF0B OUT 0x3B,R16 25 TIMSK = ((1<<TOIE1)+(1<<TOIE0)); //?ac?aoeou i?a?uaaiey ii ia?aiieiaie? oaeia?ia \ 00000020 E802 LDI R16,130 \ 00000022 BF09 OUT 0x39,R16 26 TCCR0 = T0PredDividerT; //ione oaeia?a 0 \ 00000024 E002 LDI R16,2 \ 00000026 BF03 OUT 0x33,R16 27 SREG_Bit7 = 1; //iauaa ?ac?aoaiea i?a?uaaiee 28 /***************************************************************************
******/ 29 #ifndef DEBUG 30 { 31 } 32 #endif 33 34 #ifdef DEBUG 35 { 36 } 37 #endif 38 /
***************************************************************************
******/ 39 //iniiaiie ?aai÷ee oeee 40 Work: 41 CLRBIT(PORTB,HL); \ ??main_0: \ 00000028 98C3 CBI 0x18,0x03 42 SETBIT(PORTD,LED); \ 0000002A 9A96 SBI 0x12,0x06 43 Delay(1000); \ 0000002C E308 LDI R16,56 \ 0000002E E010 LDI R17,0 \ 00000030 .... LDI R30,DelayReg \ 00000032 8300 ST Z,R16 \ 00000034 8311 STD Z+1,R17 \ 00000036 .... RCALL WaitTmr 44 SETBIT(PORTB,HL); \ 00000038 9AC3 SBI 0x18,0x03 45 CLRBIT(PORTD,LED); \ 0000003A 9896 CBI 0x12,0x06 46 Delay(1000); \ 0000003C E308 LDI R16,56 \ 0000003E E010 LDI R17,0 \ 00000040 .... LDI R30,DelayReg \ 00000042 8300 ST Z,R16 \ 00000044 8311 STD Z+1,R17 \ 00000046 .... RCALL WaitTmr 47 goto Work; \ 00000048 CFEF RJMP ??main_0 48 }
\ In segment ABSOLUTE, at 0x31 \ union <unnamed> volatile __io _A_DDRD \ _A_DDRD: \ 00000000 DS 1
\ In segment ABSOLUTE, at 0x32 \ union <unnamed> volatile __io _A_PORTD \ _A_PORTD: \ 00000000 DS 1
\ In segment ABSOLUTE, at 0x37 \ union <unnamed> volatile __io _A_DDRB \ _A_DDRB: \ 00000000 DS 1
\ In segment ABSOLUTE, at 0x38 \ union <unnamed> volatile __io _A_PORTB \ _A_PORTB: \ 00000000 DS 1
\ In segment ABSOLUTE, at 0x53 \ union <unnamed> volatile __io _A_TCCR0 \ _A_TCCR0: \ 00000000 DS 1
\ In segment ABSOLUTE, at 0x55 \ union <unnamed> volatile __io _A_MCUCR \ _A_MCUCR: \ 00000000 DS 1
\ In segment ABSOLUTE, at 0x58 \ union <unnamed> volatile __io _A_TIFR \ _A_TIFR: \ 00000000 DS 1
\ In segment ABSOLUTE, at 0x59 \ union <unnamed> volatile __io _A_TIMSK \ _A_TIMSK: \ 00000000 DS 1
\ In segment ABSOLUTE, at 0x5a \ union <unnamed> volatile __io _A_GIFR \ _A_GIFR: \ 00000000 DS 1
\ In segment ABSOLUTE, at 0x5b \ union <unnamed> volatile __io _A_GIMSK \ _A_GIMSK: \ 00000000 DS 1
\ In segment ABSOLUTE, at 0x5f \ union <unnamed> volatile __io _A_SREG \ _A_SREG: \ 00000000 DS 1 49 /***************************************************************************
******/
Maximum stack usage in bytes:
Function CSTACK RSTACK -------- ------ ------ main 0 2 -> WaitTmr 0 2 -> WaitTmr 0 2
Segment part sizes:
Function/Label Bytes -------------- ----- main 74 _A_DDRD 1 _A_PORTD 1 _A_DDRB 1 _A_PORTB 1 _A_TCCR0 1 _A_MCUCR 1 _A_TIFR 1 _A_TIMSK 1 _A_GIFR 1 _A_GIMSK 1 _A_SREG 1
11 bytes in segment ABSOLUTE 74 bytes in segment CODE
74 bytes of CODE memory 0 bytes of DATA memory (+ 11 bytes shared)
Errors: none Warnings: none
***********************************************************************
***********************************************************************
Как видно общее разрешение прерываний не установлено (оба макроса не компилируются). Программа в реальном девайсе поэтому не работает.
Стоит макросы заменить на intrinsic функции и все проходит на ура и девайс работает. Причем заметил - если дописать несколько строчек С предложений то это приводит иногда к корректной компиляции макросов. Мистика?...