Moin,
ich habe das myAVR Lehrbuch durchgearbeitet und wollte nun mit dem
Atmega8 2 analoge Messwerte an ADC0 und ADC1 aufnehmen und dann weiter
verarbeiten.
Wenn ich es richtig verstanden habe, kann ich nicht mehrere ADC-Eingänge
gleichzeitig asbfragen, sondern muss dies nacheinander tun.
Mir erschien es sinnvoll dies folgerndermaßen zu machen:
1
on: sbrc EK, 0 ;wenn zuletzt Wert1 ausgelesen wurde,
2
rjmp onWert2 ;dann springe zum Verarbeiten des Wert2
Es funktioniert auch soweit, dass ich abwechselnd die Werte ausgegeben
bekomme, das Problem ist nun, dass wen ich versuche die Werte zu
verarbeiten, dann nutze ich eine Schleife für eine Automatensteuerung,
die so aussieht:
1
phase1:
2
mov temp1, Wert2
3
ldi temp2, 60
4
5
cp temp1, temp2 ;der Startwert lieg bei 25 und steigt dann bis
6
BRSH phase2 ;60 an, hier soll dann der Motor abgeschaltet
7
;werden
8
sbi PORTB, 0 ;Motor einschalten
9
sbi PORTB, 1
10
rjmp phase1
11
12
phase2:
13
cbi PORTB, 0 ;Motor abschalten
14
cbi PORTB, 1
Diese Schleife wird nun leider ignorriert. Egal welcher Wert als Wert2
eingelsen wird, es wird zu Phase 2 übergegangen, das ganze funktioniert
aber solange ich die Messung von Wert1 nicht durchführe.
Ich habe schon die das AVR-Tutorial: ADC gelesen und versucht mit der
Suchfunktion und Google etwas passendes dazu zu finden, aber mir ist
einfach nicht im geringsten klar wo der Fehler liegt.
An der Signalqualität liegt es nicht- ich habe sie sowohl mit einem
starken Tiefpass versucht zu glätten wie auch einfach den Poti vom
myAVR-Board benutzt... und wie gesagt- ohne die Messung des Wert1 klappt
es auch...
Im SiSy-Controlcenter bekomme ich auch brav die richtigen Werte
Wenn es einen sinnvolleren alternativen Weg gibt um 2 ADC-Werte
einzulesen immer her damit ich bin mittlerweile für alles dankbar^^
Also, die gute Nachricht ist, dass es jetzt läuft- allerdings nicht so
wie ich es mir dachte.
Ich rufe jetzt jedesmal wenn ich den Wert2 brauche ein Unterprogramm
auf:
1
AVR-Assembler-Code
2
getMessst:
3
ldi EK, 0b00000000 ;ADC initialisieren
4
out ADMUX, EK
5
6
sbi ADCSRA, ADSC ; den ADC starten
7
8
wait_adc2:
9
sbic ADCSRA, ADSC ;wenn der ADC fertig ist, wird dieses Bit gelöscht
10
rjmp wait_adc2
11
reti
und habe die entsprechenden Teile aus dem Interrupt-Aufruf gelöscht.
So funktioniert es zwar erst mal- aber so werden halt nicht
kontinuierlich Werte an der Schnittstelle übergeben. Dies ist zwar nicht
so schlimm, da sie zur Zeit nur zur Kontrolle visualisiert werden, aber
es ärgert mich schon, das ich es nicht hinbekomme- ich hoffe also immer
noch auf eine Idee von jemanden wo der Fehler liegt, bzw wie man es
"richtig" macht.