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

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

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

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

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

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

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

 
Опции темы
Непрочитано 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.RU
 
Аватар для niXto
 
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,048
Сказал спасибо: 60
Сказали Спасибо 3,954 раз(а) в 2,309 сообщении(ях)
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.RU
 
Регистрация: 01.04.2009
Адрес: Рязань
Сообщений: 1,140
Сказал спасибо: 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.RU
 
Регистрация: 01.04.2009
Адрес: Рязань
Сообщений: 1,140
Сказал спасибо: 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, время: 12:11.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot