Atmega Flash -> PROGMEM -> ARRAY

OP #5103096
Lesenswert?

Moin.

Ich möchte ein Array in den Flash parken.
Das klappt soweit auch. Nur beim auslesen, mache ich was falsch.
1
const unsigned char hesch [] PROGMEM = {..};



Und hier will ich das Array ausgeben. Leider passt da was überhaupt 
nicht?! Es wird nur Mist angezeigt.
Was mache ich bei der Übergabe falsch?
1
void lcd_printImage(const unsigned char *image, uint16_t sizeofimage)
2
{
3
  uint16_t page  = 0;
4
  uint16_t column  = 0;
5
  
6
  lcd_gotoxy(0,0);
7
  for (column=0;column<sizeofimage;column++)
8
  {
9
    lcd_senddata(swapBits(pgm_read_byte(image[column])));
10
    if ((column%LCD_WIDTH_SIZE)==0)
11
    {
12
      lcd_gotoxy(page++, 0);
13
      if (page==LCD_PAGE_SIZE) page=0;
14
    }
15
  }
16
}
Persönliche Seite #5103143
Lesenswert?

Jan H. schrieb:
> pgm_read_byte(image[column])

Hier wird der Pointer "image" vor dem Aufruf von "pgm_read_byte" 
dereferenziert, und somit der Funktion der (vermeintliche) Inhalt 
übergeben. Es muss aber weiterhin ein Pointer übergeben werden.

Mit
1
 
2
  pgm_read_byte(image + column)

bleibt der übergebene Wert ein Pointer, es wird nur der Offset "column" 
dazugerechnet.

Das ist funktional das gleiche wie die Verwendung des Adressoperators
1
 
2
  pgm_read_byte(&image[column])
OP #5103177
Lesenswert?

1
void lcd_printImage(const unsigned char *image, uint16_t sizeofimage)
2
{
3
  uint16_t page  = 0;
4
  uint16_t column  = 0;
5
  
6
  lcd_gotoxy(0,0);
7
  for (column=0;column<sizeofimage;column++)
8
  {
9
    lcd_senddata(swapBits(pgm_read_byte(image+column)));
10
    if ((column%LCD_WIDTH_SIZE)==0)
11
    {
12
      lcd_gotoxy(page++, 0);
13
      if (page==LCD_PAGE_SIZE) page=0;
14
    }
15
  }
16
}

Und der Aufrufer..
1
lcd_printImage(pgm_read_ptr(hesch),1024);

Nach wie vor das selbe..
Gast #5103241
Lesenswert?

Leo C. schrieb:
> Warum sich immer noch mit PROGMEM abrackern?

Weil das die alten Compiler-Versionen des AVR Studios
nicht kennen / können.

Unserem freundlichen TO muss man ja jeden Popel einzeln aus der
Nase ziehen, und er äussert sich ja weder zu Compiler Versionen
noch zum Typ seiner Entwicklungsumgebung.
OP #5103243
Lesenswert?

Leo C. schrieb:
> Warum sich immer noch mit PROGMEM abrackern? Wie wärs mit
>
1
> const __flash unsigned char hesch [] = {...};
2
> 
3
> void lcd_printImage(const __flash unsigned char image[], uint16_t 
4
> sizeofimage)
5
> {
6
>     ...
7
> 
8
>         lcd_senddata(swapBits(image[column]));
9
>     ...
10
>
> ?

Hey Super. Damit klappt das.
Nur wird doch das ganze Array übergeben und nicht die Adresse oder?

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