в качестве рабочего таймер T0.
Выберем в качестве рабочего таймер T0. Настройка таймера нам потребуется только один раз (при включении часов). Поэтому настройку таймера поместим в блок инициализации микроконтроллера.
Программа в основном режиме может ожидать переполнения таймера, опрашивая флаг TF0, но при использовании прерываний от таймера можно значительно снизить потребление микроконтроллера. Экономия реализуется при переведении микроконтроллера в спящий режим командой orl PCON,#1. После выполнения этой команды микроконтроллер может проснуться только после сброса микроконтроллера или возникновения прерывания.
Для реализации прохождения микроконтроллером по основному циклу один раз в 50мс разместим команду orl PCON,#1 в конце цикла. В качестве источника прерываний будет служить таймер T0. Переход на начало цикла будет осуществляться сразу после возврата из подпрограммы обслуживания прерывания.
Так как прерывания нам потребуются каждые 50 мс, то разрешение прерываний от таймера разместим тоже в подпрограмме инициализации таймера. Разрешение прерываний от таймера производится записью единиц в биты регистра специального назначения IE. Разрешение прерываний от таймера производится битом ET0, а общее разрешение всех прерываний битом EA. Установим эти биты в единичное состояние командой orl IE,#10000010b.
Теперь микроконтроллер каждые 50 мс будет не только просыпаться, но и передавать управление на вектор прерывания таймера T0. Этот вектор находится по адресу 0Bh. Подпрограмму повторной записи числа 50мс в таймер нужно поместить точно на этот адрес. Размещение подпрограммы на векторе прерывания можно произвести директивой ORG 0Bh. Так как пока нет прерываний от других источников, то подпрограмму обслуживания прерывания не будем выносить в конец программы.
;-------------СБРОС МИКРОКОНТРОЛЛЕРА--------------------------------- ORG
jmp init ;Переход на начало выполнения программы
;-------------ВЕКТОР ПРЕРЫВАНИЯ ТАЙМЕРА T0--------------------------- ORG 0Bh mov TH0, #HIGH(-50000) ;Загрузить старший байт таймера mov TL0, #LOW(-50000) ;Загрузить младший байт таймера reti
;-------------ИНИЦИАЛИЗАЦИЯ МИКРОКОНТРОЛЛЕРА------------------------- init: call Timer0_Init ;Настроить таймер T0 на прерывания с периодом 50мс
;-------------ОСНОВНАЯ ПРОГРАММА МИКРОКОНТРОЛЛЕРА-------------------- Begin: orl PCON,#1;Перевести микроконтроллер в пониженный режим ;потребления тока и подождать переполнения таймера jmp begin ;Переход на начало выполнения программы ;-------------КОНЕЦ ОСНОВНОЙ ПРОГРАММЫ МИКРОКОНТРОЛЛЕРА--------------
;******************************************************************** ;Подпрограмма настройки таймера T0 на 50мс режим работы ;******************************************************************** Timer0_Init: mov TMOD,#00000001b ;перевести таймер T0 в первый режим ; работы, а T1 - в нулевой режим ;++------Перевести таймер T0 в ; шестнадцатиразрядный режим работы ;|+--------Синхронизироваться от внутреннего ;| генератора ;+---------Запретить управление таймером от ; ножки INT0 ;++----------Перевести таймер T1 в ; тринадцатиразрядный режим ;|+------------Синхронизироваться от внутреннего ;|+------------генератора ;+-------------Запретить управление таймером ; от ножки INT1
;Настройка таймера на генерацию 50-ти миллисекундного интервала ;времени mov TH0, #HIGH(-50000) ;Загрузить старший байт таймера mov TL0, #LOW(-50000) ;Загрузить младший байт таймера
orl IE,#10000010b ;Разрешить прерывания от таймера SetB TR0 ;включить таймер ret ;и вернуться в основную программу
end
Рисунок 9.19.
Содержание Назад Вперед
Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий