Do you have a question? Post it now! No Registration Necessary
Subject
- Posted on
EWAVR v3.20A вопрос по компилятору
- 07-27-2004
- Vladimir Ivanov
July 27, 2004, 4:51 pm

Hello, All!
Не смог разобраться, почему в данной версии не работают макросы
SREG_Bit7 = 0;
SREG_Bit7 = 1;
а функции
__disable_interrupt();
__enable_interrupt();
работают корректно...
Другие регистры обрабатываются вышеуказанными макросами правильно. Проблемы
только с SREG.
Не смог разобраться, почему в данной версии не работают макросы
SREG_Bit7 = 0;
SREG_Bit7 = 1;
а функции
__disable_interrupt();
__enable_interrupt();
работают корректно...
Другие регистры обрабатываются вышеуказанными макросами правильно. Проблемы
только с SREG.
---
Best regards,
Vladimir Ivanov
Best regards,
Vladimir Ivanov

Re: EWAVR v3.20A вопрос по компилятору
Всем привет!
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.
А в чем проблема-то? У меня эти макросы компилируются в команды CLI и SEI
соответственно. Чего тебе еще-то для счастья надо?
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.
А в чем проблема-то? У меня эти макросы компилируются в команды CLI и SEI
соответственно. Чего тебе еще-то для счастья надо?
--
Аскольд Волков, Новосибирск. http://www.inp.nsk.su/~volkov /
Аскольд Волков, Новосибирск. http://www.inp.nsk.su/~volkov /

Re: EWAVR v3.20A вопрос по компилятору
Добрый день, 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 функции и все проходит на ура и девайс
работает.
Причем заметил - если дописать несколько строчек С предложений то это
приводит иногда к корректной компиляции макросов. Мистика?...
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 функции и все проходит на ура и девайс
работает.
Причем заметил - если дописать несколько строчек С предложений то это
приводит иногда к корректной компиляции макросов. Мистика?...
---
Best regards,
Vladimir Ivanov
Best regards,
Vladimir Ivanov

Re: EWAVR v3.20A вопрос по компилятору
Greetings, Vladimir!
Посмотрел я мессагу, посланную Vladimir Ivanov к All, и решил ответить:
VI> Hе смог разобраться, почему в данной версии не работают макросы
VI> SREG_Bit7 = 0;
VI> SREG_Bit7 = 1;
Я пользую 3.10A и заметил такую стpанность - подобное пpоисходит пpи уpовне
оптимизации HIGH
К пpимеpу:
struct byte3 { int loword; char hibyte };
byte3 Add_byte3_byte3(byte3 a, byte3 b)
{
a.loword+=b.loword;
if (SREG_Bit0) ++a.hibyte;
a.hibyte+=b.hibyte;
return(a)
}
Пpиходится пеpед функцией ставить #pragma optimize=3, иначе стpока с пpовеpкой
SREG игноpиpуется, как будто бы это условие всегда ложно.
C наилучшими пожеланиями
Ilja aka ИЛ-2 (ilja_vlaskin$mail.ru)
... Сижу, никого не трогаю, примус починяю :)
Посмотрел я мессагу, посланную Vladimir Ivanov к All, и решил ответить:
VI> Hе смог разобраться, почему в данной версии не работают макросы
VI> SREG_Bit7 = 0;
VI> SREG_Bit7 = 1;
Я пользую 3.10A и заметил такую стpанность - подобное пpоисходит пpи уpовне
оптимизации HIGH
К пpимеpу:
struct byte3 { int loword; char hibyte };
byte3 Add_byte3_byte3(byte3 a, byte3 b)
{
a.loword+=b.loword;
if (SREG_Bit0) ++a.hibyte;
a.hibyte+=b.hibyte;
return(a)
}
Пpиходится пеpед функцией ставить #pragma optimize=3, иначе стpока с пpовеpкой
SREG игноpиpуется, как будто бы это условие всегда ложно.
C наилучшими пожеланиями
Ilja aka ИЛ-2 (ilja_vlaskin$mail.ru)
... Сижу, никого не трогаю, примус починяю :)
Site Timeline
- » обработка валкодера
- — Next thread in » Microcontrollers (Russian)
-
- » [?] GSM-модем Siemens MC35
- — Previous thread in » Microcontrollers (Russian)
-
- » По моему это гениально
- — Newest thread in » Microcontrollers (Russian)
-
- » (PDF) Atlas of Upper Gastrointestinal and Hepato Surgery 2nd Ed by CLAVIEN
- — The site's Newest Thread. Posted in » Electronics (Polish)
-
- » (PDF) Aesthetic Surgery Techniques - A Case-Based Approach by James D. Fra...
- — The site's Last Updated Thread. Posted in » Embedded Programming
-