mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LCD Menü Routine funktioniert nicht


Autor: Patrick F. (Firma: AISLER B.V.) (helipaddi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Morgen,

bin im Moment eine kleine Menü Routine für ein 2x16 LCD am schreiben. µC 
ist ein ATMega 16.
Hier mal die wichtigen Ausschnitte:
//Menü
//Menü Texte
static const char menu_string0[] PROGMEM = "New Record";
static const char menu_string1[] PROGMEM = "Profiles";
static const char menu_string2[] PROGMEM = "Free space";
static const char menu_string3[] PROGMEM = "Choose Profile";
//Menü Struct
typedef struct MENU {
  const unsigned char *text;
  uint8_t previous;
  uint8_t next;
  uint8_t up;
  uint8_t down;
  void ( *fp )( void );
} MENU_ENTRY;
//Menü Funktionen
void menu_function01( void )
{

}
//Menü Struktur
const MENU_ENTRY menue[] PROGMEM= {
  { menu_string0, 0, 1, 0, 3, menu_function01 },
  { menu_string1, 0, 2, 0, 0, menu_function01 },
  { menu_string2, 1, 2, 0, 0, menu_function01 },
  { menu_string3, 0, 0, 0, 0, menu_function01 }
 };
uint8_t menu_count = 0;

...

  //Menü scrollen
  if (debounce(&PINA, PINA0)) {
    menu_count = menue[menu_count].next;
    //menu_count = 0;
  }
  if (debounce(&PINA, PINA1)) {
    menu_count = menue[menu_count].up;
    //menu_count = 1;
  }
  if (debounce(&PINA, PINA2)) {
    menu_count = menue[menu_count].down;
    //menu_count = 2;
  }
  if (debounce(&PINA, PINA3)) {
    menu_count = menue[menu_count].previous;
    //menu_count = 3;
  }

  lcd_clrscr();
  //Text für Menü ausgeben
  strcpy_P(firstLine, (char*)pgm_read_word(&menue[menu_count].text));
  lcd_gotoxy(0,0);
  lcd_puts(firstLine);


Leider funktioniert das ganze nicht so. Wenn ich z.B. in Menü 0 die 
Taste A2 drücke springt er nicht wie gewünscht auf Menü 3.
Vielleicht findet ihr den Fehler. Danke schonmal!

Gruß,
Patrick

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Patrick Franken schrieb:

> Vielleicht findet ihr den Fehler. Danke schonmal!

Dein Fehler ist, dass du die Menüdaten komplett ins Flash ausgelagert 
hast, beim Zugriff auf die Daten dies aber nicht berücksichtigst.
  menu_count = pgm_read_byte( &menue[menu_count].next );

und alle anderen Stellen an denen du Werte von menue holst.

Autor: Patrick F. (Firma: AISLER B.V.) (helipaddi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wow, vielen Dank für die super schnelle Antwort! Es funktioniert jetzt. 
Habe aber noch eine kleine Frage im Bezug auf den Function Pointer im 
Struct:
Wie kann man die Funktionen aufrufen?
Habe es schon mit
(*menue[menu_counter].fp)();
versucht, was aber leider nicht funktionierte. Wenn ich die Funktion 
sofort aufrufe funktioniert es hingegen.

Gruß,
Patrick

Autor: Patrick F. (Firma: AISLER B.V.) (helipaddi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hm... Weis keiner was? Hab schon alles getestet, aber es geht nicht :-( 
Der µC bleibt übrigends hängen, wenn die Funktion über den Pointer 
aufgerufen würd.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Patrick Franken schrieb:
> Hm... Weis keiner was? Hab schon alles getestet, aber es geht nicht :-(

Schon ein starkes Stück, wenn man dir zu erklären versucht, dass ALLES, 
was du von menu holst, über read_pgm_xxx gemacht werden muss, du zum 
AUsdruck bringst es verstanden zu haben und dann ein paar Stunden später 
schon wieder denselben Fehler machst und ihn nicht erkennst.

const MENU_ENTRY menue[] PROGMEM= {

das komplette menue liegt im Flash!
Egal, was du von dort lesen willst, du musst
* festlegen, von welcher Adresse du lesen willst
* einen read_pgm_xxx Aufruf machen, damit der Lesezugriff von dieser
  Adresse im Flash und nicht im SRAM passiert.

Autor: Patrick F. (Firma: AISLER B.V.) (helipaddi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe mir das schon ein bisschen gedacht...
Werde es mal selber weiter versuchen mit read_pgm.... Danke erstmal!

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.