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