Обычный таймер.

Обсуждаем контроллеры компании Atmel.
Ответить
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Самое интересное, что об этом уже тоже говорили. В той теме, где был выложен код изначально.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
Встал на лапы
Сообщения: 131
Зарегистрирован: Вс май 08, 2016 22:45:48

Сообщение sTRog »

А погрешность можно уменшить чем то, кроме предделителя?
Реклама
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Погрешность чего, таймера ? Она определяется погрешностью его тактовой частоты, а не предделителем.
Встал на лапы
Сообщения: 131
Зарегистрирован: Вс май 08, 2016 22:45:48

Сообщение sTRog »

Попробовал сделать таймер по сравнению.
Спойлер

Код: Выделить всё

ISR(TIM0_COMPA_vect)
{
	i++;

   if (i>=10) //period 1s
   {   
      Sec++;
	  i=0;
   }
}


int main(void) {

	PRR = (1<<PRADC); // shut down ADC

    TIMSK0 = (1<<OCIE0A);  // 
    TCCR0B = (1<<CS02) | (1<<CS00); // prescaler 1/1024
	OCR0A = 116;
  
   i=0; Sec=0;

   sei();
Но теперь вместо 10 сек - отсчитывает 21.5 сек, в чем ошибка?
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 3385
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

Тактовая частота МК какая? Относительно ее нужно высчитывать предделитель и число сравнения.
Реклама
Встал на лапы
Сообщения: 131
Зарегистрирован: Вс май 08, 2016 22:45:48

Сообщение sTRog »

Считал так
Частота 9600000Гц. Установлен делитель на 8, получаем 1200000
1200000/1024 = 1171,875 ГЦ/сек или 1,17 Гц/мс
1,17Гц*100=117Гц/100мс
Значит, если ставлю OCR0 = 116, то прерывание будет происходить каждые 100мс. При этом приращая переменную i++
если i>=10. Значит прошло 1000мс или 1 сек.
Вот так я рассуждал.
Реклама
akl
Друг Кота
Сообщения: 4463
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

1200000/1024=1'171,875Гц. Такое число должен отсчитать счетчик таймера за 1 секунду. 1'171,875/256=4,578, т.е. будет 4 переполнения + 147,875. Т.е. такой вариант не проходит, поэтому приходится вводить дополнительный счетчик на 10, чтобы отсчитать ~100мс. В итоге полученная секунда далека от идеала. Можно получить секундный интервал немного изменив условия. Например, задав число сравнения 250-1, предделитель таймера 256 и дополнительный счетчик. 9'600'000/256/250=150. Почему идет неправильный счет? Думаю, что не задан режим работы CTC. Для ATtiny13

Код: Выделить всё

TCCR0A = (1<<WGM01) 
Ответить

Вернуться в «AVR»