Pippeytz писал(а):А зачем щитать прерывания по перполнению таймера от тактового генератора, если можно прицепить на щетные вывода щетчиков часовой кварц на ~32кгц , поставить коэф деления 128 , и ты получиш ровно 1 прерывание в секунду, дльаше наращиваеш переменные в нужном формате и запихиваеш их в EEPROM
Если вы отвечали предыдущему оратору, то не можно, поскольку у него тини2313, к счетным выходам которой нельзя просто так прицепить часовой кварц, нужно как минимум сделать генератор.
rush писал(а):Всеравно не получается Sad Частота у меня 4мгц. Делитель 1024. Получается: 4000000/1024=3906. И как мне это 3906 записать, если таймер восьмибитный, а 1024 это максимальный делитель ?
Один из выходов использовать timer1 - он 16-ти битный,
второй выход - в прерывании по переполнению timer1 декрементировать переменную, как только она будет равна 0, записывать в нее новое значение и выставлять флаг- секунда прошла.
Рассчет начального значения переменной 4 000 000 (тактовая частота)/(1024(делитель)*256(переполнение таймера))=15,258 поскольку значение не целое, то будет набегать довольно приличная погрешность
третий выход (для уменьшения погрешности) - использование режима сброса таймера по совпадению с регистром сравнения (Clear Tiner on Compare). Подобно второму способу организуем переменную счетчик, но не в прерывании по переполнению а в прерывании по совпадению таймера с регистром сравнения.
Методика расчета значения OCR0A (или OCR0B) - Нужно так выбрать делители чтобы при делении тактовой частоты получались целые числа
4 000 000 (тактовая частота)/(256(делитель) = 15625
Теперь нужно подобрать число, такое, чтобы при делени 15625 на него получалось бы целове число, второе условие - число должно быть не больше 255, и желательно не очень маленкое, ну например
125 - это будет значение, которое мы будем записывать в регистр OCR0A
Итак получаем значение декрементируемого счетчика, который нужно организовать в прерывании по совпадению таймера с регистром OCR0A
4 000 000 (тактовая частота)/(256(делитель)/125(Значение OCR0A)=125. Теперь в прерывании нужно сделать примерно так
код немного исправлен с момента первого редактирования.
Код: Выделить всё
...
if (--soft_presc==0){
soft_presc=125;
flag1sek=1; // выставить флаг что прошла секунда - обработать можно в лучше в майне, имо прерывание должно быть коротким
}
// хотя можно здесь увеличивать значения счетчиков секунд, минут и т.д.
...
к сожалению я плохо разбираюсь в C (надеюсь пока), поэтому не могу сказать какие квалификаторы нужны переменной soft_presc, но она должна сохраняться от прерывания к преныванию, т. е. по идее должна быть внешней, а значит объявленной до майн, переменная flag1sek должна быть с квалификатором volatile т. е. может изменяться непонятным для компилятора образом (в прерываниях). В общем пусть меня более знающие товарищи поправят