Hi,
ich möchte (Interrupt gesteuert) einen Datenblock vom SRAM des ATMEGA8
in das EEPROM schreiben. Das funktioniert im Simulator vom AVR-Studio
auch ohne Probleme, aber im µP wird nur das erste Byte gespeichert, dann
passiert nichts mehr. Es scheint so, als würde das EEPROM nach dem erste
Schreibbefehl nie fertg werden...
Das wäre mein Code:
1 | EXT_INT0:
|
2 | cli ; Alle Interrupts sperren um Zeit und Energie zu sparen
|
3 |
|
4 | ldi ZH, high(EEPROMDaten) ; Quell-Adresse im EEPROM
|
5 | ldi ZL, low(EEPROMDaten)
|
6 | ldi YH, high(RamDat) ; Ziel-Adresse im SRAM
|
7 | ldi YL, low(Ramdat)
|
8 | ldi r16,112 ; 112 Bytes sind zu kopieren
|
9 |
|
10 | EEPROM_schreiben:
|
11 |
|
12 | sbic EECR,EEWE ; prüfen, ob der vorherige Schreibzugriff beendet ist
|
13 | rjmp EEPROM_schreiben ; wenn nicht, nochmal prüfen
|
14 |
|
15 | out EEARH, ZH ; Adresse von EEPROM laden
|
16 | out EEARL, ZL
|
17 |
|
18 | ld r17, Y+ ; r17 mit SRAM-Byte befüllen
|
19 | out EEDR, r17 ; r17 ins EEPROM
|
20 |
|
21 | sbi EECR,EEMWE ; Schreiben vorbereiten
|
22 | sbi EECR,EEWE ; Schreiben ausführen
|
23 |
|
24 | adiw ZH:ZL,1
|
25 | dec r16 ; Byte-Counter
|
26 | brne EEPROM_schreiben ; Solange nicht 0 nochmal schreiben
|
27 |
|
28 | sei ; Interrupts wieder freigeben
|
29 | reti
|
Ich habe jetzt schon Stunden mit der Fehlersuche verbracht, komme aber
auf keinen grünen Zweig. Ich hoffe, ihr habt eine Idee...
lg Michi