org 0h jmp START rin_currIn equ 80h ; adres wejsciowy p1 (1 bajt wejść = 8 wejść DI) rin_fltInit equ 3 ; ilość odczytów do eliminacji drgań styków rin_prevIn equ 38h ; ostatni chwilowy stan wejsciowy rin_fltIn equ 39h ; aktualny przefiltrowany stan wejcia rin_fltBuf equ 30h ; bufor 8-miu licznikow (30h-37h) base_time equ 100 tick_base equ 20h.0 tick_read_in equ 20h.1 tick_time equ 20h.2 R_max equ 5; R equ r2 P_max equ 20; Plow equ r0 phigh equ r3 running equ 20h.3 rin_fltRise equ 21h weStart equ rin_fltrise.0 weStop equ rin_fltrise.1 weReset equ rin_fltrise.2 rin_fltPrev equ 3Ah seconds equ 22h;90h ;P1 org 0Bh INT_T0: ; obsługa przerwania od T0 clr tr0 ; wyłączenie timera mov th0, #high(65535-base_time) ; załadowanie mov tl0, #low(65535-base_time) ; wart. pocz. setb tr0 ; załączenie timera push psw ; zachowanie psw setb tick_base DJNZ R, NOT_SET_READ_IN SETB tick_read_in mov R, #R_max NOT_SET_READ_IN: DJNZ Plow, NOT_SET_TICK_TIME mov a, Phigh jnz NOT_SET_TICK_TIME_IN SETB tick_time mov Phigh, #high(P_max) mov Plow, #low(P_max) jmp NOT_SET_TICK_TIME NOT_SET_TICK_TIME_IN: DEC Phigh mov Plow, #255 NOT_SET_TICK_TIME: pop psw ; przywrócenie psw reti ; powrót do pętli głównej ;----------------------------------------------------------------------------------------- org 80h START: ;mov sp, #30h ; ustawienie wsk. stosu mov sp, #60h-1 clr ea ; blokada przerwań clr tr0 ; wył. timera mov tmod, #00000001b; t0 --> mode=1, c/t=0, gate=0 mov th0, #high(0FFFFh-base_time) ; ustaw T0 na mov tl0, #low(0FFFFh-base_time) ; ilCykli ; inicjalizacja !!!! CLR running mov R, #R_max mov Phigh, #high(P_max) mov Plow, #low(P_max) ;CLR rin_fltprev ;CLR rin_fltin ;CLR rin_fltrise setb tr0 ; start timera setb et0 ; zezwolenie na jego przerwanie setb ea ; globalne zezw. przerwań LOOP: JNB tick_read_in, NOT_READ_IN call read_in CLR tick_read_in MOV a, rin_fltprev CPL a ANL a, rin_fltin ;CPL a ;oszukamy mov rin_fltrise, a mov rin_fltPrev, rin_fltin NOT_READ_IN: JNB tick_time, NOT_TICK_TIME CLR tick_time JNB running, NOT_TICK_TIME INC seconds NOT_TICK_TIME: JNB weStart, NOT_START SETB running mov Phigh, #high(P_max) mov Plow, #low(P_max) NOT_START: JNB weStop, NOT_STOP CLR running NOT_STOP: JNB weReset, NOT_RESET CLR running mov seconds, #0 mov Phigh, #high(P_max) mov Plow, #low(P_max) NOT_RESET: mov rin_fltRise, #0 ;CLR rin_fltRise jnb tick_base, NOT_ZERO_BIT cpl seconds.7 ;CPL P1.7 ;zaneguj najstarszy bit seconds gdy tick_base=1 ;zapisz seconds na wyjsciach (write_out) NOT_ZERO_BIT: mov a, seconds cpl a mov p1, a CLR tick_base jmp LOOP ;--------------------------------------------------------------- ;mov a,p0 ; odczyt wejść ; cpl a ; mov c, acc.0 ; weStart := acc.0 ; mov weStart, c ; mov c, acc.2 ; weReset := acc.2 ; mov weReset, c ; jnb weReset, nieReset ; reset == 1 ? ; call RESETUJ ; tak ; jmp zapisWy ;nieReset: ; jnb weStart, nieStart ; start == 1 ? ; jnb tick1s, zapisWy ; i tick1s==1 ? ; clr tick1s ; inc r4 ; jmp zapisWy ;nieStart: ; mov r3, #0 ; stop stopera, zerowanie licznika 50ms ;clr tick1s ;zapisWy: ; mov a, r4 ; zapis sekund na wyjścia ; cpl a ; mov p1,a ;------------------------------------------------ read_in: mov a, rin_currIn ;przeniesienie aktualnego stanu wejsc cpl a; mov r7, a ; mov a, r7 XRL a, rin_prevIn ; wyznaczenie bitów które sie zmienily mov r6, a mov b, #10000000b mov r5, #8 ; licznik petli mov r1, #rin_fltBuf+8 rin_1: DEC r1 mov a, r6 ANL A, B jz RIN_2 ;SKOK JESKI ZERO jesli nie nastopila zmiana na wejsciu mov @r1, #rin_fltinit jmp rin_3 RIN_2: mov a, @r1 jz rin_4 dec @r1 rin_4: mov a, @r1 jnz rin_3 mov a, b ; wczytuje maske cpl a ; odwraca wszystkie bity anl a, rin_fltIn ;wczytuje wszysktie oprócz aktualnie zmienianego mov r4, a ; zachowaj w r4 mov a, b ; wczytaj maske anl a, r7 ; akualny stan badanego wejscia orl a, r4 ; zsumowanie ze starym mov rin_fltin, a jmp rin_3 rin_3: mov a, b rr a mov b, a djnz r5, rin_1 mov rin_prevIn, r7 ; przeniesienie obecnego stano jako stan poprzedni r7 zamiast rin_currIn mov a, rin_fltIn ; skopiuj aktualnyu stan wejsc ret END