;**** Программная реализация автоматической перезагрузки T/C0 **********
;*
;* При каждом прерывании от Т/С0 в счетный регистр микроконтроллера
;* AT90S1200 программно загружается значение автоперезагрузки.
;*
;* Тактовая частота микроконтроллера: 12 МГц.
;*  
;***************************************************************************
.nolist
.include "1200def.inc"
.list

.def	STAT	= r15	; Регистр для хранения состояния главной программы
.def	WorkI	= r16	; Рабочий регистр подпрограммы обработки прерывания
.def	WorkH	= r17	; Рабочий регистр главной программы
.def	Count	= r18	; Счетчик прерываний

.equ	Time	= 120	; Количество тактовых импульсов до следующего прерывания
	; 120 импульсов при F = 12 МГц -> интервал 10 мкс

Reset:
rjmp Initial	; Переход к части инициализации
reti	; Внешнее прерывание 0 (не используется)
Timer_Int:		; Прерывание от таймера 0 в AT90S1200
in   STAT,SREG	; Сохраняем флаги главной программы
in   WorkI,TCNT0	; Извлекаем текущее содержимое счетчика
subi WorkI,Time-3	; Устанавливаем таймер по-новому: 
out  TCNT0,WorkI	;   длительность интервала минус время выполнения первых трех команд
in   WorkI,PortD	; Извлекаем содержимое порта D
subi WorkI,$10	; Декрементируем старший полубайт на 1
out  PortD,WorkI	; Выводим новое содержимое порта D
dec  Count	; Декрементируем счетчик интервалов
out  SREG,STAT	; Восстанавливаем старые флаги
reti	; Конец подпрограммы обработки прерывания
Initial:	; Инициализация регистра ввода/вывода
ldi  WorkH,$00	; На всех выводах порта D - лог. 0
out  PortD,WorkH	; Вывод в порт D
ldi  WorkH,$7F	; Загружаем направление передачи данных
out  DDRD,WorkH	; Порт D: все разряды - выходы
ldi  WorkH,-Time	; Загружаем интервал (отрицательный, т.к. счетчик - суммирующий)
out  TCNT0,WorkH	; Инициализируем таймер, T=10мкс при 12МГц
ldi  WorkH,1
out  TCCR0,WorkH	; Запускаем таймер (с тактом сист. синхр.)
ldi  WorkH,2
out  TIMSK,WorkH	; Разрешаем прерывание от таймера
ldi  Count,251
sei	; Общее разрешение прерываний (разряд I)
Haupt:
rjmp Haupt	; Главная программа: ожидание прерывания
