Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: частота таймера
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
spyphy
Не могу понять почему у меня часы идут в 2 раза медленнее.
Atmega8. Стоит кварц 12 МГц. Нужно чтобы прерывание срабатывало через 1 сек. Но получается что только через 2 сек. Вот код
Код
      TCCR1A = 0x00;
      TCCR1B = (1<<CS12)|(0<<CS11)|(0<<CS10);   // делитель 256
      TIMSK  |= (1<<OCIE1A);
      OCR1AH = 183;    //  OCR1AH = 0xB7;
      OCR1AL = 27;      //  OCR1AL = 0x1B;

Код
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
   tm_sec++;
   TCNT1H=0;
   TCNT1L=0;
}
Игoрь
а что записано в CLKPR?

открыл даташит, увидел, что у атмеги 8 оказывается нет CLKPR, так что это предположение отпадает
spyphy
меня вот что тревожит, значения для OCR1A я хоть правильно посчитал? Если проблема где-то в другом месте, то просто подгоню под требуюемую частоту, а причину как-нибудь потом поищу.
megajohn
не выбран режим CTC. Для этого нужно установить бит WGM12.
и не нужно в прерывании обнулять TCNT
Игoрь
значение OCR1A посчитано правильно.

Цитата(megajohn @ Jan 12 2014, 18:16) *
не выбран режим CTC. Для этого нужно установить бит WGM12.
и не нужно в прерывании обнулять TCNT

это эквивалентно указанному коду- можно считать до OCR1A и сбрасывать таймер в режиме NORMAL, а можно в режиме CTC считать сразу до OCR1A, затем опять с нуля.
Если бы частота отличалась не ровно в два раза, я бы предположил, что может вместе с TCNT1=0 нужно делать FOC1A=1
rx3apf
Все равно, конечно, нельзя в прерывании обнулять таймер. Надо или CTC, либо OCR каждый раз переставлять вперед, не трогая таймер вообще. Константа задана правильно. А точно вдвое ? Может быть, в полтора ? Тогда возможен вариант, что тактируется от собственного RC, а не от кварца.
Палыч
Цитата(rx3apf @ Jan 12 2014, 19:31) *
Может быть, в полтора ? Тогда возможен вариант, что тактируется от собственного RC, а не от кварца.
В этом случае отличие было бы в 12 раз
spyphy
Два раза это было на глаз, а реально так где-то 1.8055 (+- 0.001).
Фьюзы проверил, вроде всё на месте (внешний кварц стоит).

ILYAUL
Код
TCCR1A = 0x00;
      TCCR1B =1<<WGM12|(1<<CS12)|(0<<CS11)|(0<<CS10);   // делитель 256
      TIMSK  |= (1<<OCIE1A);
      OCR1AH = 183;    //  OCR1AH = 0xB7;
      OCR1AL = 27;      //  OCR1AL = 0x1B;
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
   tm_sec++;
}
Попробуй так
spyphy
Цитата(ILYAUL @ Jan 12 2014, 19:40) *
Код
TCCR1A = 0x00;
      TCCR1B =1<<WGM12|(1<<CS12)|(0<<CS11)|(0<<CS10);   // делитель 256
      TIMSK  |= (1<<OCIE1A);
      OCR1AH = 183;    //  OCR1AH = 0xB7;
      OCR1AL = 27;      //  OCR1AL = 0x1B;
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
   tm_sec++;
}
Попробуй так


Теперь работает. Спасибо

Там собственно делал по примерам, что в инете лежат. И если б не захотел часы сделать, то разницы бы не заметил.
rx3apf
Цитата(Палыч @ Jan 12 2014, 20:07) *
В этом случае отличие было бы в 12 раз

А это уж как CKSEL поставить...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.