Gast
#463599
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