www.mikrocontroller.net

Forum: Compiler & IDEs AVR-GCC: Pointer auf Flash-Array


Autor: Michael H. (overthere)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Mark .. (mork)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael H. (overthere)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Michael H. (overthere)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

vielen dank für deine Hilfe, man lernt nie aus. Nun meckert er nicht 
mehr.

Danke

Michael

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.