Offline
Newbie
Karma: 0
Posts: 45
|
 |
« on: November 16, 2012, 11:00:30 am » |
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.
|
|
|
|
|
Logged
|
|
|
|
|
Rome (Italy)
Offline
Tesla Member
Karma: 74
Posts: 7380
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
|
 |
« Reply #1 on: November 16, 2012, 11:22:08 am » |
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 ?
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 219
Posts: 16517
Don't know what I do
|
 |
« Reply #2 on: November 16, 2012, 11:30:03 am » |
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?
|
|
|
|
|
Logged
|
|
|
|
|
BZ (I)
Offline
Brattain Member
Karma: 162
Posts: 15757
+39 349 2158303
|
 |
« Reply #3 on: November 16, 2012, 11:37:46 am » |
Non sarebbe malvagio anche sapere quale Arduino hai. Ciao Uwe
|
|
|
|
|
Logged
|
|
|
|
|
Lamezia Terme
Offline
Shannon Member
Karma: 386
Posts: 10287
Le domande di chi vuol imparare rappresentano la sua sete di sapere
|
 |
« Reply #4 on: November 16, 2012, 11:43:55 am » |
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 
|
|
|
|
|
Logged
|
|
|
|
|
Rome (Italy)
Offline
Tesla Member
Karma: 74
Posts: 7380
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
|
 |
« Reply #5 on: November 16, 2012, 11:50:21 am » |
oppure bisogna rispolverare l'UweBox che mi pare sia ferma da un bel po' di tempo  Mi sa tanto che qua serve la Uwebox(tm) 2.0, però è ancora in fase di sviluppo 
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 45
|
 |
« Reply #6 on: November 16, 2012, 11:56:20 am » |
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à.
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 45
|
 |
« Reply #7 on: November 16, 2012, 12:25:10 pm » |
Sto utilizzando una scheda Arduino duemilanove - atmega328P
|
|
|
|
|
Logged
|
|
|
|
|
Lamezia Terme
Offline
Shannon Member
Karma: 386
Posts: 10287
Le domande di chi vuol imparare rappresentano la sua sete di sapere
|
 |
« Reply #8 on: November 16, 2012, 12:49:09 pm » |
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
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 45
|
 |
« Reply #9 on: November 16, 2012, 01:12:15 pm » |
si ho già provato ad introdurre il ritardo, ma il fenomeno continua a presentarsi. ripropongo il codice taggato. #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 #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.
|
|
|
|
|
Logged
|
|
|
|
|
Genova
Offline
Edison Member
Karma: 14
Posts: 2451
|
 |
« Reply #10 on: November 16, 2012, 01:19:50 pm » |
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); ... ...
|
|
|
|
« Last Edit: November 16, 2012, 01:25:20 pm by pablos »
|
Logged
|
Meglio imparare dalle cose inutili piuttosto che non imparare niente. [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 45
|
 |
« Reply #11 on: November 16, 2012, 01:35:59 pm » |
Scusa ma il debug sul serial monitor lo hai mai fatto? si, è stato fatto. Sicuro che sia la strada più semplice scrivere B10000000 Si, per quello che devo fare io è la strada più semplice e più sicura. grazie.
|
|
|
|
|
Logged
|
|
|
|
|
Lamezia Terme
Offline
Shannon Member
Karma: 386
Posts: 10287
Le domande di chi vuol imparare rappresentano la sua sete di sapere
|
 |
« Reply #12 on: November 16, 2012, 01:38:18 pm » |
può usare anche la notazione esadecimale PORTD = 255; -> PORTD = B11111111; (@ Paolo, con 8 "1"  ) -> PORTD = 0xFF
|
|
|
|
|
Logged
|
|
|
|
|
Genova
Offline
Edison Member
Karma: 14
Posts: 2451
|
 |
« Reply #13 on: November 16, 2012, 01:41:10 pm » |
Il debug lo hai fatto... ok.. quindi ci sono quei byte che ti servono quando vai a leggere la eeprom?
|
|
|
|
|
Logged
|
Meglio imparare dalle cose inutili piuttosto che non imparare niente. [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]
|
|
|
|
Genova
Offline
Edison Member
Karma: 14
Posts: 2451
|
 |
« Reply #14 on: November 16, 2012, 01:45:51 pm » |
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.
|
|
|
|
|
Logged
|
Meglio imparare dalle cose inutili piuttosto che non imparare niente. [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]
|
|
|
|
|