Go Down

Topic: Lettura parallela pin (Read 886 times) previous topic - next topic

erpomata

Vorrei sapere se c'è un modo per leggere lo stato dei pin in maniera "parallela".
Io per ora faccio così:

Code: [Select]
 xVal = digitalRead(x);
 yVal = digitalRead(y);
 zVal = digitalRead(z);


vorrei fare invece:

Code: [Select]
xyzVal = leggiPin(x,y,z);

che mi restituisce il byte contenente lo stato dei 3 (00000111) pin senza leggerli in maniera sequenziale come sopra ovviamente.
E magari se c'è un modo anche per settarli nella stessa maniera.
http://www.paologiammarco.it
http://www.valentinamagni.it

astrobeed


Vorrei sapere se c'è un modo per leggere lo stato dei pin in maniera "parallela".


Basta che leggi/scrivi direttamente il registro della porta, PINB o PORTB per esempio, mascherando i pin che non ti interessano, in questo modo puoi leggere/scrivere 8 bit per volta.

erpomata

Ok grazie sembra che ci sia riuscito, questa sera farò altri esperimenti.
Sai se funziona anche su attiny?
http://www.paologiammarco.it
http://www.valentinamagni.it

leo72


erpomata

http://www.paologiammarco.it
http://www.valentinamagni.it

erpomata

#5
Nov 15, 2012, 06:45 am Last Edit: Nov 15, 2012, 06:53 am by erpomata Reason: 1
Grazie ma non ci ho capito nulla :smiley-sad-blue:
Come funziona la cosa?
Che differenza c'è tra:

   DDRB - The Port B Data Direction Register - read/write
   PORTB - The Port B Data Register - read/write
   PINB - The Port B Input Pins Register - read only

Ci provo:
DDRB: serve per indicare se il pin è input o output ??
PORTB: ??
PINB: ??


Io ho scritto questo codice:
Code: [Select]

void setup() 
{
  DDRB = B00000000;
}

void loop() // run over and over
{
  Serial.println(PORTB, BIN);
}
http://www.paologiammarco.it
http://www.valentinamagni.it

astrobeed


DDRB: serve per indicare se il pin è input o output ??
PORTB: ??
PINB: ??


DDRB specifica la direzione del pin.
PORTB è il registro per scrivere sulla porta.
PINB è il registro per leggere la porta.

Ci sono due registri diversi per leggere e scrivere per ovviare ad un problema che affligge tutti i micro/mcu dotati di un solo registro per accedere ai pin, si tratta del "Read Modify Write Problem" che in certe circostanze può portare a errori di i/o su i pin se non se ne tiene debito conto nel proprio software.
Puoi trovare una spiegazione, con esempio, del "RMW" http://www.mikroe.com/download/eng/documents/compilers/mikroc/pro/pic/help/rmw.htm]qui, è riferito ai pic, ma valido per tutti i micro dotati di singolo registro per accedere in lettura/scrittura della porta.



erpomata

Interessante articolo, ma non ho capito se il problema persiste solo se al pin è collegato un condensatore.
Nel mio caso uso un semplice partitore di tensione e non dovrebbe presentarsi.
http://www.paologiammarco.it
http://www.valentinamagni.it

astrobeed


Interessante articolo, ma non ho capito se il problema persiste solo se al pin è collegato un condensatore.


Quello del condensatore è solo un esempio per evidenziare il problema, in realtà esistono diversi casi in cui l'RMW crea errori, tutti aggirabili da software se uno è cosciente della cosa, però questo non è un problema che affligge le mcu utilizzate su Arduino proprio perché usano due distinti registri per leggere/scrivere i pin.
Ho citato la cosa solo per farti capire perché si usa PORTB e PINB invece di avere un singolo registro PORTB sia per leggere che per scrivere la porta.

erpomata

Ok grazie allora mi rilasso con arduino.
Alla fine ci sono riuscito ora devo andare, appena posso posto lo sketch, può essere utile ad altri.
http://www.paologiammarco.it
http://www.valentinamagni.it

erpomata

Come promesso ecco lo sketch:

Code: [Select]

void setup() 
{
  DDRB = B00000000; //Tutti i pin come input
}

void loop() // run over and over
{
  Serial.println(PINB, BIN);
}
http://www.paologiammarco.it
http://www.valentinamagni.it

Go Up