- Messaggi: 1222
- Ringraziamenti ricevuti 104
Chiarimenti parametri per I2C
11 Anni 8 Mesi fa #16
da StefA
..avevano magari fatto lo sgambetto al ka, ma il sangue restava sempre più denso dell'acqua.. [cit.]
Risposta da StefA al topic Ciarimenti parametri per I2C
mi era sfuggito che utilizzi cont sia per scrivere che per leggere..non va bene, perché se in lettura hai qualche problema, dentro cont c'è già l'informazione che ti aspetti e quindi non sai se il tutto funziona.
Per fare delle prove potresti dichiarare un'altra variabile, leggere da memoria e mettere il dato in questa variabile e poi porre i led uguali a questa variabile, ripetendo il tutto, così puoi vedere se effettivamente legge la memoria, poi cambiando dati puoi vedere se scrive valori diversi..
una cosa del tipo:
unsigned char cont[5] = {12,45,7,10};
unsigned char dato;
write_I2C_EEPROM (0xA4, 0, cont[0]);
write_I2C_EEPROM (0xA4, 1, cont[1]);
write_I2C_EEPROM (0xA4, 2, cont[2]);
write_I2C_EEPROM (0xA4, 3, cont[3]);
write_I2C_EEPROM (0xA4, 4, cont[4]);
while (1)
{
read_I2C_EEPROM (0xA4,0, &dato);
LATD = dato;
__delay_ms (500);
read_I2C_EEPROM (0xA4,1, &dato);
LATD = dato;
__delay_ms (500);
read_I2C_EEPROM (0xA4,2, &dato);
LATD = dato;
__delay_ms (500);
read_I2C_EEPROM (0xA4,3, &dato);
LATD = dato;
__delay_ms (500);
read_I2C_EEPROM (0xA4,4, &dato);
LATD = dato;
__delay_ms (500);
}
Ste
Per fare delle prove potresti dichiarare un'altra variabile, leggere da memoria e mettere il dato in questa variabile e poi porre i led uguali a questa variabile, ripetendo il tutto, così puoi vedere se effettivamente legge la memoria, poi cambiando dati puoi vedere se scrive valori diversi..
una cosa del tipo:
unsigned char cont[5] = {12,45,7,10};
unsigned char dato;
write_I2C_EEPROM (0xA4, 0, cont[0]);
write_I2C_EEPROM (0xA4, 1, cont[1]);
write_I2C_EEPROM (0xA4, 2, cont[2]);
write_I2C_EEPROM (0xA4, 3, cont[3]);
write_I2C_EEPROM (0xA4, 4, cont[4]);
while (1)
{
read_I2C_EEPROM (0xA4,0, &dato);
LATD = dato;
__delay_ms (500);
read_I2C_EEPROM (0xA4,1, &dato);
LATD = dato;
__delay_ms (500);
read_I2C_EEPROM (0xA4,2, &dato);
LATD = dato;
__delay_ms (500);
read_I2C_EEPROM (0xA4,3, &dato);
LATD = dato;
__delay_ms (500);
read_I2C_EEPROM (0xA4,4, &dato);
LATD = dato;
__delay_ms (500);
}
Ste
..avevano magari fatto lo sgambetto al ka, ma il sangue restava sempre più denso dell'acqua.. [cit.]
Si prega Accedi o Crea un account a partecipare alla conversazione.
- StefA
- Moderator
Riduci
Di più
11 Anni 8 Mesi fa #17
da Guido
Rendering Error in layout Message/Item: array_keys(): Argument #1 ($array) must be of type array, null given. Please enable debug mode for more information.
Risposta da Guido al topic Ciarimenti parametri per I2C
Rendering Error in layout Message/Item: array_keys(): Argument #1 ($array) must be of type array, null given. Please enable debug mode for more information.
Si prega Accedi o Crea un account a partecipare alla conversazione.
- Guido
- Autore della discussione
- Platinum Member
Riduci
Di più
- Messaggi: 583
- Ringraziamenti ricevuti 1
11 Anni 8 Mesi fa #18
da StefA
..avevano magari fatto lo sgambetto al ka, ma il sangue restava sempre più denso dell'acqua.. [cit.]
Risposta da StefA al topic Ciarimenti parametri per I2C
avevo messo il ritardo a 500ms così cambiava stato ogni mezzo secondo, se imposti 50ms..o ti chiami Clark Kant..o comincia ad essere difficile!
Al di là di questo, riattiva le scritture, la memoria una volta scritta mantiene il suo valore fino a quando la cancelli o la sovrascrivi, quindi anche disabilitando le scritture, se le hai eseguite almeno una volta i dati sono scritti.
Veniamo al led..sospetto che tu abbia un solo led..ma da quello che vorresti fare te ne servirebbero 8, ti spiego:
la variabile dato è stata definita come "unsigned char", che è da 8bit, la porta D ha 8 pin, quindi quando scrivi...LATD = dato;..i led della porta d (se ne colleghi uno ogni pin) si accenderanno a seconda della variabile dato; prendendo il valore della variabile dato e trasformandolo in binario, dove ci sono gli 1 il led risulta acceso, dove ci sono gli 0, risulta spento.
Esempio: se dato vale 12 (come nel tuo primo valore), avrai il corrispettivo in binario che vale, 00001100 e gli 8 led della porta d risulteranno, SSSSAASS (dove S= spento ed A= acceso).
Esempio 2: dato = 45 = 00101101 = SSASAASA.
Se prendi valori di dato piccoli puoi anche usare meno led, vedi tu.
La parte di codice che ti ho scritto prima scrive all'inizio i 5 valori di dato in memoria, poi ciclicamente li rilegge uno ad uno e li visualizza in binario attraverso i led.
Se non era questo che volevi fare, ho capito male io.
Ste
Al di là di questo, riattiva le scritture, la memoria una volta scritta mantiene il suo valore fino a quando la cancelli o la sovrascrivi, quindi anche disabilitando le scritture, se le hai eseguite almeno una volta i dati sono scritti.
Veniamo al led..sospetto che tu abbia un solo led..ma da quello che vorresti fare te ne servirebbero 8, ti spiego:
la variabile dato è stata definita come "unsigned char", che è da 8bit, la porta D ha 8 pin, quindi quando scrivi...LATD = dato;..i led della porta d (se ne colleghi uno ogni pin) si accenderanno a seconda della variabile dato; prendendo il valore della variabile dato e trasformandolo in binario, dove ci sono gli 1 il led risulta acceso, dove ci sono gli 0, risulta spento.
Esempio: se dato vale 12 (come nel tuo primo valore), avrai il corrispettivo in binario che vale, 00001100 e gli 8 led della porta d risulteranno, SSSSAASS (dove S= spento ed A= acceso).
Esempio 2: dato = 45 = 00101101 = SSASAASA.
Se prendi valori di dato piccoli puoi anche usare meno led, vedi tu.
La parte di codice che ti ho scritto prima scrive all'inizio i 5 valori di dato in memoria, poi ciclicamente li rilegge uno ad uno e li visualizza in binario attraverso i led.
Se non era questo che volevi fare, ho capito male io.
Ste
..avevano magari fatto lo sgambetto al ka, ma il sangue restava sempre più denso dell'acqua.. [cit.]
Si prega Accedi o Crea un account a partecipare alla conversazione.
- StefA
- Moderator
Riduci
Di più
- Messaggi: 1222
- Ringraziamenti ricevuti 104
11 Anni 8 Mesi fa #19
da Guido
Risposta da Guido al topic Ciarimenti parametri per I2C
Ciao, all' inizio ho messo il valore che hai scritto 500 ms, solo che xc8 lo segnala come errore, riguardo ai led vorrei solo scrivere uno ho due stringhe di array in memoria e poi leggerle, l'accensione del led mi dice solo che la lettura è avvenuta.
Comunque ho appreso un altro pò su come si programma in C.
Grazie
Comunque ho appreso un altro pò su come si programma in C.
Grazie
Si prega Accedi o Crea un account a partecipare alla conversazione.
- Guido
- Autore della discussione
- Platinum Member
Riduci
Di più
- Messaggi: 583
- Ringraziamenti ricevuti 1
11 Anni 8 Mesi fa #20
da StefA
Se vuoi solo sapere se la riga di codice è stata eseguita, ti basta mettere l'accensione del led dopo la funzione read. Altrimenti, visto che la funzione read ti ritorna un parametro (signed char), puoi porre ad esempio..
signed char controllo;
...
...
controllo = read_I2C_EEPROM (0xA4,0, &dato);
if(controllo == 1)
PORTDbits.RD0 = 1;
else
PORTDbits.RD0 = 0;
Comunque sia siamo abboddantemente OT...spero almeno che ti sia d'aiuto.
Ste
..avevano magari fatto lo sgambetto al ka, ma il sangue restava sempre più denso dell'acqua.. [cit.]
Risposta da StefA al topic Ciarimenti parametri per I2C
probabilmente quella funzione non "supporta" valori così alti di ritardo, magari prova a scendere gradualmente...400..300..250...all' inizio ho messo il valore che hai scritto 500 ms, solo che xc8 lo segnala come errore
Hai letto il libro di Mauro?Comunque ho appreso un altro pò su come si programma in C
con un solo led non puoi sapere che valore hai dentro le variabili, al massimo puoi distinguere tra 1 e 0..o tra pari e dispari.riguardo ai led vorrei solo scrivere uno ho due stringhe di array in memoria e poi leggerle, l'accensione del led mi dice solo che la lettura è avvenuta
Se vuoi solo sapere se la riga di codice è stata eseguita, ti basta mettere l'accensione del led dopo la funzione read. Altrimenti, visto che la funzione read ti ritorna un parametro (signed char), puoi porre ad esempio..
signed char controllo;
...
...
controllo = read_I2C_EEPROM (0xA4,0, &dato);
if(controllo == 1)
PORTDbits.RD0 = 1;
else
PORTDbits.RD0 = 0;
Comunque sia siamo abboddantemente OT...spero almeno che ti sia d'aiuto.
Ste
..avevano magari fatto lo sgambetto al ka, ma il sangue restava sempre più denso dell'acqua.. [cit.]
Si prega Accedi o Crea un account a partecipare alla conversazione.
- StefA
- Moderator
Riduci
Di più
- Messaggi: 1222
- Ringraziamenti ricevuti 104
Moderatori: Mauro Laurenti, Pinna, StefA, Matteo Garia
Registrati al sito
Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.
Login
© LaurTec 2006 - 2024