[an error occurred while processing this directive]
Господа, вы что - сбрендили все, кроме omen? Тут эмбеддеры или где?? ТАК ПЕСАТЬ НИЗЯ, КРОСАВЧЕГИ!
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

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

Отправлено =AVR= 16 сентября 2006 г. 19:04
В ответ на: Подсобите please IAR AVR (не переносится параметр в функцию).... отправлено Brdm 15 сентября 2006 г. 22:59

Какие в жопу 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а у меня, правда, нет, но чудеса отменили постановлением Святой Инквизиции несколько веков назад

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

Ответы


Отправка ответа
Имя (обязательно): 
Пароль: 
E-mail: 

Тема (обязательно):
Сообщение:

Ссылка на URL: 
Название ссылки: 
URL изображения: 


Rambler's Top100 Рейтинг@Mail.ru
Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание