PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Arduino Mega und LCD Display code Fehler (Display 20x 4)



RoboterSindCool
18.12.2016, 13:06
Guten 4 Advent!

Ich bin gerade dabei eine Steuerung für einen Roboter zu Programmieren (Steuerung ist damit man dem Roboter Sagen kann was er tun soll). Diese Steuerung besteht aus 2 Displays und zu jedem Display gehören 5 knöpfe (wie ein Steuerkreuz angeordnet). Ich will, dass auf dem Display 1 verschiedene Funktionen angezeigt werden, die er Roboter ausführen kann. Dann soll man per Knopfdruck die gewünschte Funktion auswählen und dann mit der Mitteltaste diese bestätigen. Die Funktionen (die der Roboter können soll) stehen in dem "funktionen" Array (siehe im code). Das Problem:
Wenn ich das LCD direkt anspreche also wie im ersten Beispiel, dann funktioniert das. Wenn ich aber probiere mit einer Schleife die jeweilige funktion aus dem Array auszulesen und diese dann immer in die nächste Zeile zu schreiben funktionert es nicht und der Display zeigt sogar nur noch "qqqqqqqqqqqqqqqqq" oder so ein ähnliches Zeichen an. Der ganze Display ist dann mit diesen Zeichen gefüllt.

Beispiel 1 (so funktioniert es) :

LCD_Mod1.setCursor(0,0);
LCD_Mod1.print(funktionen[0]);
LCD_Mod1.setCursor(0,1);
LCD_Mod1.print(funktionen[1]);
LCD_Mod1.setCursor(0,2);
LCD_Mod1.print(funktionen[2]);


Beispiel 2 (so funktioniert es nicht):

void BIB_Roboterbedienung :: LCD_Aktualisieren(){


LCD_Mod1.clear();



for(int z = 0; z <= (sizeof(funktionen) - 1); z++){ //funktionen ist der Array mit den Funktionen

if(z == LCD_counter){ //Das ist, damit die gerade ausgewählte funktion erkennbar ist
LCD_Mod1.setCursor(0, z);
LCD_Mod1.print(" * ");
LCD_Mod1.setCursor(3, z);
LCD_Mod1.print(funktionen[z]);
}
else{
LCD_Mod1.setCursor(0, z);
LCD_Mod1.print(funktionen[z]);
}
}


}

Sisor
18.12.2016, 14:06
Der gegebene Code ist ein wenig dünn für eine Analyse. Wie und wo ist 'funktionen' definiert?
sizeof() gibt die Länge in Byte an.
char hat zwar die Länge 1 Byte, ein Zeiger auf char aber nicht.
SO könnte es gehen:


...
for(int z = 0; z < (sizeof(funktionen) / sizeof(*funktionen)); z++) {
LCD_Mod1.setCursor(0, z);
if(z == LCD_counter) {
LCD_Mod1.print(" * ");
LCD_Mod1.setCursor(3, z);
}
LCD_Mod1.print(funktionen[z]);
}
...

RoboterSindCool
18.12.2016, 15:45
Hallo und vielen Dank für die Schnelle Antwort
"funktionen" (der Array) ist in der header Datei so definiert:

char* funktionen[3] = {"Funk", "Autodrive", "Kabel Bedienung"};

- - - Aktualisiert - - -

Hi Leute Es hat wie immer wenn man euch fragt funktioniert!

Aber jetzt noch mal : Was gibt "sizeof(funktionen)" zurück und was "sizeof(*funktionen)"

Wo besteht der Unterschied? Noch mal vielen Vielen Dank!

Sisor
18.12.2016, 16:13
Hier findest du Informationen zu Zeigeroperatoren (https://www.tu-chemnitz.de/urz/archiv/kursunterlagen/C/kap2/ptrop.htm).
PS: Kennst du Google?

Unregistriert
18.12.2016, 18:21
etwas vereinfacht:

funktionen ist bei dir definiert als ein Pointer auf eine Speicher-Zelle (also eine Speicheradresse), ab wo deine insgesamt 3 Strings gespeichert stehen:

char *funktionen[3] = {"Funk", "Autodrive", "Kabel Bedienung"};

und ein Pointer (eine Speicheradresse) ist nichts anderes als eine Integerzahl, wahrscheinlich 32bit (4 Bytes).
sizeof(funktionen) ist also die Größe dieses Pointers (also 4 für 4 Bytes)

*funktionen ist dagegen die Größe der eigentlichen Stringvariable, auf die der Pointer funktionen zeigt,
und daher ist sizeof(*funktionen) die Gesamtgröße (Gesamtlänge) deiner Strings, also "Funk", "Autodrive", "Kabel Bedienung" = 4+8+16=28 Bytes.

Diese Methode funktioniert allerdings nur mit fest vordefinierten (konstant langen) Strings, denn sizeof() weiß bei variablen Strings nicht, welche Länge hinter der Pointeradresse aktuell stehen.

- - - Aktualisiert - - -

verzählt: String-Array 4+9+15, sind aber auch 28 vermutlich ;)

Sisor
18.12.2016, 19:11
Nö, falsch.
Auf den 8 Bit Atmels (Uno, Mega etc.) sind char-Zeiger (char*) 2 Byte lang.
Damit ist sizeof(*funktionen) = sizeof(char*) = 2[Byte].
Somit ist sizeof(funktionen) = 3 * 2[Byte] = 6[Byte].
Schließlich ist sizeof(funktionen) / sizeof(*funktionen) = 6 / 2 = 3 = Anzahl der Feldelemente von 'funktionen'.