Hi. Hab schon gesucht ob es Beiträge gibt die mein Problem lösen, aber ich habe nichts gefunden auch wenn viele dasselbe Problem hatten. Ich will im Betrieb den ADC Kanal wechseln und hab im Datenblatt gelesen, man soll das ADEN Bit löschen, dann den Kanal wechseln und dann ADEN wieder setzen.
1 | ldi temp, (0<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (0<<ADPS0) |
2 | out ADCSRA, temp |
3 | ldi temp, (1<<REFS0) | (0<<REFS1) | (0<<ADLAR) | (0<<MUX0) | (1<<MUX1) | (1<<MUX2) | (0<<MUX3) | (0<<MUX4) |
4 | out ADMUX, temp |
5 | ldi temp, (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (0<<ADPS0) |
6 | out ADCSRA, temp |
Ich habe zwei Routinen, also quasi "Kanal1_auslesen" und "Kanal2_auslesen". Am Anfang jeder Routine steht der obige Codeblock und bei dem einen setze ich (1<<MUX0) und beim anderen lösche ich es mit (0<<MUX0). Die Routinen werden abwechseln aufgerufen. Beim ersten Aufruf von Routine1 wird der erste Kanal ausgelesen. Dann wird die zweite Routine aufgerufen und Kanal2 wird ausgelesen, dann wieder Routine1 und ab hier wird nur noch Kanal2 ausgelesen, statt auch Kanal1. Wo könnte da der Fehler liegen? ADC wird anschließend an den Block oben ganz schlicht über:
1 | sbi ADCSRA, ADSC |
2 | wait_adc2: |
3 | sbic ADCSRA, ADSC |
4 | rjmp wait_adc2 |
5 | |
6 | in r23, ADCH |
7 | in r22, ADCL |
ausgelesen.