Code:
.include "4433def.inc"
.def temp = r16
.def ad_value = r17
.def ad_value0 = r18
.def ad_value1 = r19
.def ad_value2 = r20
.def count = r21
.org 0x000
rjmp init ; Initialisierung / RESET
reti ; IRQ0
reti ; IRQ1
reti ; Timer1 Capture
reti ; Timer1 Compare
reti ; Timer1 Overflow
reti ; Timer0 Overflow
reti ; SPI Complete
reti ; UART Rx
reti ; UART Data empty
reti ; UART Tx
rjmp adc_int ; ADC Conversion Complete
reti ; EEPROM ready
reti ; Analog Comparator
; ################################
; Initialisierung
; ################################
init:
; ################################
; Ports initialisieren (alle PINS INPUT - interne Pullups aktiviert)
; ################################
ldi temp, 0x00
out DDRB, temp
ldi temp, 0xFF
out PORTB, temp
ldi temp, 0x00
out DDRC, temp
ldi temp, 0xFF
out PORTC, temp
ldi temp, 0x00
out DDRD, temp
ldi temp, 0xFF
out PORTD, temp
; ################################
; Stack initialisieren
; ################################
ldi temp, RAMEND
out SP, temp
; ################################
; ADC initialisieren
; ################################
; Multiplexer setzen - PC0 ist analoger Eingang
cbi ADMUX, MUX0
cbi ADMUX, MUX1
cbi ADMUX, MUX2
; ADC Interrupt anschalten
sbi ADCSR, ADIE
; Prescaler auf 16 setzen
cbi ADCSR, ADPS0
cbi ADCSR, ADPS1
sbi ADCSR, ADPS2
; AD Converter anschalten
sbi ADCSR, ADEN
; global Interrupts aktivieren
sei
; Erste Wandlung auslösen
sbi ADCSR, ADSC
; ################################
; Hauptprogramm
; ################################
ldi count, 0x00
main:
; Hier könnte nun der ad_value umgerechnet werden und über
; UART oder LCD ausgegeben werden
rjmp main
; ################################
; ADC Interrupt
; ################################
adc_int:
; gewandelte Werte einlesen
in ad_value, ADCL
in temp, ADCH
; zweimal nach rechts rotieren (um die beiden LSB
; in das Low Register zu kriegen) -> 8 bit Wandlung
ror temp
ror ad_value
ror temp
ror ad_value
; Count abfragen
cpi count, 0x00
breq count_0
cpi count, 0x01
breq count_1
cpi count, 0x02
breq count_2
count_0:
; wenn Count = 0: count auf 1 setzen; ad_value in ad_value0 schreiben; mux auf 001 einstellen
ldi count, 0x01
mov ad_value0, ad_value
sbi ADMUX, MUX0
cbi ADMUX, MUX1
cbi ADMUX, MUX2
rjmp end
count_1:
; wenn Count = 1: count auf 2 setzen; ad_value in ad_value1 schreiben; mux auf 010 einstellen
ldi count, 0x02
mov ad_value1, ad_value
cbi ADMUX, MUX0
sbi ADMUX, MUX1
cbi ADMUX, MUX2
rjmp end
count_2:
; wenn Count = 2; count auf 0 setzen; ad_value in ad_value2 schreiben; mux auf 000 einstellen
ldi count, 0x00
mov ad_value2, ad_value
cbi ADMUX, MUX0
cbi ADMUX, MUX1
cbi ADMUX, MUX2
rjmp end
end:
; neue Wandlung starten
sbi ADCSR, ADSC
reti
Hoffe ich konnte helfen.
Lesezeichen