Разработка программ, использующих таймер/счетчик, обработка внешнего прерывания и прерывания от таймера

В режиме таймера таймер/счетчик (Т/С) после его запуска увеличивает свое содержимое на единицу каждые 32 машинных цикла. При тактовой частоте 6 МГц это соответствует 80 мкс (32*2,5 = 80), т.е. таймер «тикает» каждые 32 машинных цикла (каждые 80 мкс). Так как емкость Т/С - один байт, то его переполнение наступает при смене содержимого с 255 на 0, при этом признак переполнения Т/С TF устанавливается в 1, т.е. (TF)=1. Возможна организация ветвления в программе с помощью команды JTF M, которая осуществляет переход на метку М в случае если (TF)=1. После выполнения указанной команды признак TF сбрасывается в 0, т.е. (TF)=0.

     Таким образом, Т/С можно использовать для организации временных задержек или выдержек времени. Например, требуется организовать задержку, соответствующую времени одного переполнения таймера, т.е. Тз=256*80 мкс = 20480 мкс. Для этого запускаем таймер с нуля и дожидаемся его переполнения путем тестирования признака TF с помощью команды JTF M.

CLR A;     очистка А        

MOV T,A;   и Т/С

STRT T;    запуск Т/С в режиме таймера

M0: JTF M1;    переход на М1, если (TF)=1, т.е. при переполнении Т/С,

     JMP M0; иначе возврат (ожидание переполнения Т/С)

M1: STOP TCNT; останов Т/С

     Если требуется организовать задержку меньшую чем время одного переполнения, то Т/С необходимо запускать не с нуля, а с некоторого «порога». Например, необходимо организовать задержку на время Тз=4000 мкс. Подсчитаем количество «тиков» таймера, соответствующее этой задержке (время задержки разделить на время одного «тика»): Nтик= Тз / Т1тик = 4000 / 80 = 50 тиков. Тогда «порог»: Nпорог = 256 – Nтик = 256 – 50 = 206 = СЕН.     

MOV A,#CEH; записать в Т/С       

MOV T,A;       порог

STRT T;       запуск Т/С в режиме таймера

M0: JTF M1;       ожидание

     JMP M0;     переполнения Т/С

M1: STOP TCNT; останов Т/С

Если требуется организовать задержку большую чем время одного переполнения, то необходимо организовать подсчет количества переполнений Т/С. Например, необходимо организовать задержку на время Тз=0,1с=100000 мкс. Подсчитаем количество «тиков» таймера, соответствующее этой задержке:

Nтик= Тз / Т1тик = 100000 / 80 = 1250 тиков.

Тогда количество переполнений при целочисленном делении:

     Nпереп= Nтик / 256 = 1250 / 80 = 4 (226 - остаток),

т.е. четыре «полных» переполнения и одно «неполное», которому соответствует «порог»:

Nпорог = 256 – «остаток» = 256 – 226 = 30 = 1ЕН.

Таким образом, необходимо в Т/С записать «порог» Nпорог=30, запустить его в режиме таймера, дождаться 5 переполнений и остановить Т/С. Один из вариантов решения может выглядеть следующим образом.

MOV R6,#00H; очистить R6 – счетчик переполнений

MOV A,#1EH; записать в Т/С       

MOV T,A;       порог

STRT T;       запуск Т/С в режиме таймера

M0: JTF M1;       ожидание

     JMP M0;     переполнения Т/С

M1: INC R6;        подсчет очередного переполнения

     MOV A,R6;  проверка R6 на

     XRL A,#05H;    5 переполнений   

     JNZ M0; если нет 5 переполнений, то возврат на ожидание

STOP TCNT;  иначе останов Т/С

Другой вариант решения (вместо проверки счетчика переполнений на 5, использовать его как счетчик циклов).

MOV R6,#05H; 5 циклов для ожидания 5 переполнений

MOV A,#1EH; записать в Т/С       

MOV T,A;       порог

STRT T;       запуск Т/С в режиме таймера

M0: JTF M1;       ожидание

     JMP M0;     переполнения Т/С

M1: DJNZ R6,M0; если нет 5 переполнений, то возврат на ожидание

STOP TCNT;  иначе останов Т/С

Следующий фрагмент программы совмещает использование вывода Т0 в качестве тестируемого входа и использование Т/С в режиме таймера, а именно организует подсчет импульсов на входе Т0 за 4000 мкс с момента запуска таймера.

MOV R6,#00H; очистить R6 – счетчик переполнений

MOV A,#СEH; записать в Т/С      

MOV T,A;       порог

STRT T;       запуск Т/С в режиме таймера

M0: JNT0 M1;     переход на M1, если пришел «0», иначе проверка Т/С

     JTF M3;     на переполнение, т.е. переход на M3, если время вышло,

     JMP M0;     иначе возврат (ожидание «0» с проверкой по времени)

M1: INC R6;        если пришел «0», то подсчет очередного импульса

M2: JT0 M0;           переход на M0, если пришла «1», иначе проверка Т/С

     JTF M3;           на переполнение, т.е. переход на M3, если время вышло,

     JMP M2;     иначе возврат (ожидание «1» с проверкой по времени)

M3: STOP TCNT; останов Т/С

В режиме счетчика Т/С увеличивает свое содержимое на единицу каждый раз при смене на входе Т1 логической «1» на логический «0», если период такой смены не меньше времени одного машинного цикла (альтернативное назначение тестируемого входа Т1 – вход Т/С в режиме счетчика внешних событий).

Например, требуется организовать подсчет 100 логических импульсов на входе Т1 с помощью Т/С. Ниже приводятся два равнозначных с точки зрения размера программы варианта.

;первый вариант

CLR A;     очистка А        

MOV T,A;   и Т/С

STRT CNT; запуск Т/С в режиме счетчика внешних событий

M0: MOV A,T; проверка Т/С

     XRL A,#64H; на 100

JNZ M0; возврат, если не 100

  STOP TCNT; иначе останов Т/С

;второй вариант

MOV A,#9CH; записать в Т/С

MOV T,A;      порог 9СH = 156 = 256 - 100

STRT CNT; запуск Т/С в режиме счетчика внешних событий

M0: JTF M1;      ожидание

     JMP M0;     переполнения Т/С

M1: STOP TCNT; останов Т/С

     Если на вход Т1 подавать логические импульсы с известным периодом следования, то с помощью счетчика внешних событий также можно организовывать задержки и выдержки времени. Например, на вход Т1 подаются логические импульсы с периодом 1 секунда. Требуется организовать временную      задержку на 20 секунд. Решение задачи сводится к подсчету 20 импульсов на входе Т1 с помощью Т/С.

MOV A,#ECH; записать в Т/С       

MOV T,A;       порог ECH = 236 = 256 - 20

STRT CNT; запуск Т/С в режиме счетчика внешних событий

M0: JTF M1;       ожидание

     JMP M0;     переполнения Т/С

M1: STOP TCNT; останов Т/С

Прерыванием, в общем смысле, называется процесс приостановления выполнения основной программы с целью выполнения какого-то другого "срочного" задания (запроса на прерывание). «Учебный» микроконтроллер может обрабатывать прерывания от двух источников: 1) по входу INT при наличии логического нуля на этом входе (внешнее прерывание) и 2) от таймера/счетчика при его переполнении. Обработка прерываний происходит только тогда, когда эти прерывания разрешены, иначе они игнорируются. Разрешение внешнего прерывания осуществляется командой EN I, запрещение – DIS I; разрешение прерывания от таймера/счетчика – EN TCNTI, запрещение – DIS TCNTI (более подробно см. приложение 1).

     На рис. 3 представлена логика выполнения очередной команды основной программы для рассматриваемого микроконтроллера.

При выполнении очередной команды основной программы микроконтроллер проверяет сначала наличие внешнего прерывания ((INT)=0?), а затем наличие прерывания от таймера/счетчика ((iip) =1?). Если этих прерываний нет, то выполняется очередная команда основной программы. Если перед выполнением очередной команды микроконтроллер обнаружил внешнее прерывание (логический ноль на входе INT) и это прерывание разрешено ((ie)=1), то выполнение очередной команды временно приостанавливается, а управление передается на третий вектор (третья ячейка ПЗУ). По этому адресу располагается или команда безусловного перехода на подпрограмму обработки внешнего прерывания или сама подпрограмма. Затем выполняется эта подпрограмма и командой RETR, которой должна заканчиваться подпрограмма обработки прерывания, осуществляется возврат в основную программу к тому оператору, выполнение которого было временно приостановлено. За время этой обработки (выполнения подпрограммы) внешнее прерывание должно быть снято, т.е. на входе INT должна появиться логическая единица, иначе процесс обработки повторится снова.

 

 

 


                                                                                                                               Нет   

 


                                                                                                       Да                   

                                                                                               


                                                    Да                                              

 


                                                                                    Нет

     
Через 3 вектор выполнение подпрограммы обработки внешнего прерывания  
 


                                                                                                                               Нет     

                                                                                                                                               

 

                                                                                                           

                                                                                                       Да       

     
 


                                                     Да                                                                     

 


Выполнение очередной команды основной программы
Через 7 вектор выполнение подпрограммы обработки прерывания от Т/С
                                                                                     Нет                                                                      

 

                                                                                     

 










Рис.3 - Логика выполнения очередной команды основной программы

 Аналогично происходит обработка прерывания от таймера/счетчика при его переполнении (наличие прерывания – (iip)=1, прерывания разрешены – (tie)=1). Только в данном случае управление передается на седьмой вектор (седьмая ячейка ПЗУ), и микроконтроллер сам снимает прерывание от таймера/счетчика ((iip)=0) при выполнении возврата из подпрограммы обработки прерывания от таймера/счетчика командой RETR.

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

Ниже приведена одна из структур программы, в которой используются оба прерывания (имеется в виду взаимное адресное расположение векторов основной программы и подпрограмм обработки прерываний).

0000      JMP START; переход к основной программе (обход векторов) -2б

0002      NOP; формальный оператор (для заполнения ячейки ПЗУ) -1б

0003      JMP INI; третий вектор; переход на подпрограмму обработки

;  внешнего прерывания -2б

0005      NOP; формальный оператор -1б

0006      NOP; формальный оператор -1б

0007      JMP TIME; седьмой вектор; переход на подпрограмму обработки

   ; прерывания от таймера/счетчика -2б

Основная программа
0009 START:

 

Подпрограмма обработки внешнего прерывания RETR


   INT:

 

Подпрограмма обработки прерывания от таймера/счетчика RETR
         

     TIME:

 

           

Возможно и другое расположение, например, когда подпрограмма обработки внешнего прерывания может размещаться, начиная прямо с третьей ячейки ПЗУ, если она очень короткая (т.е. вместе с командой RETR занимает с третьей по шестую ячейки ПЗУ), или когда нет прерывания от таймера/счетчика (т.е. седьмой вектор не используется). Аналогично, без всяких ограничений, подпрограмма обработки прерывания от таймера/счетчика может располагаться, начиная с седьмой ячейки, а сразу за ней основная программа. При составлении основной программы необходимо следить за тем, чтобы во время ее выполнения не попасть естественным порядком на какую-либо подпрограмму.

     Примеры обработки прерывания от таймера/счетчика и внешнего прерывания см. в лабораторной работе №7 (пп. 6,7).

                        Задания к практическому занятию №6:

1) с помощью таймера организовать задержку на 15000 мкс; 2) с помощью таймера организовать задержку на 4 с; 3) используя прерывания от таймера/счетчика, организовать выдержку времени в 2 с; 4) используя внешние прерывания, организовать подсчет 100 логических импульсов.




Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: