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

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


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


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

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

Открываем datasheet на наш микроконтроллер PIC18F452 и находим пункт: 12.0 TIMER2 MODULE. В этом пункте описан таймер 2. Мы видим, что здесь показаны назначения битов регистра управления, а также функциональная схема таймера 2.
Основной регистр управления данного таймера T2CON. Рассмотрим назначение битов регистра:


№ бита

Название

Описание

7

– 

не используется

6-3

TOUTPS3-0

4 бита для конфигурирования делителя выходной частоты с таймера
0000 – 1:1 постскалер
0001 – 1:2 постскалер
0010 – 1:3 постскалер
   .
   .
   .
1111 – 1:16 постскалер

2

TMR2ON

1 – включить таймер 2
0 – выключить таймер 2

1-0

T2CKPS1-0

2 бита, которые задают делитель входной частоты на таймер:
00 –  входная частота не делится;
01 –  входная частота делится на 4;
10 –  входная частота делится на 16;
11 –  входная частота делится на 16;

           
Когда таймер 2 включен, он начинает инкрементироваться с каждым входным импульсом после прескалера. Накапливается значение таймера 2 в регистре TMR2. Входные импульсы  могут идти только от внутреннего генератора (командные циклы = Fosc/4). Таймер 8-ми разрядный. Но есть у него один регистр, который позволяет таймеру 2 формировать промежутки, практически, с любым периодом! Это регистр PR2. Как мы помним из выпуска №12 рассылки, флаг прерывания таймера 0 взводился, когда происходило переполнение значения таймера (FFh->00h). Так вот, в таймере 2 флаг прерывания (PIR1.TMR2IF) взводится, когда значение TMR2  совпадет со значением, находящимся в регистре PR2, и количество совпадений, станет равно делителю выходной частоты таймера 2. После совпадения TMR2 и PR2, TMR2 автоматически сбрасывается в ноль, и на постскалер приходит очередной импульс. Не забываем самое важное, что любая программная модификация регистров TMR2 или T2CON приводит к сбросу прескалера и постскалера, который грозит нарушением длительности периода!!!
Работа таймера 2 более наглядно отображена на функциональной схеме:

Функциональная схема таймера 2

Как видим по схеме, таймер 2 может тактировать модуль MSSP. Только частота пойдет на модуль, минуя постскалер. Но об этом мы поговорим позже, когда будем рассматривать модуль MSSP.
 
Ну и теперь, обещанное в прошлом выпуске: как рассчитать таймаут на данном таймере, чтобы получить точный период в 1 секунду.  Как мы помним, тактировался у нас микроконтроллер от внешнего кварца, настроенного на частоту Fosc=20МГц.  Таким образом, на таймер 2 пойдет 5000000 импульсов в секунду (Fosc/4).
Рассчитываем прескалер: 5000000/16= 312500. Где, 16 – максимальное число прескалера, которое делит входную частоту для таймера без остатка.
Теперь постскалер: 312500/10= 31250.  Где, 10 – максимальное число постскалера, которое делит выходную частоту с таймера без остатка.
Таким образом, получилось, что если у нас значение регистра PR2  будет равно 1, то нам будет устанавливаться флаг прерывания от таймера 2  31250 раз в секунду. Теперь находим максимально возможное большее 8-ми битное число, которое делит цифру 31250 без остатка. Это 250. Оно и будет записано в регистр PR2. 31250/250= 125. Вот с такой частотой нам будет взводиться флаг прерывания таймера 2 (125 раз в секунду).
;Объявляем переменные
CBLOCK       0x000  ; блок начинается с нулевого адреса банка 0
            tmr2h             
ENDC
; инициализация таймера 2
            CLRF             T2CON, ab              
            MOVLW        .125
            MOVWF        tmr2h, ab
            MOVLW        .250                 ; значение регистра сравнения
            MOVWF        PR2, ab
            CLRF             TMR2, ab      ; сброс значения таймера 2
            BCF                PIR1, TMR2IF, ab   ; сбрасываем флаг прерывания      
            MOVLW        0x4B
            MOVWF        T2CON, ab    ; прескалер 1:16, постскалер 1:10
            BSF                T2CON, TMR2ON, ab        ; старт таймера 2
            …
; в основном цикле проверяем на окончание таймаута
; все, как в программе предыдущего выпуска
Main_Loop:
            …
            BTFSS            PIR1, TMR2IF, ab               ; таймер 2 переполнился?
            BRA               Main_Loop                            ; нет. Ждем, когда это произойдет
            BCF                PIR1, TMR2IF, ab               ; да, сбросили флаг прерывания
            DECFSZ         tmr2h, rf, ab                           ;  закончился таймаут или нет?
            BRA               Main_Loop                ; таймаут не закончился, ждем нового переполнения    
            BTG               LATD, RD0, ab         ; закончился, проинвертировали выход на светодиод
            MOVLW        .125
            MOVWF        tmr2h, ab                    ; запускаем новый таймаут
            BRA               Main_Loop   
           
           
В следующем выпуске будем рассматривать таймер 1 (TMR1) микроконтроллера PIC18F452!
 
Полный архив рассылки Вы можете прочитать на нашем сайте!  При любом опубликовании текстов данной рассылки ссылка на сайт http://www.2aplusa.ru обязательна!
 
На нашем сайте работает форум, где Вы можете общаться на интересующие Вас вопросы по поводу разработки собственных устройств или задавать вопросы по поводу рассылки!  Не стесняйтесь задавать вопросы, где и что непонятно! Также, жду на форуме Ваши пожелания, чего Вы бы хотели увидеть на страницах нашей рассылки!

 

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


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


В избранное