Forum: Mikrocontroller und Digitale Elektronik Reset bei ADC Wandlung atmega8


von Florian (Gast)


Lesenswert?

hallo,

ich habe hier ein seltsames Problem. Den adc initialisiere ich mit 
folgendem code

void init_adc()
{
  ADMUX   = 0x00;  // externe Spannungsreferenz und Kanal 0 selektiert
  ADCSRA  = _BV(ADPS0)|_BV(ADPS2);  // Takt = XTAL/32 == 125kHz
  ADCSRA |= _BV(ADEN);      // ADC einschalten
  ADCSRA |= _BV(ADSC);      // eine Wandlung durchführen
  while(ADCSRA & _BV(ADSC));    // warte auf ende der Wandlung
  adc_kanal=0;
  ADCSRA |= _BV(ADIE);      // Interrupte einschalten
  ADCSRA |= _BV(ADFR);            // free running mode
  //adc_ergebnis[7] = 500;
}

Ohne Interrupte und ohne adfr funktioniert das auch ganz gut
aber im free running mode mit isr hängt er sich auf und resettet

SIGNAL(SIG_ADC) //interrupte sind in ISR automatisch ausgeschaltet
{
  adc_kanal = (ADMUX<<4);                   //hole "nur" die mux 
Einstellung zum weiterverarbeiten
  adc_kanal = (adc_kanal>>4);        //e.g. adc_kanal 0...7

  adc_ergebnis[adc_kanal]= ADCL;// erst ADCL dann ADCH um 
sicherzustellen
                                //das Werte aus einer Wandlung stammen
  adc_ergebnis[adc_kanal]  += (ADCH<<8);

  if(adc_kanal!=1)         // Einstellung für die Übernächste Wandlung
    adc_kanal++;
  else    // ADC4 u. ADC5 nicht konvertieren
    adc_kanal+=2;

  if(adc_kanal==4)
    adc_kanal=0;      //ca. 100 Zyklen seit der Interrup ausgelöst wurde
                //wir können also den mux neu muxen
  ADMUX = adc_kanal;
  adc_ergebnis[7] = 500;
}

für Hilfe bei diesem Fehler wäre ich echt dankbar
und wünsche euch ein frohe Fest
Florian

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.