|
|
  |
частота таймера, идет медленнее в 2 раза |
|
|
|
Jan 12 2014, 12:19
|
Группа: Новичок
Сообщений: 4
Регистрация: 12-01-14
Пользователь №: 80 003

|
Не могу понять почему у меня часы идут в 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; }
|
|
|
|
|
Jan 12 2014, 13:21
|
Участник

Группа: Участник
Сообщений: 52
Регистрация: 15-05-13
Пользователь №: 76 836

|
а что записано в CLKPR?
открыл даташит, увидел, что у атмеги 8 оказывается нет CLKPR, так что это предположение отпадает
|
|
|
|
|
Jan 12 2014, 13:57
|
Группа: Новичок
Сообщений: 4
Регистрация: 12-01-14
Пользователь №: 80 003

|
меня вот что тревожит, значения для OCR1A я хоть правильно посчитал? Если проблема где-то в другом месте, то просто подгоню под требуюемую частоту, а причину как-нибудь потом поищу.
Сообщение отредактировал spyphy - Jan 12 2014, 14:01
|
|
|
|
|
Jan 12 2014, 14:41
|
Участник

Группа: Участник
Сообщений: 52
Регистрация: 15-05-13
Пользователь №: 76 836

|
значение OCR1A посчитано правильно. Цитата(megajohn @ Jan 12 2014, 18:16)  не выбран режим CTC. Для этого нужно установить бит WGM12. и не нужно в прерывании обнулять TCNT это эквивалентно указанному коду- можно считать до OCR1A и сбрасывать таймер в режиме NORMAL, а можно в режиме CTC считать сразу до OCR1A, затем опять с нуля. Если бы частота отличалась не ровно в два раза, я бы предположил, что может вместе с TCNT1=0 нужно делать FOC1A=1
|
|
|
|
|
Jan 12 2014, 16:27
|
Группа: Новичок
Сообщений: 4
Регистрация: 12-01-14
Пользователь №: 80 003

|
Два раза это было на глаз, а реально так где-то 1.8055 (+- 0.001). Фьюзы проверил, вроде всё на месте (внешний кварц стоит).
|
|
|
|
|
Jan 12 2014, 17:21
|
Группа: Новичок
Сообщений: 4
Регистрация: 12-01-14
Пользователь №: 80 003

|
Цитата(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++; } Попробуй так Теперь работает. Спасибо Там собственно делал по примерам, что в инете лежат. И если б не захотел часы сделать, то разницы бы не заметил.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|