Сразу скажу - я новичок в программировании микроконтроллеров. Пишу на CodeVisionAVR.
Для моего проекта нужно использовать сторожевой таймер, во избежание некоторых непредвиденных ситуаций.
Так вот, этот код работает и по таймеру сбрасывает:
Код:
void main(void)
{
PortInit(); // Инициализацыия портов
lcd_init(16);
// Watchdog Timer initialization
// Watchdog Timer Prescaler: OSC/2048k ~2 сек
WDTCR=(0<<WDTOE) | (1<<WDE) | (1<<WDP2) | (1<<WDP1) | (1<<WDP0);
while (1)
{
}
}
если написать так, то таймер не срабатывает, так как есть
#asm("wdr"):
Код:
void main(void)
{
PortInit(); // Инициализацыия портов
lcd_init(16);
// Watchdog Timer initialization
// Watchdog Timer Prescaler: OSC/2048k ~2 сек
WDTCR=(0<<WDTOE) | (1<<WDE) | (1<<WDP2) | (1<<WDP1) | (1<<WDP0);
while (1)
{
#asm("wdr") // Сброс сторожевого таймера
}
}
А теперь самое интересное... В этом коде по таймеру не сбрасывается, хотя и
#asm("wdr") вообще нету:
Код:
void main(void)
{
char i;
char symb;
PortInit(); // Инициализацыия портов
lcd_init(16);
// Watchdog Timer initialization
// Watchdog Timer Prescaler: OSC/2048k ~2 сек
WDTCR=(0<<WDTOE) | (1<<WDE) | (1<<WDP2) | (1<<WDP1) | (1<<WDP0);
symb = ':';
lcd_gotoxy(0,0); //|
lcd_putsf(" ALARM SYSTEM "); //|
delay_ms(500); //|
for (i=0;i<=15;i++) //|
{ //|
lcd_gotoxy(i,1); //|
lcd_putchar(symb); //| Выводим анимацию символа ":"
delay_ms(10); //|
} //|
delay_ms(500); //|
lcd_clear(); //|
while (1)
{
// тут должна быть команда сброса сторожевого таймера
}
}
Какой бы я код ни писал дальше (в цикле while (1) {}) - естественно по таймеру не сбрасывает...
Помогите, пожалуйста, разобраться почему так происходит?
