write_integer_LCD libreria LCD_44780

11 Anni 4 Settimane fa - 11 Anni 4 Settimane fa #1 da alpignolo
write_integer_LCD libreria LCD_44780 è stato creato da alpignolo
Ciao a tutti,
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
Allegati:
Ultima Modifica 11 Anni 4 Settimane fa da alpignolo.

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • alpignolo
  • Junior Member
  • Junior Member
Di più
11 Anni 4 Settimane fa #2 da Mauro Laurenti
Risposta da Mauro Laurenti al topic write_integer_LCD libreria LCD_44780
Ciao Andrea,

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.

  • Mauro Laurenti
  • Avatar di Mauro Laurenti
  • Moderator
  • Moderator
Di più
11 Anni 4 Settimane fa #3 da alpignolo
Risposta da alpignolo al topic write_integer_LCD libreria LCD_44780
Ciao Mauro,
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
  • Junior Member
  • Junior Member
Di più
11 Anni 3 Settimane fa #4 da Mauro Laurenti
Risposta da Mauro Laurenti al topic write_integer_LCD libreria LCD_44780
Ciao Andrea,

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.

  • Mauro Laurenti
  • Avatar di Mauro Laurenti
  • Moderator
  • Moderator
Di più
11 Anni 3 Settimane fa #5 da alpignolo
Risposta da alpignolo al topic write_integer_LCD libreria LCD_44780
Ciao Mauro,
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
  • Junior Member
  • Junior Member
Di più
Moderatori: Mauro LaurentiPinnaStefAMatteo Garia

Registrati al sito

Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.

Registrati al sito LaurTec.

Login