Forum: Mikrocontroller und Digitale Elektronik Wie bekomme ich mega8 EEPROM zum laufen?


von happeen (Gast)


Lesenswert?

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

von antworter (Gast)


Lesenswert?

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...

von happeen (Gast)


Lesenswert?

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--

von Roland R. (roland) Benutzerseite


Lesenswert?

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

von happeen (Gast)


Lesenswert?

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

von happeen (Gast)


Lesenswert?

juhu, mit YAAP hat's funktioniert (mit dem Pony leider nicht),
nun weiss ich auch das,

danke für die Hilfe
Gruß
happeen

von Roland R. (roland) Benutzerseite


Lesenswert?

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
Noch kein Account? Hier anmelden.