Задача: получить импульсы с частотой 5Гц.
Исходный материал: PIC16f628a
Таймер TMR0 применяется во многих программах и имеет следующие полезные опции: 8 битный таймер/счетчик Программируемый выбор внешнее/внутреннее тактирование По переполнению генерирует прерывание
В этом эксперименте пока что обойдемся функциями самого таймера без прерываний.
За опции таймера TMR0 отвечает регистр OPTION. Понять работу таймера помогает очень наглядная картинка из ресурса mikroe: А вот собственно биты регистра OPTION: RBPU — PORTB подтяжки
1 — выключены
0 — включены INTEDG — Прерывание по спадающему/возрастающему импульсу тактирования
1 — По возрастающему импульсу
0 — По спадающему импульсу T0CS — Режим таймер/счетчик
1 — Тактирование от внешнего источника через пин RA4.
0 — Таймер использует внутренний осциллятор (Fosc/4).
T0SE — TMR0 Срабатывание по спадающему/возрастающему импульсу тактирования
0 — Срабатывание по спадающему импульсу
1 — Срабатывание по возрастающему импульсу PSA — Подключение предделителя
1 -Предделитель подключен к сторожевому таймеру
0 — Предделитель подключен к таймеру
PS2, PS1, PS0 — Биты, которые определяют на сколько мы будем делить нашу частоту тактирования Теперь все что нужно знать у нас есть. Исходя из задачи нам нужно получить импульсы длиной 200 мс, от кварца мы получаем 4/4 = 1 МГц ~ 1 мкс. А значит за один прогон таймера мы можем получить максимум 256 мкс, маловато… Но ничего, введем переменную #include <htc.h> #define _XTAL_FREQ 4000000 __CONFIG(WDTDIS & UNPROTECT & MCLREN); unsigned char cnt = 0; unsigned char i = 0; unsigned char srb = 0; void main() { TRISB = 0b01111111; RB7 = 0; for (;;) { OPTION = 0b11010111; // считаем по 256 мкс for (i=1;i<4;i++) { // 192 мс TMR0 = 0; while (TMR0 < 250) { cnt++; } } OPTION = 0b11010100; // считаем по 32 мкс TMR0 = 0; cnt = 0; while (TMR0 < 250) {cnt++;} // 8 мс srb = !srb; RB7 = srb; } } В результате работы программы получаем такую симпатичную картинку: 25*8 = 200 мс
Источник: http://diymicro.ru/?p=56 |