Yes, I know just another entry with ADC but I did not find a hint for my problem in the forum yet. I have a Problem reading an adc value with ATMega328P in noise reduction mode ( with a Interrupt Service routine ). Because reading per polling the ADSC Bit is OK, I get the right value that way, I suppose the error has to do with the initialization of ADC in my function EnableADCInt(... ). The ISR is definitely not called ! adcValue in ISR is volatile in my header. Where is the missing bit ? By the way: This forum is very helpful for me. I found already many important hints. Here the code: void EnableADCInt(uint8_t channel) { // Clear PRADC to startup ADC PRR &= ~(1<<PRADC); // Power Reduction Register ADMUX = 0; ADMUX |= (1 << REFS1) | (1 << REFS0); ADMUX |= channel; ADCSRA = ( 1 << ADPS2) | ( 0 << ADPS1) | ( 1 << ADPS0) ; // Für Interrupt bei Free Running ? // ADCSRA |= ( 1 << ADATE); // Free running mode !? // ADCSRB = 0; // sleep Mode set_sleep_mode(SLEEP_MODE_ADC); // Bit 3 – ADIE: ADC Interrupt Enable // Bit 7 – ADEN: ADC Enable // Bit 6 – ADSC: ADC Start Conversion but not for noise reduction ? ADCSRA |= (1 << ADEN) | (1 << ADIE); // enable Global Int sei(); } void DisableADCInt() { // disable ADC Int // Bit 3 – ADIE: ADC Interrupt Disable // Bit 7 – ADEN: ADC Disable // Bit 6 – ADSC: ADC Stop Conversion ADCSRA = 0; PRR |= (1<<PRADC); } // Oversampling to improve the value int16_t GetADCTemp(uint8_t channel) { EnableADCInt(channel); sleep_cpu(); // throw away first reading adcCount=0; adcValue=0; while( adcCount < 64 ) { adcCount++; sleep_cpu(); } DisableADCInt(); int16_t ticksresult = (adcValue >> 6); return ticksresult; } ISR(ADC_vect) { adcValue = ADC; // low + high byte }
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.