Facebook
From Speedy Cat, 7 Years ago, written in asymptote.
Embed
Download Paste or View Raw
Hits: 302
  1.         org 0h
  2.         jmp START
  3.  
  4. rin_currIn      equ 80h ; adres wejsciowy p1 (1 bajt wejść = 8 wejść DI)
  5. rin_fltInit     equ 3   ; ilość odczytów do eliminacji drgań styków
  6. rin_prevIn      equ 38h ; ostatni chwilowy stan wejsciowy
  7. rin_fltIn       equ 39h ; aktualny przefiltrowany stan wejcia
  8. rin_fltBuf      equ 30h         ; bufor 8-miu licznikow (30h-37h)
  9. base_time       equ 100
  10. tick_base       equ 20h.0
  11. tick_read_in    equ 20h.1
  12. tick_time       equ 20h.2
  13. R_max           equ 5;
  14. R               equ r2
  15. P_max           equ 20;
  16. Plow            equ r0
  17. phigh           equ r3
  18. running         equ 20h.3
  19. rin_fltRise     equ 21h
  20. weStart         equ rin_fltrise.0
  21. weStop          equ rin_fltrise.1
  22. weReset         equ rin_fltrise.2
  23. rin_fltPrev     equ 3Ah
  24. seconds         equ 22h;90h     ;P1
  25.  
  26. org 0Bh
  27.  
  28. INT_T0: ; obsługa przerwania od T0
  29.         clr     tr0             ; wyłączenie timera
  30.         mov     th0, #high(65535-base_time) ; załadowanie
  31.         mov     tl0, #low(65535-base_time)  ; wart. pocz.
  32.         setb    tr0             ; załączenie timera
  33.         push    psw             ; zachowanie psw
  34.  
  35.         setb tick_base
  36.         DJNZ R, NOT_SET_READ_IN
  37.         SETB tick_read_in
  38.         mov R, #R_max
  39. NOT_SET_READ_IN:
  40.  
  41.         DJNZ Plow, NOT_SET_TICK_TIME
  42.         mov a, Phigh
  43.         jnz  NOT_SET_TICK_TIME_IN
  44.         SETB tick_time
  45.         mov Phigh, #high(P_max)
  46.         mov Plow, #low(P_max)
  47.         jmp NOT_SET_TICK_TIME
  48. NOT_SET_TICK_TIME_IN:
  49.         DEC Phigh
  50.         mov Plow, #255
  51. NOT_SET_TICK_TIME:
  52.         pop     psw             ; przywrócenie psw
  53.         reti                    ; powrót do pętli głównej
  54.  
  55.        
  56. ;-----------------------------------------------------------------------------------------
  57.         org 80h
  58. START:
  59.         ;mov     sp, #30h        ; ustawienie wsk. stosu
  60.         mov     sp, #60h-1
  61.         clr     ea              ; blokada przerwań
  62.         clr     tr0             ; wył. timera
  63.         mov     tmod, #00000001b; t0 --> mode=1, c/t=0, gate=0
  64.  
  65.         mov     th0, #high(0FFFFh-base_time) ; ustaw T0 na
  66.         mov     tl0, #low(0FFFFh-base_time)  ;   ilCykli
  67.  
  68.         ; inicjalizacja !!!!
  69.         CLR running
  70.         mov R, #R_max
  71.         mov Phigh, #high(P_max)
  72.         mov Plow, #low(P_max)
  73.         ;CLR rin_fltprev
  74.         ;CLR rin_fltin
  75.         ;CLR rin_fltrise
  76.        
  77.  
  78.         setb    tr0             ; start timera
  79.         setb    et0             ; zezwolenie na jego przerwanie
  80.         setb    ea              ; globalne zezw. przerwań
  81.  
  82. LOOP:  
  83.         JNB tick_read_in, NOT_READ_IN
  84.         call read_in
  85.         CLR tick_read_in
  86.         MOV a, rin_fltprev
  87.         CPL a
  88.         ANL a, rin_fltin
  89.         ;CPL a ;oszukamy
  90.         mov rin_fltrise, a
  91.         mov rin_fltPrev, rin_fltin
  92. NOT_READ_IN:
  93.  
  94.         JNB tick_time, NOT_TICK_TIME
  95.         CLR tick_time
  96.         JNB running, NOT_TICK_TIME
  97.         INC seconds
  98. NOT_TICK_TIME:
  99.         JNB weStart, NOT_START
  100.         SETB running
  101.         mov Phigh, #high(P_max)
  102.         mov Plow, #low(P_max)
  103. NOT_START:
  104.         JNB weStop, NOT_STOP
  105.         CLR running
  106. NOT_STOP:
  107.         JNB weReset, NOT_RESET
  108.         CLR running
  109.         mov seconds, #0
  110.         mov Phigh, #high(P_max)
  111.         mov Plow, #low(P_max)
  112. NOT_RESET:
  113.         mov rin_fltRise, #0
  114.         ;CLR rin_fltRise
  115.         jnb tick_base, NOT_ZERO_BIT
  116.         cpl seconds.7
  117.         ;CPL P1.7
  118.         ;zaneguj najstarszy bit seconds gdy tick_base=1
  119.         ;zapisz seconds na wyjsciach (write_out)
  120. NOT_ZERO_BIT:
  121.         mov a, seconds
  122.         cpl a
  123.         mov p1, a
  124.         CLR tick_base
  125.         jmp LOOP
  126. ;---------------------------------------------------------------
  127.         ;mov            a,p0    ; odczyt wejść
  128.     ;    cpl     a
  129.  
  130.    ;     mov     c, acc.0        ; weStart := acc.0
  131.    ;     mov     weStart, c
  132.    ;     mov     c, acc.2        ; weReset := acc.2
  133.     ;    mov     weReset, c
  134.  
  135.     ;    jnb     weReset, nieReset ; reset == 1 ?
  136.    ;     call    RESETUJ           ; tak
  137.    ;     jmp            zapisWy
  138. ;nieReset:
  139.  
  140.         ;       jnb     weStart, nieStart ; start == 1 ?
  141.      ;   jnb     tick1s, zapisWy  ; i tick1s==1 ?
  142.     ;    clr     tick1s
  143.       ;  inc     r4
  144.         ;       jmp             zapisWy
  145.  
  146. ;nieStart:
  147.        ; mov     r3, #0    ; stop stopera, zerowanie licznika 50ms
  148.         ;clr     tick1s
  149.  
  150. ;zapisWy:
  151.       ;  mov     a, r4     ; zapis sekund na wyjścia
  152.        ; cpl     a
  153.        ; mov     p1,a
  154. ;------------------------------------------------
  155.  
  156.  
  157. read_in:
  158.         mov a, rin_currIn ;przeniesienie aktualnego stanu wejsc
  159.         cpl a;
  160.         mov r7, a
  161.  ;       mov a, r7
  162.         XRL a, rin_prevIn        ; wyznaczenie bitów które sie zmienily
  163.         mov r6, a
  164.         mov b, #10000000b
  165.         mov r5, #8 ; licznik petli
  166.         mov r1, #rin_fltBuf+8
  167. rin_1:
  168.         DEC r1
  169.         mov a, r6
  170.         ANL A, B
  171.         jz RIN_2 ;SKOK JESKI ZERO jesli nie nastopila zmiana na wejsciu
  172.         mov @r1, #rin_fltinit
  173.         jmp rin_3
  174. RIN_2:
  175.         mov a, @r1
  176.         jz rin_4
  177.         dec @r1
  178. rin_4:
  179.         mov a, @r1
  180.         jnz rin_3
  181.  
  182.         mov a, b ; wczytuje maske
  183.         cpl a   ; odwraca wszystkie bity
  184.         anl a, rin_fltIn ;wczytuje wszysktie oprócz aktualnie zmienianego
  185.         mov r4, a ; zachowaj w r4
  186.         mov a, b  ; wczytaj maske
  187.         anl a, r7       ; akualny stan badanego wejscia
  188.         orl a, r4       ; zsumowanie ze starym
  189.         mov rin_fltin, a
  190.         jmp rin_3
  191. rin_3:
  192.         mov a, b
  193.         rr a
  194.         mov b, a
  195.         djnz r5, rin_1
  196.         mov rin_prevIn, r7 ; przeniesienie obecnego stano jako stan poprzedni r7 zamiast rin_currIn
  197.         mov a, rin_fltIn          ; skopiuj aktualnyu stan wejsc
  198.         ret
  199.         END
  200.