Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Микроконтроллеры (MCU) и микропроцессоры (MPU) > ATmega16 и его АЦП по полочкам.


Автор: tima705 29.10.2011, 11:44
Здравствуйте, уважаемые. Прошу Вас "разжевать" мне работу с АЦП на меге16. Очень хочется, а инет не дал нужной инфы.. Буду очень признателен.


Код: 
Код

#include <mega16.h>

unsigned int PARAM = 0; // Я так понимаю АЦП возвращает значение от 0 до 1023, поэтому тип переменной такой.

interrupt [ADC_INT] adc_isr()
{
PARAM = 
// Здесь не знаю, как получить занчения с регистров АЦП
};




void main(void)
{

// Вот это ОЧЕНЬ прошу разжевать..

ADCSRA=0x8E; // Это зависит от кварца, деления частоты для АЦП, и собсна включения АЦП (на сколько я понял, перерыв инет)
// А вот как мне выставить опеределенные занчения кварца, делителя - не могу найти. должна же быть какая-то таблица..
// или типа каждая группа бит отвечает за то-то.. И лучше для понимания в двоичном.. Можно ж?

ADMUX=0; // вход АЦП ADC0 (ножка PA0) и внешнее опорное напряжение с ножки AREF  
// тоже самое.. А как мне выставить, например, PA2 (38 ножка меги16)?


#asm("sei") // разрешения прерывания локального.. тоже не понимаю как работает.

// запускаем первое АЦП 
ADCSRA|=0x40;


while (1) {

// Здесь будет что-то типа Writeln(PARAM); ))


};}


/*
И еще такой вопрос. Обязательно ли обращаться к АЦП в прерывании?  Нельзя ли это делать в главной функции, когда это необходимо. 

Типо 
void main(void)
{
PARAM = АЦПМК
if (PARAM > 0) {..}
}
*/


Думаю, вопросы понятны... Спасибо заранее!

Автор: Mazzi 31.10.2011, 14:39
На сайте производителя есть файлы-аппноуты для каждого микроконтроллера с примерами работы для всех внутренних устройств. Почитайте, узнаете много нового для себя.

Автор: tima705 31.10.2011, 20:37
Цитата(Mazzi @ 31.10.2011,  14:39)
На сайте производителя есть файлы-аппноуты для каждого микроконтроллера с примерами работы для всех внутренних устройств. Почитайте, узнаете много нового для себя.

Обычно такие ответы и поступают. 
Mazzi, я в первую очередь покопался на atmel.com... Я очень плохо понимаю юсовский, вытекающе и даташиты с переводов на 20% курю.. Что ессно не достаточно. С программированием АВР на си сталкивался единожды.. СИ же с исходников вообще туго)) (Ближе паскаль-делфи..) Вот и прошу именно "разжевать".. "на пальцах", что называется.. Я бы не стал создавать ветку, если бы смог разобраться сам. Вопросы вполне конкретные, прошу Вас уделить мне немного времени на разъяснение сих) Спасибо.

Автор: UniBomb 1.11.2011, 08:12
Цитата(tima705 @  31.10.2011,  21:37 Найти цитируемый пост)
С программированием АВР на си сталкивался единожды.. СИ же с исходников вообще туго)) (Ближе паскаль-делфи..)

Не надо лукавить smile Вопросы из первого сообщения не имеют никакого отношения к языку и связаны исключительно с непониманием работы мк. 

Цитата(tima705 @  29.10.2011,  12:44 Найти цитируемый пост)
// Я так понимаю АЦП возвращает значение от 0 до 1023, поэтому тип переменной такой.

 smile 

Цитата(tima705 @  29.10.2011,  12:44 Найти цитируемый пост)
// Здесь не знаю, как получить занчения с регистров АЦП

Результат преобразования хранится в двух регистрах - ADCH и ADCL. Но разные реализации стандартной библиотеки могут немного упрощать работу. Так например в avr-libc, идущей в комплекте к avr-gcc результат сохраняется в переменную ADCW.

Цитата(tima705 @  29.10.2011,  12:44 Найти цитируемый пост)
// Это зависит от кварца

Это не зависит от кварца. 

Цитата(tima705 @  29.10.2011,  12:44 Найти цитируемый пост)
// А вот как мне выставить опеределенные занчения кварца

Никак. Кварц определённой частоты впаивается и не изменяется. Тут более уместен другой вопрос - а как выбрать необходимый режим тактирования? С помощью fuse-битов CKSEL3...CKSEL0

Цитата(tima705 @  29.10.2011,  12:44 Найти цитируемый пост)
А как мне выставить, например, PA2 (38 ножка меги16)?

Управление мультиплексором (т.е. выбор "ножки" считывания) осуществляется битами MUX3...MUX0. Для выбора ADC2 в эти быти надо записать значение 0010(2)

Цитата(tima705 @  29.10.2011,  12:44 Найти цитируемый пост)
// разрешения прерывания локального

Разрешение общего прерывания. Без установки бита I регистра SREG (что и делает эта команда) ни одно прерывание не сработает.

Цитата(tima705 @  29.10.2011,  12:44 Найти цитируемый пост)
Обязательно ли обращаться к АЦП в прерывании? Нельзя ли это делать в главной функции, когда это необходимо. 

Можно обращаться в любой момент времени и в любой части программы. Но ведь прерывания не просто так придумали. О наступлении момента "когда это необходимо" можно узнать либо по прерыванию, либо при постоянном опросе регистров состояния модуля. В зависимости от задачи постоянный опрос может быть не приемлем, потому что за это время можно сделать кучу другой полезной работы.


И на будущее - не задавай вопросы в таком виде, т.к. это как видишь приводит к оверквоттингу. И совсем на будущее - купи себе http://www.dodeca.ru/books/139/ книгу. В ней содержится вся необходимая информация, т.к. она представляет из себя обобщённый перевод оригинальных даташитов.

Автор: tima705 2.11.2011, 05:45
Все-таки придется самому)) За книгу спасибо! Уже читаю. ОЧЕНЬ полезная книга.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)