Display gibt als String eine Art Pixelfehler aus

OP #4222816
Lesenswert?

Hallo Community,
ich habe folgendes Problem.
An der Stelle an der die Strings ausgegeben werden sollen, gibt er eine 
Art Pixelfehler aus.
Wenn ich jedoch andere Werte in einem Integer speicher gibt er die 
Variablen richtig aus.
Jedoch brauche ich den typ uint8_t wegen den CAN daten.
Weiß einer vielleicht woran das liegen kann?
Code ist im Anhang.
Schonmal danke im Vorraus.

Mit freundlichen Grüßen

Julian
Angehängte Dateien:
OP #4222824
Lesenswert?

oh meinte damit natürlich das Display3000 angesteuert über den 
At90Can128.
Zu dem Thema SRAM ich denke ja mal nicht, im moment werden ja gerade 
einmal 3 Ziffern ausgegeben auf dem Display. Welche bei einem Interrupt 
aktualisiert werden. Jedoch werden diese Komische Pixelfehler schon bei 
dem Programm start angezeigt, auch wenn kein CAN bus angeschlossen ist.
Diese Pixelfehler sind so groß ca. wie eine Ziffer.
#4222831
Lesenswert?

Julian M. schrieb:
> oh meinte damit natürlich das Display3000 angesteuert über den
> At90Can128.

Wenn ich die Produktinformation zum Display3000 richtig interpretiere, 
dann ist der AT90CAN128 auch für das TFT Display zuständig. Was soviel 
bedeutet wie: er muss auch die Farbinformation für die Pixel irgendwo 
speichern, die angezeigt werden. D.h. dazu braucht er SRAM SPeicher, von 
dem auf dem µC nur 4KB vorhanden sind.

> Zu dem Thema SRAM ich denke ja mal nicht, im moment werden ja gerade
> einmal 3 Ziffern ausgegeben auf dem Display.


Das ist ziemlich wurscht.
Du hast dazu
1
char drehstring[30];
2
char wassertempstring[30];
3
char oiltempstring[30];
4
char gangstring[30];
120 Bytes verbrutzelt.
Das klingt erst mal nicht viel.
Wenn man allerdings berücksichtigt, dass ein erklecklicher Anteil schon 
für das TFT drauf geht, dann sind 120 Bytes schon sehr viel. Vor allen 
Dingen, weil du sie ziemlich unnötig und leichtsinnig verbrutzelt hast.
#4222833
Lesenswert?

Denn das
1
char drehstring[30];
2
char wassertempstring[30];
3
char oiltempstring[30];
4
char gangstring[30];
5

6
....
7

8
      sprintf(drehstring, "%i", rev);
9
      sprintf(gangstring, "%i", gang[0]);
10
      sprintf(wassertempstring, "%i", temperatur[6][2]);
11
      sprintf(oiltempstring, "%i", temperatur[7][2]);
12
      
13
      Orientation = Landscape;
14
      LCD_Print (drehstring,0,0, 2, 1, 1, white, black);
15
      Orientation = Landscape;
16
      LCD_Print (gangstring,60,30, 2, 5, 5, white, black);
17
      Orientation = Landscape;
18
      LCD_Print (wassertempstring,120,120, 2, 1, 1, white, black);
19
....

ist schon ein wenig verschwenderisch im Speicherverbrauch.

Es besteht kein Grund, für jede Ausgabe ein eigenes char-Array 
anzulegen.

sprintf - LCD_print  sprintf - LCD_print ...
immer im schönen Wechsel und schon kann man immer ein und dasselbe 
char-Array benutzen.
Und weil das so ist, kann man sich dann auch eine Funktion LCD_Print_int 
machen, so dass letzten Endes dann nur noch dort steht
1
....
2
      rev=(messwerte[4] + ( messwerte[3] << 8)) / 2;
3
      
4
      LCD_Print_int( rev,                0,   0, 2, 1, 1, white, black);
5
      LCD_Print_int( gang[0],           60,  30, 2, 5, 5, white, black);
6
      LCD_Print_int( temperatur[6][2], 120, 120, 2, 1, 1, white, black);
7

8
      if(rev < 500)     //Drehzahl unter 500 u/min -> Fehlerhaftes Datenpaket
9
....

und die Details, wie du 'ASCII'-fizierung sowie das Umschalten auf 
Landscape wird von dieser einen Funktion gehandhabt. Und als Nebeneffekt 
benötigt das dann auch viel weniger SRAM Speicher. Für einen 16 Bit 
reicht ein char Array mit einer Länge von 7. Denn die 'längste' 
auszugebende Zahl ist -32767. Zähl nach, das sind 6 sichtbare Zeichen. 
30 ist da verschwendirisch überdimensioniert.
#4223490
Lesenswert?

Julian M. schrieb:
> Wenn ich jedoch andere Werte in einem Integer speicher gibt er die
> Variablen richtig aus.
> Jedoch brauche ich den typ uint8_t wegen den CAN daten.

kann man das so verstehen, dass es mit uint16_t bspw. funktioniert?
Wenn ja: kann es sein, dass der "%i" im Format-String mit dem uint8_t in 
Konflikt steht? Oder kann es sein, dass der übergebene uint8_t als 
Character interpretiert wird?
Wenn etwas derartiges ist, müsste ja der Umweg über eine temporäre 
Integer-Variable funktionieren.
#4223491
Lesenswert?

Rufus Τ. F. schrieb:
> Wie sehen denn Deine "Pixelfehler" aus? Gelingt es überhaupt,
> irgendwelchen Text auszugeben, oder geht das prinzipiell immer schief?

Er sagt
> Wenn ich jedoch andere Werte in einem Integer speicher gibt er
> die Variablen richtig aus.
> Jedoch brauche ich den typ uint8_t wegen den CAN daten.

Die uint8_t sollten jetzt keine Rolle spielen, denn bei einem sprintf 
findet sowieso eine Promotion auf int statt. Die kann man ja auch nicht 
abschalten, oder doch?

Auch wenn es eigentlich keinen Unterschied macht:
1
  sprintf(ausgabestring, "%i", (int)uebergabe);
#4223526
Lesenswert?

Julian M. schrieb:
> So sehen diese Fehler aus. Ja wenn ich ein anderes Programm mit integer
> werten aufspiele wird auf dem Display alles angezeigt.


Mooooment.

Was heisst hier anderes Programm?

Hast du nicht testweise in dein Programm am Anfang mal irgend eine 
Ausgabe reingemacht? Und sei es nur, dass du irgendeinen (konstanten) 
Text ausgibst?

> Liegt es möglicherweise an der uint8_t convertation?

Nein.
Nicht wenn dein Compiler nicht massiv gepatcht wurde. In C ist genau 
geregelt, wie die Argumentübergabe im Falle variadischer Funktionen zu 
erfolgen hat. Das ist soweit alles in Ordnung.
#4223542
Lesenswert?

Julian M. schrieb:
> Ja genau, in diesem Programm funktioniert auch keine feste Ausgabe.

Dann fangen wir halt mal damit an.

Alles raus aus dem Programm!
Nur Textausgabe!

Die muss erst mal klappen.

Und dann kommen nach und nach die anderen Teile wieder dazu.
1
...
2
int main(void)
3
{
4
  cli();
5
  
6
  LCD_Init();
7
  _delay_ms(1000);
8
  LCD_Cls(black);
9

10
  sei();
11

12
  LCD_Cls(black);
13

14
  while(1)
15
  {
16
    LCD_Print_int ( 5, 60, 30, 2, 5, 5 );
17
  }
18
}

[] funktioniert
[] funktioniert nicht

Wenn das schon nicht funktioniert, dann sieht das Ganze danach aus, als 
ob in der Initialisierung irgendwas fehlt.
Wenn das funktioniert, dann verdichten sich die Hinweise, dass es 
irgendein Speicherproblem ist. Mglw. immer noch zu hoher 
Speicherverbrauch.
#4223545
Lesenswert?

Und beim nächsten Programm fängst du gleich damit an, dich vor allem 
anderen um die Ausgabe zu kümmern.
Es macht wenig Sinn, mit den CAN Funktionen anzufangen, wenn man die 
nicht testen kann, weil man nirgends eine Ausgabemöglichkeit hat. 
Ausgabe ist immer das Allerwichtigste.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren