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?
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.