Доброго времени суток, уважаемые форумчане! Опыт работы с микроконтроллерами у меня весьма мал, начал погружаться в эту тему, т.к. по работе нужно. Дошел до изучения работы с АЦП в ATMEGA 16. Сейчас у меня стоит задача - нужно сделать так, чтобы АЦП с как можно большей частотой в реальном времени оцифровывал входной сигнал и сразу же передавал его на один из портов (а дальше там уже ЦАП). Получается этакий повторитель - выходной сигнал равен входному. Программы пишу на Си в CodeVisionAVR. Вот текст программы:
// Программа для работы с встроенным АЦП микроконтроллера ATmega16. // Микроконтроллер оцифровывает входное напряжение и подает его на выход, // где подразумевается наличие ЦАП - таким образом реализуется повторение // входного сигнала на выходе.
// Используемые библиотеки: #include <mega16.h> // Начало программы void main(void) { // Настраиваем порты: DDRA = 0b00000000; // Все выводы порта А настраиваем на входы (0 - вход, 1 - выход) PORTA = 0b11111111; // Подключаем внутренние подтягивающие резисторы к выводам порта A.
DDRC=0b11111111; // Все выводы порта C настраиваем как выходы (0 - вход, 1 - выход) PORTC=0b00000000; // Обнуляем порт С до начала выполнения программы (на всякий случай)
// Настраиваем встроенный АЦП: ADCSRA = 0b11100100; // включить АЦП, запустить преобразование, непрерывный режим работы, частота считывания 750kHz (12MHz/16) ADMUX = 0b01100000; /* источник опорного напряжения - источник питания МК - 5 В, выравнивание слева (используем только 8 бит регистра ADCH), входной канал ADC0 */ SFIOR = 0b00000000;
//Основная программа while(1) { PORTC=ADCH; //вывести в порт С значение, полученное в результате считывания } }
программа не работает (но компилируется нормально)
Вопросы такие: Правильно ли я настроил АЦП? Нужно ли перед настройкой АЦП настраивать порт А как вход ( т.к. ADC0 соответствует входу PA0)? Корректна ли такая настройка АЦП без настройки прерываний и т.д.?
За любую помощь буду очень благодарен! Не судите строго - я только начинающий...
|