Forum: Mikrocontroller und Digitale Elektronik string aus RAM an LCD-Ausgabefunktion übergeben


von Lochrasterfan (Gast)


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?

von Stephan (Gast)


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

von Lochrasterfan (Gast)


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++){ ... }

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.