Функциональные модули микроконтроллера P IC16F873
Поможем в ✍️ написании учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

Микроконтроллеры серии PIC16F873  имеют в своем составе следующие функциональные блоки:
- три таймера: TMR0, TMR1, TMR2,

- два специальных модуля CCP1, CCP2,

- модуль аналого - цифрового преобразователя –АЦП,

- модуль универсального синхронно – асинхронного приемопередатчика USART,

- модуль синхронного последовательного порта MSSP,

- модуль памяти данных типа EEPROM.

Микроконтроллеры других серий этого семейства имеют иные наборы функциональных модулей, в частности, в их составе могут быть модули параллельного порта или модули USB – портов.

Рассмотрим работу некоторых функциональных модулей.

 2.1. Таймеры.

     Микроконтроллеры типа PIC16F873 имеют в своем составе три таймера: TMR0, TMR1 и TMR2. В основном все таймеры предназначены для получения временных интервалов в процессах управления различными техническими системами. Однако каждый из еречисленных таймеров имеет свои технические и функциональные особенности. Рассмотрим устройство и принцип действия всех таймеров.

 

2.1.1.Таймер TMR0.

Данный таймер имеет следующие основные функциональные возможности:

- 8-разрядный таймер-счетчик,

- возможность чтения и записи текущего состояния счетчика,

- 8-разрядный программируемый предделитель входных импульсов,

- внутренний или внешний источник тактовых входных импульсов,

- выбор активного фронта входных импульсов,

- возможность формирования запроса на прерывание при переполнении счетчика.

 

      Блок-схема таймера TMR0 показана на рис 1.8. 

 

      Настройка таймера TMR0 осуществляется с помощью регистра OPTION-REG (адрес 81h или 181h). Распределение разрядов и обозначение сигналов регистра приведены в таблице 16.

                                                                                                                        Таблица 18.

Номер разряда 7 6 5 4 3 2 1 0
Обозначение сигнала - - TOCS TOSE PSA PS2 PS1 PS0

 

Назначение сигналов:

TOCS – выбор тактового сигнала для таймера TMR0:

    1- внешний тактовый сигнал с вывода RA4,

    0- внутренний тактовый сигнал CLKOUT ,

TOSE – выбор фронта входного сигнала для таймера:

    1 – приращение счетчика таймера по заднему фронту входного сигнала,

    0 – то же по переднему фронту,

PSA – выбор способа использования предделителя:

    1 – предделитель включен перед сторожевым таймером – WDT,

    0 – предделитель включен перед таймером TMR0,

CLKOUT (Fosc/4)
RA4
TOSE
TOCS
MUX
MUX
MUX
WDT
Предделитель
8-to- 1 MUX
MUX
PSA
Переполнение WDT
PSA
TMR0
Флаг T0IF
8
Рис. 9. Блок- схема таймера TMR0 с предделителем.
 

PS2:PS0 – установка коэффициента деления предделителя: см. таблицу 5    

 

Принцип работы таймера типовой для большинства таймеров. Вначале производится настройка таймера в соответствии с вышеизложенным.   Поскольку счетчик таймера работает на сложение, в регистр TMR0 записывается дополнительный код требуемого времени:

                  N = FF – t * Т,           

 где: t – интервал времени в сек, Т – период входного тактового сигнала . Период входного сигнала определяется как величина обратная частоте входного сигнала. Входной сигнал формируется либо внутренним генератором: F = Fosc / 4, либо внешним генератором через вход RA4 (см. таблицу 4)                                           

После переполнения счетчика (регистр TMR0) формируется сигнал готовности таймера – установка в 1 сигнала TOIF (регистр INTCON <2>), который является также сигналом требования прерывания. Само же прерывание может быть разрешено установкой в 1 сигнала TOIE ( Т ноль регистр INTCON <5>). После обработки прерывания сигнал требования прерывания TOIF должен быть программно сброшен в 0. Следующий интервал времени будет получен при повторной записи в регистр TMR0.

Примечания:

1. После записи в регистр TMR0 первые два машинных цикла запрещается подача входных импульсов в счетчик таймера, что вызовет задержку начала формирования интервала времени.

2. Запись в регистр TMR0 сбрасывает предделитель не изменяя его режим работы.

 

 

   Пример программирования работы таймера TMR0 на языке СИ.

Данный таймер можно использовать в качестве элемента задержки в контроллерах электроавтоматики станков с ЧПУ.  Дополним приведенный выше фрагмент электроавтоматики условием отключения Кп после задержки в 500 мсек.  или 500 000 мксек с помощью таймера TMR0. Для простоты будем использовать внутренний     генератор тактовых импульсов частотой 4 МГц, откуда тактовая частота равна:           Fclk = Fosc /4 = 1МГц, а период соответственно Тclk = 1 мксек.

Время срабатывания таймера рассчитывается из условия:

 

  t = nn * Tclk,

где nn – число импульсов, пришедших в счетчик таймера.

Tclk – период входных импульсов таймера.

Так как счетчик таймера TMR0 работает на суммирование, то в него записывается дополнительный код:

 mm = FF – nn,

поэтому максимальный период срабатывания таймера (при mm =0) будет равен:

Тмах = 256 х Tclk = 256 мксек., где:

256 – максимальная емкость 8-ми разрядного регистра TMR0,

 

Для получения большей задержки перед таймером включается предделитель (см. бит PSA <3> в регистре OPTION-REG). Этот прием позволит еще увеличить время задержки в 256 раз:

 Тмах = 256 * 256 = 65536 мксек

 Однако и этого приема недостаточно для получения требуемой задержки, поэтому увеличим задержку за счет формирования нескольких циклов срабатывания таймера:

 

К = 500 000 / 65536 = 7,629 .

Поскольку число циклов может быть только целым, принимаем К = 8.

Тогда максимально возможное число импульсов будет равно:

                                             Mmax = 65536 * 8 = 524288

 

поэтому разность 24288 компенсируем за счет уменьшения задержки на самом таймере с учетом предделителя и на каждом цикле работы таймера:

На каждом цикле компенсируем:

  24 288 /8 = 3086 импульсов.

За счет предделителя компенсируем:

3086 / 256 = 12 импульсов.

 

Поэтому перед запуском таймера записываем в него число 12 или в шестнадцатиричной системе счисления: 0С.

 

 

Программа работы фрагмента электроавтоматики  (см. раздел 1.6) совместно с задержкой в 500 мсек будет имет вид:

 

 

#define XTAL_FREQ 4MHZ //Частота тактового генератора 4 MHZ

 

#define byte            unsigned char

#define word              unsigned int

 

#include <pic.h>

#include <stdio.h>

__CONFIG(HS & WDTDIS & PWRTEN & LVPDIS & DUNPROTECT & WRTEN);

 

void main() {

 

char chet = 0x00;   //сброс счетчика числа циклов таймера

 

    

 OPTION = 0x07; // предделитель перед таймером TMR0,

TRISA = 0x10;

TRISB= 0xFF;

 

for (; !RA0 ;) {                //цикл программы работы фрагмента

 

RA0 = (RB2&&RB3 && RB1&&RB6) ||(RB2&&RB3 RB1&&RA1&&RA4)|| (RB2&&RB3&& RB1&&RA1&&RA0);                                                    

                          }

 

   TOIF = 0;      // сброс флага TMR0 - начальный

   for (chet = 0x00; chet < 0x08; chet ++ ) {       //счет циклов таймера

                      T0IF = 0;       // сброс флага таймера в цикле

   TMR0 = 0x0С;      //пуск таймера TMR0

   for (; !TOIF ;) { }                 // ожидание срабатывания таймера TMR0

                                              

   RA0 = 0;       // отключение Кп

                                                                   }

 

   }           // конец main

 

2.1.2.     Модуль таймера TMR1.

Таймер TMR1 имеет 16 – разрядный счетчик, выполненный на двух регистрах (TMR1H, TMR1L), доступных для записи и чтения. Модуль может работать в двух режимах:

- режим таймера,

- режим счетчика.

В режиме таймера инкрементируется содержимое 16-ти разрядного счетчика и при переполнении его устанавливается флаг прерывания TMR1IF в региcтре PIR1 <0>.

В режиме счетчика происходит приращение 16-ти разрядного счетчика, содержимое которого может быть прочитано в любой момент времени. При достижении значения FFh, счет начинается заново со значения 00h. Структурная схема модуля показана на рис 9. 

Настройка модуля на различные режимы производится установкой соответствующих бит регистра T1CON (адрес 10h), значения которых приведены в таблице 17.   

                                                                                                                        Таблица 179

Номер разряда 7 6 5 4 3 2 1 0
Обозначение сигнала - - T1CKPS1 T1CKPS0 T1OSCEN -T1SYNC TMR1CS TMR1ON

Где:

T1 CKPS1: T1 CKPS0 – выбор коэффициента деления предделителя:

                           11 = 1:8

                           10 = 1:4

                           01 = 1:2

                           00 = 1:1

T1 OSCEN – включение тактового генератора модуля TMR1:

1 - генератор включен,

0 - генератор выключен (инвертор и обратная связь отключены для уменьшения потребления тока),

 

-T1SYNC – синхронизация внешнего тактового сигнала (при TMR1CS = 1):

1 – не синхронизировать внешний тактовый сигнал,

0 – синхронизировать внешний тактовый сигнал.

 

TMR1 CS - выбор источника тактового сигнала:

1 – внешний источник тактового сигнала со входа RC0 (активный передний фронт),

0 - внутренний источник Fosc/4.

 

TMR1ON - включение модуля TMR1:

1 - модуль включен,

0 - модуль выключен.

 

 

TMR1H TMR1L
Флаг  TMR1IF
TMR1ON
Синхронизированный тактовый сигнал
Предделит 1,2,4,8
синхронизация
RC0
 RC1
Fosc/4
TMR1CS
T1CKPS1:T1CRPS0
Режим SLEEP
Рис.10. Структурная схема модуля TMR1.
T1OSCEN

 


Пример программирования таймера TMR1.

Исходные данные примем те же, что и в примере программирования таймера TMR0:

1. Требуемая задержка -500 мсек.

2. Тактовый сигнал – внутренняя частота Fosc / 4 = 1 MHz/

3. Режим работы модуля – таймер.

 

Максимальное время срабатывания самого таймера составляет:

 

t max = 256*256 * 1 = 65536 мксек (счетчик таймера сдвоенный TMR1H и TMR1L

 

 С включенным  предделителем:

                 T max = t max * 8 =    65536 * 8 = 524288 мксек.,

т.е. максимальное время самого таймера TMR1 больше требуемого. Разность времен: 24288 мксек компенсируем за счет уменьшения длительности цикла самого таймера путем записи в регистр таймера (TMR1H и TMR1L) некоторого числа, Так как входные импульсы поступают в таймер через предделитель с полным коэффициентом деления, то таймер должен компенсировать:

 

   2428/8 = 3036 импульсов или в шестнадцатиричной системе: 0BDC.

 

Текст программы.

#define XTAL_FREQ 4MHZ //Частота тактового генератора 4 MHZ

 

#define byte            unsigned char

#define word              unsigned int

 

#include <pic.h>

#include <stdio.h>

__CONFIG(HS & WDTDIS & PWRTEN & LVPDIS & DUNPROT & WRTEN);

 

void main() {

 

 

TRISB = 0xff;       // порт В на вход

TRISA = 0x10;     // порт A на выход и на вход

T1CON = 0x30;    //настройка таймера TMR1

 

for (; !RA0 ;) {                //цикл работы фрагмента

 

RA0 = (RB2&&RB3 && RB1&&RB6) ||(RB2&&RB3 RB1&&RA1&&RA4)|| (RB2&&RB3&& RB1&&RA1&&RA0);                                                    

                          }       // решение булевых уравнений фрагмента

 

   TMR1IF= 0;      // сброс флага TMR1

   TMR1H = 0x0B; //начальная установка таймера

   TMR1L = 0xDC;

   TMR1ON = 1;    //пуск таймера TMR1    

   for (; !TMR1IF ;) { }          // ожидание срабатывания таймера TMR1

      

          RA0 = 0;       // отключение Кп

                                   

 

   }           // конец main

 

Примечание. Код настройки таймера T1CON = 0x30 (двоичный код:00110000) по порядку соответствует:

00 <7,6> – не программируется,

11 <5,4> – настройка предделителя 1:8

0 <3> -  внутренний генератор отключен.

            0 <2> - синхронизация входного сигнала отсутствует

            0 <1> - внутренний источник входных импульсов

            0 <0> - таймер TMR1 пока выключен.

 

 

Модуль таймера TM R 2.

Модуль представляет собой 8-ми разрядный таймер с предделителем входных импульсов и выходным делителем. Структурная схема таймера показана на рис 10.

Работает таймер следующим образом. Временной период задается путем записи определенного числа в регистр PR2. После пуска тактовые импульсы через программируемый предделитель поступают в счетчик TMR2. Содержимое счетчика TMR2 инкрементируется и сравнивается с регистром PR2. При совпадении счетчика TMR2  с регистром PR2 работа таймера прекращается и устанавливается флаг TMR2IF. При установке разрешения прерывания (TMR2IE = 1) запускается процесс обслуживания таймера в режиме прерывания.. . . Настройка таймера осуществляется путем записи в регистр T2CON (адрес 12h) в соответствии с таблицей 20.

 

Установить флаг ТMR2IF
Выход TMR2
Cброс
  TMR2
Сравнение
Fosc/4
Предделитель 1:1, 1:4, 1:16
PR2
Вых. делитель 1:1 до 1:16
2
4
Рис. 11. Структурная схема таймера TMR2.

                                                                                                                        Таблица 20.

Номер разряда 7 6 5 4 3 2 1 0
Обозначение сигнала - TOUTPS3 TOUPTS2 TOUPTS1 TOUTPS0 TMR2ON T2CKPS1 T2CKPS0

 

Где:

TOUPTS3: TOUPTS0 - выбор коэффициента деления выходного делителя таймера TMR2,

                                      0000 = 1 : 1

                                      0001 = 1 : 2

                                      :

                                      :

                                      1111 = 1: 16

TMR2 ON – включение таймера TMR2: 1 – таймер включен, 0 – таймер выключен.

T2 CKPS1: T2 CKPS0 – выбор коэффициента деления предделителя:

                                      00  = 1:1

                                      01 = 1:4

                                      1х = 1:16       

 

Пример программирования работы таймер TMR2 .  

Рассмотрим пример программирования таймера TMR2 при использовании его для организации задержки на 500 мсек в том фрагменте электроавтоматики. Максимальная задержка самого таймера зависит от разрядности регистра PR2, поскольку счтчик таймера восьмиразрядный а период тактовых импульсов равен 1 мксек, максимальное время задержки составит 256 мксек.

 

С учетом входного предделителя с коэффициентом деления 1:16, получим:

Т мах = 256 * 16 = 4096 мксек.

 

а с учетом выходного делителя с максимальным коэффициентом деления 1:16, получим:

Tmax = 4096 * 16 =65536 мксек.

Таким образом, максимальная задержка таймера TMR2 со всеми делителями недостаточна для получения требуемой задержки, поэтому мы вынуждены программировать несколько циклов срабатывания таймера TMR2(см. программирование таймера TMR0). Как было показано в указанном примере программирования таймера TMR0, разность входных импульсов 24288 должна быть компенсирована записью некоторого числа в регистр PR2. Рассчитаем это число:

       Поскольку  совершается восемь циклов работы таймера на каждом цикле мы можем компенсировать:

                       24288 / 8 = 3036 импульсов.

На выходном делителе компенсируется:

                       3036 / 16 = 190 импульсов.

А с учетом входного предделителя:

                       190 / 16 = 12 импульсов или в шестнадцатиричной системе 0С импульсов.

С учетом вышеизложенного программа для фрагмента электроавтоматики будет иметь вид:

 

#define XTAL_FREQ 4MHZ

 

#define byte            unsigned char

#define word              unsigned int

 

#include <pic.h>

#include <stdio.h>

__CONFIG(HS & WDTDIS & PWRTEN & LVPDIS & DUNPROT & WRTEN);

 

void main() {

 

char shet = 0x00;   //сброс счетчика числа циклов таймера

 

TRISB = 0xff;       // порт В на вход

TRISA = 0x10;     // порт A на выход  и на вход

T2CON = 0x7A  //настройка таймера TMR2

 

                

for (;! RA0 ;) {

RA0 = (RB2&&RB3 && RB1&&RB6) ||(RB2&&RB3 RB1&&RA1&&RA4)|| (RB2&&RB3&& RB1&&RA1&&RA0);             

   }       //проверка условий включения пускателя Кп

      

   for (shet = 0x00; shet < 0x08; shet ++ ) { //счет числа циклов TMR2

   TMR2IF = 0;      // сброс флага TMR2

    PR2 = 0x0C;

    TMR2ON = 1;   //пуск таймера TMR2

 

           for (; !TMR2IF ;) { } //ожидание срабатывания таймераTMR2

                                                                    }

   RA0 = 0;       // отключение Кп

       

   

}           // конец main

 

 

Расшифровка настройки таймера по разрядам регистра T2CON: 7A (01111010)

0 <7> - не программируется,

1111 <6-3> - коэффициент деления выходного делителя 1:16,

0 <2> - таймер пока выключен,

10 <1-0> - в предделителе установлен коэффициент деления 1: 16.

 

Дата: 2019-04-23, просмотров: 282.