string aus RAM an LCD-Ausgabefunktion übergeben

Gast #1862125
Lesenswert?
• ▲
▼
Hallo,

ich habe mir gerade eine kleine Platine mit einem Atmega8, einem Nokia 
3310-Display und einer GPS-Maus aufgebaut. Als Software zur Ansteuerung 
des Displays verwende ich die Lib von Martin Junghans 
(http://www.jtronics.de/elektronik-avr/lcd-display-nokia3310).
Die Beispiele in seinem Code funktionieren auch, hardwaremäßig scheine 
ich also alles richtig gemacht zu haben. Nur mache ich anscheinend 
irgendwas im Umgang mit Strings falsch:

Folgendes funktioniert einwandfrei:
    N3310_PutStr(PSTR("Beispieltext"));

Wenn ich das PSTR weglasse, oder wenn ich einen String übergeben möchte, 
den ich vorher über den UART des ATmega ins RAM eingelesen habe, wird 
aber nur ein schwarzer Balken angezeigt. Dass mit PSTR der Text 
"Beispieltext" vom Compiler im Flash abgelegt wird, glaube ich, 
verstanden zu haben, was schief läuft, wenn man es weglässt, verstehe 
ich allerdings nicht.

Kann mir jemand sagen, was ich an der Übergabe verändern muss, damit 
auch Strings aus dem RAM angezeigt werden?
Gast #1862201
Lesenswert?
• ▲
▼
Hi,
die Funktion erwartet halt einen String im Flash!

Was du machen kannst ist, dir eine neue Funktion zuschreiben, die
dir den String aus dem RAM anzeigt.

zum Testen, nicht geprüft:
1
uint8_t  N3310_PutStr_Ram(char *c)
2
{  
3
  // NEW LINE ???
4
  //if (c == '\n') {      N3310_NewLine();      return(0);    }        // noch bearbeiten
5
  
6
  
7
  if(rot){                                          // x2 muss größer sein als x1
8
      N3310_Coord_t eX = N3310_Cursor.X;
9
      N3310_Cursor.X=N3310_Cursor.Y; N3310_Cursor.Y= eX;
10
      }
11

12

13
  N3310_Coord_t x = N3310_Cursor.X;
14
    N3310_Coord_t y = N3310_Cursor.Y;
15

16
  //TeXtausrichtung bzw format - anfang
17
  
18
  if (TextFormat == 1)  
19
    {    
20
    x -= N3310_CharsWidth(c)/ 2;
21
    y -= pgm_read_byte_near(&FontPointer[3])/ 2;  // Höhen Zentriert
22
    }  
23
  //if (TextFormat == 2)  {  x -= N3310_CharsWidth(c);  }
24
  //TeXtausrichtung bzw format  - ende
25

26
  uint8_t zeichen = 0;
27
  uint8_t zeichenbreite = 0;
28
  uint8_t xo = 0;
29
  uint8_t i = 0;
30
  while(zeichen = c++)      // pgm_read_byte(c++)) <---- geändert!!!
31
    {
32
    N3310_Cursor.X=x+xo;
33
    zeichenbreite = N3310_PutChar(zeichen);
34
    if(TextTyp == 0)
35
      {
36
      xo += zeichenbreite+1;
37
      }
38
    else
39
      {
40
      xo+=TextBreite;
41
      }
42
    i++;
43
    if(i == 255){return(255);} // 255 ist "Fehleroode" für unterminierten String
44
    }
45
  return(xo);
46
  }

mfg
Stephan
Gast #1862276
Lesenswert?
• ▲
▼
Danke für Deine Antwort, Stefan!

Ich hatte mich eh' gefragt, was die vielen Anweisungen pgm_read_byte() 
bedeuten ...

Dein Vorschlag hat nicht ganz exakt funktioniert, aber er ging in die 
richtige Richtung. Es muss heißen:

while(zeichen = *c++){ ... }

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.