реклама на сайте
подробности

 
 
> нужна помощь с АЦП в АТмеге48
seven7
сообщение Apr 21 2008, 13:53
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 33
Регистрация: 13-07-06
Пользователь №: 18 795



Для меня микроконтроллеры скорее хобби и вот столкнулся с проблемой.
Задумка такая: по команде я один раз считываю значение на одном из 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 ...............
}

Буду признателен за подсказки.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 21:41
Рейтинг@Mail.ru


Страница сгенерированна за 0.0133 секунд с 7
ELECTRONIX ©2004-2016