Помогите с таймером
- Сообщения: 42
- Зарегистрирован: Чт янв 22, 2009 12:16:55
Возможно ли реализовать таймер на тини13? Надо чтобы в еепром писалось время с момента включения контроллера в формате типа ЧЧ:ММ:СС. Нашел много исходников, но они на асме и под другие контроллеры. так и не смог разобраться так как асма не знаю
Может есть у кого нибудь примеры на С. Буду очень благодарен 
- Реклама
Алгоритм прост. Настраиваеш тайме чтобы тикал с частотой в одну секунду, потом от него начинаеш считать минуты, часы , дни и т.д. Создаёш в eeprom три переменные и записуеш сравниваемое значения, когда значения совпадают, зажигаеш светодиод к примеру.

- Сообщения: 42
- Зарегистрирован: Чт янв 22, 2009 12:16:55
Мяу-у-у-у-у
- Сообщения: 42
- Зарегистрирован: Чт янв 22, 2009 12:16:55
этот мануал неподходит. если я все правильно понял то clock value можно выставить любой. дальше надо поставить в "compare A" частоту выбранную в "clock value" в 16-ричном виде. и вот тут проблема. число у меня получилось F42, а написать туда можно только 2 символа. И как я понял тини будет выходить раз в секунду из спящего режима чтобы обработать прерывание по таймеру. мне бы этого не хотелось
можно как-нибудь подругому сделать?
- Реклама
Вот небольшой FAQ.
Настройка таймера.
У таймера есть счётчик "Prescaler" который делит тактовую частоту МК. Произвольное значение счётчика задать нельзя, есть только фиксированые: Fclk/8; Fclk/64; Fclk/256; Fclk/1024;
Если использовать таймер 0, то он может делить, максимум, на 256. Ели таймер1, то можно делить уже на 65536.
Пример настройки таймера для часов, при частоте МК 4мгц., и тикание с частотой 1раз в секунду.
Воспользуемся такими подщётами:
4 000 000 / 256 = 15625 Гц
Где:
4 000 000 - тактовая частота МК
256 - прескалер, взят из таблицы допустимых значений
15625 - конечное значение частоты прерывания
Конечное значение частоты надо подобрать так чтобы после подщётов выходтло целое число без десятичных, иначе будет большая погрешность.
Также надо загнать таймер в режим "Clear Timer on Compare Match (CTC) Mode" и в регистр сравнения
(Output Compare Register) прописать 15625. И некаких ошибок в сутки!
Код (писался для тини2313, думаю переписать не составит труда):
// установка режимов и прескалера
TCCR1A=0x00;
TCCR1B=0x0C;
// загрузка регистра сравнения
OCR1A=15625;
// разрешаем прерывания по совпадению с регистром сравнения
TIMSK=0x40;
Настройка таймера.
У таймера есть счётчик "Prescaler" который делит тактовую частоту МК. Произвольное значение счётчика задать нельзя, есть только фиксированые: Fclk/8; Fclk/64; Fclk/256; Fclk/1024;
Если использовать таймер 0, то он может делить, максимум, на 256. Ели таймер1, то можно делить уже на 65536.
Пример настройки таймера для часов, при частоте МК 4мгц., и тикание с частотой 1раз в секунду.
Воспользуемся такими подщётами:
4 000 000 / 256 = 15625 Гц
Где:
4 000 000 - тактовая частота МК
256 - прескалер, взят из таблицы допустимых значений
15625 - конечное значение частоты прерывания
Конечное значение частоты надо подобрать так чтобы после подщётов выходтло целое число без десятичных, иначе будет большая погрешность.
Также надо загнать таймер в режим "Clear Timer on Compare Match (CTC) Mode" и в регистр сравнения
(Output Compare Register) прописать 15625. И некаких ошибок в сутки!
Код (писался для тини2313, думаю переписать не составит труда):
// установка режимов и прескалера
TCCR1A=0x00;
TCCR1B=0x0C;
// загрузка регистра сравнения
OCR1A=15625;
// разрешаем прерывания по совпадению с регистром сравнения
TIMSK=0x40;

Я наверное покажусь наглым:) но можете показать расчет для кварца 11,0592МГц что бы тоже тикало 1 раз в секунду. таймер0 восьми битный. нужно что бы прерывание вызывались приблизительно 1 раз в секунду дальше я считать их количество умею. 
Я не Сашок!!!
Да что там считать ?!sachok писал(а):Я наверное покажусь наглым:) но можете показать расчет для кварца 11,0592МГц что бы тоже тикало 1 раз в секунду. таймер0 восьми битный. нужно что бы прерывание вызывались приблизительно 1 раз в секунду дальше я считать их количество умею.
11 059 200 / 256 = 43200
Если нечего не напутал, должно получиться типа того (для тини2313):
// Timer/Counter 0 initialization
// Clock value: 43,200 kHz
// Mode: CTC top=OCR0A
TCCR0A=0x02;
TCCR0B=0x04;
OCR0A=43200;
TIMSK=0x02;

- Сообщения: 459
- Зарегистрирован: Вс июн 01, 2008 12:16:38
Господа проверьте меня пожалуйста!!! Нужно настроить таймер0 (восьмибитный) так что бы от делал прерывание с частотой в 50Гц - 50раз в секунду. Тактовая частота контролера - 11,0592МГц используя предделитель на 1024 получаем частоту работы таймера - 10,8кГц. Я считал в ICCAVR и у меня вышло такое значение регистра - . Прошу Вас проверьте правильность моих и программных расчетов всё ли правильно.
Код: Выделить всё
TCNT0=0x28;Я не Сашок!!!
- Сообщения: 459
- Зарегистрирован: Вс июн 01, 2008 12:16:38
Расчеты правильные, но я бы рекомендовал Вам использовать режим CTC и записать в регстр сравнения число 0xD7.sachok писал(а):Господа проверьте меня пожалуйста!!! Нужно настроить таймер0 (восьмибитный) так что бы от делал прерывание с частотой в 50Гц - 50раз в секунду. Тактовая частота контролера - 11,0592МГц используя предделитель на 1024 получаем частоту работы таймера - 10,8кГц. Я считал в ICCAVR и у меня вышло такое значение регистра -. Прошу Вас проверьте правильность моих и программных расчетов всё ли правильно.Код: Выделить всё
TCNT0=0x28;
Ну там кажись ровненько выходит, а в общем мне супер точность не нужна это не часы:) СПАСИБО!!!
Я не Сашок!!!
- Сообщения: 42
- Зарегистрирован: Чт янв 22, 2009 12:16:55
А зачем щитать прерывания по перполнению таймера от тактового генератора, если можно прицепить на щетные вывода щетчиков часовой кварц на ~32кгц , поставить коэф деления 128 , и ты получиш ровно 1 прерывание в секунду, дльаше наращиваеш переменные в нужном формате и запихиваеш их в EEPROM
Полный пипеутз.
- Сообщения: 459
- Зарегистрирован: Вс июн 01, 2008 12:16:38
Если вы отвечали предыдущему оратору, то не можно, поскольку у него тини2313, к счетным выходам которой нельзя просто так прицепить часовой кварц, нужно как минимум сделать генератор.Pippeytz писал(а):А зачем щитать прерывания по перполнению таймера от тактового генератора, если можно прицепить на щетные вывода щетчиков часовой кварц на ~32кгц , поставить коэф деления 128 , и ты получиш ровно 1 прерывание в секунду, дльаше наращиваеш переменные в нужном формате и запихиваеш их в EEPROM
Один из выходов использовать timer1 - он 16-ти битный,rush писал(а):Всеравно не получается Sad Частота у меня 4мгц. Делитель 1024. Получается: 4000000/1024=3906. И как мне это 3906 записать, если таймер восьмибитный, а 1024 это максимальный делитель ?
второй выход - в прерывании по переполнению 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; // выставить флаг что прошла секунда - обработать можно в лучше в майне, имо прерывание должно быть коротким
}
// хотя можно здесь увеличивать значения счетчиков секунд, минут и т.д.
...- Сообщения: 42
- Зарегистрирован: Чт янв 22, 2009 12:16:55
- Сообщения: 39
- Зарегистрирован: Вт сен 02, 2008 18:17:29
Есть отличный on-line ресурс, который позволяет 2-3 "кликами" мышки получить необходимый для программирования таймера кусок код. С этого же сайта доступен AvrWiz - a little code generation wizard for Atmel-AVR. Причем, что мне особенно понравилось, так это то, что все это заточено под WinAVR.
- Сообщения: 459
- Зарегистрирован: Вс июн 01, 2008 12:16:38
Категорически против код-визардов, не добавляет понимания работы таймера и из-за этого появляются вопросы, подобные предыдущему, причем таких вопросов тьма.Bird55 писал(а):Есть отличный on-line ресурс, который позволяет 2-3 "кликами" мышки получить необходимый для программирования таймера кусок код. ...
- Сообщения: 459
- Зарегистрирован: Вс июн 01, 2008 12:16:38
Прошу у всех прощения, ошибочка вышла, в OCR0A нужно записывать не 125 а 124, формулу приведенную в процитированном посте нужно читать какsmac писал(а): Итак получаем значение декрементируемого счетчика, который нужно организовать в прерывании по совпадению таймера с регистром OCR0A
4 000 000 (тактовая частота)/(256(делитель)/125(Значение OCR0A)=125.
4 000 000 (тактовая частота)/(256(делитель)/125(Значение OCR0A +1)=125


