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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.