Go Down

Topic: problema con PORTD (Read 2509 times) previous topic - next topic

dr.benway

Salve a tutti.
Sto realizzando il progetto per la mia tesi di Laurea con Arduino.
Ho riscontrato un problema con il controllo PORTD.
Ho cercato sul formu qualche dritta a riguardo, però probabilmente non sono molto bravo ad usare la funzione search e non ho trovato molto. :-(
Quindi ho deciso di aprire questo post.
Mi scuso in anticipo se l'argomento è stato discusso e ridiscusso (credo sia cosa probabile)

Il progetto è il seguente.

Ho scritto sulla  EEPROM  alcuni byte,
Voglio che uesti byte (sono 32) vengano letti ciclicamente e riportati in toto sulle porte digitali.
Ho utilizzato la sintassi  PORTD = EEPROM.read(addr);
Dove  addr è l'indirizzo che si incrementa .

Dove sta il problema?

Il problema è che ogni tot istruzioni (in media una cinquantina), la porta va a zero per un paio di cicli.
Per me è FONDAMENTALE che questo non accada.

E' possibile porvi rimedio?

Grazie.




astrobeed


Dove sta il problema?


Intanto dovresti spiegare cosa intendi esattamente con "un paio di cicli" e poi se non posti tutto lo sketch è impossibile fare una analisi esatta del problema.
Posso solo azzardare una ipotesi, sei sicuro che durante il ciclo non vai a leggere locazioni della EEPROM che valgono 0x00 con il conseguente riporto su PORTD ?

leo72


Salve a tutti.
Sto realizzando il progetto per la mia tesi di Laurea con Arduino.
Ho riscontrato un problema con il controllo PORTD.
Ho cercato sul formu qualche dritta a riguardo, però probabilmente non sono molto bravo ad usare la funzione search e non ho trovato molto. :-(
Quindi ho deciso di aprire questo post.
Mi scuso in anticipo se l'argomento è stato discusso e ridiscusso (credo sia cosa probabile)

Il progetto è il seguente.

Ho scritto sulla  EEPROM  alcuni byte,
Voglio che uesti byte (sono 32) vengano letti ciclicamente e riportati in toto sulle porte digitali.
Ho utilizzato la sintassi  PORTD = EEPROM.read(addr);
Dove  addr è l'indirizzo che si incrementa .

Dove sta il problema?

Il problema è che ogni tot istruzioni (in media una cinquantina), la porta va a zero per un paio di cicli.
Per me è FONDAMENTALE che questo non accada.

E' possibile porvi rimedio?

Grazie.





Ho usato la manipolazione diretta della PORTD per il mio Micrologio senza riscontrare problemi.
Intanto sai che l'accesso alla EEPROM è un'operazione lenta, vero? Non è che hai bisogno di molta velocità?
Perché non carichi in anticipo su 4 variabili il valore di questi 32 bit?
Potresti postare lo sketch che stai usando?
Cosa comandano questi pin?

uwefed

Non sarebbe malvagio anche sapere quale Arduino hai.
Ciao Uwe

Michele Menniti

Anch'io ho usato il PORTD sul mio Programmatore HV, senza alcun particolare problema, quindi decisamente serve vedere lo sketch, oppure bisogna rispolverare l'UweBox che mi pare sia ferma da un bel po' di tempo  :D
Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

astrobeed


oppure bisogna rispolverare l'UweBox che mi pare sia ferma da un bel po' di tempo  :D


Mi sa tanto che qua serve la Uwebox(tm) 2.0, però è ancora in fase di sviluppo  :)

dr.benway

Grazie a tutti per le risposte.

Questo è il codice del mio programma:

#include <EEPROM.h>
int addr = 0;
k=0;


void setup()
{

  DDRD = B11111111; //tutti i pin sono uscite
 
}

void loop()
{
  while (k<100)
{
PORTD = EEPROM.read(addr);
   
    ++ addr;
   
    if (addr > 31)
{addr = 0;}

}

  }


Ho utilizzato la EEprom , proprio perché mi serve la velocità.
Le operazioni in lettura avvengono infatti molto rapidamente.
Il byte viene letto dalla cella e portato direttamente sulle porte, che è ESATTAMENTE quello che mi serve.

Accade però che  per qualche ciclo l'intera porta si resetti portandosi a livello logico  zero.

Vi posto anche il contenuto della mia rom

/*
* EEPROM Write
*
* Stores values read from analog input 0 into the EEPROM.
* These values will stay in the EEPROM when the board is
* turned off and may be retrieved later by another sketch.
*/

#include <EEPROM.h>


void setup()
{
}
int write = 1;
void loop()
{
  if (write == 1)
  {
EEPROM.write(    0 , B10000000 );
EEPROM.write(    1 , B10000000 );
EEPROM.write(    2 , B10001010 );
EEPROM.write(    3 , B10001010 );
EEPROM.write(    4 , B10101000 );
EEPROM.write(    5 , B10101000 );
EEPROM.write(    6 , B10100010 );
EEPROM.write(    7 , B10100010 );
EEPROM.write(    8 , B10100010 );
EEPROM.write(    9 , B10100010 );
EEPROM.write(   10 , B10101000 );
EEPROM.write(   11 , B10101000 );
EEPROM.write(   12 , B10001010 );
EEPROM.write(   13 , B10001010 );
EEPROM.write(   14 , B10000000 );
EEPROM.write(   15 , B10000000 );
EEPROM.write(   16 , B00101010 );
EEPROM.write(   17 , B00101010 );
EEPROM.write(   18 , B00100000 );
EEPROM.write(   19 , B00100000 );
EEPROM.write(   20 , B00000010 );
EEPROM.write(   21 , B00000010 );
EEPROM.write(   22 , B00001000 );
EEPROM.write(   23 , B00001000 );
EEPROM.write(   24 , B00001000 );
EEPROM.write(   25 , B00001000 );
EEPROM.write(   26 , B00000010 );
EEPROM.write(   27 , B00000010 );
EEPROM.write(   28 , B00100000 );
EEPROM.write(   29 , B00100000 );
EEPROM.write(   30 , B00101010 );
EEPROM.write(   31 , B00101010 );
  }

write = 0;



}



La rom è scritta correttamente altrimenti il problema si presenterebbe periodicamente e per un solo ciclo.

Invece mediamente ogni 50-80 letture, l'uscita va zero per qualche ciclo.

Ancora grazie per la cortese disponibilità.



dr.benway

Sto utilizzando una scheda Arduino duemilanove - atmega328P

Michele Menniti

solo come prova, introduci un piccolo ritardo tra una lettura e la successiva
il codice racchiudilo tra i tag "code" così diventa molto più leggibile
Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

dr.benway

si ho già provato ad introdurre il ritardo, ma il fenomeno continua a presentarsi.

ripropongo il codice taggato.

Code: [Select]
#include <EEPROM.h>
int addr = 0;
k=0;


void setup()
{

  DDRD = B11111111; //tutti i pin sono uscite

}

void loop()
{
  while (k<100)
{
PORTD = EEPROM.read(addr);
   
    ++ addr;
   
    if (addr > 31)
{addr = 0;}

}

  }



contenuto rom

Code: [Select]
#include <EEPROM.h>


void setup()
{
}
int write = 1;
void loop()
{
  if (write == 1)
  {
EEPROM.write(    0 , B10000000 );
EEPROM.write(    1 , B10000000 );
EEPROM.write(    2 , B10001010 );
EEPROM.write(    3 , B10001010 );
EEPROM.write(    4 , B10101000 );
EEPROM.write(    5 , B10101000 );
EEPROM.write(    6 , B10100010 );
EEPROM.write(    7 , B10100010 );
EEPROM.write(    8 , B10100010 );
EEPROM.write(    9 , B10100010 );
EEPROM.write(   10 , B10101000 );
EEPROM.write(   11 , B10101000 );
EEPROM.write(   12 , B10001010 );
EEPROM.write(   13 , B10001010 );
EEPROM.write(   14 , B10000000 );
EEPROM.write(   15 , B10000000 );
EEPROM.write(   16 , B00101010 );
EEPROM.write(   17 , B00101010 );
EEPROM.write(   18 , B00100000 );
EEPROM.write(   19 , B00100000 );
EEPROM.write(   20 , B00000010 );
EEPROM.write(   21 , B00000010 );
EEPROM.write(   22 , B00001000 );
EEPROM.write(   23 , B00001000 );
EEPROM.write(   24 , B00001000 );
EEPROM.write(   25 , B00001000 );
EEPROM.write(   26 , B00000010 );
EEPROM.write(   27 , B00000010 );
EEPROM.write(   28 , B00100000 );
EEPROM.write(   29 , B00100000 );
EEPROM.write(   30 , B00101010 );
EEPROM.write(   31 , B00101010 );
  }

write = 0;



}


grazie ancora.


pablos

#10
Nov 16, 2012, 07:19 pm Last Edit: Nov 16, 2012, 07:25 pm by pablos Reason: 1
Scusa ma il debug sul serial monitor lo hai mai fatto? giusto per visualizzare se a quell'indirizzo c'e' quello che vorresti ci fosse.
Sicuro che sia la strada più semplice scrivere B10000000 ... perchè non provi con un numero 0-255 (byte) e poi lo passi PORTD = EEPROM.read(addr);

scrivere PORTD = 255;
oppure PORTD = B1111111;
fa la stessa cosa

EEPROM.write(    0 , B10000000 );
EEPROM.write(    1 , B10000000 );
EEPROM.write(    2 , B10001010 );
EEPROM.write(    3 , B10001010 );
...
...

EEPROM.write(    0 ,128);
EEPROM.write(    1 ,128);
EEPROM.write(    2 ,138);
EEPROM.write(    3 ,138);
...
...
no comment

dr.benway


Quote
Scusa ma il debug sul serial monitor lo hai mai fatto?


si, è stato fatto.


Quote
Sicuro che sia la strada più semplice scrivere B10000000


Si, per quello che devo fare io è la strada più semplice e più sicura.

grazie.

Michele Menniti

può usare anche la notazione esadecimale
PORTD = 255; -> PORTD = B11111111; (@ Paolo, con 8 "1" :)) -> PORTD = 0xFF
Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

pablos

Il debug lo hai fatto... ok..  quindi ci sono quei byte che ti servono quando vai a leggere la eeprom?
no comment

pablos


può usare anche la notazione esadecimale
PORTD = 255; -> PORTD = B11111111; (@ Paolo, con 8 "1" :)) -> PORTD = 0xFF


Io avevo registrato su eeprom direttamente il byte 0-255 e lo riportavo al PORTD = 'byte da eeprom' non ho avuto problemi.
no comment

Go Up