Hallo,
Ich habe eine Merkwürdigkeit mit dem ADC des ATtiny861:
Ich initialisiere den ADC im free running mode und aktiviere den
interrupt und möchte den ADC wert im interrupt auslesen.
Das Problem dabei ist, das er nur ein einziges mal eine Wandlung
durchführt. Diese ist zwar korrekt, aber er wandelt nicht kontinuierlich
weiter.
hier mal meine Initialisierungsfunktion:
1 | void adc_init(void)
|
2 | {
|
3 | ADMUX = FADER_PIN; // select channel
|
4 | // VCC as reference voltage
|
5 | ADCSRA = (1<<ADIE); // enable interrupt
|
6 | ADCSRA |= (1<<ADPS2) | (1<<ADPS1); // frequency devider of 64 (8Mhz/64 = 125Khz)
|
7 | ADCSRA |= (1<<ADEN); // enable adc
|
8 | ADCSRA |= (1<<ADSC); // start converting
|
9 | }
|
und meine ISR:
1 | ISR(ADC_vect)
|
2 | {
|
3 | out.bit.adc = ADCW;
|
4 | }
|
mein derzeitiges workaround ist es den wandlungsvorgang in der ISR mit
nocheinmal zu starten. Das geht auch soweit, ist aber irgendwie ja nicht
der Sinn der Sache.
Mir sieht das ganz danach aus, als läuft der ADC im single conversion
mode.
Im Datenblatt steht aber eindeutig:
ADCSRB
ADTS2 = 0; ADTS1 = 0; ADTS0 = 0; =>Free Running mode
Also setze ich keines der Bits.
Hat jemand eine Idee?
(ich hab jetzt nicht den ganzen code angehängt, da das auslesen an sich
ja geht, und ich sonst nirgents was an den ADC registern rumfummle)