Зависает АЦП

Обсуждаем контроллеры компании Atmel.
Ответить
Родился
Сообщения: 7
Зарегистрирован: Вс май 09, 2010 22:28:45

Сообщение y2056 »

Всем доброго времени суток. Прошу помощи опытных спецов по AVR. Проблема в следующем мне надо оцифровывать два входных синусоидальных сигнала, примерно 2048 выборок ну можно немного и другое число но два сигнала одновременно. Ацп настроил как надо в режиме автоматической работы и генерации прерывания. По одиночке каждый канал работает отлично все расчеты все выполняется но когда я пытаюсь переключиться с 0 входа АЦП на 1, АЦП перестает генерировать прерывание перепробовал все даже специально настроил 13 вывод ардуинки чтоб мигал светодиод когда попадаем в прерывание. он не мигает. В чем может быть проблема. И второй вопрос если при автоматической работе АЦП после генерации прерывания что преобразование завершено изменить вход АЦП, то после следующего преобразования какие значения будут в регистрах результата АЦП. Значение предыдущего входа так как преобразование уже перезапущено автоматически или нового входа. Заранее благодарен за ответы.
Реклама
Родился
Сообщения: 7
Зарегистрирован: Вс май 09, 2010 22:28:45

Сообщение y2056 »

Приметно так. Что закоментировано это разные варианты что я пробовал как раз с переключениями входов Пишу на ардуино.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));
}

}
}
Реклама
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1315
Зарегистрирован: Пт ноя 27, 2009 19:47:13
Откуда: Казань

Сообщение НАПАЛМ »

Попробуйте такой алгоритм:
- переключение на канал 0
- запуск одиночного преобразования
- переключение на канал 1 после выполнения одиночного преобразования
- запуск одиночного преобразования
- переключение на канал 0 после выполнения одиночного преобразования
Родился
Сообщения: 7
Зарегистрирован: Вс май 09, 2010 22:28:45

Сообщение y2056 »

Так то я понял но хотелось на автомате тем более аппаратные средства позволяют.
Реклама
Эиком - электронные компоненты и радиодетали
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Вы же обработчике прерывания сами отключаете АЦП. Зачем Вы изменяете регистр ADCSRA?
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 6337
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

Хоть давно на С не писал, но вот этот оператор кажется подозрительным :

Код: Выделить всё

if( ( UCSR0A & (1<<UDRE0)) )
Возможно, имелось в виду :

Код: Выделить всё

if( ( UCSR0A && (1<<UDRE0)) )
Изображение
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Вы Jack_A неправы, как раз предложенная Вами конструкция работать не будет.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Друг Кота
Аватара пользователя
Сообщения: 6337
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

Может быть. Давно на Си не писал, а для АВР - вообще никогда.
Изображение
YS
Друг Кота
Аватара пользователя
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05

Сообщение YS »

этот оператор кажется подозрительным
Все нормально, это проверка бита.

if (UCSR0A & (1<<UDRE0)) - если в UCSR0A стоит бит UDRE0, то результат побитового И будет ненулевым (что в классическом Си интерпретируется как true), и if сработает. Если интересующий бит нулевой, то результатом побитового И будет ноль, что интерпретируется как false.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Контактная информация:
Ответить

Вернуться в «AVR»