Newsgroup: it.hobby.elettronica.digitale
Titolo: PIC: leggere 9 tasti con 3 cavi: reti RC e wake pull-up

Ciao a tutto il NG. Ho costruito un programma per la lettura di keypad a 9
tasti con solo 3 cavi + massa.
Funziona secondo principio RC: quando ogni colonna è interpretata, ogni riga
(a cui è allacciata una rete RC di valore diverso) risponde con un impulso a
livello basso (mi aiuto col weak pull-up dei PIC su Port_b) di durata
variabile per riga.
Lo ammetto, non è tutta farina del mio sacco: ho "rubato" l'idea a
Elettronica In. Però il software me lo sono costruito tutto di sana pianta
(sono molto gelosi dei loro soft..) ma le routine fanno schifo: conto il
tempo di durata degli stati bassi (RC) che non è stabile, cioè non è uguale
ogni volta che si preme lo stesso tasto: ciò mi crea non pochi problemi e un
sacco di inaffidabilità.
Tutti i problemi penso stiano nel fatto che non riesco a scaricare il
condensatore dopo la sua carica e lettura, fregando i tempi o addirittura ad
annullarli (il condensatore rimane carico)
A tal scopo, chiedo: qualcuno ha già utilizzato questo sistema? magari mi
può dare qualche dritta?
Sarò lieto di fornire il programma a chi vorrà collaborare/aiutare !
E' lecito utilizzare, in mezzo ad un programma, nuovamente il comando TRIS
per cambiare un ingresso in un'uscita è forzarne lo stato ? (so che dopo il
tris devo riabilitare il pull-up)
Ciao e grazie.
Gurz.
Togli le X....X se vuoi rispondermi in privato.
(no spam please)
ICQ 98282781
-- 
Posted from 
smtp1.libero.it
 [193.70.192.51] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 ha scritto nel messaggio
news:002501c0be10$157de420$0a02020a@xxxx...


L'idea è ottima :-), ti ringrazio, utilizzi solo 3 linee, e per giunta la
lettura e sicura... .
Ho già buttato giù un algoritmo veloce,
E per i rimbalzi come hai fatto? Usi forse qualche ritardo dopo la lettura
di un pulsante?
Ciao e grazie.
Gurz.
Togli le X....X se vuoi rispondermi in privato.
(no spam please)
ICQ 98282781 "nebbia"
-- 
Posted from 
smtp2.libero.it
 [193.70.192.52] 


 ha scritto nel messaggio
news:000c01c0bf51$61e49380$0a02020a@xxxx...


Ok, tutto risolto, ho approntato una basetta volante ed è tutto OK. Il
software mi ha creato qualche problema, ma soprattutto il rumore (e ci ho
messo un po' a capire che era quello il principale
problema...l'oscilloscopio mi è stato di grande aiuto), di cui non avevo
tenuto conto.
Ho dovuto invertire (con un transistor emettitore comune e dopo aver
modificato il software) il segnale di uscita del 4017, perchè nella lettura
dell'ingresso, il PIC mi tirava dentro un sacco di disturbi in lettura, sul
comune dei pulsanti (prima, leggevo se uno stato passava da basso ad alto),
tali da considerare uno stato alto permanente ciò che doveva essere uno
stato basso di attesa. Proverò a costruire qualche routine per
l'antirimbalzo e la rilettura. Forte come meccanismo, conoscevo solo la
lettura colonne-righe !!! Grazie !!


 ha scritto nel messaggio
news:000301c0c1fb$fda25440$0a02020a@xxxx...


Ti mando le routine (scusate la lunghezza del messaggio ma penso possa
essere di interesse generale):
;***************************************************************************
**
;* Routine di acquisizione della pressione di uno dei sette tasti, questa
*
;* routine esegue il debounce della tastiera ed inoltre esegue la gestione
*
;* dell'autorepeat.
*
;***************************************************************************
**
;
   MOVF DEBOUNCE,F ;Se Debounce non è =0 decrementalo
 BTFSS STATUS,Z
 DECF DEBOUNCE,F
 CALL KEY_SCAN ;Acquisisci tasto premuto
 MOVWF NEW_KEY
 MOVF NEW_KEY,F ;E' premuto un tasto ?
 BTFSC STATUS,Z ;Se no vai alla routine di visualizzazione
 GOTO OUT_DSP
 MOVF DEBOUNCE,F ;Se si, ricontrolla se debounce vale 0 ?
 BTFSS STATUS,Z        ;Se si dai preset a debounce ed a repeat
 GOTO KEY_REPEAT
 MOVLW N_DEBOUNCE ;preset debounce
 MOVWF DEBOUNCE
 MOVLW N_REPEAT ;preset repeat
 MOVWF REPEAT
 GOTO DO_KEY
KEY_REPEAT
 MOVLW N_DEBOUNCE ;Se no dai preset a debounce
 MOVWF DEBOUNCE
 MOVF REPEAT,F ;repeat è a 0 ?
 BTFSS STATUS,Z
 GOTO NO_KEY  ;NO, allora non dare tasto
 MOVLW REPEAT_FREQ ;SI, allora:
 MOVWF REPEAT  ;           ricarica REPEAT con REPEAT_FREQ
    ;           dai codice tasto
DO_KEY
 MOVF NEW_KEY,W
    ; TABELLA DI SALTO PER LE ROUTINE DI SERVIZIO
 ADDWF PCL,F  ;                DEI  TASTI
 GOTO NO_KEY
 GOTO  KEY_1 ; + erogazione
 GOTO KEY_2 ; - erogazione
 GOTO KEY_3 ; + temp
 GOTO KEY_4 ; - temp
 GOTO KEY_5 ; set/misura
 GOTO KEY_6 ; start
 GOTO KEY_7 ; stop
  ;
 GOTO NO_KEY
NO_KEY
 DECF REPEAT,F ; Decrementa REPEAT senza codice tasto
KEY_SCAN
 CALL KEY_SCAN0
 MOVWF W_SAVING
 CALL KEY_SCAN0
 XORWF W_SAVING,F
 BTFSS STATUS,Z
 RETLW 0
 RETURN
KEY_SCAN0
 CLRWDT   ;Questa routine esegue la scansione dei sette tasti e
 BSF PORTB,KEY_RES ;restituisce nel registro W un numero da 1 a 7 che
 BCF PORTB,DQ ;identifica il tasto trovato premuto. Restituisce in W
 BCF PORTB,KEY_RES ;uno zero se nessun tasto è premuto.
 MOVLW .8
 MOVWF _N
SCAN_LOOP
 BCF PORTB,CLK
 NOP
 NOP
 BSF PORTB,CLK
 BCF STATUS,C
 NOP
 NOP
 NOP
 NOP
 NOP
 NOP
 NOP
 NOP
 NOP
 NOP
 NOP
 NOP
 NOP
 NOP
 NOP
 BTFSC PORTB,KEY_IN
 BSF STATUS,C
 RRF _N1,F
 DECFSZ _N,F
 GOTO SCAN_LOOP
 BSF PORTB,KEY_RES
 MOVF _N1,F
 BTFSC STATUS,Z
 RETLW 0  ; Se nessun tasto è premuto ritorna con 0
 MOVLW 60H  ; DETECT TASTO
XORWF _N1,W
 BTFSC STATUS,Z
 RETLW 1
 MOVLW 30H  ; DETECT TASTO
 XORWF _N1,W
 BTFSC STATUS,Z
 RETLW 2
 MOVLW 06H  ; DETECT TASTO .
 XORWF _N1,W
 BTFSC STATUS,Z
 RETLW 3
 MOVLW 84H  ; DETECT TASTO .
 XORWF _N1,W
 BTFSC STATUS,Z
 RETLW 4
 MOVLW 04H  ; DETECT
XORWF _N1,W
 BTFSC STATUS,Z
 RETLW 5
 MOVLW 01H  ; DETECT TASTO
XORWF _N1,W
 BTFSC STATUS,Z
 RETLW 6
 MOVLW 08H  ; DETECT TASTO
XORWF _N1,W
 BTFSC STATUS,Z
 RETLW 7
 RETLW 0  ; DETECT QUALUNQUE ALTRA COMBINAZIONE DI TASTI

Ti invio le mie routine (chiedo scusa per la lunghezza del messaggio pa
penso possano essere di interesse generale):



 GOTO KEY_2 ;
 GOTO KEY_3 ;
 GOTO KEY_4 ;
 GOTO KEY_5 ;
 GOTO KEY_6 ;
 GOTO KEY_7 ;
  ;
 GOTO NO_KEY


 MOVLW 60H  ; DETECT TASTO 1
 XORWF _N1,W
 BTFSC STATUS,Z
 RETLW 1
 MOVLW 30H  ; DETECT TASTO 2.
 XORWF _N1,W
 BTFSC STATUS,Z
 RETLW 2
 MOVLW 06H  ; DETECT TASTO 3
 XORWF _N1,W
 BTFSC STATUS,Z
 RETLW 3
 MOVLW 84H  ; DETECT TASTO 4
 XORWF _N1,W
 BTFSC STATUS,Z
 RETLW 4
 MOVLW 04H  ; DETECT TASTO 5
 XORWF _N1,W
 BTFSC STATUS,Z
 RETLW 5
 MOVLW 01H  ; DETECT TASTO 6
 XORWF _N1,W
 BTFSC STATUS,Z
 RETLW 6
 MOVLW 08H  ; DETECT TASTO STOP


Ci ero andato vicino, con la resistenza sul comune dei pulsanti..... (sono
arrivato ad 1 kohm), ma visto i risultati scadenti non sono salito oltre, e
ho pensato ad invertire il tutto.... . Grazie per le routine :-)
Ciao.
