ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Суббота
29 июня
220000 Топик полностью
mazur (05.11.2010 11:24, просмотров: 179) ответил Vit на для кнопок жесткий риалтайм нафиг нужен. а вот насчёт мягкого риалтайма уже рассказывал, но видно не куриццо. оттого и такие страшные цифры по ОЗУ
Похоже я все-таки что-то не понял. 
"такие страшные цифры по ОЗУ"
Вот моя реализация таймера. Пока простенько, зато надежно. Глобальный и локальные таймеры реализую позже. Все равно не могу понять, зачем на каждую кнопу таймер. Если это можно сделать проще. Допустим нужно ввести последовательность. Нажимаем кнопу, взводим ОДИН таймер, нажимаем следующую, если время еще не вышло, сброс-взвод. И т.д. Если время вышло (следующая кнопа не нажата вовремя), все заново. ; Äîäåëàòü 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 метка