Newsgroup: it.hobby.elettronica.digitale
Titolo: PIC: Controllo valore di 3 bit

Salve a tutti,
da poco ho iniziato ad usare i micro PIC, e sono ancora ai LED lampeggianti.
Volendo fare un passo avanti, ho incontrato un piccolo problema, che non
riesco a risolvere: leggo 3 bit dalla PORTA (0:1:2) e voglio sapere il
valore che hanno, che ovviamente puo' essere compreso solo tra 0 e 7. Come
faccio?
Ho provato a spostarli nell'accumulatore W e con una serie di andlw a
controllare il bit Z dello STATUS, ma non mi da' i risultati sperati.
Qualcuno ha una soluzione efficace?
Grazie
PaoloS


Presupponendo che stai usando un 16F84 devi mascherare con un'AND il valore
letto , se usi 3 bit (0,1,2) devi fare un'operazione del tipo :
Valore letto = PORTA and 00000111, in questo modo leggi solo il valore dei 3
bit di tuo interesse e ignori (lo poni a 0) il valore di RA03 che potrebbe
falsare la lettura, ti allego un esempio in C per semplicità.
leggiA()
{
int valore;
valore =PORTA & Ox08;    // legge la porta a mascherandola tramite AND
PORTB=valore                    // risultato su porta B, con i led connesi a
0,1,2
}
Ciao
Marco d'Ambrosio  
m.dam...@tiscalinet.it
http://utenti.tripod.it/razzimodellismo
    ACME I-RM-05
http://web.tiscalinet.it/mda

 Qualcuno ha una soluzione efficace?
movf    porta,W ;carica in W il valore letto dalla porta A
andlw  0x03 ;Maschera i bit da 4 a 7 in modo da lasciare solo quelli da 0 a
3 che ti interessano
xowlw 1 ;Fa l'or esclusivo con il valore di confronto (al posto di uno puoi
inserire il valore che vuoi verificare da 0 a 7)
btfsc    STATUS,Z ;lo XOR da 0 se i valori sono uguali. Se il risultato e' =
non salta l'istruzione successiva
goto    uguale
goto   diverso
uguale
            ;Inserisci qui il codice che devi eseguire se il valore e'
uguale
diverso
            ;Inserisci qui il codice che devi eseguire se il valore e'
diverso
Non so se funzionera' ma sulla carta dovrebbe andare.
Ciao
Sergio Tanzilli
http://tanzilli.com/pbe

 valore che hanno, che ovviamente puo' essere compreso solo tra 0 e 7.
Un esempio potrebbe essere:
movf PORTA,W
andlw b'00000111'
btfsc STATUS,Z
goto uscita_0
sublw 1
btfsc STATUS,Z
goto uscita_1
sublw 1
btfsc STATUS,Z
goto uscita_2
sublw 1
...
btfsc STATUS,Z
goto uscita_6
goto uscita_7
Forse il tuo codice non funziona perche` non hai fatto l'AND del valore preso
da PORTA. Nel PIC16x84 i tre bit alti di PORTA non esistono e sono indefiniti,
quindi se ad esempio leggessi degli 1 ovviamente lo zero flag non sarebbe mai
settato.
--
Bye! Lorenzo Lutti
http://www.geocities.com/SiliconValley/Peaks/6258/

Grazie sia a Marco D'Ambrosio, sia a Sergio Tanzilli per i consigli.
Adesso il firmware e' corretto, ma devo controllare l'hardware.


Geniale, non ci avevo mai pensato, grazie Lorenzo.
Io ho sempre fatto cosi', forse e' un po' piu' veloce e compatto per grossi
switch ma la soluzione da te proposta e' molto interessante.
Switch1         movlw   PCH_SWITCH1
                movwf   PCLATH
                movfw   x
;...........................................................................
...
                CONSTANT        PCH_SWITCH1=(HIGH $)
;...........................................................................
...
                addwf   PCL
                b       x_0
                b       x_1
                b       x_2
                b       x_3
                b       x_4
                b       x_5
                b       x_6
;...........................................................................
...
        IF      (HIGH ($-1))!=PCH_SWITCH1
                ERROR "SWITCH 1 fuori dalla pagina"
        ENDIF
;...........................................................................
...
Ciao Andrea

                 movwf   PCLATH
[...]
Forte! Anche il tuo metodo e` ingegnoso... PCLATH io l'ho sempre guardato con
sospetto, ma sembra proprio che sia utile anche lui. ;-)
