Hallo Leute, ich habe eine frage zu Eeprom. ich habe ein Programm in Assembler geschrieben und möchte nun mehre werte die in registern stehen in den eeprom speichern und dann wieder auslesen, ist dies in der form überhaupt möglich? Mfg Peter
Ja logisch! Wenns ein AVR ist, im Datenblatt über Deines µC steht alles drinn, sogar ein Sample-Programm. Gruß Andi
Hallo, danke für deine schnelle antwort ich musste etwas suchen habe aber schliesslich das beispiel programm gefunden allerdings nicht im datenplatt meines mikros at90s8515 und at90s2313 sondern in den Atmel-Appnotes. Nunja ich bin nicht so gut in englisch und verstehe das nicht so ganz! Ich müsste mehrere register speichern und wieder auslesen. Ich habe erst mal das auslesen von festen werten versucht und das brachte nicht das erwartete ergebniss. eepromread: ldi r23, HIGH(daten) ; Adresse laden out EEARH, r23 ldi r23, LOW(daten) out EEARL, r23 sbi EECR, EERE ; Lesevorgang aktiviere in r23, EEDR ret .eseg Daten: 0b00110101 es sollte eigentlich 0b00110101 in r23 geladen werden, stattdessen aber bekomme ich einen anderen wert, ich weis auch nicht genau welchen da ich mit dem simulator nicht klar komme, ich denke das es folgender wert ist 0b01100000. Vielleicht könnt mir ja mal einer auf deutsch erklären wie ich ein register in einen eeprom speichere und wieder auslese.
Das kann doch nicht so schwierig sein! Hier zwei Routinen zum lesen vom uns schreiben in das EEPRO welche ich mal gemacht habe: ;Schreiben eines Byte in das EEPROM. ;Dabei wird vor dem Schreiben an der gleichen ;Adresse gelesen und geprüft, ob der Wert in ;der angegebenen Adresse schon vorhanden ist ;um die Schreibzyklen zu erhöhen. .def EEPByte=r16 .def EEPTemp=r17 EEPWB: push EEPTemp mov EEPTemp,EEPByte rcall EEPRB cp EEPTemp,EEPByte breq EEPWBExit out EEDR,EEPTemp cli sbi EECR,EEMWE sbi EECR,EEWE sei EEPWBExit: pop EEPTemp ret EEPRB: sbic EECR,EEWE rjmp EEPRB out EEARH,xh out EEARL,xl sbi EECR,EERE adiw xl,1 in EEPByte,EEDR ret Die Routine "EEPRB" ist zum lesen eines Bytes (EEP Read Byte) und die Routine "EEPWB" zum schreiben (EEP Write Byte). Die Routine EEPWB ruft Anfangs die Routine EEPRB auf um zu checken, ob der gleiche Wert in einer EEPROM-Zelle schon enthalten ist. Ist das der Fall, wird nicht geschrieben um die Write-Zyklen zu erhöhen da der selbe Wert schon enthalten ist. Auch ganz paraktisch einen ganzen Block von z. B. Einstellbaren Parametern zu speichern wenn nur einer der Parameter verändert wird. Da kann man dann jedes mal mit einer Routine alle speicherbaren Parameter übergeben ohne das man für jeden Parameter eine Adresse errechnen lassen muß und ohne das die Schreib-Zyklen unnötig minnimiert werden. An beiden Routinen übergibt man in X (XL und XH) die EEPROM-Adresse und in R16 den zu schreibenden Wert. Beim lesen ist nach EEPRB der Wert in R16. Beispiel: Schreiben: ldi r16,105 ;Zu schreibende Zahl ldi xl,low(312) ;Adresse low-Byte ldi xh,high(312) ;Adresse high-Byte rcall EEPWB ;Wert in R16 in EEPROM schreiben Lesen: ldi xl,low(312) ;Adresse low-Byte ldi xh,high(312) ;Adresse high-Byte rcall EEPWB ;Wert in R16 vom EEPROM lesen ... ;In R16 ist der Wert von der EEPROM-Adresse X. Wenn das mit X (XL und XH) für die Adress-Übergabe nicht passt, kann man ja ändern auf Y (YL und YH) oder Z (ZL und ZH). Innerhalb der beiden Routinen wird der Adress-Pointer, in diesem Fall X, nach einer Aktion áutomatisch um 1 erhöht. Ist auch ganz Hilfreich für Block-Lese/Schreib-Routinen die sich dann das erhöhen des Pointers schenken können. Gruß Andi
Hallo, vielen dank für deine Hilfe, mein Problem ist gelöst dank deiner erklärung! Mfg Peter
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.