Hallo Community, eigentlich möchte ich nur das interne EEPROM nutzen, um Daten aus dem RAM für den nächsten Start zu speichern. Normalerweise ist das keine große Sache. Aber irgendwie gelingt es mir nicht, den Schreibprozess auszulösen. Ich arbeite mit dem AVR-Studio 6.0 (Beta). Wenn ich den Kram in C-schreibe, wie im Datenblatt beschrieben, dann macht die "native"-Toolkette soviel Schnörkelkram, dass die 4 Taktzyklen zwischem dem Setzen von EEMWE und EEWE überschritten werden. Also, habe ich meine alten Assemblerkenntnisse hervorgekramt um da etwas direkter anzusteuern. Nach einigem Hin- und Her habe ich auch rausgefunden, dass RAM-Adresse der IO-Register nicht der tatsächlichen für die Befehle sbi und cbi entsprechen soll und darum steht bei den sbi-Befehelen auch nicht 0x3F für das EECR sonder 0x1F. Trotzdem programmiert der Controler die EEPROM-Adresse nicht. Wer kann mir sagen, wo der Gedankenfehler liegt? /* Startaddresse in das EEAR laden */ EEAR = Startaddresse++; /* Daten aus Quellbereich holen */ EEPROM_Daten_lokal = (*LeseZielAddresse); EEDR = EEPROM_Daten_lokal; LeseZielAddresse += 1; /* Master setzen */ //EECR |= (1<<EEMWE); /* Schreibaufforderung setzen */ //EECR |= (1<<EEWE); /*; Schreibe Logische Null in Controlbit EEWE */ asm("cbi 0x1F,0x02"); /* ; Write logical one to EEMWE */ asm("sbi 0x1F,0x04"); /*; Start eeprom write by setting EEWE */ asm("sbi 0x1F,0x02"); Für jeden nützlichen Tipp danke ich Euch jetzt schon. Gruß cskulkw
cskulkw schrieb: > Wenn ich den Kram in C-schreibe, wie im Datenblatt beschrieben, Wieso willst du das selber schreiben? Du hast doch schon EEPROM Routinen! Du brauchst sie nur zu benutzen. #include <avr/eeprom.h> eeprom_read_byte eeprom_write_byte etc. etc. AVR-GCC-Tutorial: EEPROM
Karl Heinz Buchegger schrieb: > Wieso willst du das selber schreiben? Du hast doch schon EEPROM > Routinen! Du brauchst sie nur zu benutzen. Weil ich eine State-Machine programmiert habe, die parallel die Jobs abarbeiten soll, ohne dabei die anderen Tasks durch while-Schleifen auszubremsen. Und weil mein Programm schon einmal funktioniert hat. Aber ja, diese Implementierung wäre zur Not eine Option.
cskulkw schrieb: > Karl Heinz Buchegger schrieb: >> Wieso willst du das selber schreiben? Du hast doch schon EEPROM >> Routinen! Du brauchst sie nur zu benutzen. > > Weil ich eine State-Machine programmiert habe, die parallel die Jobs > abarbeiten soll, ohne dabei die anderen Tasks durch while-Schleifen > auszubremsen. Ähm. Dein EEPROM Code kann auch nichts anderes machen als die EEPROM Funktionen. Um 1 Byte auszulesen gibt es eine Sequenz. Ob du die implementierst (und dabei Fehler machst) oder ob du die getesteten FUnktionen aus der lib nimmst (die funktionieren) machht Codetechnisch keinen Unterschied. Sehr wohl aber in Bezug auf Fehlerfreiheit. Oder implementierst du if Abfragen auch selber, weil du dem Compiler nicht traust? > durch while-Schleifen auszubremsen. Dir ist aber schon klar, was die while-Schleife in den EEPROM Funktionen für eine Aufgabe hat? Sie hat die Aufgabe mit der nächsten EEPROM Funktionalität erst dann zu beginnen, wenn das EEPROM die letzte Operation abgeschlossen hat. Wenn du sowieso weißt, dass die letzte Operation schon abgeschlossen ist, dann wird die while-Schleife auch niemanden ausbremsen sondern dient lediglich als Sicherheit gegen Programmierfehler deinerseits. Und wenn dein Programm so zeitkritisch ist, dass die 3 Prozessorbefehle den Unterschied zwischen läuft und läuft nicht ausmachen, dann hast du sowieso ganz was anderes falsch gemacht.
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.