Forum: Mikrocontroller und Digitale Elektronik STRING AUS FLASH


von Ingo L. (grobian)


Lesenswert?

Was läuft denn hier falsch, bekomme die Strings nicht aufs LCD
PROGMEM wird vom compiler ignogiert??


#define F_CPU 800000UL
#include <avr/io.h>
#include <util/delay.h>
#include <lcd.h>
#include <lcd.c>
#include <avr/pgmspace.h>

int main(void)
{
char lcdtext[] PROGMEM = "ZEILE 1";
char lcdtext1[] PROGMEM = "ZEILE 2";

lcd_init();

set_cursor(0,1);
lcd_string(lcdtext);
set_cursor(0,2);
lcd_string(lcdtext1);

while (PINB & (1 <<PB6)); // Wartet so lange wie pin6 high ist
           //  ..bei lo weiter
.....
}

von Michael K. (Gast)


Lesenswert?


von David M. (md2k7)


Lesenswert?

lcdtext und lcdtext1 sind hier Pointer in den Flash-Speicher. C-Compiler 
sind auf eine Architektur ausgelegt, wo alles im RAM ist (von Neumann). 
Dagegen hat ein AVR eine Harvard-Architektur, und der C-Compiler kann 
Adressen ins Flash und ins RAM (EEPROM genauso) nicht von alleine 
unterscheiden.

Zum Lesen aus dem Flash bemüht man deshalb die Funktionen pgm_read_byte 
(liest 1 Byte) und pgm_read_word (2 Bytes), zu finden im Header 
<avr/pgmspace.h>

Deine lcd_string() Funktion wird wahrscheinlich einen String im RAM 
erwarten, du musst sie umschreiben.

von crazy horse (Gast)


Lesenswert?

bei CodeVision gibts dafür ne eigene Funktion, lcd_putsf.
Vielleicht guibts auch sowas?
Oder selbst schreiben.
Oder vorher ins RAM kopieren.

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.