Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Микроконтроллеры PIC фирмы Microchip для начинающих выпуск №12


РАССЫЛКА Микроконтроллеры PIC фирмы Microchip для начинающих
Ведущий: Алексей (pont_a@mail.ru)


Доброго времени суток, дамы и господа!!

Продолжаем рассматривать периферию микроконтроллеров серии PIC18 на базе микроконтроллера PIC18F452! Сегодня будем рассматривать Таймер 0 (TMR0). 

Очень часто в программах приходится использовать различные задержки, таймауты и прочие временные параметры. Для их более удобной реализации используют таймеры, которые являются встроенными периферийными модулями микроконтроллеров. Открываем datasheet на наш микроконтроллер PIC18F452 и находим пункт: 10.0 TIMER0 MODULE. В этом пункте описан таймер 0. Мы видим, что здесь показаны назначения битов регистра управления, а также схемы организации таймера, как в 8-ми битном, так и в 16-ти битном режиме.
Основной регистр управления данного таймера T0CON. Рассмотрим назначение битов данного регистра:


№ бита

Название

Описание

7

TMR0ON

1 – включить таймер 0;
0 – остановить таймер 0;

6

T08BIT

1 – таймер 0 конфигурируется, как 8-ми битный таймер/счетчик;
0 – таймер 0 конфигурируется, как 16-ти битный таймер/счетчик;

5

T0CS

1 – таймер 0 инкрементируется импульсами, идущими с RA4/T0CKI;
0 – таймер 0 инкрементируется внутренними импульсами;

4

T0SE

1 – инкремент таймера 0 спадающим фронтом входа RA4/T0CKI;
0 – инкремент таймера 0 нарастающим фронтом входа RA4/T0CKI;

3

PSA

1 – прескалер (делитель частоты) таймера 0 отключен;
0 – прескалер включен, таймер 0 инкрементируется частотой деления;

2-0

T0PS2-0

3 бита, которые задают делитель входной частоты:
111 – частота делится на 256;
110 – частота делится на 128;
101 – частота делится на 64;
100 – частота делится на 32;
011 – частота делится на 16;
010 – частота делится на 8;
001 – частота делится на 4;
000 – частота делится на 2;

           
Значение  таймера 0 накапливается: в 8-ми битном режиме в регистре TMR0L, в 16-ти битном режиме – в регистрах TMR0H, TMR0L. Как мы видим, на 4-ый бит порта А наложена альтернативная функция – вход таймера 0 (T0CKI). Поэтому, если таймер 0 настроен на инкрементирование от внешнего генератора, то направление данного бита необходимо определить, как вход: TRISA.4=1.
Когда таймер 0 включен, он начинает инкрементироваться с каждым входным импульсом. Поэтому, внимание, чтобы точно отрабатывался временной промежуток, который Вы хотите запрограммировать, перед включением таймера 0 необходимо сбросить значения регистров TMR0H, TMR0L или только регистр TMR0L, если режим 8-ми битный!!! А также сбросить флаг прерывания в регистре INTCON (бит 2 – TMR0IF).
Также, рекомендую, сначала в регистр T0CON загрузить все настройки и таймер 0 должен быть остановлен, только после этого отдельной командой (установкой бита TMR0ON) запустить таймер 0 в работу!
Как только значение таймера 0 станет 0xFF в 8-ми битном режиме или 0xFFFF в 16-ти битном, и придет новый импульс, таймер 0, автоматически сбросит значения регистров в 0 и выставит флаг прерывания в регистре INTCON (бит 2 – TMR0IF). Если разрешены прерывания, то программа уйдет в обработчик прерываний. Но пока прерывания мы не используем – их изучим позднее.   
Если необходимо будет использовать повторно этот таймер (например, считать длинный таймаут), то флаг необходимо сбросить программой:
           BCF    INTCON, TMR0IF, ab

 А свое значение таймер 0 уже сбросил автоматически.
Схема таймера 0 представлена на рисунке:

 схема таймера 0
Как мы видим, на схеме фигурирует устройство синхронизации. Оно необходимо для корректного сопряжения внутренней частоты микроконтроллера с частотой входного сигнала на таймер 0, который подается внешним генератором на вход RA4/T0CKI. Чтобы определить, какой максимальной частоты может быть внешний сигнал, необходимо смотреть максимальные и минимальные характеристики таймера 0. Все эти характеристики можно найти в datasheet пункт 22.0 ELECTRICAL CHARACTERISTICS в нем таблица: TABLE 22-8: TIMER0 AND TIMER1 EXTERNAL CLOCK REQUIREMENTS. В ней находим эти параметры. Видим, что, если включен прескалер, то минимальный период сигнала большее: или 20нс или (Tcy+40)/N. Где N-значение прескалера, а Tcy= период импульса, формируемого тактовым генератором.  
Если Вы работаете в 16-ти битном режиме, то необходимо правильно записывать и считывать значения таймера 0.  Как мы видим на схеме, есть еще третий недоступный из программы регистр (TMR0 High Byte), благодаря которому мы получаем правильный 16-ти битный срез данных. Иначе, могла получиться ситуация, когда читается старший байт, и после этого сразу происходит изменение младшего байта, которое изменяет значение старшего байта. И в итоге, прочитав далее младший байт программой, мы получим неверное значение таймера 0.
Например. Читаем значение 0x01FF. Сначала читаем из TMR0H значение 1, потом приходит очередной импульс, и значение таймера 0 стало 0x0200. Мы в программе читаем значение TMR0L, а оно стало уже 0. В итоге, программа будет работать с неверным значением 0x0100.
Чтобы такого избежать и был придуман механизм защелки. В данном случае регистр TMR0H является этим регистром. Т.е. он используется только, когда  мы работаем с регистром TMR0L. Таким образом, в 16-ти битном режиме, чтобы записать в таймер 0 новое значение, сначала надо записать TMR0H, а потом TMR0L!  При чтении, наоборот, сначала читаем TMR0L, а потом TMR0H!

Ну и напоследок, приведу простой пример инициализации таймера 0. И расчет таймаута на этом таймере.
Пусть у нас микроконтроллер тактируется от кварца с частотой Fcy=4МГц. То частота командного цикла равна Fcy/4=Fosc=1МГц. Т.е. у нас на таймер пойдет внутренняя частота  1МГц.  Нам необходимо получить таймаут в 50мс.
Простой расчет:
1МГц – это импульс с периодом 1мкс.
В итоге, 50/ 0,001 получим 50000. Это столько импульсов придет на таймер 0 за время 50мс.
Таймер 0 в 8-ми битном режиме.
Таймер переполняется за 256 импульсов. В итоге, 50000/256= 195,3125 импульсов. Это значение прескалера. Как видим, такого значения у нас нет в настройках. Поэтому приходится выбирать между 128 или 256. Здесь придется идти на компромисс (делать задержку больше или меньше), или менять кварц, который будет формировать более подходящий тактовый сигнал.
Для нашего случая возьмем прескалер = 128. В итоге получим время задержки: 256*128*1мкс=32,768 мс.  
Пример программы инициализации таймера 0 для нашего примера:
            CLRF            TMR0L, ab
            BCF               INTCON, TMR0IF, ab
            MOVLW       0x46                           ; прескалер=128, 8-ми битный режим, Fosc
            MOVWF       T0CON, ab
            BSF                T0CON, TMR0ON, ab

Через 32,768мс бит TMR0IF регистра INTCON установится автоматически в единицу.

В следующем выпуске будем уже писать программу мигания светодиодом к нашей схеме на базе микроконтроллера PIC18F452!

Полный архив рассылки Вы можете прочитать на нашем сайте!  При любом опубликовании текстов данной рассылки ссылка на сайт http://www.2aplusa.ru обязательна!

Теперь на нашем сайте начал работать форум, где Вы можете общаться на интересующие Вас вопросы по поводу разработки собственных устройств или задавать вопросы по поводу рассылки! 

Желаю Вам удачи! До скорой встречи!


С уважением, Алексей pont_a@mail.ru
Cайт разработчиков 2AplusA http://2aplusa.ru


В избранное