Таймер программирования 0 на PIC16F882 для значения больше максимального PRESCALER
Я использую PIC16F88X, который имеет внутренний тактовый период 200 нс, и я хочу запрограммировать TIMER0
сделать 4 измерения в секунду.
Согласно учебнику по программированию таймера 0 (стр. 10), я могу использовать PS0
, PS1
а также PS2
назначить TMR0 RATE
до 1:256, но это только увеличивает масштаб моего тактового периода до 51,2 микросекунды.
Существует также возможность запрограммировать начальное значение для TMR0
но я не думаю, что это повлияет на часы, которых я хочу достичь. Есть ли что-то на большой картинке, что мне не хватает?
2 ответа
Ожидается, что прескалер таймера не может охватить любой диапазон, который может пожелать пользователь. Чтобы достичь больших интервалов, вы должны добавить дополнительную логику в вашу процедуру прерывания таймера. По сути, вы должны добавить дополнительную переменную / счетчик, который вы должны увеличить, скажем, на 50us (вы настроите таймер от 51,2us до 50us, добавив начальное значение к TMR0
). Когда ваш счетчик достигнет 5000, вы захотите разрешение 1/4 с.
Надеюсь, поможет...
Глядя на лист спецификации ( http://ww1.microchip.com/downloads/en/DeviceDoc/41291D.pdf) стр. 76, мы видим, что таймер1, доступный на этом микроконтроллере, имеет 16 бит и имеет до 8 предварительных масштабировщиков. Мой собственный подход состоит в том, чтобы использовать timer1 с прескалером 8. Без заполнения значения вручную это дает:
<osc speed>/(4*<prescaller>*2^16)
5MHz/(4*8*2^16) = 2.38Hz
Чтобы получить ровно 4 Гц, вы можете заполнить счетчик на каждом опрокидывании до значения:
2^16-<osc speed>/(<desired speed>*4*<prescaller>)
2^16-5MHz/(4Hz*4*8) = 26474