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
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 | }
|
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); }
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!
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
"kommische Zeichen"? Hat denn das Senden von Zeichen überhaupt schon mal funktioniert?
>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.
> 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?
@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?
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.
>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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.