[an error occurred while processing this directive]
|
Какие в жопу volatile, extern, оптимизации, если не учитывать элементарной логики видимости переменных? Что за бред в функции Delay и в процедуре прерывания? И при чем тут компилятор, когда над собственно языком С делаются такие надругательства? "Я ху..ею, дорогая редакция!"
Вот код, каким он должен быть по уму, а не по понятиям. На всякий случай проверил в CV, после кода - куски листингов. Код для двух вариантов - программного таймера и аппаратного таймера, аппаратный выбирается закомментированием #define stimer:
#include "mega128.h"
#define stimer softtimer //Закомментировать для чисто аппаратного таймера
char foo;
#ifdef stimer
char softtimer;
#define mytimer softtimer
#else
#define mytimer TCNT0
#endif
void delay (char ticks)
{
foo=mytimer;
foo+=ticks;
while (foo < mytimer);
}
#ifdef stimer
interrupt [15] void timer0_overflow (void)
{
++softtimer;
}
#endif
void main (void)
{
delay(50);
}
Вот листинг для программного таймера (расширение аппаратного):
; 15 void delay (char ticks)
; 16 {
.CSEG
_delay:
; 17 foo=mytimer;
00007a 2c34 MOV R3,R4
; 18 foo+=ticks;
00007b 81e8 LD R30,Y
00007c 0e3e ADD R3,R30
; 19
; 20 while (foo < mytimer);
_0x3:
00007d 1434 CP R3,R4
00007e f3f0 BRLO _0x3
; 21 }
00007f 9621 ADIW R28,1
000080 9508 RET
; 22
; 23
; 24 #ifdef stimer
; 25 interrupt [15] void timer0_overflow (void)
; 26 {
_timer0_overflow:
000081 93ea ST -Y,R30
000082 b7ef IN R30,SREG
; 27 ++softtimer;
000083 9443 INC R4
; 28 }
000084 bfef OUT SREG,R30
000085 91e9 LD R30,Y+
000086 9518 RETI
; 29 #endif
; 30
; 31 void main (void)
; 32 {
_main:
; 33 delay(50);
000087 e3e2 LDI R30,LOW(50)
000088 93ea ST -Y,R30
000089 dff0 RCALL _delay
; 34 }
_0x6:
00008a cfff RJMP _0x6
А вот - для голого аппаратного таймера:
; 15 void delay (char ticks)
; 16 {
.CSEG
_delay:
; 17 foo=mytimer;
00007a b632 IN R3,50
; 18 foo+=ticks;
00007b 81e8 LD R30,Y
00007c 0e3e ADD R3,R30
; 19
; 20 while (foo < mytimer);
_0x3:
00007d b7e2 IN R30,0x32
00007e 163e CP R3,R30
00007f f3e8 BRLO _0x3
; 21 }
000080 9621 ADIW R28,1
000081 9508 RET
; 22
; 23
; 24 #ifdef stimer
; 25 interrupt [15] void timer0_overflow (void)
; 26 {
; 27 ++softtimer;
; 28 }
; 29 #endif
; 30
; 31 void main (void)
; 32 {
_main:
; 33 delay(50);
000082 e3e2 LDI R30,LOW(50)
000083 93ea ST -Y,R30
000084 dff5 RCALL _delay
; 34 }
_0x6:
000085 cfff RJMP _0x6
IARа у меня, правда, нет, но чудеса отменили постановлением Святой Инквизиции несколько веков назад