В наличие атмега32. С ней и экспериментирую.
Светодиодами моргать научился, сервами рулить тоже, пищать, кнопки, прерывания, таймеры.
Изучаю АЦП. И тут возникли грабли. курс 123авр читал, задачу 9 и другие тоже. В поиске сижу 2й день, безрезультатно.
Пытаюсь по мотивам сделать простую вещь:
переменный резистор на 10к. середина к PA7, края к +5в и земле.
Прога:
- Код: Выделить всё
#include <mega32.h>
int adc_complete;
unsigned char adc_data;
main() {
PORTA=0x00;DDRA=0xFF; // Настройка порта А
// Настройка АЦП
ADMUX = 0b01000111;
ADCSRA=0b10111111;
#asm("sei")
while(1)
{
adc_complete = 0;
// Старт АЦП
ADCSRA |= 0x40;
// Ждем
while(adc_complete==0);
}
}
interrupt [ADC_INT] void adc_isr() {
adc_data = ADCH;
PORTA = adc_data>>4;
adc_complete = 1;
}
Алгоритм (желаемый)
1)Настроиваем порт А и АЦП.
2)Запускаем АЦП преобразование.
3)Ждем пока оно отработает в прерывании
4)Повторяем все сначала
Внутри прерывания получаем 8-и битное значение и старшие 4 бита выводим на светодиоды, подключенные к 0-3 битам порта А.
Т.е. крутим резистором, светодиоды показывают уровень сигнала (с точностью 16 градаций)
Прога не работает. Светодиоды всегда выключены. Хотя прерывания обрабатывается. Все как бы работает, но всегда получаем 0 в результате преобразования.
Меня смущает описание битов REFS0,1 региста ADMUX. Я выбрал вариант - AVCC с внешним конденсатором на AREF.
Но к AREF у меня ничего не подключено. Может в этом ошибка? Или неправильно настроен порт А? Возможно бит 7 порта А (к которому подключен резистор) нужно настроить на вход? (я думал он сам перенастраивается в нужный режим при работе АЦП).