Hallo zusammen,
ich als absoluter µC Neuling weiss nicht mehr weiter und brauche einen
guten Rat.
Mein Problem, ich bekomme diesen Code auf dem mega8 nicht zum laufen:
.include "m8def.inc"
ldi R16, 0xFF
out DDRB, R16 ; Port B: Ausgang
ldi r16, HIGH(daten) ; Adresse laden
out EEARH, r16
ldi r16, LOW(daten)
out EEARL, r16
sbi EECR, EERE ; Lesevorgang aktivieren
in r16, EEDR
out PORTB, r16
loop: rjmp loop
.eseg
daten:
.db 0b10101010
dieser ist aus dem Beispiel des AVR-Tutorials, und sollte ja eigentlich
laufen. Ich benutze AVR-Studio 4.12 SP3 und PonyProg 2000 Vers.2.06f
Beta.
Sowohl in der Simulation als auch auf dem µC kein Erfolg.
Was mache ich falsch???
Bin über jegliche Infos sehr sehr dankbar.
Gruß
happeen
google sagt: sbi EECR,EERE ; read enable _eee1: in temp,EECR andi temp,EERE tst temp brne _eee1 in temp,EEDR Fazit: Du muß wohl warten bis das Byte da ist...
danke für die Info, ein guter Tip, leider hat es auch trotz Schleife nicht funktioniert. Laut I/O View im AVR-Studio scheint das EECR-Register nicht zu reagieren. Ich habe versucht, es mit EERE bzw. mit 0 zu beschreiben, leider kein Erfolg. An was kann das liegen? Kann es an AVR-Studio 4.12 SP3 liegen? --brauche Hilfe--
Hallo,
Die folgende Funktion habe ich für den mega16 geschrieben, sie
funktioniert auch auf einem mega128:
.def gen1 = r16
.def gen2 = r17
.def gen3 = r18
.def gen4 = r19
eeprom_read: ; gen2:gen1 (in): address
; gen1 (out): data
push gen3
; eeprom access is timing critical
; disable interrupts
in gen3, SREG
cli
; read eeprom
out EEARH, gen2
out EEARL, gen1
sbi EECR, EERE
in gen1, EEDR
; restore interrupts
out SREG, gen3
pop gen3
ret
Eventuell kannst Du ein anderes Ausgaberegister verwenden, um die
Leseadresse nicht zu zerstören.
Gruß,
Roland
Hallo Roland,
danke für deine Antwort,
leider wachsen die meinigen µC-Kenntnisse nur langsam, aber hoffentlich
sicher. Also, dein Programmvorschlag habe ich leider nicht verstanden
(da fehlen mir wohl noch so einige Stunden der Zweisamkeit mit google
und Co). Jedoch ein kleiner Erfolg war da. Wer lesen kann ist klar im
Vorteil, so habe ich diesmal das hiesige Beispiel aus dem Tutorial
richtig abgeschrieben, und siehe da, es tut, zumindest im Simulator.
.include "m8def.inc"
ldi R16, 0xFF
out DDRB, R16 ; Port B: Ausgang
ldi r16, HIGH(daten) ; Adresse laden
out EEARH, r16
ldi r16, LOW(daten)
out EEARL, r16
sbi EECR, EERE ; Lesevorgang aktivieren
_eee1: sbic EECR, 1 ; ... und auf das EEPROM
warten
rjmp _eee1
in R16,EEDR
out PORTB, R16
loop: rjmp loop
.eseg
daten:
.db 0b10101010
nun muss mir bloß noch jemand sagen, wie um Gottes Hilfe ich des µC's
eeprom dazu überreden kann, auch das anzuzeigen was ich möchte.
Fuse-Bits sind wohl richtig. Keine Ahnung, gibt es noch eine Alternative
zu PonyProg?
gruß
happeen
juhu, mit YAAP hat's funktioniert (mit dem Pony leider nicht), nun weiss ich auch das, danke für die Hilfe Gruß happeen
Die Schleife
sbic EECR, 1
rjmp _eee1
kannst Du Dir vorerst sparen. Die wartet nämlich auf die
Vervollständigung einer evtl. vorhergehenden Schreiboperation. Da es
diese bei Dir nicht gibt, kannst Du das weglassen. Und wenn Du sie
behalten willst, solltest Du sie vor den Start des Lesevorgangs
verschieben.
Aus dem mega8 Datenblatt S. 19:
The EEPROM read access takes one instruction, and the requested data is
available immediately. When the EEPROM is read, the CPU is halted for
four cycles before the next instruction is executed.
.include "m8def.inc"
ldi r16, 0xff
out DDRB, r16 ; Port B: Ausgang
ldi r16, LOW(daten) ; Adresse laden
ldi r17, HIGH(daten)
out EEARL, r16
out EEARH, r17
sbi EECR, EERE ; Lesevorgang aktivieren
in r16, EEDR
out PORTB, r16
loop: rjmp loop
.eseg
daten:
.db 0b10101010
.cseg
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.