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.