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
|
3 | ;------------------------------------------------------------------
|
4 | onWert1: ;verarbeiten von Wert1
|
5 | push temp1 ;rette die Temps
|
6 | push temp2
|
7 |
|
8 | in temp1, ADCL ;lese den Wert1 aus
|
9 | in temp2, ADCH
|
10 | ;-----------------------
|
11 | asr temp2 ;Die 8 MSB auslesen
|
12 | ror temp1
|
13 | asr temp2
|
14 | ror temp1
|
15 | mov Wert1, temp1
|
16 |
|
17 | putChar:
|
18 | sbis UCSRA, 5 ;gebe die Daten aus
|
19 | rjmp putChar
|
20 | out UDR, Wert1
|
21 |
|
22 | ldi EK, 0b00000001 ;initialisiere C1
|
23 | out ADMUX, EK
|
24 | sbi ADCSRA, 6 ;starte nächste Messung
|
25 |
|
26 | pop temp2 ;schreibe die Temps zurück
|
27 | pop temp1
|
28 | reti ;und zurück ins Hauptprogramm
|
29 | ;------------------------------------------------------------------
|
30 | onWert2: ;aufnehmen von Wert2
|
31 | push temp1 ;rette die Temps
|
32 | push temp2
|
33 |
|
34 | in temp1, ADCL ;lese den Wert2 aus
|
35 | in temp2, ADCH
|
36 | ;-----------------------
|
37 | asr temp2 ;Die 8 MSB auslesen
|
38 | ror temp1
|
39 | asr temp2
|
40 | ror temp1
|
41 |
|
42 | mov Wert2, temp1
|
43 | ;-----------------------
|
44 | putChar1:
|
45 | sbis UCSRA, 5
|
46 | rjmp putChar1
|
47 | out UDR, Wert2
|
48 |
|
49 | ldi EK, 0b00000000 ;wechsel zu C0
|
50 | out ADMUX, EK
|
51 | sbi ADCSRA, 6 ;nächste Konvertierung
|
52 |
|
53 | pop temp2 ;schreibe die Temps zurück
|
54 | pop temp1
|
55 |
|
56 | reti
|
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^^