Похоже я все-таки что-то не понял.
; Äîäåëàòü Set_Timer
; #if (SELECT_TIMER==SMALL_TIMER)
; #elif (SELECT_TIMER==LONG_TIMER)
; ldi r16,4
; #endif
; #if (SELECT_TIMER==LONG_TIMER)
; lds r16,System_Timer_2
; adc r16,Data_H
; st X+,r16
; lds r16,System_Timer_3
; adc r16,Data_H
; st X+,r16
; #endif
#define SELECT_TIMER SMALL_TIMER
#define SMALL_TIMER 0
#define LONG_TIMER 1
.dseg
System_Timer:
System_Timer_0:
.byte 1
System_Timer_1:
.byte 1
System_Timer_2:
.byte 1
System_Timer_3:
.byte 1
Timers:
#if SELECT_TIMER==SMALL_TIMER
.equ Timers_Size = 10*2
#elif SELECT_TIMER==LONG_TIMER
.equ Timers_Size = 10*4
#endif
.byte Timers_Size
.equ T_Send_Char = 0
.equ T_Check_Enc_Cnt = 1
.equ T_Process_Keys = 2
.equ T_Period_Repeat = 3
.equ T_Blink_Display = 4
.equ T_Off_Blink_Display = 5
.cseg
.macro Set_Timer
ldi STReg,@0
ldi Data_H,High(@1)
ldi Data_L,Low(@1)
rcall Set_Timer_
.endmacro
Set_Timer_:
push r16
push XL
push XH
cli
LDIX Timers
ldi r16,2
mul STReg,r16
addw X,r0,r1
lds r16,System_Timer_0
add r16,Data_L
st X+,r16
lds r16,System_Timer_1
adc r16,Data_H
st X,r16
pop XH
pop XL
pop r16
reti
.macro Check_Time_Out
ldi STReg,@0
rcall Check_Time_Out_
.endmacro
Check_Time_Out_:
push r16
push r17
push XL
push XH
cli
set
LDIX Timers
ldi r16,2
mul STReg,r16
addw X,r0,r1
lds r16,System_Timer_0
ld r17,X+
cp r16,r17
lds r16,System_Timer_1
ld r17,X+
cpc r16,r17
#if SELECT_TIMER==LONG_TIMER
lds r16,System_Timer_2
ld r17,X+
cpc r16,r17
lds r16,System_Timer_3
ld r17,X+
cpc r16,r17
#endif
brlo Check_Time_Out_End
clt
Check_Time_Out_End:
pop XH
pop XL
pop r17
pop r16
reti
TIMER2_COMP:
wdr
push r16
in r16,SREG
push r16
push XL
push XH
in r16,OCR2
subi r16,-250
out OCR2,r16
LDIX System_Timer
ld r16,X
subi r16,Low(-1)
st X+,r16
ld r16,X
sbci r16,BYTE2(-1)
st X+,r16
#if SELECT_TIMER==LONG_TIMER
ld r16,X+
sbci r16,BYTE3(-1)
st X+,r16
ld r16,X+
sbci r16,BYTE4(-1)
st X+,r16
#endif
TIMER2_COMP_End:
pop XH
pop XL
pop r16
out SREG,r16
pop r16
reti
Set_Timer T_Process_Keys,20
Check_Time_Out T_Process_Keys
brts метка
brtc метка
"такие страшные цифры по ОЗУ"Вот моя реализация таймера. Пока простенько, зато надежно. Глобальный и локальные таймеры реализую позже. Все равно не могу понять, зачем на каждую кнопу таймер. Если это можно сделать проще. Допустим нужно ввести последовательность. Нажимаем кнопу, взводим ОДИН таймер, нажимаем следующую, если время еще не вышло, сброс-взвод. И т.д. Если время вышло (следующая кнопа не нажата вовремя), все заново.
-
- я тоже не могу понять, зачем много таймеров. Vit(80 знак., 05.11.2010 11:33)