511 Messwerte
über ADC aufnehmen und in EEPROM schreiben.
Seriell auslesen über Terminal / PC.
include"C:\Programme\Atmel\AVR
Tools\AvrAssembler2\Appnotes\m8def.inc"
.def A = r16
.def B = r17
.def EEmode = r20
.def sicher = r21
.def EEadrl = r22
.def EEadrh = r23
.equ c1 = 64000
;Durchläufe der
Warteschleife
;Stackpointer Init
ldi r16,LOW(RAMEND)
out SPL,r16
ldi r16,HIGH(RAMEND)
out SPH,r16
;ADC_Init
ldi A,3
;ADCTakt/8
out ADCSRA,A
sbi ADCSRA,ADEN
;USART_Init
ldi r16,12
;Baudrate 9600 bei2 MHz
ldi r17,00
out UBRRH,r17
out UBRRL,r16
ldi r16,(1<<RXEN)|(1<<TXEN)
;Enable TX+RX
out UCSRB,r16
ldi r16,0b10000110
;asyncron 8N1
out UCSRC,r16
sbi DDRB,1
;LED
sbi portb,0
;Startschalter am Eingang PB0 mit Pullup!
Anfang:
sbic
pinb,0
;Abfrage Startschalter
rjmp Anfang
sbi portb,0
;pullup setzen
loop:
ldi
A,0
;Drückerabfrage:
kurz =lesen | lang=schreiben
sbic pinb,0
rjmp loop
rcall wait
rcall wait
sbic pinb,0
rjmp
lesen
;Taster kurz
drücken
schreiben:
ldi EEadrh,0
ldi EEadrl,0
schreiben1:
ldi
B,5
;Verzögerung Aufzeichnung (Meßpause)
Zeit:
rcall wait
cbi
portb,1
;LED aus
dec
B
brne
Zeit
;Zeitschleife
sbi
portb,1
;LED ein
rcall RdADC
rcall USART_Transmit
rcall WrEE
;Block EEPROM
schreiben
inc EEadrl
cpi
EEadrl,255
;Schleifenzähler L
brlo schreiben1
ldi EEadrl,0
inc EEadrh
cpi
EEadrh,2
;Schleifenzähler H
brlo schreiben1
rjmp loop
lesen:
ldi EEadrl,0
ldi EEadrh,0
ldi A,13
rcall USART_Transmit
;Zeilensprung
lesen1:
rcall RdEE
rcall USART_Transmit
inc EEadrl
cpi
EEadrl,255
;Schleifenzähler L
brlo lesen1
ldi
EEadrl,0
inc
EEadrh
cpi
EEadrh,2
;Schleifenzähler H
brlo lesen1
rjmp loop
RdEE: sbic EECR,EEWE
rjmp RdEE
out
EEARH,EEadrh
out
EEARL,EEadrl
sbi
EECR,EERE
in A,EEDR
ret
WrEE: sbic EECR,EEWE
rjmp WrEE
out
EEARH,EEadrh
out
EEARL,EEadrl
out EEDR,A
sbi
EECR,EEMWE
sbi
EECR,EEWE
ret
USART_Transmit:
sbis
UCSRA,UDRE
;Wait for emty transmit buffer
rjmp USART_Transmit
;Put Data into buffer, sends the data
out UDR,A
ret
USART_Receive:
sbis UCSRA,
RXC
;wait for data to be received
rjmp
USART_Receive ;get and return
received data from buffer
in A,UDR
ret
RdADC:
ldi
A,0b11100000
;Interne Referenz-ADLAR, Eingang ADC0 aktiviert!!!
out
ADMUX,A
sbi
ADCSRA,ADSC
;Wandlung starten
ADrdyb:
sbic
ADCSRA,ADSC ;ADC busy
rjmp ADrdyb
in
A,ADCH
ret
wait: in sicher,SREG
ldi r25,HIGH(c1)
;lade MSB-Register mit Schleifenwert c1
ldi r24,LOW(c1)
``
Loop1:
sbiw r24,1
;Doppelregisterwert um 1 verringern
brne Loop1
out SREG,sicher
ret
programmiert mit ATMEL Studio4 und
ISP Programmer über USB am Notebook
Rolf Grauer, 06.10.2024