AVR progmem array auslesen in Funktion

Gast #4573660
Da mein RAM im AT90USB1286 voll ist, möchte ich den Text der LCD 
Menüpunkte im Flash ablegen. Das klappt auch soweit. Hier ein Beispiel 
eines Menüs:
1
static const char string_1[] PROGMEM ="1 SWR Alarm";
2
...
3
static const char string_11[] PROGMEM ="0 Exit";
4

5
const char * const level0_menu_items[] PROGMEM =
6
{
7
  string_1, string_2, string_3, 
8
  string_4, string_5, string_6,
9
  string_7, string_8, string_9,
10
  string_10, string_11
11
};

Ich kann nun mit dem Aufruf
1
lcd_scroll_Menu(Pointer auf Menü, menu_size, current_selection);

meine Funktion aufrufen in der die Daten vom level0_menu_items 
dargestellt werden, wobei "Pointer auf Menü" erstmal null ist.
"Pointer auf Menü" soll später der Zeiger für das jeweilge Menü sein.
Jetzt habe ich aber weitere Menüpunkte und daher macht es wenig Sinn für 
jeden Menüpunkt eine eigene Funktion zu erstellen. Daher dachte ich mir 
es müsste doch auch mit Pointer gehen. Nur leider kenn ich mich damit 
nicht gut genug aus und benötige hier Hilfe.
1
void lcd_scroll_Menu(Pointer auf Menu, uint8_t menu_size, uint8_t current_choice)
2
{
3
 char buffer[21];
4
lcdGotoXY(0,1);
5
strcpy_P(buffer, (PGM_P)pgm_read_word(&(level0_menu_items[current_choice])));
6
lcdPrintData(buffer,strlen(buffer));
7
_delay_ms(1000);
8
}

menu_size soll später mit Leben gefüllt werden.

Kann mir jemand zeigen wie ich mit einer Funktion die Inhalte der 
verschiedenen Menüpunkte anzeigen kann? Als Übergabe soll ein Zeiger auf 
das jeweilige Array oder Menü sein.

Gruß Marc
@ Marc (Gast)

>static const char string_1[] PROGMEM ="1 SWR Alarm";

Bei einem halbwegs aktuellen avr gcc nimmt man besser __flash.

https://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Flash_mit_flash_und_Embedded-C
1
const char __flash string_1[]   = "1 SWR Alarm";
2
const char __flash string_11[]  = "0 Exit";
3

4
const __flash char* const __flash menu_items[][10] PROGMEM =
5
{
6
  /* menu 0 */
7
  {string_1, string_2, string_3, 
8
  string_4, string_5, string_6,
9
  string_7, string_8, string_9,
10
  string_10, string_11},
11

12
  /* menu 1 */
13
  {string_1, string_2, string_3, 
14
  string_4, string_5, string_6,
15
  string_7, string_8, string_9,
16
  string_10, string_11}
17

18
};
19

20
void lcd_scroll_Menu(uint8_t menu, uint8_t item)
21
{
22
   char buffer[21];
23

24
   strcpy_P(buffer, menu_items[menu][item]);
25
   lcdGotoXY(0,1);
26
   lcdPrintData(buffer,strlen(buffer));
27
}

Das mit dem _delay_ms(1000) gewöhnst du die am besten gleich wieder ab! 
Siehe Multitasking!!!

>Kann mir jemand zeigen wie ich mit einer Funktion die Inhalte der
>verschiedenen Menüpunkte anzeigen kann? Als Übergabe soll ein Zeiger auf
>das jeweilige Array oder Menü sein.

Dazu reicht hier ein 2D Array, denn es sind ja alles nur Pointer. Man 
kann es auch über ein struct und verkettete Listen machen.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.