Newsgroup: it.hobby.elettronica.digitale
Titolo: Debounce per PIC

Salve, forse sono stanco e sto studiando troppo, ma non riesco a
implementare una routine di antirimbalzo per un pic16f84 (uno a caso, eh
;-P).
In sostanza, nel LSN di PORTA sono collegati quattro fili che arrivano da
una codifica a diodi, per trasformare una tastiera a 16 tasti in una
tastiera binaria. Ovviamente, ogni volta che premo un tasto sembra di stare
al festival internazionale dell'alea statica /:-00... Ovviamente ognuno dei
bit del nibble cambia quando vuole lui producendo infiniti rimbalzi.
Sistemare le cose via software non mi è riuscito, sin'ora. Le ipotesi verso
le quali mi sono orientato sono le seguenti:
1-trovare qualcosa di già fatto [si è rivelato improponibile]
2-implementare una cosa del tipo: appena un bit cambia di stato allora
aspetta un tanto ( 500 msec bastano?) che la smettano di fare dei rimbalzi e
fai la lettura definitiva, nella speranza che sia quella buona. [tale
speranza sembra, almeno sulla carta, simile a quella di vincere al
superenalotto senza barare]
Mettendo dei condensatori sulle quattro linee che entrano nel pic, e
togliere tutta la parte software relativa può bastare?
Ancora peggio, dei flip flop?????
Grazie alle anime pie che mi compatiranno.
--
CIao
=================================================
Se vuoi visita il mio sito presso:
http://www.elettrox.cjb.net
[lascia stare, non sprecare banda della linea telefonica per questo]
[forse fra qualche settimana sarà un gesto giustificabile, ma ora    ]
[non te lo consiglio proprio]
=================================================

togliere tutta la parte software relativa può bastare?
Assolutamente no. Mettendo condensatori aumenti i tempi di
transizione e la probabilita' di trovare differenze tra i vari bit.
Luigi




 Ancora peggio, dei flip flop?????
C'e' una soluzione piu` semplice dei flip flop, che comunque richiede
sempre un contatto a scambio (interruttore a due posizioni). Usi un aporta
non invertente (ad es un buffer) e con una R fai una retroazione
(positiva). Il sistema diventa bistabile e derimbalza il segnale. Pero` mi
pare che per un sistema con matrice a diodi non si possa fare. 
 
Ciao
Franco

 bit del nibble cambia quando vuole lui producendo infiniti rimbalzi.
Io faccio sempre cosi': mi servo innanzitutto di un flag, che utilizzo 
per ricordarmi se il tasto era gia' premuto, e di un file che uso come 
contatore.
- Se il tasto non e' premuto azzero il flag e reinizializzo il 
contatore.
- Se il tasto e' premuto e il flag e' zero inizio a decrementare un 
contatore... se arrivo a zero non era un rimbalzo, quindi setto il flag 
e faccio quello che devo fare.
Ciao!
---
    _/
   _/                                     /"\
  _/     _/_/_/ _/_/_/ _/_/_/             \ /
 _/     _/  _/ _/     _/_/                 X  ASCII RIBBON CAMPAIGN
_/_/_/ _/_/_/ _/     _/_/_/               / \ AGAINST HTML MAIL
Lorenzo Raschi
Togliere #NOSPAM# dall'indirizzo email per rispondermi
ICQ #48357220
Fidonet: 2:332/403.0
PGP Key Fingerprint = 71 10 68 82 50 7B 6F C7  A2 07 26 3D 10 60 45 72
Per favore non utilizzate ne' tag html ne' accentate. Grazie.

Un esempio, matrice 4 X 2.
;---------------------------------------------------------------------------
-
;  Descrizione delle locazioni RAM 0
;---------------------------------------------------------------------------
-
        CBLOCK
                Key_col         ;Maschera della colonna corrente
                Key_read        ;Registro per la lettura dei tasti
                Key_save        ;Tasto letto memorizzato
                Key_cnt         ;Contatore per il tasto in ripetizione
                Key_out         ;Uscita tasti
        ENDC
;***************************************************************************
***
; SUBRUOTINE:   Ini_Key
;
; Operazione:   Inizializzazione delle variabili
;
; Chiamata:     call    Ini_Key
;
; Chiamata da:  ram_0   Lavora in:      prom_0          Stack:   1
; Ritorna:      ram_0   Usa Reg:        ---
;***************************************************************************
***
Ini_Key         MOVLWF  h'10',Key_col
                clrf    Key_read
                clrf    Key_cnt
                clrf    Key_save
                return
;***************************************************************************
***
; SUBRUOTINE:   Key_scan
;
; Operazione:   RUOTINE SCANSIONE TASTIERA
;               C=0 & Z=0       E' stato premuto un tasto ed e' riconosciuto
;                               valido, il tasto e' in Key_out
;               C=0 & Z=1       Nessun tasto valido. Ruotine in scansione
;                               o in attesa di ripetizione
;               C=1 & Z=1       Tutti i tasti rilasciati, l'ultimo tasto
;                               rilasciato e' in Key_out
;               La ruotine deve essere chiamata almeno ogni 10 mSec.
;               Ritorna in Key_out i tasti letti, ogni bit rappresenta un
;               tasto 1=chiuso. C'e' un tasto premuto valido in Key_out
;               quando Z=0.L'ultimo tasto rilasciato e' in Key_out.
;               C=1 significa che tutti i tasti sono stati rilasciati.
;
; Chiamata:     call    Key_scan
;               BC      --      ;Salta se tutti i tasti sono stati
rilasciati
;               BZ      --      ;Salta se nessun tasto e' premuto
;
; Restituisce:  Z=1             ;Nessun tasto premuto
;               Z=0             ;Almeno un tasto premuto
;               C=1             ;Tutti i tasti rilasciati
;
; Chiamata da:  ram_0   Lavora in:      prom_0          Stack:  1
; Ritorna:      ram_0   Usa Reg:        ---             FSR:    ---
;***************************************************************************
***
;----------------------------------------------------------------------
        ; Scansione colonne
;----------------------------------------------------------------------
Key_scan
        movlw   0xF0                    ;\Poni a tutti "1" il bus a 4 fili
        iorwf   LCD_DATA                ;/
        comf    Key_col,w               ;
        andwf   LCD_DATA                ;Attiva colonna per tastiera
        nop                             ;\
        nop                             ;|
        nop                             ;|Attendi 1 uSec
        nop                             ;|
        nop                             ;/
        movfw   PORTC                   ;\Leggi i pulsanti della colonna
        andlw   b'00000011'             ;/
        iorwf   Key_read                ;Memorizzali in Key_read
        BSS     Key_col,7,Key_1         ;Salta se e' l'ultima colonna
        clrc                            ;\
        rlf     Key_read                ;|Ruota di due posizioni Key_read
        rlf     Key_read                ;/
        rlf     Key_col                 ;Ruota Key_col per la prossima
        setz                            ;\
        clrc                            ;|Nessun tasto valido C=0 & Z=1
        return                          ;/
        ;===============================;
;----------------------------------------------------------------------
        ; SONO STATI LETTI TUTTI GLI 8 PULSANTI
;----------------------------------------------------------------------
Key_1   incf    Key_cnt                 ;Incrementa contatore ripetizione
        MOVLWF  h'10',Key_col           ;Riparti dalla prima colonna
        comf    Key_read,w              ;\Salta se nessun tasto e' premuto
        BZ      Key_5                   ;/
        ;...............................;Almeno un tasto e' premuto
        xorwf   Key_save                ;\Salta se e' diverso dal salvato
        BNZ     Key_4                   ;/(W e' salvo)
        movwf   Key_save                ;Salva complemento Key_read
        ;...............................;Tasto uguale al precedente
        btfss   F_KeyRip                ;\Azzera Key_cnt se
        clrf    Key_cnt                 ;/non deve ripetere
        BSS     F_K_Rip, Key_3          ;Salta se in ripetizione
        BSFEL   Key_cnt,KEY_ATR,Key_6   ;Salta se trascorso tempo di attesa
        b       Key_7                   ;
        ;...............................;Salva tasto
Key_4   movwf   Key_save                ;Salva complemento Key_read
        bcf     F_K_Rip                 ;F_K_rip=0
        b       Key_2                   ;Salta a tasto valido
        ;..............................<;Nessun tasto premuto
Key_5   bcf     F_K_Rip                 ;F_K_Rip=0
        clrf    Key_cnt                 ;Key_cnt=0
        clrf    Key_read                ;Azzera registro di lettura
        MOVFWF  Key_save,Key_out        ;Tasto precedente in Key_out
        clrf    Key_save                ;Azzera registro di salvataggio
        setc                            ;\
        setz                            ;|Nessun tasto premuto C=1 & Z=1
        return                          ;/
        ;==============================<;Ritorna
Key_7   clrf    Key_read                ;Azzera registro di lettura
        clrc                            ;\Nessun tasto valido C=0 & Z=1
        setz                            ;|scansione o attesa ripetizione
        return                          ;/
        ;==============================<;Tasto in ripetizione progressiva
Key_3   BSFNEL  Key_cnt,KEY_RIP,Key_7   ;Ogni KEY_RIP tasto valido
        ;..............................<;Tasto in ripetizione (1ma volta)
Key_6   bsf     F_K_Rip                 ;F_K_Rip=1
        ;..............................<;Tasto valido
Key_2   clrf    Key_cnt                 ;Key_cnt=0
        clrf    Key_read                ;Azzera registro di lettura
        ;...............................;
        MOVFWF  Key_save,Key_out        ;Tasto in Key_out
        clrc                            ;\
        clrz                            ;|Tasto valido C=0 & Z=0
        return                          ;/
Ciao Andrea

Un grazie enorme per l'aiuto. Mi ci sono messo ieri sera e penso di esserci
riuscito.
Grazie anche ad Andrea per il codice: adesso me lo studio per bene.
CIao
=================================================
Se vuoi visita il mio sito presso:
http://www.elettrox.cjb.net
[lascia stare, non sprecare banda della linea telefonica per questo]
[forse fra qualche mese sarà un gesto giustificabile, ma ora    ]
