Go Down

Topic: arduino e lcd seriale...problemi grafici (Read 3499 times) previous topic - next topic

ale92_

Jun 02, 2010, 07:25 pm Last Edit: Jun 02, 2010, 07:25 pm by ale92_ Reason: 1
salve a tutti ho da poco comprato il secondo arduino (dopo aver stupidamente bruciato il primo :-[) per un progetto molto semplice, creare un computerino di bordo per questo veicolo(cose del tipo velocità stato batteria ecc).
il grande problema che mi sono trovato di fronte utilizzando questo lcd sono appunto questi bug grafici che non riesco veramente a risolvere...
infatti quando vado a complicare un pò la grafica mi trovo con della grafica a caso(linee, quadrati, punti) che non ho messo io.

ho chiesto ad un pò di colleghi e alcuni mi hanno detto che potrebbe essere il boud rate, altri che il buffer del backpack dell'lcd va cancellato ogni tanto, altri ancora mi dicono che è il programma(spero che non sia così perchè questa è la quarta volta che ricomincio da capo il programma con grafica e "approcci" diversi).

voi cosa ne pensate...diciamo che ho qualcuno che mi alita sul collo per questo progetto e devo finirlo entro venerdì prossimo

se volete vi posso dare codice o altre informazioni

aspetto ansioso le risposte grazie in anticipo

uwefed

#1
Jun 02, 2010, 07:37 pm Last Edit: Jun 02, 2010, 07:38 pm by uwefed Reason: 1
ciao Ale92

Non sará semplice aiutarti perché per povare il tuo programma per capire il problema serve il display che dubito posseggono tanti.

Siccuramente come primo passo manda lo sketch e come hai collegato il display all'Arduino.

Dubito che sia il BaudRate perché se sbagliato non dovrebbe funzionare niente.

Ciao Uwe

kokiua

Una causa del tuo problema può essere una routin che va a scrivere sul display con dati corrotti (sia che servano per indirizzare la grafica o per "plottare" un oggetto grafico in bitmap)
Fai per caso delle copie di parti della memoria di Arduino per simboli particolari o altro da visualizzare sul display?
Perchè se così fosse dovresti verificare di non avere overflow di stack o superamento dei limiti di array (o buffer che dir si voglia).
Non scordarti poi che gestire un'area di schermo di 2,5Kb con Arduino non è tanto semplice, soprattutto se hai bisogno di inviargli grosse parti di grafica (sempre in bitmap) tipo loghi o simile...

Calamaro

#3
Jun 02, 2010, 09:18 pm Last Edit: Jun 02, 2010, 09:18 pm by Calamaro Reason: 1
l'arduino bruciato che arduino è? lo sai che lo puoi comunque usare se hai bruciato l'FT232?
Praticamente devi pluggare l'arduino bruciato, se dall ide ti rileva la com allora l'F232 è salvo. Non dovrai far altro che seguire questo tutorial e riflashare il bootloader. A meno che non tu abbia rotto altri componenti o ci siano cortocircuiti sulla scheda.
http://www.geocities.jp/arduino_diecimila/bootloader/index_en.html
Io oggi ho recuperato 2 mega e un microcontrollore atmega168 su cui era caduta una lima .D

ale92_

#4
Jun 02, 2010, 09:37 pm Last Edit: Jun 02, 2010, 09:39 pm by ale92_ Reason: 1
@calamaro...la scheda è l'arduino duemilanove, non so domani provo comunque ho dato 14 V sul pin 0 (quello analogico) e dopo fari scoppiettii ha smesso di funzionare...comunque mi pare che la usb la veda ancora, comunque giusto per averlo come riserva avevo ordinato un microprocessore nuovo(quello vecchio ha fatto una brutta fine...non l'ho presa benissimo quando ha smesso di funzionare XD)

io diciamo che uso per lo più la funzione quadrato che ho copiato dal datasheet(speriamo di averla copiata bene) non mi sono buttato sul disegno pixel per pixel ma domani sicuramente dalla disperazione proverò anche questo
scusa ma non capisco cosa intendi per "copie di parti della memoria di Arduino", vuoi dire i sottoprogrammi???

la quantità di dati che mando non è massiccia(secondo me)...dei delay possono aiutare?

ale92_

il problema è che gli errori sono random e non ad un loop preciso...per favore aiutatemi non so più dove mettere le mani...

edit.
oggi ho provato anche a fare tutto a pixel ma ho avuto subito dei problemi
Code: [Select]

void Pixel(int x1, int y1)
{
 Serial.print(0x7C, BYTE);
 Serial.print(0x10, BYTE);
 Serial.print(x1, BYTE);
 Serial.print(y1, BYTE);
 Serial.print(0x01, BYTE);
}




for(int i = 10; i < 90; i++)
 {
   Pixel(97,i);
 }


anche una cosa semplice come un for per fare una riga mi da parecchi problemi, cosa sbaglio?

kokiua

#6
Jun 03, 2010, 11:00 am Last Edit: Jun 03, 2010, 11:01 am by kokiua Reason: 1
Il fatto che tu "veda" una certa casualità negli errori non vuol dire necessariamente che siano "random".. è sufficiente che un contatore generi un valore che va erroneamente a sovrascrivere una variabile che poi inviii alla seriale per darti la medesima impressione... (una serie apparentemente casuale solo perchè lunga ed articolata).
Questo è un caso molto comune quando si hanno problemi di overflow nello stack (troppe funzioni nidificate).
I tuoi test li stai facendo con un programmino "bello magro" (nel senso: con le sole istruzioni di test) o sta provano il tutto con il software che dovrebbe servirti per il lavoro finale?
Nel caso il test sia "magro", hai verificato di non avere problemi nella comunicazione controllando i flag della seriale? (vedi post: Display LCD 20x4 seriale + arduino?) ink: http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1274883645

ale92_

il programma è solo quello con questa funzione, ora vado a vedere l'altro post anche se gli avevo gia dato un occhiata ma non ci avevo capito molto

ale92_

l'istruzione Serial.available mi può essere utile?

kokiua

#9
Jun 03, 2010, 03:33 pm Last Edit: Jun 03, 2010, 03:36 pm by kokiua Reason: 1
Direi di no, perchè quella funzione ti dice solo se hai ricevuto dei caratteri...
Hai provato a verificare che non ci siano errori di trasmissione con quel codice che ho già postato?

Lo riposto anche qui:
Code: [Select]
/* serial test by kokiua */

// definizione funzioni utili
#define setBit(var, bitnum)   (var)|=(1<<(bitnum))
#define resBit(var, bitnum)   (var)&=~(1<<(bitnum))
#define testBit(var, bitnum)  (var)&(1<<(bitnum))

//definizione led di stato
#define PIN_err1    9  //acceso se Frame Error
#define PIN_err2   10  //acceso se Data OverRun
#define PIN_err3   11  //acceso se Parity Error
#define PIN_err4   12  //acceso se tutto ok

//variabili globali

int errore = false;

void setup()
{
 pinMode(PIN_err1, OUTPUT);
 pinMode(PIN_err2, OUTPUT);
 pinMode(PIN_err3, OUTPUT);
 pinMode(PIN_err4, OUTPUT);
 Serial.begin(9600);

 // da modificare se la seriale è usata per altri scopi
 Serial.println("Test protocollo della seriale");
}

void loop()
{
 if(testBit(UCSR0A, FE0)){ // indica errore "Frame Error"
      digitalWrite(PIN_err1, 1);
      errore = true;
 } else {
     digitalWrite(PIN_err1, 0);
 }
 
 if(testBit(UCSR0A, DOR0)){ // indica errore "Data OverRun"
      digitalWrite(PIN_err2, 1);
      errore = true;
 } else {
     digitalWrite(PIN_err2, 0);
 }
 
 if(testBit(UCSR0A, UPE0)){ // indica errore "Parity Error"
      digitalWrite(PIN_err3, 1);
      errore = true;
 } else {
     digitalWrite(PIN_err3, 0);
 }

 if(errore){
      digitalWrite(PIN_err4, 0);  //spegne led di tutto ok
 } else {
     digitalWrite(PIN_err4, 1);  //accende led di tutto ok
     errore = false;
 }
}  



Ricorda che la stringa emessa in fase di setup la devi modificare per renderla compatibile con il dispositivo che hai collegato (in questo caso il Display) e vedi di non usare Serial.println() ma solo Serial.print()

Fammi sapere se hai un qualche errore!

ale92_

#10
Jun 03, 2010, 03:39 pm Last Edit: Jun 03, 2010, 03:42 pm by ale92_ Reason: 1
sisi l'ho visto e stavo cercando di capire come funzionava...(non so se si è capito ma non sono molto pratico ;D) ...praticamente devo collegare lo schermo come al solito in più metto il led sui vari pin e vedo se si accendono...giusto?


edit
Code: [Select]

pinMode(1, OUTPUT);
 Serial.begin(115200);

uso questo al posto del println giusto?

kokiua

Ok per i led che se tutto funziona dovrebbero restare spenti a parte il quarto (quello che dice che tutto è ok).
Al posto del println devi usare solo il print ovvero: Serial.print() perchè printnl aggiunge alla trasmissione il carattere di "a capo", utile solo se devi "stampare" una stringa su di una periferica di visualizzazione abbastanza intelligente da saper interpretare il codice di "a capo".

pinMode(1, OUTPUT); è solo l'impostazione del pin 1 come output che non c'entra nulla con la seriale ma solo con una uscita logica.
Serial.begin(115200); è la velocità di trasmissione (della quale devi essere certo che anche il display la utilizzi uguale!)

ale92_

avendo un solo display sono andato a culo e l'ho attaccato direttamente al 12 per vedere se era tutto ok e il led si è acceso, quasi che speravo che non si accendeva almeno capivo cos'è che non funzionava...
ora che posso fare/provare???

sul mio programma l'aggiunta di qualche delay può aiutare secondo te???

kokiua

Mi posti qui il sorgente da te usato per fare il test?

P.S. dove trovo il datasheet del display con le istruzioni precise della configurazione??

ale92_

#14
Jun 03, 2010, 05:53 pm Last Edit: Jun 03, 2010, 05:53 pm by ale92_ Reason: 1
il datasheet è questo

dopo la tua domanda penso di non aver capito come fare il testo...io ho messo il tuo codice sull'arduino, invece cosa dovevo mettere?

il codice generale che uso è questo
Code: [Select]

//PIN
int schermo_pin = 1;
int carica_pin = 0;
int pin_fotoresistore = 1;
int pin_fotoresistore_uscita = 2;
//VARIABILI
int cont = 20;
int pulisci = 0;
int cont_fotoresistore = 25;
int controllo_batteria = 61;

void setup()
{
 ConfigureLCD();
 ClearScreen();
 Background();
}

void loop()
{
 if(cont == 85)
 {
   cont = 20;
 }
 Velocita(cont);
 Batteria(cont);
 cont = cont + 5;
 if(pulisci == 10)
 {
   ClearScreen();
   pulisci = 0;
   Background();
 }
 EraseBlock(21,11,49,89);
 EraseBlock(98,11,126,89);
 pulisci++;
 delay(400);
}

void ConfigureLCD()  //CONFIGURO LO SCHERMO
{
 pinMode(1, OUTPUT);
 Serial.begin(115200);
}

void ClearScreen()    //RIPULISCO LO SCHERMO
{
 Serial.print(0x7C, BYTE);
 Serial.print(0x00, BYTE);  // clear screen
}

void DrawBox(byte x1, byte y1, byte x2, byte y2)    //DISEGNO UN QUADRILATERO!!
{
 Serial.print(0x7C, BYTE);
 Serial.print(0x0F, BYTE);
 Serial.print(x1, BYTE);
 Serial.print(y1, BYTE);
 Serial.print(x2, BYTE);
 Serial.print(y2, BYTE);  
}

void EraseBlock(int x1, int y1, int x2, int y2)    //CANCELLO UN'AREA DELIMITATA DAI VERTICI CON COORDINATE X1, Y1 E X2, Y2
{
 Serial.print(0x7C, BYTE);
 Serial.print(0x05, BYTE);
 Serial.print(x1, BYTE);
 Serial.print(y1, BYTE);
 Serial.print(x2, BYTE);
 Serial.print(y2, BYTE);
}

void SetXY(int x, int y)      //POSIZIONO IL CURSORE SUL PIXEL DETERMINATO DALLE COORDINATE X E Y
{
 Serial.print(0x7C, BYTE);
 Serial.print(0x18, BYTE);
 Serial.print(x, BYTE);
 Serial.print(0x7C, BYTE);
 Serial.print(0x19, BYTE);
 Serial.print(y, BYTE);
}
void Background()
{
   SetXY(25,120);
   Serial.print("CLASSE VIRTUALE 2010");
   SetXY(20,100);
   Serial.print("SPEED");
   SetXY(97,100);
   Serial.print("BATTERY");
   
   //SPEED
   DrawBox(20,10,50,90);
   SetXY(13,10);
   Serial.print("0");
   SetXY(13,30);
   Serial.print("5");
   SetXY(7,50);
   Serial.print("10");
   SetXY(7,70);
   Serial.print("15");
   SetXY(7,90);
   Serial.print("20");
   
   //BATTERY
   DrawBox(97,10,127,90);
   SetXY(78,90);
   Serial.print("100");
   SetXY(84,70);
   Serial.print("75");
   SetXY(84,50);
   Serial.print("50");
   SetXY(84,30);
   Serial.print("25");
   SetXY(90,10);
   Serial.print("0");
}

void ReverseMode()        //INVERTO I COLORI DELLO SCHERMO
{
 Serial.print(0x7C, BYTE);
 Serial.print(0x12, BYTE);
}

//void Fotoresistore()  //FARI ACCESI/SPENTI IN BASE ALLA LUCE
//{
//  int valore1 = 0;
//  int valore2 = 920;
//  valore1 = analogRead(pin_fotoresistore);
//  if(valore1 >= valore2)
//  {
//    digitalWrite(pin_fotoresistore_uscita, HIGH);
//  }
//  else
//  {
//    digitalWrite(pin_fotoresistore_uscita, LOW);
//  }
//}

void Velocita(int riga)
{
 DrawBox(21, riga, 49, riga);
}

void Batteria(int riga)
{
 DrawBox(98, riga, 126, riga);
}


quando arrivo a casa posto un paio di foto...ora con il firewall di lavoro non riesco nemmeno a mettere un immagine su internet

Go Up