AVR progmem array auslesen in Funktion

Gast #4573660
Lesenswert?

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
#4573984
Lesenswert?

@ 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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren