www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ADC-Werte falsch nur im Watchdog-Interrupt


Autor: Lee (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
folgende Situation habe ich.

1. Ich versetze meinen ATMEGA168 in den Standby-Mode.
2. Der MCU wacht durch den Watchdog-Interrupt auf.
3. In der ISR(WDT_vect) rufe ich eine Funktion read_adc() zur 
Spannungsmessung. Und die Werte der Messung stimmen nicht.

Mit der gleichen Funktion read_adc() bekomme ich aber im Programm 
außerhalb der WDT-ISR richtige Messwerte.

Kann jemand mir bitte helfen?

Danke für Eure Antworten
Lee

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alle Werte oder nur der erste nach dem Aufwachen?

Autor: Lee (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der erste Wert ist fast immer falsch. Ansonstens wie geschrieben, alle 
Werte in der ISR stimmen nicht, eher zu niedrig. Denn ich will mit der 
Messung Spannungen auswerten. Wenn sie unter 11,7V liegen, sollen es 
piepsen. Aber im Interrupt piepst es immer noch bei Spannungen unter 
11,95 V.

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der erste Wert ist immer falsch, da hier der ADC initialisiert wird. 
Warte den ersten Wert ab, verwirf ihn und lass den ADC noch einmal 
messen.

Autor: Lee (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So sieht die Funktion read_adc aus:
uint16_t read_adc(uint8_t adc_source)
{
  uint16_t adc_result; 
  uint8_t count;
  cli();  // stoppe alle ISR
  

  ADCSRA |= (0 << ADPS2) | (1 << ADPS1) | (0 << ADPS0); // 1MHz sysclk -> ADC-clk = 125 kHz

  // Referenzspannung
  ADMUX |= ADC_VREF_TYPE; // Internal 1.1V Voltage Reference with external capacitor at AREF pin

  // Quelle
  ADMUX |= adc_source;

  // ADC aktivieren
  ADCSRA |= (1 << ADEN);
              
  // AD-Umwandlung starten
  // dummy readout 5 mal!

  for( count = 0; count < 5; count++ )
  {

    ADCSRA |= (1<<ADSC);      // eine Wandlung "single conversion"

    while ( ADCSRA & (1<<ADSC) );  // auf Abschluss der Konvertierung warten

    adc_result = ADCW;        
  }                  
                    
  ADMUX = adc_source | ADC_VREF_TYPE;

  // Jetzt startet die eigentliche Messung
  adc_result = 0; 
  for( count = 0; count < 8; count++ )
  {
    ADCSRA |= (1<<ADSC);            // eine Wandlung "single conversion"
    while ( ADCSRA & (1<<ADSC) ) ;  // auf Abschluss der Konvertierung warten
    adc_result += ADCW;          // Wandlungsergebnisse aufaddieren
  }
  ADCSRA &= ~(1<<ADEN);               // ADC deaktivieren 
 
  adc_result = adc_result >> 3;  
  
  sei();  // setzte alle ISR fort
  return adc_result;
}

Autor: Lee (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe
 ADMUX = adc_source | ADC_VREF_TYPE;
einmal zu viel. Habe die Zeile gelöscht aber es ändert sich nicht an den 
Ergebnissen.

Autor: Lee (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
  ADCSRA |= (0 << ADPS2) | (1 << ADPS1) | (0 << ADPS0); // 1MHz sysclk -> ADC-clk = 125 kHz

wird auf
  ADCSRA |= (0 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); // 1MHz sysclk -> ADC-clk = 125 kHz

korrigiert, also Frequenzteilerfaktor = 8.
Sorry, war mein Fehler beim Kopieren.

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>(0 << ADPS2)

Das kannst du dir auch sparen...
Guck die mal den Artikel zur Bitmanipulation an.

Autor: Lee (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, aber ich will es für mich ein bisschen deutlicher machen.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.