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