АЦП на ATmega48??

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Первый раз сказал Мяу!
Сообщения: 25
Зарегистрирован: Пн июл 05, 2010 16:51:16

Сообщение Sany81 »

Добрый день.
Необходимо выполнить АЦП с ноги PC5 МК Atmega48
Ни в какую не получается сделать.
Нужно считывать напряжение на ноге и выводить его на дисплей. Загвоздка как раз в снятии напряжения.

Если не сложно, дайте кусочек кода(СИ), касающийся именно АЦП именно для ноги PC5, или хотя бы ткните носом где почитать на русском языке про регистры:
ADMUX,ADCSRA как правильно в них проставить биты что бы АЦП зашевелился???

Делаю так:
#define ADC_VREF_TYPE 0x00

interrupt [ADC_INT] void adc_isr(void)
{
adc_data=ADCW;
ADCSRA|=0x40;
}

DIDR0=0x00;
ADMUX=5 | (ADC_VREF_TYPE & 0xff);
ADCSRA=0xCB;
ADCSRA|=0x40;

при этом прерывание вызывается всего 1 раз в самом начале старта МК. т.е. считывается напряжение с 5й ноги и на этом прерывания от АЦП прекращаются.
Подскажите что здесь не так? может я не допонимаю, но мне кажется что строка ADCSRA|=0x40; запускает новое АЦП, после этого сигнал оцифровывается и должно вызваться прерывание interrupt [ADC_INT] void adc_isr(void), в котором считываются два байта ADCL и ADCH (в моем случае считывается виртуальный ADCW) и после этого я опять даю команду на АЦП (ADCSRA|=0x40;) - и все должно повториться, но не повторяется.
Где я накосячил?
Реклама
GP1
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград

Сообщение GP1 »

Русский перевод ДШ - Евстифеев "Микроконтроллеры AVR семейства mega фирмы ATMEL" книжка есть у Светы на сайте.
Чем дальше, тем больше становлюсь занудой...
Изображение
Контактная информация:
Реклама
Первый раз сказал Мяу!
Сообщения: 25
Зарегистрирован: Пн июл 05, 2010 16:51:16

Сообщение Sany81 »

Спасибо за помощь, книжка отличная, хоть понял как с АЦП работать а не на угад тыкать биты.
Изначально код был рабочий, за исключением того что, у меня на дисплей по прерыванию от таймера0 выводились данные.
Так вот делитель на таймере был 1, сделал его 2 и о чудо, все заработало. Из за прерываний таймера 0 не отрабатывали прерывания от АЦП.
Сейчас все работает как часы, еще раз спасибо
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»