Atmega Flash -> PROGMEM -> ARRAY

OP #5103096
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
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
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..
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 sizeofimage)
4
{
5
    ...
6

7
        lcd_senddata(swapBits(image[column]));
8
    ...
?
Gast
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
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

Eine eigene Frage? Dieser Thread ist über 9 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.