- Labornetzteil AliExpress         
Ergebnis 1 bis 4 von 4

Thema: Adc initialisieren beim Atmega 16

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    08.06.2009
    Beiträge
    41

    Adc initialisieren beim Atmega 16

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo,
    ich versuche schon seit 2 Tagen den Adc beim Atmega 16 in Gang zu bekommen. Leider erfolglos. Beim Atmega8 hatte ich keine Probleme.
    Könnte mal jemand auf meinen Code schauen und mir sagen, ob das so ok ist? Der Adc soll in der free running Variante laufen.


    void adc_init (void)
    {
    ADCSRA = (1<<ADEN) |(1<<ADSC) | (1<<ADATE) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0); // prescaler = 128
    ADMUX = (1<<REFS1) | (1<<REFS0) | (1<<MUX0); // interne Referenzspannung
    ADMUX &= ~(1<<ADLAR);
    SFIOR &= ~((1<<ADTS2) | (1<<ADTS1) | (1<<ADTS0));
    messwert = ADCL;
    messwert |= (ADCH<<8 );
    messwert = 0;
    }

    "messwert" ist einer Headerdatei folgendermaßen deklariert:
    uint16_t messwert; // Messwert ADC


    Wäre toll, wenn ihr mir weiter helfen könntet.

    MfG
    Destrono

  2. #2
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    Mit dem gesamten Code könnte man es einfach mal testen.
    Du verwendest ADC1 und keinen Interrupt, mehr sieht man daraus nicht.
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    08.06.2009
    Beiträge
    41
    Hallo,
    der Code besteht aus mehreren Teilen.
    Gestern habe ich den Kontroller noch mit 2.8 Volt gespeist, weil mein Display, das noch mit angesteuert wird, nicht mehr abkann.
    Kann es sein, dass ich den Kontroller kaputt gemacht habe, wenn am Aref bei den 2.8 Volt Eingangsspannung nur 2.05 Volt anlagen, ich dem Kontroller aber am Adc1 2.5 Volt zugeführt habe?
    Heute habe ich das ganze noch mal bei 5Volt Eingangsspannung und ohne Display probiert und auch hier zeigt der Kontroller ein sehr komisches Verhalten.
    Bezogen auf den Adc habe ich folgenden Code:
    Adc.c:

    void einlesen (void){

    messwert = ADCL;
    messwert |= (ADCH<<8 );



    }
    void adc_init (void)
    {
    ADCSRA = (1<<ADEN) |(1<<ADSC) | (1<<ADATE) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0); // free running prescaler = 128
    ADMUX = (1<<REFS1) | (1<<REFS0) | (1<<MUX0); // interne Referenzspannung, Mux0 = Pin ADC0 Mit diesem Register wird der zu messende Kanal ausgewählt.
    ADMUX &= ~(1<<ADLAR);
    SFIOR &= ~((1<<ADTS2) | (1<<ADTS1) | (1<<ADTS0));
    messwert = ADCL;// einmalige Messung
    messwert |= (ADCH<<8 );
    messwert = 0;
    }



    in der while Schleife der main Funktion wird dann Folgendes aufgerufen:
    if (messwert >= 500){
    PORTC ^= (1<< PC7);} // Led an PC7
    einlesen ();




    mehr ist es im Grunde nicht.
    Beim Atmega 8 hat alles wunderbar funktioniert.
    Könntet ihr bitte noch mal einen Blick auf den Code werfen, denn ich sitze jetzt schon den 3 Tag an dem Teil und bin echt ratlos.

    MfG
    Destrono

  4. #4
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    Zum ersten du hast nicht ADC0 sondern ADC1 ausgewählt.
    Dann fehlt noch die ADC-Abfrage, woher weisst du das die Conversion komplett ist?
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

Berechtigungen

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

Labornetzteil AliExpress