Технический форум по робототехнике.
-= Александр =- » 16 май 2006, 23:51
Захотелось мне впихнуть в робота часы реального времени. Сделал таймер со срабатыванием раз в секунду. А теперь чешу репу:
Есть прерывание. Обнуление таймера надо проводить до выполнения кода или это обязательно делать в конце функции-обработчика? Но ведь если от прерывания до обнуления будет выполняться действие - часы будут отставать? :roll:
- Код: Выделить всё • Развернуть
void timer1_ovf_isr(void)
{
sec++;
if(sec==60){sec=0;min++;}
if(min==60){min=0;sec=0;hr++;}
if(hr==24){hr=0;min=0;sec=0;}
//Вот эти вот строчки можно в начало?
TCNT1H = 0xC2; //reload counter high value
TCNT1L = 0xF7; //reload counter low value
}
wolf » 17 май 2006, 00:09
Часы и тому подобные вещи делают с использованием режима Clear Timer on Compare. Как раз для того, чтобы не перегружать счётчик самому.
gosu » 17 май 2006, 00:24
А ещё лучше DS1307 взять .. Пускай себе считает а проц своими делами занимается а когда ему время понадобится спросит.
-= Александр =- » 17 май 2006, 00:59
Не, внешний не катит, плата старая... В новом будет, а в этом вот приходится извращаться... :oops:
SS » 24 июн 2006, 18:55
Я тебе советую, считать только секунды от 0 до 86399. А вычислять часы, минуты, секунды уже в обработчике отображения данных. Таким образом, будет уменьшена задержка, а соответственно и погрешность.
Код получиться такой:
- Код: Выделить всё • Развернуть
long int sec
void timer1_ovf_isr(void)
{
if (sec < 86399)
sec++;
else
sec=0;
//Вот эти вот строчки можно в начало?
TCNT1H = 0xC2; //reload counter high value
TCNT1L = 0xF7; //reload counter low value
}
Последний раз редактировалось
SS 26 июн 2006, 13:57, всего редактировалось 1 раз.
avr123.nm.ru » 24 июн 2006, 19:34
и НУЖНО в начало, чтоб счет был точным.
wolf » 25 июн 2006, 00:02
Не нужно в начало. Нужно CTC использовать.
-= Александр =- » 26 июн 2006, 23:31
Вопрос в общем-то давно снят... Но все равно пасибо, погляжу как умные люди делают... :roll: