Не удается получить 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, когда вы используете внутренние часы ATMega168PA с частотой 8 МГц ? Какие числа нужно ввести в калькулятор?
- Какие переключатели я должен устанавливать? Я думал, что это были правильные.
- Что означает OCIE1A, не можете найти его в документации или учебнике, только в примере кода?
Вероятно, мне также следует добавить, что все, что я делаю, - это увеличиваю количество и отображаю количество в своем цикле.
ISR (TIMER1_COMPA_vect)
{
count++;
}
@Rick Dearman, 👍-1
Обсуждение1 ответ
В обычном режиме таймер отсчитывает от 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
- Установка timer3 в режиме CTC - конфликт с сервобиблиотекой
- Как измерить ультразвуковой датчик без импульсного метода?
- Проблема прерывания библиотеки MPU6050 Arduino Jeff Rowberg
- Arduino Mega TIMER1 интервал в одну секунду
- Таймеры, выводы ШИМ и цифровые выходы на Arduino Mega
- Точность синхронизации Arduino nano
- Мега: присоединение Interrupt на выводе 18/19/20/21 не работает
- Arduino Mega — включение режима CTC отключает таймер
Re “ _ Я пытался разобраться в этом с помощью этого учебника_”: В этом руководстве предлагается периодически сбрасывать таймер. Этого делать не следует: это верный способ пропустить галочки. Я предлагаю поискать лучший учебник. И затем, **это обязательно**, прочтите таблицу данных (только главу о таймере 1)., @Edgar Bonet
`TCR1B = (1<, @Gerben
Извините, я встречался с вами, когда редактировал вопрос. Я вставил прямо из кода., @Rick Dearman