Herbert Huber schrieb:
> ADCSRA |= (1<<ADEN)|(1<<ADATE)| // Enable ADC, Enable auto
> Triggering
vergiss den Autotrigger.
Du weißt sonst nie, ob dein Umsetzen des MUX-Registers bei nächsten
Wandlungsergebnis schon erfolgt ist oder nicht. Denn der Zeitpunkt, ab
dem das Wandlungsergebnis korrekt dem ADC-Kanal zugeordnet werden kann,
hängt davon ab, ob zum Zeitpunkt der Bit-Setzens bereits eine Wandlung
im Gange ist oder nicht. Das kannst du aber nicht brauchen.
Lass den Autotrigger weg und starte jede Messung einzeln nachdem du die
MUX Bits korrekt gesetzt hast.
1 | int main()
|
2 | {
|
3 | pwm_init();
|
4 |
|
5 | ADMUX |= (1<<REFS0);
|
6 | ADCSRA |= (1<<ADEN)|
|
7 | (1<<ADPS1)|(1<<ADPS0)|(1<<ADSC);
|
8 |
|
9 | while( 1 )
|
10 | {
|
11 | // Servo 1
|
12 | ADMUX = ADMUX & ~0x03 | 0; // Kanal 0 aktivieren
|
13 | ADCSRA |= (1<<ADSC); // Wandlung starten
|
14 | while((ADCSRA&(1<<ADSC))) // aufs Ergebnis warten
|
15 | ;
|
16 | OCR1A = ADC*2 + 1000; // und setzen
|
17 |
|
18 | // Servo 2
|
19 | ADMUX = ADMUX & ~0x03 | 1; // Kanal 1 aktivieren
|
20 | ADCSRA |= (1<<ADSC); // Wandlung starten
|
21 | while((ADCSRA&(1<<ADSC))) // aufs Ergebnis warten
|
22 | ;
|
23 | OCR1B = ADC*2 + 1000; // und setzen
|
24 | }
|
25 | }
|
Die ganze ADC Abfragerei könntest du sinnvollerweise noch in eine
Funktion auslagern, so das deine Hauptschleife abmagert zu
1 | while( 1 )
|
2 | {
|
3 | // Servo 1
|
4 | OCR1A = ADC_Read( 0 ) * 2 + 1000;
|
5 |
|
6 | // Servo 2
|
7 | OCR1B = ADC_Read( 1 ) * 2 + 1000;
|
8 | }
|
9 | }
|
Und beachte: Die ADC Wandlung ist im Gange, SOLANGE das ADSC Bit gesetzt
ist! Die Logik ist ganz einfach: Du setzt das Bit um die Wandlung zu
starten und der ADC löscht es wieder wenn er fertig ist. Solange es also
auf 1 ist, ist das Ergebnis noch NICHT fertig und du musst warten.