Forum: Mikrocontroller und Digitale Elektronik EEPROM schreiben beim AT90CAN128


von cskulkw (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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

von cskulkw (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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
Noch kein Account? Hier anmelden.