Hallo Florian,

hier ein (hoffentlich) funktionierender Code für den Adwandler.

Er liest die AD Ports 0 - 2 ein und schreibt die Werte je in ein eigenes Register. Der Code ist nicht optimiert (Speicherplatz / RAM) damit er übersichtlicher bleibt ...

Hier der Code:
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.

Viele Grüße
Flite