Forum: Mikrocontroller und Digitale Elektronik ATMega8: AD-Wandlung wird nicht fertig


von Wolfgang M. (avvf)


Lesenswert?

Hallo,
wo ist in meinem Code ein Fehler? Denn ich habe das Problem, dass die 
AD-Wandlung nicht abschließt, er also im Code in der While-Schleife 
hängen bleibt.
Die Hardware sollte stimmen -> AGND, AREF, AVCC sind correct 
angeschlossen.
1
int main(void)
2
{
3
  uint16_t temp;
4
  char text[40];
5
  
6
  uart_Init();
7
  
8
    ADMUX = 0x00;  //ex reference, no channel selected
9
    ADCSRA = 0xA7;  //0b1010 0111, division factor: 128, free running
10
    ADMUX |= ((1<<MUX0)|(1<<MUX1));
11
    ADMUX &= ~(1<<ADLAR);
12
    
13
    uart_puts("STARTED\n");
14
    while(1)
15
    {
16
         
17
         ADCSRA |= (1<<ADSC);
18
         while(ADCSRA & (1<<ADSC))
19
           ;
20
21
         temp = ADCW;
22
    sprintf(text,"ADC: %d\n",temp);
23
    uart_puts(text);
24
    _delay_ms(100);
25
    }
26
}

Vielen Dank!

von Uwe (de0508)


Lesenswert?

Hallo,

Bei der Anweisung
1
ADCSRA = 0xA7;
 sollte man immer die Bitnamen verwenden, dass beugt Fehler vor.

Wenn
1
(ADCSRA.ADFR == 1)
 ist, dann muss man auch nur einmalig den ADC-Vorgang "anstoßen".
Dies geht mit
1
ADCSRA.ADSC = 1;
 oder ähnlich in deiner Implementierung.

Wie schnell läuft deine CPU ?
Der ADC-Takt hat auch bestimmte Grenzen, diese stehen im Datenblatt.
1
ADMUX.ADLAR = 0;
 könnte man sich sparen, da dies der Initwert des Registers ADMUX, bzw. 
des Bits ADLAR ist.

: Bearbeitet durch User
von Wolfgang M. (avvf)


Lesenswert?

> Wenn ADCSRA.ADFR = 1;, dann muss man auch nur einmalig den ADC-Vorgang
> "anstoßen".
> Also ADCSRA.ADSC = 1;

Das war der Fehler, vielen Dank!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.