Leggere stato porta

Ciao a tutti,
è la prima volta che scrivo in quanto basta leggervi per imparare. Complimenti a tutti.
Questa volta sono in difficoltà ed avrei bisogno di aiuto.

Su Arduino UNO, mi è rimasta disponibile solo la porta analogica (PORTC) e devo usare i primi 4 bit in digitale (14,15,16,17) mentre i restanti due bit in analogico. Devo altresì leggere il dato binario del nibble digitale ma non ne vengo a capo.

Questo è quello che ho scritto (sintetizzando):

int pers;
    
void setup(void) {
    pinMode(14, INPUT);
    pinMode(15, INPUT);
    pinMode(16, INPUT);
    pinMode(17, INPUT);
}
 
void loop(void) {
pers = (PORTC & 0x0F);        // leggo il valore binario dei primi quattro bit della porta C

// ora stampo il dato su LCD 

 }

La routine di stampa funziona perfettamente ma il dato restituito da “pers” è sempre 0, anche mettendo tutti e quattro i pin a +5V.

Dove sbaglio?

P.S.
Provengo da anni di PIC Micro dove era possibile settare, attraverso dei registri, la porta degli ingressi analogoci, sia in dig che ana.
Non ho ancora dato una occhiata al datasheet del 328, è possibile questa cosa?

Saluti a tutti,

Mimmo.

Prova a convertire il valore in stringa

Serial.println(PORTC, BIN);

int num=(PORTC, BIN);
Serial.println ((String)num);

prima di leggere i dati da un port devi definire se i singoli pin sono entrate o uscite. Nelle entrate digitali questo funziona senza la dichiarazione perché vengono in automatico messe come entrate per evitare che a causa di componenti esterne possano rompersi.

consulta: Arduino Reference - Arduino Reference

Ciao Uwe

Manipolando i registri delle porte di I/O accedi ai pin in maniera digitale. Per effettuare delle letture analogiche devi utilizzare l'ADC del micro, ma ciò comporta l'uso di differenti registri.

Se vuoi studiare l'accesso tramite registri, apri il file /hardware/arduino/cores/arduino/wiring_analog.c e guarda la funzione analogRead.

leo, non voleva usare in pin analogici come digitali leggendo il valore dal port?

Ciao Uwe

Mi pare che abbia scritto che vuole usare i primi 4 pin della porta C (quindi i pin da 14 a 17) come digitale, mentre gli altri 2 in analogico. Però non può ovviamente fare una lettura analogica a 10 bit (0-1023) tramite 1 solo bit, deve usare i registri dell'ADC.

Secondo me vuole fare una lettura BCD con 4 bit leggendo valori da 0 a 15

ma ragazzi, nessuno si è accorto che usa il registro sbagliato?

dunque sul C abbiamo
DDRC - se a 1 il pin è in scrittura, se a 0 in lettura
PORTC - accende/spegne il pin corrispondente. SE IL PIN é IN LETTURA COMANDI LA PULL-UP!
PINC - PER LEGGERE LO STATO DEI PIN <<< quello che vuole usare

cheers :grin:

Sì vero.
Resta il fatto che con quei registri non si può leggere un pin in formato analogico.

lesto:
ma ragazzi, nessuno si è accorto che usa il registro sbagliato?

dunque sul C abbiamo
DDRC - se a 1 il pin è in scrittura, se a 0 in lettura
PORTC - accende/spegne il pin corrispondente. SE IL PIN é IN LETTURA COMANDI LA PULL-UP!
PINC - PER LEGGERE LO STATO DEI PIN <<< quello che vuole usare

cheers :grin:

BINGO!!!
Grazie a tutti e soprattutto a LESTO.
Infatti, usando il registro PIN, tutto funziona regolarmente. Che bestia che sono, c’è anche scritto chiaramente.

Per chiarezza, con i primi quattro pin della porta C (usati come I/O digitali), leggo un dato binario da un’apparecchiatura esterna.
Con il pin 18 (usato in analogico) leggo una tensione variabile da un’altra apparecchiatura esterna.
Ciao a tutti ed a rileggerci,

Mimmo.