Forum: Mikrocontroller und Digitale Elektronik Code im Flasch wird überschrieben ??


von Thorsten (Gast)


Lesenswert?

Hi Leutz,

ich versuche gerade, ein Laufschriftboard in C aufzusetzen.
Allerdings hab ich grosse Probleme mit der Zeichentabelle.
Proz: Atmel AVR 90S8535 (8k Flash, 512Byte RAM)

Diese ist als 2-dimensionales Array angelegt:

static const unsigned char array[83][5]={/*{0,0,0,0,0},*/
{0,0,242,0,0},
{0,224,0,224,0},
{40,254,40,254,40},
.......
};

Die ist schon gekürzt (normalerweise wärens über 100 Zeichen)

Füge ich zur Darstellungsroutine noch etwas Code hinzu, so werden die
letzten Zeichen nur noch als Datenmüll angezeigt.

Schreibt der das Array ins RAM (415 Byte) oder bleibt das zur
Bearbeitung im Flash ?
Warum zerstört das Hinzufügen von Code meine letzten Zeichen
(aufsteigend) ?


Vielen Dank für die Hilfe!

Greetz,
Thorsten

von crazy horse (Gast)


Lesenswert?

welcher Compiler?
static const kommt mir irgendwie komisch vor - static bedeutet
RAM-Variable, die nicht überlagert wird. Sinnvollerweise sollten
Konstanten aber im ROM abgelegt werden (was du ja wahrscheinlich
willst). Wahrscheinlich läuft dir der Stack in den Datenbereich.

Versuchs mal so:
const unsigned char test[...];
oder
flash unsigned char test[...];

von Thorsten (Gast)


Lesenswert?

Hi,

mit const unsigned char hab ichs auch schon probiert, dann gibtz gar
keine ausgabe mehr aufm LED-Display.

Meine Ausgabe:
//Spalten:
unsigned char binary[5]={1,2,4,8,16};
...

for(j=0; j<=4; j++)
{
 PORTB = binary[4-j];
 PORTC = array[i][j];
 delay_ms(1);
}


Greetz,
thorsten

von Rufus T. Firefly (Gast)


Lesenswert?

Aufgrund der Harvard-Architektur der AVRs werden konstante Variablen aus
dem Flash-ROM ins RAM kopiert, es sei denn, die Konstanten werden
explizit so deklariert, daß sie nur im Flash abgelegt werden. Dann aber
sind für den Zugriff auf die Variablen auch spezielle Operationen
erforderlich.

Ein Beispiel findest Du in diesem Thread:
http://www.mikrocontroller.net/forum/read-1-154143.html#154157

von Mark Hämmerling (Gast)


Lesenswert?

Salve,

falls Du gcc mit avr-libc verwendest, schau mal in die Doku der
avr-libc. Dort steht, wie Du solche Daten in den Flash bekommst.
Stichwort "pgmspace.h".

Denn ja, der Compiler legt Dein Array in den RAM. Da hilft (leider)
auch kein "const".

Um die Daten dann zu lesen, benötigst Du ein pgm_read_byte(), was aber
als Maschinencode nicht (oder nicht wesentlich?) aufwendiger ist als
ein RAM-Lesevorgang. Insofern sehr empfehlenswerte Methode.

Mark

von crazy horse (Gast)


Lesenswert?

Welcher Compiler (zum 2.Mal)?

von Mark Hämmerling (Gast)


Lesenswert?

Salve,

hmpf ich sollte vor dem Losschreiben doch nochmal einen Reload
machen. Es sieht so aus, als hätte ich nur von Rufus abgeschrieben. :)

Allgemein mal ne Frage zu anderen Compilern (kenne nur den gcc)...
verhalten sich alle AVR-C-Compiler so, daß sie unabhängig vom
const-Attribut Variablen ins RAM legen? Würde mich nur mal
interessieren.

@Thorsten... bzgl. Deines Betreffs: Prost! ;)

Mark

von Thorsten (Gast)


Lesenswert?

Hi,

Compiler:
WinAVR-20050214 (AVR-gcc)

greetz,
tho

von crazy horse (Gast)


Lesenswert?

bei CodeVision wird es, wenn ich Speicherklasse  "flash" angebe, auch
im flash (und nur dort!) abgelegt.

von Thorsten (Gast)


Lesenswert?

rennt .... (scheinbar)

schnippsel:

static unsigned char feld[83][5] PROGMEM ={/*{0,0,0,0,0},*/
{0,0,242,0,0},
{0,224,0,224,0},
{40,254,40,254,40},
...


Greetz & many theanx for help,
thorsten

von Thorsten (Gast)


Lesenswert?

...frage ist nur, warum dass "static" sein muss ...
ohne rennts net.

von Thorsten (Gast)


Lesenswert?

"@Thorsten... bzgl. Deines Betreffs: Prost! ;)"

sry, vertippzt gehabt ;-))

von Rufus T. Firefly (Gast)


Lesenswert?

"...frage ist nur, warum dass "static" sein muss ...
ohne rennts net."

Wo ist denn der Schnipsel untergebracht? Etwa innerhalb einer
Funktion?!

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.