seven7 2 21 апреля, 2008 Опубликовано 21 апреля, 2008 · Жалоба Для меня микроконтроллеры скорее хобби и вот столкнулся с проблемой. Задумка такая: по команде я один раз считываю значение на одном из 4 каналов. Так вот при включении питания 1 раз корректно считывается. Потом всегда выдаёт, тоже значение, что по этому же каналу, что по другим. Т.е. ощущение что АЦП не запускается больше. В режиме debugWIRE все работает! Я в растеренности. Вот такой код у меня: static volatile unsigned char newDataReady; //!< ADC ready flag static volatile unsigned char ADCchannel; //!< ADC channel selection static volatile unsigned char ADCLresult; //!< static volatile unsigned char ADCHresult; //!< ISR (ADC_vect) { newDataReady = TRUE; } void initADC ( void ) { ADMUX |= (1<<REFS0);// AVcc with external capacitor on AREF pin ADCSRA |= (1<<ADPS2); //Use prescale factor 128 -> ADC clock is 62.5 kHz ADCSRA |= (1<<ADPS1); //Use prescale factor 128 -> ADC clock is 62.5 kHz ADCSRA |= (1<<ADPS0); //Use prescale factor 128 -> ADC clock is 62.5 kHz ADCSRA |= (1<<ADIE); // Enable ADC interrupt } void getADCresult( void ) { newDataReady = FALSE; ADMUX = (ADMUX & 0xF0) | ADCchannel; // Select ADC channel ADCSRA |= (1<<ADEN); // Enable ADC _delay_ms(1); sei(); ADCSRA |= (1<<ADSC); // Start conversion while (newDataReady == FALSE) {;} // wait ADC result ready ADCHresult = ADCH; ADCLresult = ADCL; ADCSRA &= ~(1<<ADEN); // Disable ADC } int main (void) { initADC(); // stuff ........... else if (byte1 == CMD_VOLT_READ) { initADC(); ADCchannel = volt_channel; getADCresult(); putChar_ext(byte2); _delay_ms(2); putChar_ext(ADCHresult); } else if (byte1 == CMD_VOLT_LREAD) { putChar_ext(byte2); _delay_ms(2); putChar_ext(ADCLresult); } else if (byte1 == CMD_CAL_READ) { initADC(); ADCchannel = calibration_channel; getADCresult(); putChar_ext(byte2); _delay_ms(2); putChar_ext(ADCHresult); } else if (byte1 == CMD_CAL_LREAD) { putChar_ext(byte2); _delay_ms(2); putChar_ext(ADCLresult); } // stuff ............... } Буду признателен за подсказки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
defunct 0 21 апреля, 2008 Опубликовано 21 апреля, 2008 · Жалоба А если не переключая канала и не отключая АЦП запустить и прочитать АЦП еще раз? Если эффект будет нулевой, то предположу что у вас одно из двух: 1. Завышена тактовая АЦП. 2. Высокое сопротивление источника сигнала. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться