Forum: Compiler & IDEs PROGMEM Problem


von A.W. (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Leute,
ich definiere eine char Konstante im Flash:

char StringImFlash[] PROGMEM = "Waehlen Sie bitte einen Modus aus";

diese Konstante will ich dann zum richtigen Zeitpunkt im Hauptprogramm 
mit der Funktion sende_string per Terminal ausgeben:

sende_string(StringImFlash);

Die Funktion sende_string befindet sich im Anhang.
Wie kann ich die Konstante aus dem Flash ansprechen?
MFG

von Dirk (Gast)


Lesenswert?

Schau mal in AVR GCC Tutorial oder benutz die Suche das Thema wird hier 
alle 2 tage behandelt.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Das wurde doch schon ad nauseam durchgekaut ...
1
void sende_string(const char *text)
2
{
3
  char Zeichen;
4
5
  while (Zeichen = pgm_read_byte(text))
6
  {
7
    uart_sende_zeichen(Zeichen);
8
    text++;
9
  }
10
}

von A.W. (Gast)


Lesenswert?

Ich habe das AVR GCC Tutorial durchgesen und verstehe nur Bahnhof!

von Εrnst B. (ernst)


Lesenswert?

Siehe hier:
http://www.nongnu.org/avr-libc/user-manual/group__avr__pgmspace.html
(evtl auch die FAQ dazu)


danach deine Schleife etwas umbauen, etwa

char c;
while ((c=pgm_read_byte(pos++))) {
  uart_send(c);
}

von inoffizieller WM-Rahul (Gast)


Lesenswert?

Ist doch ganz einfach: Du kannst nicht auf Daten, die im Flash stehen 
wie auf Daten zugreifen, die im RAM stehen.
Für den Flash-Zugriff brauchst du "pgm_read_byte(...)".

>Ich habe das AVR GCC Tutorial durchgesen und verstehe nur Bahnhof!
Dann übernimm einfach Rufus Lösung!

von A.W. (Gast)


Lesenswert?

Die Lösung von Rufus funktioniert nicht. Terminalprogramm gibt kommische 
Zeichen aus.
@inoffizieller WM-Rahul : mit dem Befehl "pgm_read_byte(...)" wird doch 
nur ein Byte gelesen. Ich will aber char text ausgeben.
MFG

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

"kommische Zeichen"?

Hat denn das Senden von Zeichen überhaupt schon mal funktioniert?

von inoffizieller WM-Rahul (Gast)


Lesenswert?

>Ich will aber char text ausgeben.
Das ist auch nichts anderes als eine Ansammlung von Bytes...

>Hat denn das Senden von Zeichen überhaupt schon mal funktioniert?
Das würde mich auch interessieren.

von Karl heinz B. (kbucheg)


Lesenswert?

> mit dem Befehl "pgm_read_byte(...)" wird doch
> nur ein Byte gelesen. Ich will aber char text ausgeben.

Dann schau dir nochmal die Lösung an.
Da liegt eine Schleife über dem pgm_read_byte.
Was glaubst du, was die macht?

von A.W. (Gast)


Lesenswert?

@Rufus: Vielen Dank es funktioniert!
Die komischen Zeichen entstehen dadurch da ich die anderen 
Char-Variablen aus dem RAM geladen habe! Super! Vielen Dank! Jetzt 
verstehe ich auch wie die sende_string-funktion funktioniert!
Oft ist es so dass man Sätze liest und diese nicht gleich versteht. Da 
kann man noch tausend Mal lesen! Da bringen Beispiele viel mehr!
Da ich nicht der einzige bin!
Habt ihr Euch schon mal überlegt dieses Thema im AVRGCC Tutorium 
ausweiten und mit viel mehr Beispielen beschreiben?

von Karl heinz B. (kbucheg)


Lesenswert?

Na ja.
Das Tutorial geht schon davon aus, dass man einen gewissen
C-Grundstock hat. Das Tutorial konzentriert sich hauptsächlich
auf die Unterschiede und spezifischen Erweiterungen, die man
zur Programmierung eines AVR braucht. C sollte man da schon
halbwegs können um mit dem Tuorial was anfangen zu können.

Aber der Vorschlag an sich ist nicht so schlecht. Ich werde
mal eine UART-Sende Funktion in den entsprechenden Abschnitt
einfügen.

von inoffizieller WM-Rahul (Gast)


Lesenswert?

>Habt ihr Euch schon mal überlegt dieses Thema im AVRGCC Tutorium
>ausweiten und mit viel mehr Beispielen beschreiben?

Da es ein Wiki ist, kannst du das auch machen...("wir" wissen ja meist 
wie es geht...)

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.