Делимся опытом Наступив на грабли - сообщи другим! Обмен опытом разработки и ремонта электронных устройств. |
31.07.2010, 18:59
|
|
Частый гость
Регистрация: 15.01.2010
Сообщений: 16
Сказал спасибо: 13
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
ATmega16 8-ми канальный АЦП
Здравствуйте.
Существует задача (не прикладная - учебная). Необходимо создать устройство управления тепличными нагревателями на базе микроконтроллера. Восемь нагревателей, столько же датчиков, температура регулируется в пределах +10 +40 градусов Цельсия. Включение нагревателей контролируется линейкой светодиодов. Температура одного из восьми датчиков отображается на дисплее (LCD или 7-и сегментном индикаторе), датчик для отображения температуры выбирается с помощью переключателя.
Был выбран МК ATmega16, по причине наличия 8-и АЦП (чтобы не использовать внешний мультиплексор). Датчики - аналоговые, на выходе от 0 до 5-ти вольт, в диапазоне от +10 до + 40 градусов.
Собственно вопрос по программе: как на С заставить последовательно опрашивать АЦП (голова пухнет - никак не пойму )
Во вложении программа на С и схема Proteus.
Последний раз редактировалось grizko; 08.08.2010 в 19:43.
|
|
|
|
31.07.2010, 21:59
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,048
Сказал спасибо: 60
Сказали Спасибо 3,954 раз(а) в 2,309 сообщении(ях)
|
Re: ATmega16 Устройство управления тепличными нагревателями
Сообщение от grizko
|
датчик для отображения температуры выбирается с помощью переключателя
|
По циклу "если нажата кнопка 1, то читаем первый канал АЦП и выдаем на дисплей"... если нажата кнопка 7 - конфигурируем АЦП на чтение 7-го канала. Или если переключение по кольцу - сохраняем в регистре цифру от 0 до 7, и дальше как выше - если цифра 7 то...
Как-то так
|
|
|
|
01.08.2010, 10:32
|
|
Частый гость
Регистрация: 15.01.2010
Сообщений: 16
Сказал спасибо: 13
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: ATmega16 Устройство управления тепличными нагревателями
Сообщение от niXto
|
По циклу "если нажата кнопка 1, то читаем первый канал АЦП и выдаем на дисплей"... если нажата кнопка 7 - конфигурируем АЦП на чтение 7-го канала. Или если переключение по кольцу - сохраняем в регистре цифру от 0 до 7, и дальше как выше - если цифра 7 то...
|
Здраствуйте.
Цикл я организовал по переменной counter, если counter совпадает с selektor, то выводим значение АЦП на экран (дисплей).
Проблема в том, что я не пойму как увязать с прерыванием interrupt [ADC_INT], конфигурирование определённого АЦП.
|
|
|
|
01.08.2010, 10:34
|
|
Частый гость
Регистрация: 15.01.2010
Сообщений: 16
Сказал спасибо: 13
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: ATmega16 Устройство управления тепличными нагревателями
извините за офтоп, не разобрался как вставить текст под спойлер. Хотел привести код - да там 300 строк.
|
|
|
|
01.08.2010, 10:57
|
|
Почётный гражданин KAZUS.RU
Регистрация: 01.04.2009
Адрес: Рязань
Сообщений: 1,140
Сказал спасибо: 21
Сказали Спасибо 635 раз(а) в 344 сообщении(ях)
|
Re: ATmega16 Устройство управления тепличными нагревателями
Сообщение от grizko
|
Проблема в том, что я не пойму как увязать с прерыванием interrupt [ADC_INT], конфигурирование определённого АЦП.
|
АЦП в меге 1. Просто имеет 8 входов, в каждый конкретный момент работает только один канал и прирывание у него тоже одно на все каналы. Узнать какой канал сейчас активен можно по битам MUX0 - MUX4 регистра ADMUX.
|
|
|
|
01.08.2010, 11:15
|
|
Частый гость
Регистрация: 15.01.2010
Сообщений: 16
Сказал спасибо: 13
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: ATmega16 Устройство управления тепличными нагревателями
Сообщение от _guardianangel
|
АЦП в меге 1. Просто имеет 8 входов, в каждый конкретный момент работает только один канал и прирывание у него тоже одно на все каналы. Узнать какой канал сейчас активен можно по битам MUX0 - MUX4 регистра ADMUX.
|
Если бы кто нибудь посмотрел прикреплённый в первом посту файл UUN.c, было бы проще понять. (или подсказал как текст под спойлер засунуть)
|
|
|
|
01.08.2010, 12:56
|
|
Частый гость
Регистрация: 15.01.2010
Сообщений: 16
Сказал спасибо: 13
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: ATmega16 Устройство управления тепличными нагревателями
Очень много желающих написать какой нибудь "Курс по программированию МК". Ещё больше желающих покритиковать этот курс. Но почему-то никому не интересно покритиковать конкретный пример. Даже написанный код никто не глянул, и схему приведённую не посмотрел.
Хорошо, попробую по другому:
фрагмент кода
Код:
|
/*************************************
//ADC interrupt service routine
interrupt [ADC_INT] void adc_isr(void)
{
unsigned int iRetVal;
// Read the AD conversion result
iRetVal=ADCW;
// Place your code here
}
**************************************/
//Реализация АЦП
void __ADC_SampleADC()
{
char dda;
volatile char cnt;
dda = DDRA;
//Включить выбранный АЦП
DDRA &= ~(1 ‹‹ COUNTER);
ADCSRA = 0x8B; //0b10001011 - ADC Enable; ADC Interrupt Enable; ADC Prescaler-8;
#asm("sei")
ADMUX = 0x20 | COUNTER; //0b00100xxx - ADC Left Adjust Result
//время АЦП 25 тактов
cnt = 0;
while (cnt ‹ 0x19) cnt++;
//начать преобразование
ADCSRA |= 0x40;
while(ADCSRA & 0x40);
DDRA = dda;
}
static short __ADC_ReadAsInt()
{
int iRetVal;
__ADC_SampleADC();
iRetVal = (ADCL ›› 6);
iRetVal |= (ADCH ‹‹ 2);
return (iRetVal);
} |
Последний раз редактировалось grizko; 02.08.2010 в 07:12.
|
|
|
|
01.08.2010, 12:58
|
|
Прописка
Регистрация: 02.08.2007
Адрес: RU Киров
Сообщений: 263
Сказал спасибо: 22
Сказали Спасибо 63 раз(а) в 48 сообщении(ях)
|
Re: ATmega16 Устройство управления тепличными нагревателями
Сообщение от grizko
|
...или подсказал как текст под спойлер засунуть
|
пишите код внутри тега [code} ...текст... {/code] . Только скобочки обе квадратные.
|
|
|
|
01.08.2010, 14:53
|
|
Почётный гражданин KAZUS.RU
Регистрация: 01.04.2009
Адрес: Рязань
Сообщений: 1,140
Сказал спасибо: 21
Сказали Спасибо 635 раз(а) в 344 сообщении(ях)
|
Re: ATmega16 Устройство управления тепличными нагревателями
Сообщение от grizko
|
Очень много желающих написать какой нибудь "Курс по программированию МК". Ещё больше желающих покритиковать этот курс. Но почему-то никому не интересно покритиковать конкретный пример. Даже написанный код никто не глянул, и схему приведённую не посмотрел.
|
Посмотрел - ужастнуло.
Теперь по пунктам
1. У Вас 8 датчиков и 8 исполнительных ус-в. Но переменная для хранения значения АЦП одна. Нужно как минимум иметь массив из 8 переменных для хранения значения с каждого канала.
2.
Код:
|
dda = DDRA;
//Включить выбранный АЦП
DDRA &= ~(1 ‹‹ COUNTER);
....................
DDRA = dda; |
А это на кой надо? По дефолту все порты настроены на вход, так что Вам необходимо лишь задавать нужный канал АЦП в регистре ADMUX. Читайте внимательно даташит.
3.
Код:
|
ADCSRA = 0x8B; //0b10001011 - ADC Enable; ADC Interrupt Enable; ADC Prescaler-8;
#asm("sei") |
Шедевр. Вы разрешаете прерывание от АЦП и не пишете обработчик. Компилятору до фантика забыли Вы про него или передумали, он бинарь соберет. А вот железяка при первом же прерывании ребутнется, если Вы канешн не перепишете bad_interrupt.
4.
Код:
|
cnt = 0;
while (cnt ‹ 0x19) cnt++;
//начать преобразование
ADCSRA |= 0x40;
while(ADCSRA & 0x40); |
Тож не понятно зачем. 25 тактов - это время преобразования АЦП, которое отсчитывается после запуска, но никак не до. У Вас же сначало ждем 25 тактов, потом стартуем преобразование.
Исправте для начала имеющиеся ляпу, дабы было от чего отталкиваться при дальнейшем обсуждении.
|
|
|
Сказали "Спасибо" _guardianangel
|
|
|
01.08.2010, 15:28
|
|
Частый гость
Регистрация: 15.01.2010
Сообщений: 16
Сказал спасибо: 13
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: ATmega16 Устройство управления тепличными нагревателями
Сообщение от _guardianangel
|
1. У Вас 8 датчиков и 8 исполнительных ус-в. Но переменная для хранения значения АЦП одна. Нужно как минимум иметь массив из 8 переменных для хранения значения с каждого канала.
|
Поясните зачем 8 переменных для хранения значения АЦП, если это значение нужно только один раз "включить"(выключить) исполнительное устройство, либо вывести значение на дисплей (предварительно обработав). В следующем АЦП будут другие значения, для других исполнительных устройств. (Я так думаю).
Сообщение от _guardianangel
|
А это на кой надо? По дефолту все порты настроены на вход, так что Вам необходимо лишь задавать нужный канал АЦП в регистре ADMUX. Читайте внимательно даташит.
|
Согласен. Не подумав скопировал код.
Сообщение от _guardianangel
|
Шедевр. Вы разрешаете прерывание от АЦП и не пишете обработчик. Компилятору до фантика забыли Вы про него или передумали, он бинарь соберет. А вот железяка при первом же прерывании ребутнется, если Вы канешн не перепишете bad_interrupt.
|
Ничего не понял. Поясните пожалуйста (если не трудно), что нужно написать и где.
Сообщение от _guardianangel
|
Тож не понятно зачем. 25 тактов - это время преобразования АЦП, которое отсчитывается после запуска, но никак не до. У Вас же сначало ждем 25 тактов, потом стартуем преобразование.
|
Да согласен, действительно абсурд. А после запуска АЦП, есть необходимость ждать 25 (13) тактов, или код можно пропустить?
Ещё раз, по поводу "шедевра", поясните пожалуйста, если не трудно.
Последний раз редактировалось grizko; 01.08.2010 в 15:32.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 10:20.
|
|