Ein Fest a. schrieb:
> Vielen Dank für die nächtliche Antwort!
>
> Mit fprintf_P funktioniert es.
>
> Ich bin noch recht neu auf dem Gebiet der AVR-Programmierung, und muss
> zugeben, dass ich die Implementierung/Initialisierung meines Displays
> einfach aus der Codesammlung hier gemopst habe. Und da wurden Ausgaben
> mit fprinf gemacht...
Wo genau?
Aus dem STegreif heraus, weiß ich keinen einzigen Artikel hier am µC.Net
Forum, welcher fprintf benutzt. Aber ich kenne natürlich auch nicht alle
Artikel.
> Könnest du/jemand mir genauer erklären, wie die "einfache" Variante
> direkt aus dem Flash aussieht?
Du hast eine Funktion, welche ein einzelnes Zeichen ausgibt. Ich nenn
sie mal lcd_char.
Daraus lässt sich leicht eine Funktion bauen, die einen String aus dem
SRAM ausgibt:
1 | void lcd_string( const char* s )
|
2 | {
|
3 | while( *s )
|
4 | lcd_char( *s++ );
|
5 | }
|
Soweit so gut. Jetzt soll der String aber nicht aus dem SRAM kommen,
sondern aus dem Flash. Ins Flash kann man nicht so einfach mit *s
zugreifen, wenn man einen Pointer auf die Daten hat, sondern man muss
das durch die Funktion pgm_read_byte() ersetzen, die den Zugriff
durchführt und das Byte liefert.
Und genau das machen wir: Alle *s durch pgm_read_byte ersetzen, ein
bischen umstrukturieren, so dass der Code einfacher wird und es kommt
raus
1 | void lcd_string_P( const char* s )
|
2 | {
|
3 | char c;
|
4 |
|
5 | while( ( c = pgm_read_byte(s++) ) != '\0' )
|
6 | lcd_char( c );
|
7 | }
|
(Das hinten angestellte _P kennzeichnet die Funktion als eine, die mit
dem Flash umgehen kann).