Не удается получить 1 секунду на таймере ATmega168

  TCCR1A = 0;
  TCCR1B = 0;
  OCR1B =  0xFF00;
  TCCR1A = (1<<WGM10) ;
  TCCR1B = (1<<CS12) | (1<<CS10);; //set the pre-scalar as 1024
  TIMSK1 = (1 << OCIE1A);

Это не приводит к 1-секундному таймеру, кажется, что это приводит к 0,5-секундному таймеру? Я рассчитал это, основываясь на том факте, что я использую внутренние часы 8 МГц на чипе.

Где я ошибаюсь?

РЕДАКТИРОВАТЬ: Хорошо, я действительно ничего не понимаю в таймерах, это первый раз, когда я их пробовал. Я попытался разобраться в этом с помощью этого урока: https://exploreembedded.com/wiki/AVR_Timer_programming Все примеры связаны с 16 МГц, и расчеты сбивают меня с толку из-за переключения между форматами, которых я не знаю. После долгих поисков в гугле я выясняю, что мне следует вставить в калькулятор ((8000000/1024)*1)-1) = 7811.5 (Хотя что я делаю с этим номером-загадка) Я думаю, что я должен вычесть это из 65536 или, возможно, какого-то другого случайно сгенерированного числа. Затем вы берете результат этого и превращаете его в шестнадцатеричный эквивалент названия бой-бэнда, например E17. Используйте множество стрелок, чтобы указать в сторону от вещей, которые выглядят как названия радиостанций, WGM10 (принося вам все хиты 80-х и 90-х годов).

Я прошу прощения за сарказм, я ничего не мог с собой поделать. Что мне действительно нужно знать, так это:

  1. Как на самом деле рассчитать 1-секундную задержку одного таймера 1, когда вы используете внутренние часы ATMega168PA с частотой 8 МГц ? Какие числа нужно ввести в калькулятор?
  2. Какие переключатели я должен устанавливать? Я думал, что это были правильные.
  3. Что означает OCIE1A, не можете найти его в документации или учебнике, только в примере кода?

Вероятно, мне также следует добавить, что все, что я делаю, - это увеличиваю количество и отображаю количество в своем цикле.

ISR (TIMER1_COMPA_vect)
{
  count++;
}

, 👍-1

Обсуждение

Re “ _ Я пытался разобраться в этом с помощью этого учебника_”: В этом руководстве предлагается периодически сбрасывать таймер. Этого делать не следует: это верный способ пропустить галочки. Я предлагаю поискать лучший учебник. И затем, **это обязательно**, прочтите таблицу данных (только главу о таймере 1)., @Edgar Bonet

`TCR1B = (1<, @Gerben

Извините, я встречался с вами, когда редактировал вопрос. Я вставил прямо из кода., @Rick Dearman


1 ответ


2

В обычном режиме таймер отсчитывает от 0 до 65535 (0xffff), а затем возвращается к нулю. Если для прескалера установлено значение 1024, то период равен 1024 × 65536 = 67108864 циклов процессора.

Если вы хотите контролировать период таймера, вам следует использовать не обычный режим, а режим CTC (для “очистить таймер при сопоставлении”). В этом режиме он отсчитывает от 0 до значения, сохраненного в OCR1A, а затем возвращается к нулю. При использовании того же прескалера период затем 1024 × (OCR1A + 1) Циклы процессора.

,

Я добавил строку: TCR1A= (1<, @Rick Dearman

@RickDearman: 1. Если вы выберете режим 12 (_BV(WGM12)|_BV(WGM13)), то ICR1 выберет ВЕРХНЮЮ часть числа. Используйте режим 4, если вы хотите, чтобы верх был OCR1A. 2. Биты "WGM12" и "WGM13" принадлежат TCR1B, а не TCR1A., @Edgar Bonet