- Messaggi: 33
- Ringraziamenti ricevuti 1
write_integer_LCD libreria LCD_44780
sto facendo delle prove con il programma sul sensore di luminosità che si trova sul c18 step by step (mplabx 1.90 - xc8 1.21 - librerie laurtec v_3.1.1)su freedom 2.
Al posto del sensore ho collegato il trimmer per poter verificare tutta la scala, ho notato che fino a che i valori sono sopra il 100 il display visualizza bene, quando scendono sotto il 100 non vengono allineati correttamente.
Con il debug ho visto che quando il valore scende sotto il 100 viene convertito male dalla funzione: itoa ((unsigned char*) convertedInt, value,10); (che si trova in write_integer_LCD nella libreria LCD_44780) , allego una foto di una conversione errata.
Ho modificato la funzione write_integer_LCD inizializzando a 0 convertedInt in questo modo:
unsigned char convertedInt [6]={'0'};
così funziona correttamente, però non so il perchè del problema... qualcuno ne ha idea?
allego anche una copia del programma non funzionante con la libreria LCD_44780 originale non ancora modificata
Grazie, ciao buona serata
Andrea
Si prega Accedi o Crea un account a partecipare alla conversazione.
- alpignolo
- Autore della discussione
- Junior Member
devo fare qualche test.
Non ho pero' capito bene. Il valore visualizzato e' corretto ma non rimane giustificato correttamente?
Il valore numerico e' giustificato a destra o a sinistra?
Saluti,
Mauro
Si prega Accedi o Crea un account a partecipare alla conversazione.
Grazie per la risposta, normalmente il numero è allineato a destra, quando però si scende sotto il 100 il numero viene allineato a sinistra. Il numero dovrebbe essere comunque corretto. Partendo con il trimmer a zero, alimentando la freedom 2 viene stampato un doppio zero "0 0" (se invece di togliere l'alimentazione si preme il reset viene stampato un solo 0 allineato a sinistra) , girando il trimmer fino a 100 i numeri sono allineati a sinistra dopo il 100 vengono allineati a destra.
Buona serata,
Andrea
Si prega Accedi o Crea un account a partecipare alla conversazione.
- alpignolo
- Autore della discussione
- Junior Member
- Messaggi: 33
- Ringraziamenti ricevuti 1
confermo il problema che hai riscontrato.
In particolare le due funzioni itoa usate dal C18 e XC8 sono differenti.
Avere un array non inizializzato con il rischio che tra una chiamata di funzione e l'altra l'rraz abbia lo stesso indirizzo (probabile anche se non statico) crea dei problemi a causa dei caratteri /0 vecchi presenti nell'array. Non ho investigato il problema, ovvero le differenze tra le due funzioni.
Ho cambiato la libreria apportando la seguente modifica:
unsigned char convertedInt [6] = {0,0,0,0,0,0};
In particolare ho apportato tale modifica anche alle librerie GLCD_KS0108B e LCD_44780_I2C.
Ho preferito questa inizializzazione perche' l'inizializzazione con '0' pone nell'array il numero 48 (codice ASCII del numero 0) mentre il resto dell'array , visto che e' scritto un solo carattere viene inizializzato a 0.
Quindi si avrebbe 48,0,0,0,0,0 mentre l'inizializzazione con
unsigned char convertedInt [6] = {0,0,0,0,0,0};
garantisce che siano presenti gli 0 come ci si aspetterebbe in ogni posizione. In ambo i casi funziona perche' non e' presente il carattere /0.
grazie della segnalazione e correzione!
Mettero' la libreria online con il prossimo aggiornamento.
Saluti,
Mauro
Si prega Accedi o Crea un account a partecipare alla conversazione.
grazie a te per la spiegazione, sempre molto chiara!
Ieri stavo ricompilando tutti i programmi con le nuove librerie, ho visto che mentre con il programma hello world il display va bene, con il programma per il real time clock (che utilizza tutte e due le righe del display) sulla seconda riga non viene stampato nulla. Ho guardato la nuova inizializazione del display, se non sbaglio dovrebbe esserci un errore nel settaggio delle righe, che viene impostato a una riga e non a due. Posto il codice con qualche nota che ho messo io per capire come funziona l'inizializzazione. In rosso c'è il valore che ho cambiato portandolo da 0 a 1, dopo questa modifica il display funziona correttamente.
void initialize_LCD(unsigned char quartz_frequency) {
setQuartz (quartz_frequency);
LCD_RS = 0x00;
LCD_E = 0x00;
LCD_RW = 0x00;
delay_ms (100);
send_command_LCD (0,0,1,1);//inizializzazione
delay_ms (100);
send_command_LCD (0,0,1,1);//inizializzazione
delay_ms (10);
send_command_LCD (0,0,1,1);//inizializzazione
send_command_LCD (0,0,1,0);//interfaccia 4 bit
send_command_LCD (0,0,1,0);//imposto 4 bit ,
send_command_LCD(1,0,0,0);//numerorighe(0=1riga,1=2righe),grandezza font,indifferente,indifferente
send_command_LCD (0,0,0,0);//spengo display
send_command_LCD (1,0,0,0);
send_command_LCD (0,0,0,0);//pulizia del display
send_command_LCD (0,0,0,1);
send_command_LCD (0,0,0,0);//modalità di immissione (movimento del cursore
send_command_LCD (0,1,1,0);// da sinistra verso destra).
clear_LCD ();
cursor_LCD (0,0);
}
Buona serata,
Andrea
Si prega Accedi o Crea un account a partecipare alla conversazione.
- alpignolo
- Autore della discussione
- Junior Member
- Messaggi: 33
- Ringraziamenti ricevuti 1
Registrati al sito
Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.