- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 6 von 6

Thema: ATmega8: ADC geht nicht

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    17.11.2004
    Beiträge
    33

    ATmega8: ADC geht nicht

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Guten Abend allerseits

    Nach langer Fehlersuche weis ich noch immer nicht, warum der AD-Wandler meinesATmega8 nicht geht ...

    Ich habs jetzt mal gekürzt soweit wie möglich. Das Problem ist, dass die while-Schleife while(ADCSRA & (1 << ADSC)) nie verlassen wird.

    Was mache ich falsch???

    MfG
    - C. Lechner

    Code:
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <avr/signal.h>
    #include <inttypes.h>
    
    int main(void)
    {
            uint8_t x;
    
            DDRD = 0xff;
    
            ADMUX = 0x40;
            ADCSRA = (1 << ADEN) | 0x07;
            while(1)
            {
                    ADCSRA |= (1 << ADSC);
                    while(ADCSRA & (1 << ADSC));
    
                    x++;
                    if (x & 0x01)
                            PORTD = 0x00;
                    else
                            PORTD = 0xff;
            }
    
            return(0);
    }

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.02.2005
    Ort
    Hamburg
    Alter
    37
    Beiträge
    4.255
    das datenblatt sagt dazu:
    A single conversion is started by writing a logical one to the ADC Start Conversion bit,
    ADSC. This bit stays high as long as the conversion is in progress and will be cleared by
    hardware when the conversion is completed.
    du setzt also adsc, und wartest dann in der while schleife bis es wieder zurückgesetzt wird, also die ad-wandlung fertig ist, richtig?

    demnach wird der adc nie fertig...
    ist überhaupt alles richtig angeschlossen? denn der adc hat ja ne eigene stromversorgung. AVcc und AGnd... und ARef die referenzspannung...
    wenn das nicht der fall ist kannst du natürlich lange warten...

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    17.11.2004
    Beiträge
    33
    Zitat Zitat von uwegw
    das datenblatt sagt dazu:
    A single conversion is started by writing a logical one to the ADC Start Conversion bit,
    ADSC. This bit stays high as long as the conversion is in progress and will be cleared by
    hardware when the conversion is completed.
    du setzt also adsc, und wartest dann in der while schleife bis es wieder zurückgesetzt wird, also die ad-wandlung fertig ist, richtig?

    demnach wird der adc nie fertig...
    Genau, ich warte auf ebendieses zurücksetzen vom Bit ADSC. Eigentlich ganz einfach, aber die Probs stecken wie immer mal wieder im Detail.

    Wenn ich den Code für den ATmega16 kompiliere und den Simulator auf ATmega16 umstelle, dann läuft er ordentlich.
    Kompiliere ich hingegen für ATmega8 und stelle den Simulator auf ATmega8, dann wird er eben nie fertig ...

    ist überhaupt alles richtig angeschlossen? denn der adc hat ja ne eigene stromversorgung. AVcc und AGnd... und ARef die referenzspannung...
    wenn das nicht der fall ist kannst du natürlich lange warten...
    Keine Sorge, in diese Falle bin ich (zum Glück) nicht getappt. Es reicht ja so schon.

    BTW: Gibt es im Internet irgendwo einen Code, der den AD-Wandler vom ATmega8 im Polling-Modus steuert und der bei Euch auch funktioniert??? Mit google findet man zwar viel, aber das meiste sieht wie mein Code aus und der funktioniert ja nicht.

    MfG
    - cl

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    02.12.2004
    Ort
    München
    Alter
    50
    Beiträge
    198
    Zitat Zitat von cl
    BTW: Gibt es im Internet irgendwo einen Code, der den AD-Wandler vom ATmega8 im Polling-Modus steuert und der bei Euch auch funktioniert??? Mit google findet man zwar viel, aber das meiste sieht wie mein Code aus und der funktioniert ja nicht.
    - cl
    Im ASURO läuft folgendes:

    Bei der Initialisierung:
    #define IR_LEFT (1 << MUX0) | (1 << MUX1) //ADC3

    // A/D Conversion
    ADCSRA = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1); // clk/64

    und zum Auslesen:
    ADMUX = (1 << REFS0) | IR_LEFT; // AVCC reference with external capacitor
    ADCSRA |= (1 << ADSC); // Start conversion
    while (!(ADCSRA & (1 << ADIF))); // wait for conversion complete
    ADCSRA |= (1 << ADIF); // clear ADCIF
    data[0] = ADCL + (ADCH << ;

    Das hat schon ein paar hundert Mal funktioniert!

    Hoffe,das hilft!

    CU, Robin

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    17.11.2004
    Beiträge
    33
    Futzt leider auch nicht. Ich ziehe mir mal das neueste AVRStudio. Vielleicht hat das einfach nur einen Bug ...

    Jetzt habe ich Version 4.10 Build 356.

    Mal sehen, ob das neue besser geht!!!

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    17.11.2004
    Beiträge
    33
    Zitat Zitat von cl
    Mal sehen, ob das neue besser geht!!!
    Mit dem neuen AVRStudio (Build 410) geht's besser.

    Auch mein alter Code geht jetzt *gruebel*.

    Jetzt teste ich es noch in Hardware!

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress