Технический форум по робототехнике.
Tracer » 14 дек 2006, 14:39
Толи лыжи не едут толи Я ... :о)
Timer0 Mega8 WinAVR
МК влетает в прерывание по таймеру и сидит там
Где я торможу?
Вот кусок кода
...
unsigned int msDelay;
//Системный таймер (Timer0) 1мс для временных отсчетов задержки и тайм-аутов
void SysTimerInit(unsigned char tnum) //************ Timer Init
{
if(tnum==0)
{
TCCR0 = _BV(CS02); //Прескаллер = 64
TIMSK = _BV(TOIE0); //Прерывания от Timer0 разрешены
TCNT0 = 0xB8; //Загрузка начального значения
TCCR0 = 0x02; //Разрешить таймер
}
}
ISR(TIMER0_OVF_vect)//*********************** Timer INTERRUPT
{
TCNT0 = 0xB8; //Перегрузка счетчика для нового счета 1мс
if(msDelay) msDelay--;
if(rxTimeOut) rxTimeOut--;
}
//************************************************ DELAY
unsigned char Delay(unsigned int msD)
{
msDelay=msD;
while(msDelay){};
return(0);
}
avr123.nm.ru » 14 дек 2006, 14:55
посмотрите в VMLAB. vmlab.nm.ru
Tracer » 14 дек 2006, 14:59
avr123.nm.ru писал(а):посмотрите в VMLAB. vmlab.nm.ru
Вот и меня терзают смутные сомнения что Студия мне мозги парит
Прийдется ставить и разбираться с Лабой :о(
avr123.nm.ru » 14 дек 2006, 15:08
уверен - не пожалеете.
avr123.nm.ru » 14 дек 2006, 15:09
смотрите примеры которые идуn с прогой - там есть и с WinAVR и примеры курса тоже.
Tracer » 16 дек 2006, 03:39
РАЗОБРАЛСЯ :о)
"Ну блин ВЫ даете" (С) Генерал
Оказалось это ВСЕ издержки включенной оптимизации -Оs
в функции задержки происходило следующее
msDelay -> R24 R25
R24 сравнивался с 0
В прерывании происходило следующее
push R24 R25 - запомнить в стеке
R24-- Декремент
pop R24 R25 - достали из стека
IRET
с переходом на.. (нервных дальше прошу не читать :о))
R24 сравнивается с 0
Я в ШОКЕ
Отключил оптимизацию все стало на свои места
avr123.nm.ru » 16 дек 2006, 03:52
попробуй CVAVR
Tracer » 16 дек 2006, 19:35
А что в CVAVR нет своих прибамбасов.
Какая разнца на чем писать - идеальных компиляторов НЕТ.
И не будет :о)
Если уж сильно припрет напишу на АСМе
avr123.nm.ru » 16 дек 2006, 19:43
вот я и говорю - попробуйте.
avr123.nm.ru » 16 дек 2006, 19:44
копия.
Последний раз редактировалось
avr123.nm.ru 17 дек 2006, 02:45, всего редактировалось 1 раз.
Tracer » 17 дек 2006, 01:37
Ок обязательно попробую для сравнения
Спасибо за совет
aesok » 18 дек 2006, 01:56
Есть одно волшебое слово - volatile.
Прочтите avr-libc-user-manual FAQ#1 - My program doesn’t recognize a variable updated within an interrupt routine
Анатолий.
aesok » 18 дек 2006, 01:56
Есть одно волшебое слово - volatile.
Прочтите avr-libc-user-manual FAQ#1 - My program doesn’t recognize a variable updated within an interrupt routine
Анатолий.
Tracer » 18 дек 2006, 12:48
ПРОВЕРИЛ - ВСЕ РАБОТАЕТ
СПАСИБО за подсказку, действительно ВОЛШЕБНОЕ слово :о)
avr123.nm.ru » 18 дек 2006, 14:15