Forum: Mikrocontroller und Digitale Elektronik Atmega Flash -> PROGMEM -> ARRAY


von Jan H. (janiiix3)


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
}

von M. K. (sylaina)


Lesenswert?

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

Hier fehlt das "&" vor image ;)

von Jan H. (janiiix3)


Lesenswert?

M. K. schrieb:
> Jan H. schrieb:
>> lcd_senddata(swapBits(pgm_read_byte(image[column])));
>
> Hier fehlt das "&" vor image ;)

Und dann normal den Pointer übergeben?
1
lcd_printImage(pgm_read_ptr(&hesch),sizeof(hesch));

von M. K. (sylaina)


Lesenswert?

Ach ne, das ist ja schon nen Pointer. Ich hab vorhin irgendwie den * 
übersehen...wie sieht denn swapBits() aus? Vielleicht passt da was 
nicht.

von Oliver S. (oliverso)


Lesenswert?

M. K. schrieb:
> Ach ne, das ist ja schon nen Pointer.

Ist zwar einer, aber du hattest trotzdem recht.
Wenn da image[] gestanden hätte, wärs zwar das gleich, aber klarer.

Oliver

von Jan H. (janiiix3)


Lesenswert?

Also wenn ich ohne das PROGMEM arbeite, klappt es. Es muss was an der 
Übergabe sein..

von Arduinoquäler (Gast)


Lesenswert?

Jan H. schrieb:
> void lcd_printImage(const unsigned char *image, uint16_t sizeofimage)

Ich vermute mal dass der Pointer auf das Image ein
PROGMEM Typ sein muss.

von Jan H. (janiiix3)


Lesenswert?

Arduinoquäler schrieb:
> Jan H. schrieb:
>> void lcd_printImage(const unsigned char *image, uint16_t sizeofimage)
>
> Ich vermute mal dass der Pointer auf das Image ein
> PROGMEM Typ sein muss.

Wie würde das explizit aussehen?

von Rufus Τ. F. (rufus) Benutzerseite


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])

von Axel S. (a-za-z0-9)


Lesenswert?

Jan H. schrieb:
1
...
2
lcd_gotoxy(page++, 0);

Warum heißt die Funktion lcd_gotoxy() und nicht lcd_gotoyx()?

von Jan H. (janiiix3)


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..

von Arduinoquäler (Gast)


Lesenswert?

Arduinoquäler schrieb:
> Ich vermute mal dass der Pointer auf das Image ein
> PROGMEM Typ sein muss.
1
void lcd_printImage (const unsigned char* PROGMEM image,
2
                     uint16_t sizeofimage)

Kann es gerade nicht konkret ausprobieren ....

von Jan H. (janiiix3)


Lesenswert?

Arduinoquäler schrieb:
> Arduinoquäler schrieb:
>> Ich vermute mal dass der Pointer auf das Image ein
>> PROGMEM Typ sein muss.
>
>
1
> void lcd_printImage (const unsigned char* PROGMEM image,
2
>                      uint16_t sizeofimage)
3
>
>
> Kann es gerade nicht konkret ausprobieren ....

Das mag er nicht.

von Arduinoquäler (Gast)


Lesenswert?

Jan H. schrieb:
> Das mag er nicht.

Ist das die Fehlermeldung des Programms oder des Compilers?  ;-)

von Jan H. (janiiix3)


Lesenswert?

Arduinoquäler schrieb:
> Jan H. schrieb:
>> Das mag er nicht.
>
> Ist das die Fehlermeldung des Programms oder des Compilers?  ;-)

Compilers.

von Arduinoquäler (Gast)


Lesenswert?

Jan H. schrieb:
> Compilers.

... und ich dachte der Compiler gibt nur englisch-
sprachige Fehlermeldungen aus.

von Jan H. (janiiix3)


Lesenswert?

Musste mir gerade das lachen verkneifen ;)

von Arduinoquäler (Gast)


Lesenswert?

Jan H. schrieb:
> Musste mir gerade das lachen verkneifen

Statt zu lachen könntest du ja auch was Sinnvolleres tun.

z.B. eine reale Fehlermeldung posten.

von Jan H. (janiiix3)


Lesenswert?

Arduinoquäler schrieb:
> Jan H. schrieb:
>> Musste mir gerade das lachen verkneifen
>
> Statt zu lachen könntest du ja auch was Sinnvolleres tun.
>
> z.B. eine reale Fehlermeldung posten.
1
Error    expected ';', ',' or ')'

von Leo C. (rapid)


Lesenswert?

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
    ...
?

von Arduinoquäler (Gast)


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.

von Jan H. (janiiix3)


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?

von Oliver S. (oliverso)


Lesenswert?

Jan H. schrieb:
> Nur wird doch das ganze Array übergeben und nicht die Adresse oder?

Nur Chuck Norris kann in C ganze Arrays als Funktionsparameter 
übergeben...

Oliver

von Jan H. (janiiix3)


Lesenswert?

Oliver S. schrieb:
> Jan H. schrieb:
>> Nur wird doch das ganze Array übergeben und nicht die Adresse oder?
>
> Nur Chuck Norris kann in C ganze Arrays als Funktionsparameter
> übergeben...
>
> Oliver

Danke für den tollen Hinweis ;)
Hatte nur den * Operator vergessen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.