if((ADC & (1<<0)) > (ADC & (1<<1))) { // Если АЦП0 больше чем АЦП1 то светодиод мигает PORTD |= _BV(PD1); // установить 1 на PD1
_delay_ms(50); //ждем 0.25 сек
PORTD &= ~_BV(PD1); // установить "0" на PD1
}
Вот так у меня работает и в программе виртуал студио показывает что все работает. Или может нужно вставить ADMUX ?
Спасибо за ответ. Но мне кажется что это как бы в принципе одно и тоже. С этого температурного датчика TMP36 на АЦП будет идти напряжение и его нужно будет сравнивать, или я не то что понял, поправьте меня пожалуйста.
if ((ADC1 > ADC2)&&(ADC1 > ADC3)) эта функция показывает что не корректна.
А может быть что в разных программах код воспринимается по разному?
Насосы включаются в зависимости от температуры, т.е. от разности напряжения.
Тут вот что есть, на самом деле очень интересная технология, старая как мир, но все же.
БАНЯ. Для её обеспечения нужно тепло в парной, отопление, горячая вода.
Баня на дровах, в выхлопной трубе температура близко 400С!! Жалко такое добро пропадает.
Вот мы установили теплообменник, от него вода нагревается и обогревает баню(радиаторы). Когда баня нагревается, переключается насос и подается тепло на воду(помыться). И т.д. ЭКОНОМИЯ! потрясно.
Первое дело это котлы большой мощности, а от них уже все и пляшет. Это мне все нужно скомпанвать. В принципе что и сделали до меня. Но теперь все это хочется удешевить.
Добавлено (29.01.2011, 16:10)
---------------------------------------------
/*******************************************************
D0 - индикатор работы (светодиод)
D1 - насос 1
D2 - насос 2
D3 - насос 3
Задача:
Если (D1 > D2) - включаем первый насос. Если нет, то выключаем его
При этом ждем 5 сек что бы не было гидро удара.
Если (D1 > D3) - Включаем второй насос, Если нет, то выключаем.
Если (D1 < D2) и (D1 < D3) - Включаем третий насос, 1,2 - отключаем
Это условие имеет найвысший приоритет. Выполняется пока истинно.
********************************************************/
#define F_CPU 1000000UL // указываем частоту в герцах
#include <avr/io.h>
#include <util/delay.h>
int main(void) { // начало основной программы
ADEN; // использованеие АЦП
DDRD = 0xff; // все выводы порта D сконфигурировать как выходы
while(1) {
PORTD |= _BV(PD0); // установить "1" (высокий уровень) на выводе PD0,
_delay_ms(100); // ждем 1 сек.
PORTD &= ~_BV(PD0); // установить "0" (низкий уровень) на выводе PD0,
// подключить светодиод как индикатор работы системы
while ((ADMUX & (1<<1)) < (ADMUX & (1<<2)) && (ADMUX & (1<<1)) < (ADMUX & (1<<3))) {
PORTD |= _BV(PD1); // установить "1" (первый насос работает) на выводе PD1,
_delay_ms(500); // ждем 5 сек.
PORTD &= ~_BV(PD2); // установить "0" (низкий уровень) на выводе PD2,
PORTD &= ~_BV(PD3); // установить "0" (низкий уровень) на выводе PD3,
}
if ((ADMUX & (1<<1)) > (ADMUX & (1<<2))) {
PORTD |= _BV(PD1); // установить "1" (первый насос работает) на выводе PD1,
// Если нет, то выключить D1
_delay_ms(500); // ждем 5 сек.
PORTD &= ~_BV(PD1); // установить "0" (низкий уровень) на выводе PD1,
}
if ((ADMUX & (1<<1)) > (ADMUX & (1<<3))) {
PORTD |= _BV(PD2); // установить "1" (первый насос работает) на выводе PD2,
// Если нет, то выключить D2
_delay_ms(500); // ждем 5 сек.
PORTD &= ~_BV(PD2); // установить "0" (низкий уровень) на выводе PD2,
}
} // закрывающая скобка while
} // закрывающая скобка основной программы
Теперь скажите пожалуйста, если я ставлю так:
if ((ADMUX & (1<<1)) > (ADMUX & (1<<3))) {
PORTD |= _BV(PD2); // установить "1" (первый насос работает) на выводе PD2,
}
else { // Если нет, то выключить D2
_delay_ms(500); // ждем 5 сек.
PORTD &= ~_BV(PD2); // установить "0" (низкий уровень) на выводе PD2,
};
то когда проверяю в avr studio , ничего не происходит. ошибок не выдает, но результата нет. Если в место if поставить while , то работает, проверка идет, но мне так нельзя иначе будет выполнятся только одно действие, а мне нужно что бы бывало например 2 насоса работали одновременно.
Правильно ли я выражаю ножки АЦП? - нужно ADMUX или ADC
Добавлено (29.01.2011, 20:01)
---------------------------------------------
Ура!!!!
ДОПЁР!!!
Вычитал что лучше не делать паузы в прерываниях. Убрал Все заработало. Понял что правильно ADC