- LiTime Speicher und Akkus         
Ergebnis 1 bis 6 von 6

Thema: Arduino Mega und LCD Display code Fehler (Display 20x 4)

  1. #1

    Arduino Mega und LCD Display code Fehler (Display 20x 4)

    Anzeige

    LiFePo4 Akku selber bauen - Video
    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]);
    }
    }


    }

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    13.01.2014
    Beiträge
    454
    Blog-Einträge
    3
    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:
    Code:
    ...
    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]);
    }
    ...
    Geändert von Sisor (18.12.2016 um 15:25 Uhr)

  3. #3
    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!

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    13.01.2014
    Beiträge
    454
    Blog-Einträge
    3

  5. #5
    Unregistriert
    Gast
    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

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    13.01.2014
    Beiträge
    454
    Blog-Einträge
    3
    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'.

Ähnliche Themen

  1. Arduino Mega und LCD Display code Fehler
    Von RoboterSindCool im Forum Arduino -Plattform
    Antworten: 2
    Letzter Beitrag: 19.12.2016, 17:41
  2. SPI-TFT Display gesucht für Arduino Mega, nur (!) Pins 50-53 plus Spannung (o.Touch)
    Von HaWe im Forum Suche bestimmtes Bauteil bzw. Empfehlung
    Antworten: 20
    Letzter Beitrag: 12.11.2014, 11:29
  3. Antworten: 4
    Letzter Beitrag: 09.04.2013, 11:41
  4. Arduino LCD Display(16x4) 3.&4.Zeile Fehler
    Von pro-bot128 im Forum Arduino -Plattform
    Antworten: 12
    Letzter Beitrag: 29.04.2011, 19:05
  5. LCD-Display per C-Code invertieren
    Von borisking im Forum C - Programmierung (GCC u.a.)
    Antworten: 6
    Letzter Beitrag: 12.06.2007, 13:14

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiTime Speicher und Akkus