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
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[...];
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
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
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
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
bei CodeVision wird es, wenn ich Speicherklasse "flash" angebe, auch im flash (und nur dort!) abgelegt.
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
...frage ist nur, warum dass "static" sein muss ... ohne rennts net.
"@Thorsten... bzgl. Deines Betreffs: Prost! ;)" sry, vertippzt gehabt ;-))
"...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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.