@Stefan G.
Sorry, hat ein wenig länger gedauert, und zu einem Flußdiagramm hat die
Zeit auch nicht gereicht. Ich denke aber, das Prinzip wird aus dem
Programm ersichtlich, auch wenn man kein Assembler-Champ ist.
In dieser speziellen Version brauchte ich nur 8-Bit Werte, werden alle
10 Bit benötigt, werden natürlich 2 Bytes/Wert gebraucht. Falls noch
Fragen sind, einfach Posten.
Grundprinzip: Der Wandler wird gestartet, wenn er fertig ist, wird ein
Interrupt ausgelöst. In diesem Interrupt wird der Wert gelesen und im
SRAM gespeichert, anschließend der nächste Kanal ausgewählt und die
nächste Wandlung gestartet. So stehen so ganz nebenbei die Werte aller
6 Kanäle in Reih und Glied im SRAM, und man kann mit dem Hauptprogramm
ohne irgendwelche Verzögerungen darauf zugreifen.
---------------------------------------------
.include "c:\avrtools\appnotes\4433def.inc"
.cseg
.org 0
rjmp reset ;Reset handler
reti ;External interrupt 0 - Not used
reti ;External interrupt 1
reti ;Counter1 capture event
reti ;Counter1 compare match
reti ;Counter1 overflow
reti ;Counter0 overflow
reti ;Serial Transfer complete
reti ;UART RX complete
reti ;UART Data register empty
reti ;UART TX complete
rjmp adc_int ;ADC Conversion Complete
reti ;EEPROM Ready
reti ;Analog comparator
.equ impuls = 0
.equ adc_puffer= $60 ;$60...$65 ist der A/D-Wandler Puffer
.def temp = r16
.def temp2 = r17
.def analog = r0 ;aktueller 8-Bit Analog-Wert
.def flag = r25
.def xl = r26
reset:
ldi temp,ramend
out SPL,temp
ldi temp,$FF
out DDRD,temp
ldi temp,$03
out DDRB,temp
ldi temp,$05
out ADMUX,temp
ldi temp,(1<<ADEN)+(1<<ADIE)+(1<<ADPS2)+(1<<ADPS1)
out ADCSR,temp
sei
sbi ADCSR,ADSC ;Start Conversion
main:
rjmp main ;Das Hauptprogramm macht nix.
adc_int: ;A/D-Wandler-Interrupt, wird aufgerufen, wenn eine Wandlung
fertig ist
push temp ;benutzte Register und SREG auf Stack sichern
in temp,SREG
push temp
push xl
push temp2
in temp,ADMUX ;welcher Kanal wurde gerade gewandelt?
andi temp,$07 ;nur Bit 0..2 verwenden
ldi xl,adc_puffer ;Basis-Adresse des SRAM für die Analog-Werte
add xl,temp ;Kanal-Nummer addieren
in temp,ADCL ;Den aktuell gewandelten Wert in temp1 und temp2 laden
in temp2,ADCH
ror temp2
ror temp
ror temp2
ror temp ;10 Bit nach 8 Bit konvertieren
st x,temp ;in Puffer schreiben
in temp,ADMUX ;aktuellen Kanal nochmals in temp laden
andi temp,$07 ;nur Bit 0..2 verwenden
dec temp ;den nächsten Kanal anwählen
brpl adc_int_1
ldi temp,$05 ;Kanal 5 anwählen
adc_int_1:
out ADMUX,temp ;Das MUX-Register mit dem neuen Wert laden
sbi ADCSR,ADSC ;nächste Wandlung starten
pop temp2 ;die gesicherten Register wiederherstellen
pop xl
pop temp
out SREG,temp
pop temp
reti