Hallo,
Beim Umstieg vom Easy-Mode Arduino auf avr-gcc bin ich auf ein Problem
beim ADC lesen gestossen. Es scheint als wueder der ADC haengen bleiben.
Die erste Wandlung nach einem Reset ist korrekt, aber alle weiteren
geben immer den selben Wert zurück wenn man den Eingang verändert.
Nach einem Reset wird wieder einmal richtig gewandelt, und dann hängts.
Ist auf einem ATMEGA32 der mit 16MHz betrieben wird. AVCC ist auf VCC
(+5V), Kondensator von AREF auf GND. Um AVCC als Referenz zu nutzen muss
laut Datenblatt REFS0 auf 1 sein und REFS1 auf 0.
Mein ADC Code sieht wie folgt aus:
1 | void main(){
|
2 | ADCSRA = (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0) | (1<<ADEN); //prescaler 128
|
3 | ADMUX = (1<<REFS0); //AVCC, channel 0
|
4 | _delay_ms(10); //nicht notwendig
|
5 | while(1){
|
6 | ADCSRA |= (1<<ADSC);
|
7 | while(!(ADCSRA & (1<<ADIF)));
|
8 | UARTSend(ADCH);
|
9 | UARTSend(ADCL);
|
10 | ADCSRA |= (1<<ADIF); //Interruptflag loeschen
|
11 | _delay_ms(500);
|
12 | }
|
13 | }
|
Soweit ich das richtig verstanden habe wird ADIF gesetzt wenn die
Wandlung abgeschlossen ist bzw. neue Daten in ADCH/L sind. Man loescht
es wieder indem man es auf 1 setzt. Der ADC sollte dann wieder eine neue
Wandlung nach dem Setzen von ADSC durchfuehren koennen.
Ich nehme an dass ich etwas grundsaetzlich falsch verstanden habe und
bin sehr dankbar ueber jeden Hinweis dazu was das wohl sein koennte.