Обновлённый Евгением исходник:
#ifndef _FBD41_OCRO
#define _FBD41_ FBD41
#message define FBD41 Countert milliseconds (Timer 0)
#ifdef _Timer0_
#error redeclared Timer0 __FILE__
#endif
#define _Timer0_
.SET TimerCounter0_DATA_SIZE = 6
.SET TimerCounter0_DATA_RAM = FBD_DATA_RAM //Глобальные данные для TimerCounter0
.SET FBD_DATA_RAM = TimerCounter0_DATA_RAM + TimerCounter0_DATA_SIZE //Выделяем память для TimerCounter0
// память:
// 1 байта - TCNT0
// 1 байта - TIMSK
iOVF0addr: ;Прерывание по таймеру
LDS iB, TimerCounter0_DATA_RAM+5 ;Задаем значение таймера
out TCNT0, iB ;Задаем значение таймера
in iB, SREG ;Сохраняем регистр флагов
LDS iA, TimerCounter0_DATA_RAM ;мс в текущем цикле
add iA, One ;мс в текущем цикле
STS TimerCounter0_DATA_RAM, iA ;мс в текущем цикле
out SREG, iB ;Востанавливаем регистр флагов
reti
FBD41_init:
rcall Read_cfg ;Период прерывания
STS TimerCounter0_DATA_RAM+5, Addr_Data ;Период прерывания
rcall Read_cfg ;Делитель
#if defined( _TN13ADEF_INC_)||defined(_TN13DEF_INC_)||defined(_TN25DEF_INC_)||defined(_TN45DEF_INC_)||defined(_TN85DEF_INC_)||defined(_M328PDEF_INC_)
.equ _TCCR0=TCCR0B
#else
.equ _TCCR0=TCCR0
#endif
#if defined( _TN13ADEF_INC_)||defined(_TN13DEF_INC_)||defined(_M328PDEF_INC_)
.equ _TIMSK=TIMSK0
#else
.equ _TIMSK=TIMSK
#endif
out _TCCR0, Addr_Data ;Делитель
UIN A, _TIMSK ;Разрешаем прерывание по переполнению !!!
ori A, 1<<TOIE0 ;Разрешаем прерывание по переполнению
UOUT _TIMSK, A ;Разрешаем прерывание по переполнению
ret;
FBD41_run:
ADIW YL, 2 ;Пропускаем команды инициализации
cli ;Запрещаем прерывания
LDS A, TimerCounter0_DATA_RAM ;мс накопленные за цикл
STS TimerCounter0_DATA_RAM, Zero ;мс накопленные за цикл, обнуляем
sei ;Разрешаем прерывания
LDS B, TimerCounter0_DATA_RAM+1 ;Обновляем счетчик милисекунд
add B, A ;Обновляем счетчик милисекунд
STS TimerCounter0_DATA_RAM+1, B ;Обновляем счетчик милисекунд
LDS B, TimerCounter0_DATA_RAM+2 ;Обновляем счетчик милисекунд
adc B, Zero ;Обновляем счетчик милисекунд
STS TimerCounter0_DATA_RAM+2, B ;Обновляем счетчик милисекунд
LDS B, TimerCounter0_DATA_RAM+3 ;Обновляем счетчик милисекунд
adc B, Zero ;Обновляем счетчик милисекунд
STS TimerCounter0_DATA_RAM+3, B ;Обновляем счетчик милисекунд
LDS B, TimerCounter0_DATA_RAM+4 ;Обновляем счетчик милисекунд
adc B, Zero ;Обновляем счетчик милисекунд
STS TimerCounter0_DATA_RAM+4, B ;Обновляем счетчик милисекунд
ret;
FBD41:
.db 2, 0 //Размер FBD блока, необходимая оперативная память
.dw FBD41_run, FBD41_init
Timer_Diff:
lds ZL, TimerCounter0_DATA_RAM+1 //Счетчик Lw
lds ZH, TimerCounter0_DATA_RAM+2 //Счетчик Hg
sub ZL, Uz1L //Разница времени
sbc ZH, Uz1H //Разница времени
// brcc Timer_Diff_end
// neg ZL //Меняем знак
// com ZH //Меняем знак
//Timer_Diff_end:
ret
#else
#error redeclared FBD41 __FILE__
#endif