Osetreni zakmitu (bylo: PIC16F1847 a falesne spinani vstupnich pinu na portu RA)

Radek Benedikt benedikt na lphard.cz
Úterý Květen 28 18:08:02 CEST 2013


> Nechcete sa s tym ´51 vysledkom podelit ?
> Mal by som zaujem.

No dobre, tak se ocituji (z mcu.cz) a mirne doplnim.

Inicializace R7..R4 na zacatku programu tam je jen zminena v
komentarich, v realu se obsah registru nacita z RAM pred volanin cele
rutiny a uklada po volani, inicializace na 0 je klasicka globalni, kdy
init po zapnuti CPU smaze celou nezalohovanou cast RAM...
V R3 je posledni zpracovany (odzakmitovany, referencni) stav vstupu.

Padlo tady osetrovani vice vstupu najednou. Da se na to samozrejme
udelat n-nasobny citac (alias horizontalni, co "radek" to jedno cislo),
pro kazdy bit jeden.
Nebo se na to da pouzit finta, co jsem kdesi okoukal. Jde o paralelni
zpracovani pomoci vertikalnich citacu.
  Posilam ukazku kodu pro odzakmitovani 8-mi spinacu pro 8051ku resp. v
Ccku. Uvedeny kod neni volan prerusenim od tlacitka, ale je volan ve
smycce obsluhujici i dalsi zarizeni.

        .section cpu_top, #alloc
        .global fast_debouce_4_stage_counter
;
; Debouncing with vertical counters - 4 stage - 16 count
;
;R2 in - bouncy_source , out - changed bits
;R3 debounced_source

; Based on an original PIC idea by Scott Dattalo,
; Steve M Taylor and improved by Hans van Pelt.

;R7 vertical_counter_a = 0;
;R6 vertical_counter_b = 0;
;R5 vertical_counter_c = 0;
;R4 vertical_counter_d = 0;

fast_debouce_4_stage_counter:
;;Increment the vertical counter.
; vertical_counter_d = vertical_counter_d ^ ( (vertical_counter_a &
vertical_counter_b) & vertical_counter_c );
    mov a,r7
    anl a,r6
    anl a,r5
    xrl a,r4
    mov r4,a
; vertical_counter_c = vertical_counter_c ^   (vertical_counter_a &
vertical_counter_b);
    mov a,r7
    anl a,r6
    xrl a,r5
    mov r5,a
; vertical_counter_b = vertical_counter_b ^    vertical_counter_a;
    mov a,r7
    xrl a,r6
    mov r6,a
; vertical_counter_a = ~vertical_counter_a;
    mov a,r7
    cpl a
    mov r7,a

;;Clear counters for unchanged inputs.

; t = bouncy_source ^ debounced_source;
    mov a,r2
    xrl a,r3
    mov r2,a

; vertical_counter_a = vertical_counter_a & t;
    ;mov a,r2
    anl a,r7
    mov r7,a
; vertical_counter_b = vertical_counter_b & t;
    mov a,r2
    anl a,r6
    mov r6,a
; vertical_counter_c = vertical_counter_c & t;
    mov a,r2
    anl a,r5
    mov r5,a
; vertical_counter_d = vertical_counter_d & t;
    mov a,r2
    anl a,r4
    mov r4,a

; t = ~t;
    mov a,r2
    cpl a
    mov r2,a
; t = t | vertical_counter_a;
    ;mov a,r2
    orl a,r7
    mov r7,a
; t = t | vertical_counter_b;
    mov a,r2
    orl a,r6
    mov r6,a
; t = t | vertical_counter_c;
    mov a,r2
    orl a,r5
    mov r5,a
; t = t | vertical_counter_d;
    mov a,r2
    orl a,r4
    mov r4,a

; t = ~t;
    mov a,r2
    cpl a
    mov r2,a

; debounced_source = debounced_source ^ t;
    xrl a,r3
    mov r3,a

    ret




Další informace o konferenci Hw-list