Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для C++
Уроки по C#
Уроки по Python
HTML
Веб-дизайн
Ассемблер в среде Windows
ActiveX
Javascript
Общее о Линукс
Линукс - подробно
Линукс - новое
Delphi
Паскаль для начинающих
Турбопаскаль
Новости
Партнеры
Наши предложения
Архив новостей





Однако применение вывода OCIA В автоматическом режиме решает лишь одну довольно узкую задачу. Для того чтобы выполнять еще какие-либо действия, необходимо разрешить соответствующее прерывание, которое в данном случае носит название Timerl Compare Match А (или для AT90S2313, где режим сравнения всего один, просто Timerl Compare). Это можно сделать установкой бита OCIEIA в регистре TIMSK:
ldi temp, (1«ОС1Е1А) ;разрешение прерывания Timerl Compare out TIMSK,temp Теперь сформулируем задачу создания электронных часов. Мы имеем прерывание TIMICOMPA, возникающее раз в секунду. Для отсчета минут достаточно создать отдельный счетчик до 59, а часов — еще один до 24. Однако значение времени обычно представляют в BCD-формате (причем для индикации нужен распакованный формат). Можно поступить двояко: или при необходимости вызывать каждый раз процедуру преобразования hex-значения в BCD (она описана в главе 7), или усложнить процедуру подсчета времени, заранее разместив единицы и десятки часов, минут и секунд в отдельных регистрах. Первый способ целесообразнее в тех программах, где счет времени — не основная функция, и наблюдается дефицит свободных регистров (тогда для подсчета времени потребуется всего три глобальных переменных для часов, минут и секунд, а распакованные значения можно хранить в SRAM). Второй способ проще (хотя сама процедура подсчета и сложнее), и его следует применять тогда, когда функция подсчета времени — основная, и других громоздких действий (кроме, возможно, индикации, на которой мы остановимся далее) МК не производит.

Далее предположим, что значения секунд индицироваться не будут (их заменит "мигалка" по выводу oci), так что для них достаточно одного глобального счетчика, а единицы-десятки минут и часов мы будем располагать в отдельных переменных. В листинге 8.4 показано, как можно реализовать этот второй способ tio прерыванию TIMICOMPA (разумеется, оно должно быть не только разрешено, но и в соответствующем месте таблицы прерываний должен стоять переход rjmp TIMICOMPA).

def temp = rl7 /рабочая переменная
def sek = rl8 ; :счетчик секунд
def emin = rl9 /единицы минут
def dmin = r20 /десятки минут
def ehh = r21 j ;единицы часов
def dhh = r22 j ;десятки часов

TIMICOMPA: /прерывание по сравнению 1 сек inc sek /увеличиваем число секунд на 1 cpi sek,60 /сравнить со значением 60 brne Texit /если не равно, на выход clr sek /если уже 60, очистить секунды inc emin /и увеличить ед. минут cpi emin,10 /сравнить ед. минут с числом 10 brne Texit /если еще не равно, на выход clr emin /иначе очистить ед. минут - inc dmin /увеличить дес. минут cpi dmin,б /сравнить с числом б brne Texit /если еще не равно, на выход clr dmin /иначе очистить дес. минут inc ehh /увеличить ед. часов cpi ehh,4 /сравнить ед. часов с числом 4 brio Texit /если меньше, на выход cpi dhh,2 /иначе сравнить дес. часов с числом 2 brne mhh /если не равно 2, то на метку mhh clr ehh /если равно, то очистить ед. часов

clr dhh /и десятки часов
rjmp Texit /и на выход mhh: /если дес. часов меньше 2, то
cpi ehh,10 ;сравнить ед. часов с числом 10
brne Texit ;если меньше 10, то на выход
clr ehh /иначе очистить ед. часов
inc dhh /увеличить дес. часов Texit: reti

Разумеется, чтобы этот алгоритм правильно заработал с самого начала, в секции Reset требуется предварительно обнулить все регистры отсчета времени. Затем придется установить в них реальные значения текущего времени (число минут не должно быть больше 59, часов — больше 24 и т. д.). Последнее можно делать вручную — как обычно на часах, с помощью нажатия кнопок. Расписывать такой алгоритм в силу его громоздкости мы здесь не будем. Для интересующихся схему и текст программы часов на базе МК AT90S2313 с подробным их описанием можно найти в моей книге [8]. Для более удобной установки и коррекции времени применяются различные автоматизированные методы, на которых мы остановимся далее.



     
 

Библиотека программиста. 2009.
Администратор: admin@programmer-lib.ru