mikrocontroller.net

Forum: Compiler & IDEs PROGMEM Problem


Autor: A.W. (Gast)
Datum:
Angehängte Dateien:

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

Autor: Dirk (Gast)
Datum:

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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das wurde doch schon ad nauseam durchgekaut ...
void sende_string(const char *text)
{
  char Zeichen;

  while (Zeichen = pgm_read_byte(text))
  {
    uart_sende_zeichen(Zeichen);
    text++;
  }
}

Autor: A.W. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe das AVR GCC Tutorial durchgesen und verstehe nur Bahnhof!

Autor: Εrnst B✶ (ernst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Siehe hier:
http://www.nongnu.org/avr-libc/user-manual/group__...
(evtl auch die FAQ dazu)


danach deine Schleife etwas umbauen, etwa

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

Autor: inoffizieller WM-Rahul (Gast)
Datum:

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

Autor: A.W. (Gast)
Datum:

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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"kommische Zeichen"?

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

Autor: inoffizieller WM-Rahul (Gast)
Datum:

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

Autor: Karl heinz Buchegger (kbucheg)
Datum:

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

Autor: A.W. (Gast)
Datum:

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

Autor: Karl heinz Buchegger (kbucheg)
Datum:

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

Autor: inoffizieller WM-Rahul (Gast)
Datum:

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

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.