Gast
#1119515
... aber es is auch schon spät :-)
jemand ne ahnung warum hier nix ins eeprom geschrieben wird?
(Es kommen daten über den uart rein, das hab ich geprüft)
; Daten empfangen mit Interrupt
; und zur?cksenden
.include "m162def.inc"
.def temp = r16
.def temp_save = r17
.def sreg_saveW = r18
.def sreg_saveI = r19
.def save = r20
.equ CLOCK = 4600000
.equ BAUD = 4800
.equ UBRRVAL = CLOCK/(BAUD*16)-1
; hier geht das Programmsegment los
.CSEG
.org 0x00
rjmp main
.org URXC0addr
rjmp int_rxc
; Hauptprogramm
main:
ldi temp, LOW(RAMEND) ; Stackpointer initialisieren
out SPL, temp
ldi temp, HIGH(RAMEND)
out SPH, temp
ldi temp, LOW(UBRRVAL) ; Baudrate einstellen
out UBRR0L, temp
ldi temp, HIGH(UBRRVAL)
out UBRR0H, temp
ldi temp, (1<<URSEL0)|(3<<UCSZ00) ; Frame-Format: 8 Bit
out UCSR0C, temp
sbi UCSR0B, RXCIE ; Interrupt bei Empfang
sbi UCSR0B, RXEN ; RX (Empfang) aktivieren
ldi ZL,low(daten) ; der Z-Zeiger wird hierexclusiv
ldi ZH,high(daten) ; für die
Datenadressierungverwendet
ldi save,30
sei ; Interrupts global aktivieren
loop:
rjmp loop ; Endlosschleife
(ABERInterrupts!)
; Interruptroutine wird ausgeführt,
; sobald ein Byte über den UART empfangen wurde
int_rxc:
mov temp_save, temp
in sreg_saveI, sreg
in temp, UDR ; empfangenes Byte lesen
push temp
dec save
breq writeStack ;solange das Register noch nicht einmal
übergelaufen ist wird auch nix gespeichert
out sreg,sreg_saveI
mov temp,temp_save ; temp wiederherstellen
reti
; der eigentliche EEPROM Schreibzugriff
; Adresse in ZL/ZH
; Daten in temp
writeStack:
cli ; Interrupts sperren,
dienächsten
; zwei Befehle dürfen NICHT
; unterbrochen werden
ldi save,30
writeStackLoop:
pop temp
rcall EEPROM_write ; Byte im EEPROM speichern
adiw ZL,1 ; Zeiger erhöhen
cpi ZL,low(EEPROMEND+1) ; Vergleiche den Z Zeiger
ldi temp,high(EEPROMEND+1) ; mit der maximalen
EEPROMAdresse +1
cpc ZH,temp
brne int_rxc_1 ; wenn ungleich, springen
ldi ZL,low(Daten) ; wenn gleich,
Zeigerzurücksetzen
ldi ZH,high(Daten)
int_rxc_1:
dec save
brne writeStackLoop ;Daten schreiben solange Z != 0
reti
EEPROM_write:
sbic EECR, EEWE ; prüfe ob der
letzteSchreibvorgang beendet ist
rjmp EEPROM_write ; wenn nein, nochmal prüfen
out EEARH, ZH ; Adresse schreiben
out EEARL, ZL ;
out EEDR,temp ; Daten schreiben
in sreg_saveW,sreg ; SREG sichern
sbi EECR,EEMWE ; Schreiben vorbereiten
sbi EECR,EEWE ; Und los !
out sreg, sreg_saveW ; SREG wieder herstellen
ret
; hier wird der EEPROM-Inhalt definiert
.ESEG
Daten:
.db 0