AVR-GCC: Pointer auf Flash-Array

OP #1402039
Lesenswert?

Hallo zusammen,

ich habe bereits die Forensuche benutzt, leider nichts passendes 
gefunden. Ich möchte mit dem AVR-GCC und Tiny24 einen Pointer auf ein 
Flash-array - für ein Blinken der LED zuständig - anlegen.

prog_uint8_t blink_slow[] PROGMEM = {
 BLINK_GREEN, BLINK_NONE , BLINK_NONE, BLINK_NONE, BLINK_NONE,
 BLINK_NONE, BLINK_NONE , BLINK_NONE, BLINK_NONE, BLINK_NONE};
prog_uint8_t blink_med[] PROGMEM = {
 BLINK_GREEN, BLINK_GREEN , BLINK_GREEN, BLINK_GREEN, BLINK_NONE,
 BLINK_NONE, BLINK_NONE , BLINK_NONE, BLINK_NONE, BLINK_NONE};
prog_uint8_t blink_fast[] PROGMEM = {
 BLINK_GREEN, BLINK_GREEN , BLINK_GREEN, BLINK_GREEN, BLINK_GREEN,
 BLINK_GREEN, BLINK_GREEN , BLINK_GREEN, BLINK_NONE, BLINK_NONE};
prog_uint8_t* blinker;

Wenn ich das Byte nun so lade.
>readByte = pgm_read_byte(&blink_fast[blinker_pos]);
geht alles prächtig.

Ich möchte aber auf den Array per Pointer zugreifen.
>blinker=&blink_fast;
>readByte = pgm_read_byte(blinker[blinker_pos]);

In diesem Fall motzt GCC und der Blinker funktioniert nicht. Wie muss 
ich nun den Pointer auf das Array definieren, dass es funktioniert?

Vielen Dank für Eure Hilfe!

Michael
#1402069
Lesenswert?

Klar motzt der gcc. Im ersten Fall machst Du alles richtig und übergbist 
die Adresse des Chars:

> readByte = pgm_read_byte(&blink_fast[blinker_pos]);

Im zweiten fall wird aber der Char selbst übergeben, obwohl ein Zeiger 
datauf erwartet wird.

> readByte = pgm_read_byte(blinker[blinker_pos]);

Schreib also ein & vor blinker[blinker_pos] analog zur ersten Version, 
um seine Adresse zu bekommen.

MfG Mark
OP #1402398
Lesenswert?

Vielen Dank, das klappt jetzt schon mal. Aber GCC motzt immer noch wegen 
dem Assignment/Zuweisung auf meinen Pointer:
main.c:103: warning: assignment from incompatible pointer type

prog_uint8_t* blinker;
blinker=&blink_lowbatt;
readByte = pgm_read_byte(&blinker[blinker_pos]);

Was kann ich gegen die Warnung unternehmen?
#1402415
Lesenswert?

> main.c:103: warning: assignment from incompatible pointer type

Zeig mal deine ganzen Datentypen
Welches ist Zeile 103?

> blinker=&blink_lowbatt;

Der Name des Arrays alleine fungiert schon als Spezifikation für die 
Startadresse des Arrays

  blinker = blink_lowbatt;


(Ein C-Buch wäre angebracht, da steht das und noch 1000 andere 
wissenswerte Dinge drinnen)

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