Code:
loop:
;--------DEIN CODE----------
EEPROM_write:
sbic EECR,EEWE
rjmp EEPROM_write
ldi temp2,0x00
out EEARH,temp
ldi temp,0x20
out EEARL,temp
ldi temp1,0x55
out EEDR,temp
sbi EECR,EEMWE
sbi EECR,EEWE
;--------------/DEIN CODE----------
inc temp
out EEARL,temp
rjmp loop
Also für mich war es logisch, dass wenn man den EEARL inkrementiert, er dann den Wert auf die nächste Adresse schreibt. Nur mit dem out ändert sich der Wert in EEARL nicht.
Code:
.include "m8def.inc"
.def temp = r16
.def temp1= r17
.def temp2= r18
.def temp3= r19
.def adhigh=r20
.def eepromh=r21
.def eeproml=r22
.equ CLOCK = 4000000 ; externer Oszi, weil sonst USART nicht funktioniert
.equ BAUD = 9600
.equ UBRRVAL = CLOCK/(BAUD*16)-1
.org 0x00
rjmp reset
.org URXCaddr
rjmp int_rxc
;//////////////////Initialisierung/////////
reset: ; Stackpointer initialisieren
ldi temp, LOW(RAMEND)
out SPL, temp
ldi temp, HIGH(RAMEND)
out SPH, temp
;---------------Uart---------------------
; Baudrate einstellen
ldi temp, LOW(UBRRVAL)
out UBRRL, temp
ldi temp, HIGH(UBRRVAL)
out UBRRH, temp
; Frame-Format: 8 Bit
ldi temp, (1<<URSEL)|(3<<UCSZ0);|(0<<USBS);|(1<<UMSEL)
;URSEL muss 1 sein, wenn UCSRC beschrieben wird.
;UCSZ0 = 3 entspricht 011 binär und setzt Datenbreite auf 8Bits
out UCSRC, temp
sbi UCSRB, RXCIE ; Interrupt bei Empfang
sbi UCSRB, RXEN ; RX (Empfang) aktivieren
sei ; Interrupts global aktivieren
;--------------/Uart----------------------
;--------------ADC------------------------
; ADC initialisieren:
ldi temp, (1<<REFS0) | (5<<MUX0) | (1<<ADLAR) ; REFS=1 entspricht interne Referenzspannung 5V; MUX wählt ADC5 Pin28 PC5 aus ;ADLAR=1 bei 8bit reicht ADCH
out ADMUX, temp
ldi temp, (1<<ADEN) | (7<<ADPS0); ADEN ADC Enable (anschalten); ADPS 111 entspricht Divisionsfaktor 128
out ADCSRA, temp
;--------------/ADC-----------------------
;-------EEPROM----------------------------
ldi r21,0x00 ; High-Adresse im EEPROM laden
out EEARH, r21 ; und ins EEARH schreiben
ldi r22, 0x00 ; Low-Adresse im EEPROM laden
out EEARL, r22 ; und ins EEARL schreiben
;-------/EEPROM----------------------------
;//////////////////Initialisierung ENDE/////////
loop:
; rcall threeminutes ;nach drei Minuten den ADC Wert einlesen
;--------------ADC Wert einlesen------------
sample_adc:
sbi ADCSRA, ADSC ; den ADC starten
wait_adc:
sbic ADCSRA, ADSC ; wenn der ADC fertig ist, wird dieses Bit gelöscht
rjmp wait_adc
in adhigh, ADCH ; High Byte des ADC in adhigh speichern
;--------------/ADC Wert einlesen------------
;--------------...und in EEPROM schreiben----
EEPROM_write:
cli ;Interrupts vorsichtshalber ausschalten
sbic EECR,EEWE ; Vorherigen Schreibvorgang abwarten
rjmp EEPROM_write
out EEDR,adhigh ; Daten ins EEPROM-Datenregister
sbi EECR,EEMWE ; Schreiben vorbereiten
sbi EECR,EEWE ; muss innerhalb von 4 Zyklen geschrieben werden, deswegen Interrupts aus.
sei ;Interrupts wieder einschalten
inc r22
out EEARL,r22
sei
;--------------/...und in EEPROM schreiben----
rjmp loop
int_rxc: ; wenn vom PC etwas empfangen wird, dann wird Interrupt ausgelöst und hierher gesprungen
push temp ; temp auf dem Stack sichern
in temp, UDR ; empfangenes Byte von UDR in temp speichern
BREQ 1 ;wenn eine 1 übertragen wurde, dann sollen die Werte aus dem EEPROM an den PC gesendet werden.
rcall DatenSenden
BREQ 2 ;wenn eine 2 gesendet wird, dann soll EEPROM gelöscht werden
rcall DatenLoeschen
pop temp ; temp wiederherstellen
reti
sbi UCSRB,TXEN ; TX aktivieren
ldi temp, 0xAA
DatenSenden:
ret
DatenLoeschen:
ret
serout:
sbis UCSRA,UDRE ; Warten bis UDR für das nächste
; Byte bereit ist
rjmp serout
out UDR, temp
ret ; zurück zum Hauptprogramm
;threeminutes:
; =============================
; delay loop generator
; 720000000 cycles:
; -----------------------------
; delaying 49939965 cycles:
ldi R17, $FF
WGLOOP0: ldi R18, $FF
WGLOOP1: ldi R19, $FF
WGLOOP2: dec R19
brne WGLOOP2
dec R18
brne WGLOOP1
dec R17
brne WGLOOP0
; -----------------------------
; delaying 49939965 cycles:
ldi R17, $FF
WGLOOP3: ldi R18, $FF
WGLOOP4: ldi R19, $FF
WGLOOP5: dec R19
brne WGLOOP5
dec R18
brne WGLOOP4
dec R17
brne WGLOOP3
; -----------------------------
; delaying 49939965 cycles:
ldi R17, $FF
WGLOOP6: ldi R18, $FF
WGLOOP7: ldi R19, $FF
WGLOOP8: dec R19
brne WGLOOP8
dec R18
brne WGLOOP7
dec R17
brne WGLOOP6
; -----------------------------
; delaying 49939965 cycles:
ldi R17, $FF
WGLOOP9: ldi R18, $FF
WGLOOP10: ldi R19, $FF
WGLOOP11: dec R19
brne WGLOOP11
dec R18
brne WGLOOP10
dec R17
brne WGLOOP9
; -----------------------------
; delaying 49939965 cycles:
ldi R17, $FF
WGLOOP12: ldi R18, $FF
WGLOOP13: ldi R19, $FF
WGLOOP14: dec R19
brne WGLOOP14
dec R18
brne WGLOOP13
dec R17
brne WGLOOP12
; -----------------------------
; delaying 49939965 cycles:
ldi R17, $FF
WGLOOP15: ldi R18, $FF
WGLOOP16: ldi R19, $FF
WGLOOP17: dec R19
brne WGLOOP17
dec R18
brne WGLOOP16
dec R17
brne WGLOOP15
; -----------------------------
; delaying 49939965 cycles:
ldi R17, $FF
WGLOOP18: ldi R18, $FF
WGLOOP19: ldi R19, $FF
WGLOOP20: dec R19
brne WGLOOP20
dec R18
brne WGLOOP19
dec R17
brne WGLOOP18
; -----------------------------
; delaying 49939965 cycles:
ldi R17, $FF
WGLOOP21: ldi R18, $FF
WGLOOP22: ldi R19, $FF
WGLOOP23: dec R19
brne WGLOOP23
dec R18
brne WGLOOP22
dec R17
brne WGLOOP21
; -----------------------------
; delaying 49939965 cycles:
ldi R17, $FF
WGLOOP24: ldi R18, $FF
WGLOOP25: ldi R19, $FF
WGLOOP26: dec R19
brne WGLOOP26
dec R18
brne WGLOOP25
dec R17
brne WGLOOP24
; -----------------------------
; delaying 49939965 cycles:
ldi R17, $FF
WGLOOP27: ldi R18, $FF
WGLOOP28: ldi R19, $FF
WGLOOP29: dec R19
brne WGLOOP29
dec R18
brne WGLOOP28
dec R17
brne WGLOOP27
; -----------------------------
; delaying 49939965 cycles:
ldi R17, $FF
WGLOOP30: ldi R18, $FF
WGLOOP31: ldi R19, $FF
WGLOOP32: dec R19
brne WGLOOP32
dec R18
brne WGLOOP31
dec R17
brne WGLOOP30
; -----------------------------
; delaying 49939965 cycles:
ldi R17, $FF
WGLOOP33: ldi R18, $FF
WGLOOP34: ldi R19, $FF
WGLOOP35: dec R19
brne WGLOOP35
dec R18
brne WGLOOP34
dec R17
brne WGLOOP33
; -----------------------------
; delaying 49939965 cycles:
ldi R17, $FF
WGLOOP36: ldi R18, $FF
WGLOOP37: ldi R19, $FF
WGLOOP38: dec R19
brne WGLOOP38
dec R18
brne WGLOOP37
dec R17
brne WGLOOP36
; -----------------------------
; delaying 49939965 cycles:
ldi R17, $FF
WGLOOP39: ldi R18, $FF
WGLOOP40: ldi R19, $FF
WGLOOP41: dec R19
brne WGLOOP41
dec R18
brne WGLOOP40
dec R17
brne WGLOOP39
; -----------------------------
; delaying 20840484 cycles:
ldi R17, $C4
WGLOOP42: ldi R18, $B3
WGLOOP43: ldi R19, $C5
WGLOOP44: dec R19
brne WGLOOP44
dec R18
brne WGLOOP43
dec R17
brne WGLOOP42
; -----------------------------
; delaying 6 cycles:
ldi R17, $02
WGLOOP45: dec R17
brne WGLOOP45
; =============================
ret
.eseg ; EEPROM-Segment aktivieren
daten:
.db 0b00000000
Lesezeichen