Hallo erstmal allerseits. Also gleich zum Problem, ich habe an Adresse 0x00 des EEPROM in meinem ein beliebiges Byte gespeichert, dass ich gerne auslesen würde und zu Testzwecken (sehen ob es klappt) an den PortB-LEDs meines STK200 anzuzeigen, nu hab ich alles so programmiert wie es sein sollte (bzw wie das Datenblatt es verlangt) aber nach der Programmierung (und dem beschreiben der EEPROM-Adresse mit 0xAA) tut sich an dem Board einfach nix (zumindest nicht so wie es sein sollte). Vielleicht hat ja jemand erfahrung damit und kann mir weiterhelfen. Danke im Vorraus PS: es handelt sich um einen AVR 8515
naja, das mit dem anhang hat genauso geklappt wie ich es mir gedacht habe ;-) also hier die .asm: ;*******************************EEPROM.asm****************************** ;*** An Adresse 0x00 des EEPROMS ist das Datenbyte 0xAA gespeichert, *** ;*** dieses soll ausgelesen und an den LEDs an PortB angezeigt werden*** ;*********************************************************************** .device AT90S8515 .include "8515def.inc" .def tmp =r16 ;Register festlegen .def order =r17 .def xlow =r26 .def xhigh =r27 .org 0x00 ;Einsprungadresse nach einem RESET rjmp Init .org 0x10 nop ;*********************************************************************** **** Init: ldi tmp,low(RAMEND) ;Stackpointer auf das out spl,tmp ;Speicherende setzen (RAMEND equ 0x025F) ldi tmp,high(RAMEND);3-Level-Stack out sph,tmp ser tmp ;setze tmp auf $FF(255) out DDRB,tmp ;Port B ist Ausgang out PortB,tmp ;Alle LEDs aus ldi xlow,0x00 ;EEPROM Adressregister intitialisieren (ardesse) ldi xhigh,0x00 Start: EEPREAD: out EEARL,xlow ;Die Adresse ins EEPROM Adressregister out EEARH,xhigh ldi order,0x01 ;Bit0 (EERE) in EECR setzen -> Lesebefehl out EECR,order loop: in tmp,EECR ;Prüfen ob EERE zurückgesetzt, andi tmp,0x01 cpi tmp,0x00 ;wenn ja -> Daten Bereit brne loop ;wenn nein -> weiterprüfen read_data: in tmp,EEDR ;Daten aus dem Datenregeister einlesen com tmp ;Daten benutzerfreundlich anpassen out PortB,tmp ;Datenbyte anzeigen
ok, das problem hat sich erledigt, für diejenigen die vielleicht ein ähnliches problem haben hier die funtionierende variante: EEPREAD: out EEARL,xlow ;Die Adresse ins EEPROM Adressregister out EEARH,xhigh sbi EECR,EERE ;Bit0 (EERE) in EECR setzen -> Lesebefehl read_data: in tmp,EEDR ;Daten aus dem Datenregeister einlesen com tmp ;Daten benutzerfreundlich anpassen out PortB,tmp ;Datenbyte anzeigen
Hi; ich brauch da mal hilfe... Ich habe das ganze nocheinmal auseinander genommen, weil ich mit den EEProm im Atmel auch so meine probleme habe. Vieleicht wisst ihr, woran es liegt. Das ist der gesammte quelltext für mein kleines testproggie, funktoniert auch mittlerweile, aber (und es musste ja ein aber kommen) es dauert entschieden zulange. Wenn ich den code simuliere wir am Bit EEWE erst wieder ein Low pegel angezeigt (was heißt das schreiben ist fertig) wenn der Programmzähler das nop mit meinem komentar erreicht hat. Das würde heißen es werden 22 Takte benötigt um das Speichern zu vollenden. compiliere ich das ganze und schreib es in meinen avr läuft die sache auch (ich kann PinA messen) In der doku steht aber es würden 4 takte verstreichen, weil der avr für 2 takte angehalten würde. was ist jetzt realität? bin froh jetzt endlich auch mal was messen zu können! mache ich einen generellen fehler, läuf bei euch der eeprom ohne probleme? könnt ihr mir helfen? Danke in voraus. Henning Der code: ;*******************************EEPROM.asm****************************** ;*** An Adresse 0x00 des EEPROMS ist das Datenbyte 0xAA gespeichert, *** ;*** dieses soll ausgelesen und an den LEDs an PortB angezeigt werden*** ;*********************************************************************** .device AT90S8515 .include "8515def.inc" .def tmp =r16 ;Register festlegen .def order =r17 .def xlow =r26 .def xhigh =r27 .org 0x00 ;Einsprungadresse nach einem RESET rjmp Init .org 0x10 nop ;*********************************************************************** Init: ldi tmp,low(RAMEND) ;Stackpointer auf das out spl,tmp ;Speicherende setzen (RAMEND equ 0x025F) ldi tmp,high(RAMEND);3-Level-Stack out sph,tmp ;*********************************************************************** ;Port B Definieren ser tmp ;setze tmp auf $FF(255) out DDRA,tmp ;Port B ist Ausgang out PortA,tmp ;Alle LEDs aus ;*********************************************************************** EEWrite: sbic EECR,EEWE ; skip, wenn EECR = 0 rjmp EEWrite ; nochmal! ;*********************************************************************** ; Adresse setzen ldi xlow,0x00 ;EEPROM Adressregister intitialisieren (ardesse) ldi xhigh,0x00 ;*********************************************************************** ; datenbyte setzen ldi tmp, 0xAA out EEDR, tmp ;*********************************************************************** sbi EECR, EEMWE ; Programierung freigeben sbi EECR, EEWE ; Programmierung starten nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop ;hier ist das schreiben fertig! ;*********************************************************************** ; datenbyte setzen ldi tmp, 0x00 out EEDR, tmp ;*********************************************************************** ; Adresse setzen ldi xlow,0x00 ;EEPROM Adressregister intitialisieren (ardesse) ldi xhigh,0x00 ;*********************************************************************** ;Lesebefehl sbi EECR,EERE ; ergebnis steht in eedr in tmp, EEDR ; ergebis steht in r16 out PortA, tmp loop: rjmp loop
Hi Henning ! Wer lesen kann ist klar im Vorteil! Datasheet AT90S8515 Seite 31: EEPROM Read/Write Access The write access time is in the range of 2,5 - 4ms,depending on the Vcc voltage. Das sagt doch wohl alles, oder? Gruss Uwe
okok, ich hab´s gefunden :) wenn man einfach mittels EEready: sbic EECR,EEWE ; skip, wenn EECR = 0 rjmp EEready ; wert ist noch nicht gespeichert! den avr dazu bringt sicher zu warten, bis der wert abgespeichert ist bevor man nochmal auf´s eeprom zugreift geht alles klar allerdings hab ich noch nen fehler gefunden im geposteteten quellcode: die lese UND schreib adresse wird garnicht gesetzt; nur in die register geschrieben. nach dem ldi xlow,0x00 ldi xhigh,0x00 fehlt noch out EEARL, xlow out EEARH, xhigh thx nochmal! henning
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.