Pages: [1]   Go Down
Author Topic: Lettura parallela pin  (Read 847 times)
0 Members and 1 Guest are viewing this topic.
Roma (RM)
Offline Offline
God Member
*****
Karma: 3
Posts: 634
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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

vorrei fare invece:

Code:
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.
Logged


Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 138
Posts: 9901
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Roma (RM)
Offline Offline
God Member
*****
Karma: 3
Posts: 634
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ok grazie sembra che ci sia riuscito, questa sera farò altri esperimenti.
Sai se funziona anche su attiny?
Logged


Global Moderator
Italy
Online Online
Brattain Member
*****
Karma: 336
Posts: 23147
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Sai se funziona anche su attiny?
Ovviamente sì
Logged


Roma (RM)
Offline Offline
God Member
*****
Karma: 3
Posts: 634
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

 smiley-mr-green

Grazie grazie
Logged


Roma (RM)
Offline Offline
God Member
*****
Karma: 3
Posts: 634
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
void setup() 
{
  DDRB = B00000000;
}

void loop() // run over and over
{
  Serial.println(PORTB, BIN);
}
« Last Edit: November 15, 2012, 12:53:31 am by erpomata » Logged


Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 138
Posts: 9901
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.


Logged

Roma (RM)
Offline Offline
God Member
*****
Karma: 3
Posts: 634
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged


Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 138
Posts: 9901
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Roma (RM)
Offline Offline
God Member
*****
Karma: 3
Posts: 634
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged


Roma (RM)
Offline Offline
God Member
*****
Karma: 3
Posts: 634
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Come promesso ecco lo sketch:

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

void loop() // run over and over
{
  Serial.println(PINB, BIN);
}
Logged


Pages: [1]   Go Up
Jump to: