Зависает АЦП
- Сообщения: 7
- Зарегистрирован: Вс май 09, 2010 22:28:45
Всем доброго времени суток. Прошу помощи опытных спецов по AVR. Проблема в следующем мне надо оцифровывать два входных синусоидальных сигнала, примерно 2048 выборок ну можно немного и другое число но два сигнала одновременно. Ацп настроил как надо в режиме автоматической работы и генерации прерывания. По одиночке каждый канал работает отлично все расчеты все выполняется но когда я пытаюсь переключиться с 0 входа АЦП на 1, АЦП перестает генерировать прерывание перепробовал все даже специально настроил 13 вывод ардуинки чтоб мигал светодиод когда попадаем в прерывание. он не мигает. В чем может быть проблема. И второй вопрос если при автоматической работе АЦП после генерации прерывания что преобразование завершено изменить вход АЦП, то после следующего преобразования какие значения будут в регистрах результата АЦП. Значение предыдущего входа так как преобразование уже перезапущено автоматически или нового входа. Заранее благодарен за ответы.
- Реклама
- Сообщения: 7
- Зарегистрирован: Вс май 09, 2010 22:28:45
Приметно так. Что закоментировано это разные варианты что я пробовал как раз с переключениями входов Пишу на ардуино.ISR(ADC_vect){
//// if (ADMUX == 0x40){ ADMUX = 0x41;
// ADCSRA = (1 << ADIF) |(1 << ADSC);
//}
// else {
// ADMUX = 0x40;
// ADCSRA = (1 << ADIF) | (1 << ADSC);
// }
if( ( UCSR0A & (1<<UDRE0)) ){
umoment = ADCL;//copy result.
umoment += (ADCH<<8);
...................
расчеты
...................
N++;
if (N == 4095){
...................
расчеты
...................
digitalWrite(13, !digitalRead(13));
}
}
}
Код: Выделить всё
//// if (ADMUX == 0x40){ ADMUX = 0x41;
// ADCSRA = (1 << ADIF) |(1 << ADSC);
//}
// else {
// ADMUX = 0x40;
// ADCSRA = (1 << ADIF) | (1 << ADSC);
// }
if( ( UCSR0A & (1<<UDRE0)) ){
umoment = ADCL;//copy result.
umoment += (ADCH<<8);
...................
расчеты
...................
N++;
if (N == 4095){
...................
расчеты
...................
digitalWrite(13, !digitalRead(13));
}
}
}
Попробуйте такой алгоритм:
- переключение на канал 0
- запуск одиночного преобразования
- переключение на канал 1 после выполнения одиночного преобразования
- запуск одиночного преобразования
- переключение на канал 0 после выполнения одиночного преобразования
- переключение на канал 0
- запуск одиночного преобразования
- переключение на канал 1 после выполнения одиночного преобразования
- запуск одиночного преобразования
- переключение на канал 0 после выполнения одиночного преобразования
- Сообщения: 7
- Зарегистрирован: Вс май 09, 2010 22:28:45
Вы же обработчике прерывания сами отключаете АЦП. Зачем Вы изменяете регистр ADCSRA?
- Реклама
Хоть давно на С не писал, но вот этот оператор кажется подозрительным :
Возможно, имелось в виду :
Код: Выделить всё
if( ( UCSR0A & (1<<UDRE0)) )Код: Выделить всё
if( ( UCSR0A && (1<<UDRE0)) )Вы Jack_A неправы, как раз предложенная Вами конструкция работать не будет.
- Сообщения: 7518
- Зарегистрирован: Вс мар 29, 2009 22:09:05
Все нормально, это проверка бита.этот оператор кажется подозрительным
if (UCSR0A & (1<<UDRE0)) - если в UCSR0A стоит бит UDRE0, то результат побитового И будет ненулевым (что в классическом Си интерпретируется как true), и if сработает. Если интересующий бит нулевой, то результатом побитового И будет ноль, что интерпретируется как false.
Разница между теорией и практикой на практике гораздо больше, чем в теории.




