Таймер программирования 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
Другие вопросы по тегам