Forum: Mikrocontroller und Digitale Elektronik AT89C51AC3 internes EEPROM


von Michael Heydeck (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Leute,

ich hab mal eine Frage. Ich bin µC neuling und will gerade einen alten 
Verstärker den ich mal gebaut habe "modernisieren".
Ich möchte die Lautstärke, den Bass, die Höhen und die Balance digital 
verstellen und mit Hilfe eines µC auf dem Display anzeigen und 
abspeichern.
Ich hab mir dafür den AT89C51AC3 ausgesucht weil der ein internes 2k 
EEPROM hat.
Mein Problem ist jetzt das ich die Werte nicht speichern kann. Ich will 
es über einen externen Interrupt steuern können, sprich der Interrupt 
kommt und die Werte werden abgespeichert. Der Interrupt wird von einem 
Supervisor IC gesteuert der die Betriebsspannung überwacht und bei einem 
Einbruch sofort den PFO schaltet.
Ich habe mir ein Application Note von Atmel für den µC besorgt und die 
Ansteuerung daraus abgeschrieben.
Das laden der Werte aus dem EEPROM geht jedoch. Ich bekomme immer 0xFF 
nach jedem neustart des µC.
Der Interrupt selber funktioniert auch. Es muss also an der Funktion für 
das Schreiben des EEPROMs liegen.
Habe mal die gesamte Routine kopiert und etwas umgeändert nach meinen 
Anforderungen.
Interruptroutine steht folgendes:

void PowerFail(void) interrupt 0 {
    wr_eeprom_byte(0,volume);
    wr_eeprom_byte(1,bass);
    wr_eeprom_byte(2,treble);
    wr_eeprom_byte(3,balance);
}

Ich hoffe ihr könnt mir helfe.

von Matthias (Gast)


Lesenswert?

Ist EXTRAM Bit im AUXR Register korrekt gesetzt? Ansonsten sieht Deine 
Routine ok aus.

von Michael Heydeck (Gast)


Lesenswert?

Davon habe ich schon gelesen in anderen Beiträgen. Mir ist aber nicht so 
richtig klar wo ich es setzen muss. Ob es in der Funktion zum schreiben 
stehen muss oder schon in einem Headerfile bzw. am Anfang meines 
Hauptfiles.
Deswegen weiß ich leider nicht ob es gesetzt ist.

von Matthias (Gast)


Lesenswert?

Könnte es auch sein, das die Zeit bis zum totalen Spannungsausfall nicht 
mehr ausreicht um die Schreibvorgänge zu beenden?

von Matthias (Gast)


Lesenswert?

EXTRAM muss 0 sein, sonst greifst Du nicht auf den internen XDATA 
(EEPROM oder RAM) zu, sondern auf den externen XDATA über P0/P2.

von Michael Heydeck (Gast)


Lesenswert?

Ich teste es momentan auf einem Evulationsboard in dem ich den Interrupt 
"manuell" betreibe.

Wo muss ich dieses Bit setzen? In meiner Schreibroutine oder von dem 
Punkt aus von dem ich auf die Routine zu greife?

Danke schon mal für die Tips, jetzt kann ich wieder n bissele googlen ;)

von Matthias (Gast)


Lesenswert?

Kommt auf Dein System an, ob externer XDATA Speicher genutzt wird oder 
nicht. Standardmäßig sollte es aber auf 0 sein.

Hast Du die Routinen mal ohne den Interrupt und bei normaler Spannung 
ausprobiert? Sind dann nach dem Aus- und Einschalten die Werte noch im 
EEPROM?

von Michael Heydeck (Gast)


Lesenswert?

Hallo Matthias,
jetzt hab ich es zum laufen gebracht.
Das EXTRAM Bit war standard mäßig auf 0, daran lag es also nicht.
Ich habe auch versucht die Routine ins Main zu setzen und ohne den 
Interrupt auslösen zu lassen. Hat auch nicht funktioniert.

Habe dann nochmal einen genauen Blick ins Datenblatt geworfen und 
entdeckt das das eigentlich schreiben erst mit den Befehlen 0x50 und 
sofort hinter her 0xA0 ins EECON register funktioniert. Sprich also in 
Atmels Application Note war nicht alles enthalten.

Mit den Zeilen vorher wird wohl nur ein Latch geladen mit den Daten und 
der Adresse wo sie hin sollen und mit den beiden Befehlen der 
Schreibvorgang ausgelöst.

void wr_eeprom_byte(unsigned int adr, unsigned char value){
   bit ea_save;
   while(EECON & 0x01);
   ea_save = EA;
   EA = 0;
   EECON |= 0x02;
   *(unsigned char xdata*)adr = value;
   EECON &= ~0x02;
   EECON &= 0x50;
   EECON &= 0xA0;
   EA = ea_save;
}

Das ist die komplette schreibroutine die bei mir ohne Probs funzt... 
auch mit Interrupt.

Danke für die Hilfe :)

von Peter D. (peda)


Lesenswert?

Fürs nächste mal:

Was soll denn dieser Unsinn?

Wenn Du Dich dazu bequemen könntest, einen Sourcetext vernünftiger Weise 
als *.c zu posten, dann könnt ich ihn mir mal ansehen.

Programmierer gucken sich Sourcen grundsätzlich nur in ihrem 
Lieblingseditor an, weil man da Fehler am besten erkennt.


Peter

von Matthias (Gast)


Lesenswert?

Ja stimmt, 0x50 + 0xA0 nach EECON löst erst den Schreibbefehl aus. Ein 
kleiner, aber feiner Unterschied zum gängigeren AT89C51ED2.

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.