www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ADC: Kanalumschaltung reisst AVR aus dem Konzept


Autor: Mario M. (muraer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallihallo zusammen,

ich habe ein Problem mit meinem AVR; genauer: dessen ADC. Es handelt 
sich um einen ATMega644, an 20MHz. Programmiert in C unter WinAVR 
20090313.

Der ADC wird wie folgt initialisiert:
ADMUX |= (1<<REFS0); //AREF = AVCC
ADMUX |= ((1<<MUX1) | (1<<MUX2) | (1<<MUX3) | (1<<MUX4)); //select internal Bandgap-reference as input
  
//ADC enable; ADCstart; ADC free running; Samplefreq = 156kHz, no interrupt
ADCSRA |= ((1<<ADEN) | (1<<ADSC) | (1<<ADATE) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0)); 

Das funktioniert soweit tiptop. Der ADC läuft und misst brav seine 
Bandgap-Referenz.

Nun muss ich aber eine Messung auf einem anderen Kanal machen. Dazu 
wechsle ich den Kanal. Der Folgende Code zeigt den Kanalwechsel mit der 
Messung (8 Messungen). Danach wird wieder auf die Bandgap-Referenz als 
ADC-Eingang umgeschaltet.
ADCSRA = 0; //Disable ADC;
ADMUX &= ~((1<<MUX0) | (1<<MUX1) | (1<<MUX2) | (1<<MUX3) | (1<<MUX4));//ADC Input Channel: ADC0
ADCSRA |= ((1<<ADEN) | (1<<ADIE) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0));//start ADC; no free running, 156kHz, interrupt enabled
ADCSRA |= (1<<ADSC);//start first conversion

ADCfinish = 0;
for(uint8_t k = 0; k<8; k++)
{

    while(ADCfinish == 0){}//wait until conv.compl.Interrupt

    ADCfinish = 0;
    resulthelper = ADCL; //read out the 10-bit value.
    resulthelper = resulthelper + (ADCH<<8);
    result = result + resulthelper;
        
}

//now: switch back to bandgap-reference:
ADCSRA = 0; //Disable ADC;
ADMUX |= ((1<<MUX1) | (1<<MUX2) | (1<<MUX3) | (1<<MUX4)); //select internal Bandgap-reference as input

//ADC enable; ADCstart; ADC free running; Samplefreq = 156kHz, no interrupt
ADCSRA |= ((1<<ADEN) | (1<<ADSC) | (1<<ADATE) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0)); 

Und hier noch die Interruptroutine:
ISR(ADC_vect)
{

  ADCfinish = 1;
  ADCSRA |= (1<<ADSC); //start next conversion.
} 

Das Ganze nochmals in Kürze:
Standardmässig ist die Bandgap-Referenz ADC-Eingang, der ADC läuft free 
running und hat den conversion complete interrupt ausgeschaltet.

Es muss für 8 Messungen auf Kanal 0 umgeschaltet werden. Dazu wird der 
ADC komplett abgeschaltet, der Kanal gewechselt, und wieder 
angeschaltet, diesmal Interruptgesteuert.
Dann wird gemessen. In jeder ISR wird die nächste Messung ausgelöst.
Nach den 8 Messungen muss wieder auf die Bandgap-Referenz und free 
running umgeschaltet werden ==> ADC abschalten, Kanal wechseln, neu 
konfiguriert wieder anschalten.

Die Messwerte, welche beim Achtmaligen Messen entstehen, sind korrekt. 
Der ADC arbeitet also richtig.

ABER: Er haut mir irgendwie den Rest des AVR aus den Socken. An einem 
AVR-Pin hängt eine LED. Diese wird ganz zu beginn des AVR-Programms 
eingeschaltet und dann folgt nie mehr eine Anweisung, um diese LED 
wieder auszuschalten.
Führe ich aber die Kanalumschaltung und die 8 Messungen aus, so erlischt 
die LED! Ohne dass dafür irgendwo im Programm die Anweisung dafür stehen 
würde...Der AVR läuft jedoch weiter und tut so, als ob nichts 
wäre...Alle anderen funktionen funktionieren, nur die LED leuchtet nicht 
mehr...

Jetzt wollte ich nachfragen, ob meine Variante der ADC-Bedienung so in 
Ordnung ist. Kann sein, dass meine Methode etwas "holzig" und zu exakt 
ist, da ich jetzt schon viel probiert habe und noch keine Besserung 
eingetreten ist. Aber sollte die Methode im Prinzip funktionieren?

Autor: Thomas O. (kosmos)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
an welchen Pin hängt den die LED?

Autor: Mario M. (muraer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die LED hängt an PA5, da hängen noch ADC5 und PCINT5 mit dran...
Könnte der ADC5, welcher ja auch am ADC-Mux hängt, einen Einfluss 
haben....?! Nur welchen...?

Lg
Mario

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.