Hallo, ich bin gerade dabei ein in codevision geschriebenes Programm in winavr umzusetzen. Ich benötige in meinem Programm den eeprom. Er ist mit 241 Integer-Werten beschrieben, einem Array. In codevision ist das ganz einfach: eeprom unsigned int sinarray[241]={ 0, 305, 610, 916, 1221, 1527, 1832, 2137, 2442, 2748, 3053, 3358, ......} und schon sind alle Werte im eeprom. Wie muss ich das jetzt in Winavr schreiben? Die Hilfe ist sehr komplex. Habe es leider noch nicht geschafft. Vielen Dank Sarah Heimbach Wie setze ich das jetzt in
danke für den Tipp, leider verstehe ich es nicht genau. Deswegen habe ich ja ins Forum geschrieben!
1) "uint16_t" ist wohl das selbe wie "unsigned int": kann ich da auch unsigend int nehmen? 2) eeFooWordArray1[4]: was genau bedeutet das? habe ich damit einen array mit 4 Einträgen? 3) was genau ist EEMEM??? 4) Ich würde gerne weiterhin meinen Arraynamen sinarray behalten. Was muss ich dafür ändern? 5) In codevision kann ich auf die Werte im eeprom über sinarray[c] zugreifen, in dem c der Index des Feldelements darstellt. Der Wert c wird in meinem Programm berechnet und ich muss dann immer genau diesen Wert aus dem eeprom auslesen, um ihn weiter zu bearbeiten. Wie muss ich das jetzt hier machen? Danke Sarah P.S. Sorry, ist das erste Mal, dass ich mit winavr arbeite. Die Codevision Demo reicht nur leider nicht aus.
Um ganz weit auszuholen und über einen (hoffentlich Interessanten) Umweg ans Ziel zu kommen... Die AVR CPU/MCU's basieren auf der Harvard Architektur. Im Gegensatz dazu haben die "normalen" PC-CPUs eine Von Neumann Architektur. Von Neumann Architektur: Programm(e) und Daten teilen sich einen Adressraum. D.h. Wenn auf Adresse 4712 Programmcode steht, kann man dort keine Daten ablegen (ohne das Programm an dieser Stelle zu zerstören). Harvard Architektur: Programm(e) und Daten (und eEprom) besitzen jeder für sich einen eigenen Adressraum. D.h. Die Adresse 4712 im Programmspeicher ist eine völlig andere als die Adresse 4712 im Datenspeicher und wiederum eine andere als 4712 im eEprom Bereich. Für die Zugriffe auf die verschieden Adressräume werden verschieden Maschinenbefehle verwendet. Da "C" aus der Welt der Von Neumann Architektur stammt, kennt "C" keine Notation für die unterschiedlichen Adressräume. Unter AVR-GCC werden die normalen "C" Zeigeroperationen immer in einen Zugriff auf das RAM übersetzt. Für den Zugriff auf die aderen Addressräume existieren spezielle Funktionen (inline Assembler-Macros). Um dem Compiler mitzuteilen, dass er die Daten gefälligst im Programmspiecher bzw. eEprom abzulegen hat und nicht im RAM, existieren die "Konstrukte" mit _attribute_ ((section (".xxx"))) Zugriff auf Byte 4712 im RAM: char c = *((char *)4712); Zugriff auf Byte 4712 im Flash: char c = pgm_read_byte(4712); Zugriff auf Byte 4712 im eEprom: char c = eeprom_read_byte(4712); Der CV Compiler kaschiert diese Unterschiede intern und führt (offensichtlich) für jeden Zeiger die Information über dessen zugehörigen Adressraum (auch zur Laufzeit?) mit. Darum ist es möglich ganz normale "C" Speicherzugriffe zu verwenden. unsigned int sinarray[241] _attribute_ ((section (".eeprom"))) ={ 0, 305, 610, 916, 1221, 1527, 1832, 2137, 2442, 2748, 3053, 3358, ......}; Zugriff mit: eeprom_read_word(&sinarray[index]); Wenn man/frau davon ausgeht dass sich die Werte in sintab nicht verändern, kann man diese auch im FLASH ablegen. unsigned int sinarray[241] PROGMEM ={ 0, 305, 610, 916, 1221, 1527, 1832,2137, 2442, 2748, 3053, 3358, ......}; Zugriff mit: pgm_read_word(&sinarray[index]); P.S. Hinter PROGMEM verbirgt sich auch nur ein _attribute_ ((section (".progmem"))) Happy new year. Werner
Hallo Werner, vielen Dank! Die Antwort hat mir sehr weitergeholfen. Vor allem die Erklärung war super! Danke und ebenfalls ein schönes neues Jahr!!! Sarah
Sorry, dass ich noch einmal eine Frage stellen muss. Muss ich immer über "eeprom_read_word(&sinarray[index])" zugreifen oder geht auch einfach sinarray[c]? Mein compiler meldet keinen Fehler, aber das sagt ja nicht so viel aus. Danke
eeprom_read_word erwartet die Adresse der zu lesenden Speicherstelle; und diese erhält man mit &sinarray[c] oder auch mit (sinarry+c).
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.