mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Verständnissfrage PROGMEM & Flash


Autor: Jörn A. (joern_)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hy

versuche heute meinen Butterfly bzgl. des Display zu nutzen und habe 
nutze eine fertige Funktion zum schreiben des LCD.  Funktioniert so weit 
auch alles wunderbar aber ich kann keine Paramter übergeben!! Er holt ja 
die "Daten" aus dem Flash aber wieso kann ich n nicht mit übergeben??

das klappt:

char MenuItem1[] PROGMEM= "Rot";
char MenuItem2[] PROGMEM= "Gruen";
char MenuItem3[] PROGMEM= "Blau";
char* MenuItemPointers[] PROGMEM= {MenuItem1, MenuItem2, MenuItem3};
....
LCD_puts_f(MenuItemPointers[2]);

das hier nicht: !!!

char MenuItem1[] PROGMEM= "Rot";
char MenuItem2[] PROGMEM= "Gruen";
char MenuItem3[] PROGMEM= "Blau";
char* MenuItemPointers[] PROGMEM= {MenuItem1, MenuItem2, MenuItem3};
....
n=2
LCD_puts_f(MenuItemPointers[1]);

hier die Funktion:

void LCD_puts_f(const char *FlashData)
{
    strcpy_P((char*)&TextBuffer[0], FlashData);
   LCD_puts((char*)&TextBuffer[0]);
}

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jörn Ahrens wrote:

> char* MenuItemPointers[] PROGMEM= {MenuItem1, MenuItem2, MenuItem3};
> ....
> LCD_puts_f(MenuItemPointers[2]);

Wenn dies funktioniert, dann eher zufällig, denn MenuItemPointers liegt 
im Flash aber der Zugriff auf MenuItemPointers[2] holt den Pointer aus 
dem RAM. Besser:
  LCD_puts_f(pgm_read_word(&MenuItemPointers[2]));

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

Bewertung
0 lesenswert
nicht lesenswert
Jörn Ahrens wrote:

> auch alles wunderbar aber ich kann keine Paramter übergeben!! Er holt ja
> die "Daten" aus dem Flash aber wieso kann ich n nicht mit übergeben??

Wozu willst du's mit übergeben?

> das hier nicht: !!!
>
> char MenuItem1[] PROGMEM= "Rot";
> char MenuItem2[] PROGMEM= "Gruen";
> char MenuItem3[] PROGMEM= "Blau";
> char* MenuItemPointers[] PROGMEM= {MenuItem1, MenuItem2, MenuItem3};
> ....
> n=2
> LCD_puts_f(MenuItemPointers[1]);

 LCD_puts_f(MenuItemPointers[n]);

Autor: Jörn A. (joern_)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also ich glaube das ganze Zusammenwirken von RAM<->FLASH erschließt sich 
mir noch nicht so ganz.

Zur Zeit möchte ich damit eigentlich nur die Menues anzeigen. mit dem 
Joystick Druck gehe ich durch die Menüs...  hab zur Zeit das ganze durch 
switch(n) gelöst aber das ist ja etwas umständlich.

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

Bewertung
0 lesenswert
nicht lesenswert
Jörn Ahrens wrote:
> also ich glaube das ganze Zusammenwirken von RAM<->FLASH erschließt sich
> mir noch nicht so ganz.

Ich glaub eher, du hast noch Probleme mit Arrays.

MenuItemPointers ist ein Array von Pointern, wobei jeder Pointer auf 
einen Text zeigt.
Wenn du den 0-ten Text ausgeben lassen willst, dann musst du 
logischerweise auch den 0-Eintrag aus dem Pointer Array nehmen. Willst 
du den 2-ten Text ausgeben, dann musst du logischerweise auch den 2-ten 
Eintrag aus dem Pointer Array nehmen.
Willst du allgemein den n-ten Text ausgeben, dann musst du halt den 
n-ten Pointer aus dem Array nehmen.

Daher:
  LCD_puts_f( pgm_read_word( &MenuItemPointers[n] ) );

Autor: Jörn A. (joern_)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hy

das mit den Arrays war nicht das Problem sondern das "pgm_read_word" 
fehlte.... (besten Dank, kannste ich noch nicht)
Ich habe denn Array ja gerade eingeführt, um den n-ten Wert, der den 
Pointer auf den String hat, zu nutzen aber da ich ohne PGM auf irgendwas 
zugriffen hatte war ich verwundert...

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.