roboforum.ru

Технический форум по робототехнике.


Часы (глупый вопрос)

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

Часы (глупый вопрос)

Сообщение -= Александр =- » 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
}

Аватара пользователя
-= Александр =-
Мастер Самоделкин
 
Сообщения: 3678
Зарегистрирован: 11 окт 2004, 19:20
Откуда: Россия, СПб
прог. языки: C/C++, Python, asm
ФИО: Курмис Александр Андреевич

Сообщение wolf » 17 май 2006, 00:09

Часы и тому подобные вещи делают с использованием режима Clear Timer on Compare. Как раз для того, чтобы не перегружать счётчик самому.
wolf
 
Сообщения: 63
Зарегистрирован: 23 июл 2005, 00:39
Откуда: Казань

Сообщение gosu » 17 май 2006, 00:24

А ещё лучше DS1307 взять .. Пускай себе считает а проц своими делами занимается а когда ему время понадобится спросит.
gosu
 
Сообщения: 56
Зарегистрирован: 17 янв 2006, 10:16
Откуда: Москва

Сообщение -= Александр =- » 17 май 2006, 00:59

Не, внешний не катит, плата старая... В новом будет, а в этом вот приходится извращаться...  :oops:
Аватара пользователя
-= Александр =-
Мастер Самоделкин
 
Сообщения: 3678
Зарегистрирован: 11 окт 2004, 19:20
Откуда: Россия, СПб
прог. языки: C/C++, Python, asm
ФИО: Курмис Александр Андреевич

Сообщение 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 раз.
SS
 
Сообщения: 71
Зарегистрирован: 01 май 2006, 23:00
Откуда: Ukrain

Сообщение avr123.nm.ru » 24 июн 2006, 19:34

и НУЖНО в начало, чтоб счет был точным.
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

Сообщение wolf » 25 июн 2006, 00:02

Не нужно в начало. Нужно CTC использовать.
wolf
 
Сообщения: 63
Зарегистрирован: 23 июл 2005, 00:39
Откуда: Казань

Сообщение SS » 26 июн 2006, 14:00

Кстати нашел готовую библиотеку, поищи там:
http://electronix.ru/forum/index.php?showtopic=10934
SS
 
Сообщения: 71
Зарегистрирован: 01 май 2006, 23:00
Откуда: Ukrain

Сообщение -= Александр =- » 26 июн 2006, 23:31

Вопрос в общем-то давно снят... Но все равно пасибо, погляжу как умные люди делают...  :roll:
Аватара пользователя
-= Александр =-
Мастер Самоделкин
 
Сообщения: 3678
Зарегистрирован: 11 окт 2004, 19:20
Откуда: Россия, СПб
прог. языки: C/C++, Python, asm
ФИО: Курмис Александр Андреевич


Вернуться в Микроконтроллеры

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10