www.mikrocontroller.net

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


Autor: Lochrasterfan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Stephan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
uint8_t  N3310_PutStr_Ram(char *c)
{  
  // NEW LINE ???
  //if (c == '\n') {      N3310_NewLine();      return(0);    }        // noch bearbeiten
  
  
  if(rot){                                          // x2 muss größer sein als x1
      N3310_Coord_t eX = N3310_Cursor.X;
      N3310_Cursor.X=N3310_Cursor.Y; N3310_Cursor.Y= eX;
      }


  N3310_Coord_t x = N3310_Cursor.X;
    N3310_Coord_t y = N3310_Cursor.Y;

  //TeXtausrichtung bzw format - anfang
  
  if (TextFormat == 1)  
    {    
    x -= N3310_CharsWidth(c)/ 2;
    y -= pgm_read_byte_near(&FontPointer[3])/ 2;  // Höhen Zentriert
    }  
  //if (TextFormat == 2)  {  x -= N3310_CharsWidth(c);  }
  //TeXtausrichtung bzw format  - ende

  uint8_t zeichen = 0;
  uint8_t zeichenbreite = 0;
  uint8_t xo = 0;
  uint8_t i = 0;
  while(zeichen = c++)      // pgm_read_byte(c++)) <---- geändert!!!
    {
    N3310_Cursor.X=x+xo;
    zeichenbreite = N3310_PutChar(zeichen);
    if(TextTyp == 0)
      {
      xo += zeichenbreite+1;
      }
    else
      {
      xo+=TextBreite;
      }
    i++;
    if(i == 255){return(255);} // 255 ist "Fehleroode" für unterminierten String
    }
  return(xo);
  }

mfg
Stephan

Autor: Lochrasterfan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.