Реклама на сайте DatasheetsDatasheets

KAZUS.RUN - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Книги и журналы
FAQ по электронике

  Datasheets
Поиск SMD
Онлайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Схемы и проекты
Принципиальные схемы
  Программы
Каталог сайтов
Калькуляторы
  Форумы по электронике
Помощь проекту

Делимся опытом Наступив на грабли - сообщи другим! Обмен опытом разработки и ремонта электронных устройств.

 
Опции темы

ATmega16 Устройство управления тепличными нагревателями

Непрочитано 31.07.2010, 18:59  
grizko
Частый гость
 
Регистрация: 15.01.2010
Сообщений: 16
Сказал спасибо: 13
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
grizko на пути к лучшему
По умолчанию ATmega16 8-ми канальный АЦП

Здравствуйте.
Существует задача (не прикладная - учебная). Необходимо создать устройство управления тепличными нагревателями на базе микроконтроллера. Восемь нагревателей, столько же датчиков, температура регулируется в пределах +10 +40 градусов Цельсия. Включение нагревателей контролируется линейкой светодиодов. Температура одного из восьми датчиков отображается на дисплее (LCD или 7-и сегментном индикаторе), датчик для отображения температуры выбирается с помощью переключателя.

Был выбран МК ATmega16, по причине наличия 8-и АЦП (чтобы не использовать внешний мультиплексор). Датчики - аналоговые, на выходе от 0 до 5-ти вольт, в диапазоне от +10 до + 40 градусов.

Собственно вопрос по программе: как на С заставить последовательно опрашивать АЦП (голова пухнет - никак не пойму )

Во вложении программа на С и схема Proteus.
Вложения:
Тип файла: rar UUN.rar (20.4 Кб, 136 просмотров)

Последний раз редактировалось grizko; 08.08.2010 в 19:43.
grizko вне форума  
Непрочитано 31.07.2010, 21:59  
niXto
Почётный гражданин KAZUS.RUN
 
Аватар для niXto
 
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,026
Сказал спасибо: 60
Сказали Спасибо 3,941 раз(а) в 2,302 сообщении(ях)
niXto на пути к лучшему
По умолчанию Re: ATmega16 Устройство управления тепличными нагревателями

Сообщение от grizko Посмотреть сообщение
датчик для отображения температуры выбирается с помощью переключателя
По циклу "если нажата кнопка 1, то читаем первый канал АЦП и выдаем на дисплей"... если нажата кнопка 7 - конфигурируем АЦП на чтение 7-го канала. Или если переключение по кольцу - сохраняем в регистре цифру от 0 до 7, и дальше как выше - если цифра 7 то...

Как-то так
niXto вне форума  
Сказали "Спасибо" niXto
grizko (01.08.2010)
Непрочитано 01.08.2010, 10:32  
grizko
Частый гость
 
Регистрация: 15.01.2010
Сообщений: 16
Сказал спасибо: 13
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
grizko на пути к лучшему
По умолчанию Re: ATmega16 Устройство управления тепличными нагревателями

Сообщение от niXto Посмотреть сообщение
По циклу "если нажата кнопка 1, то читаем первый канал АЦП и выдаем на дисплей"... если нажата кнопка 7 - конфигурируем АЦП на чтение 7-го канала. Или если переключение по кольцу - сохраняем в регистре цифру от 0 до 7, и дальше как выше - если цифра 7 то...
Здраствуйте.
Цикл я организовал по переменной counter, если counter совпадает с selektor, то выводим значение АЦП на экран (дисплей).
Проблема в том, что я не пойму как увязать с прерыванием interrupt [ADC_INT], конфигурирование определённого АЦП.
grizko вне форума  
Непрочитано 01.08.2010, 10:34  
grizko
Частый гость
 
Регистрация: 15.01.2010
Сообщений: 16
Сказал спасибо: 13
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
grizko на пути к лучшему
По умолчанию Re: ATmega16 Устройство управления тепличными нагревателями

извините за офтоп, не разобрался как вставить текст под спойлер. Хотел привести код - да там 300 строк.
grizko вне форума  
Непрочитано 01.08.2010, 10:57  
_guardianangel
Почётный гражданин KAZUS.RUN
 
Регистрация: 01.04.2009
Адрес: Рязань
Сообщений: 1,138
Сказал спасибо: 21
Сказали Спасибо 635 раз(а) в 344 сообщении(ях)
_guardianangel на пути к лучшему
По умолчанию Re: ATmega16 Устройство управления тепличными нагревателями

Сообщение от grizko Посмотреть сообщение
Проблема в том, что я не пойму как увязать с прерыванием interrupt [ADC_INT], конфигурирование определённого АЦП.
АЦП в меге 1. Просто имеет 8 входов, в каждый конкретный момент работает только один канал и прирывание у него тоже одно на все каналы. Узнать какой канал сейчас активен можно по битам MUX0 - MUX4 регистра ADMUX.
_guardianangel вне форума  
Непрочитано 01.08.2010, 11:15  
grizko
Частый гость
 
Регистрация: 15.01.2010
Сообщений: 16
Сказал спасибо: 13
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
grizko на пути к лучшему
По умолчанию Re: ATmega16 Устройство управления тепличными нагревателями

Сообщение от _guardianangel Посмотреть сообщение
АЦП в меге 1. Просто имеет 8 входов, в каждый конкретный момент работает только один канал и прирывание у него тоже одно на все каналы. Узнать какой канал сейчас активен можно по битам MUX0 - MUX4 регистра ADMUX.
Если бы кто нибудь посмотрел прикреплённый в первом посту файл UUN.c, было бы проще понять. (или подсказал как текст под спойлер засунуть)
grizko вне форума  
Непрочитано 01.08.2010, 12:56  
grizko
Частый гость
 
Регистрация: 15.01.2010
Сообщений: 16
Сказал спасибо: 13
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
grizko на пути к лучшему
По умолчанию 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);
}
Миниатюры:
Нажмите на изображение для увеличения
Название: UUN.jpg
Просмотров: 100
Размер:	110.2 Кб
ID:	10454  

Последний раз редактировалось grizko; 02.08.2010 в 07:12.
grizko вне форума  
Непрочитано 01.08.2010, 12:58  
dg79
Прописка
 
Аватар для dg79
 
Регистрация: 02.08.2007
Адрес: RU Киров
Сообщений: 263
Сказал спасибо: 22
Сказали Спасибо 63 раз(а) в 48 сообщении(ях)
dg79 на пути к лучшему
По умолчанию Re: ATmega16 Устройство управления тепличными нагревателями

Сообщение от grizko Посмотреть сообщение
...или подсказал как текст под спойлер засунуть
пишите код внутри тега [code} ...текст... {/code] . Только скобочки обе квадратные.
dg79 вне форума  
Сказали "Спасибо" dg79
grizko (01.08.2010)
Непрочитано 01.08.2010, 14:53  
_guardianangel
Почётный гражданин KAZUS.RUN
 
Регистрация: 01.04.2009
Адрес: Рязань
Сообщений: 1,138
Сказал спасибо: 21
Сказали Спасибо 635 раз(а) в 344 сообщении(ях)
_guardianangel на пути к лучшему
По умолчанию 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 вне форума  
Сказали "Спасибо" _guardianangel
grizko (01.08.2010)
Непрочитано 01.08.2010, 15:28  
grizko
Частый гость
 
Регистрация: 15.01.2010
Сообщений: 16
Сказал спасибо: 13
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
grizko на пути к лучшему
По умолчанию Re: ATmega16 Устройство управления тепличными нагревателями

Сообщение от _guardianangel Посмотреть сообщение
1. У Вас 8 датчиков и 8 исполнительных ус-в. Но переменная для хранения значения АЦП одна. Нужно как минимум иметь массив из 8 переменных для хранения значения с каждого канала.
Поясните зачем 8 переменных для хранения значения АЦП, если это значение нужно только один раз "включить"(выключить) исполнительное устройство, либо вывести значение на дисплей (предварительно обработав). В следующем АЦП будут другие значения, для других исполнительных устройств. (Я так думаю).


Сообщение от _guardianangel Посмотреть сообщение
А это на кой надо? По дефолту все порты настроены на вход, так что Вам необходимо лишь задавать нужный канал АЦП в регистре ADMUX. Читайте внимательно даташит.
Согласен. Не подумав скопировал код.


Сообщение от _guardianangel Посмотреть сообщение
Шедевр. Вы разрешаете прерывание от АЦП и не пишете обработчик. Компилятору до фантика забыли Вы про него или передумали, он бинарь соберет. А вот железяка при первом же прерывании ребутнется, если Вы канешн не перепишете bad_interrupt.
Ничего не понял. Поясните пожалуйста (если не трудно), что нужно написать и где.


Сообщение от _guardianangel Посмотреть сообщение
Тож не понятно зачем. 25 тактов - это время преобразования АЦП, которое отсчитывается после запуска, но никак не до. У Вас же сначало ждем 25 тактов, потом стартуем преобразование.
Да согласен, действительно абсурд. А после запуска АЦП, есть необходимость ждать 25 (13) тактов, или код можно пропустить?

Ещё раз, по поводу "шедевра", поясните пожалуйста, если не трудно.

Последний раз редактировалось grizko; 01.08.2010 в 15:32.
grizko вне форума  
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT +4, время: 16:29.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.