Вкратце чего делает: ждем сигнал с микрофона, при его появлении измеряем его длительность. На короткие сигналы не реагируем. При превышении порога длительности начинаем управлять мосфетом, т.е. активатором. (в данном конкретном случае я светодиодом мигал) Если на момент окончания цикла качания сигнал с микрофона присутствует, продолжаем качать. Если нет- снова ждем длительного сигнала.
#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
int i;
int t;
t = 0;
DDRC = 0xff; // все порты C сконфигурировать как выходы
DDRD = 0x00; // все порты D сконфигурировать как входы
PORTD = 0xff; // установить "1" на всех портах D,
while(1) { // Бесконечный цикл
// ПРОВЕРЯЕМ НАЛИЧИЕ СИГНАЛА
while (t < 10)
{ // Бесконечный цикл
if
(!(PIND & (1<<PIND1))) // проверить "0" на линии 1 порта D
t = t + 1; // если 0, тогда значение x увеличиваем на 1
else
t = 0; // в противном случае х будет обнулен
_delay_ms(200); // ждем
}
// ВКЛЮЧАЕМ ИСПОЛНЯЮЩЕЕ УСТРОЙСТВО
t = 0; // обнуляем значение переменной t
start:
for (i = 1; i <= 10; i++) // цикл 10 раз
{
PORTC |= _BV(PC1); // подаем питание
_delay_ms(200); // ждем
PORTC &= ~_BV(PC1); // выключаем питание
_delay_ms(200); // ждем
}
if
(!(PIND & (1<<PIND1))) // проверить "0" на линии 1 порта D
goto start; // перейти к метке start
}
}
О чем я хочу вас попросить:
1. наверняка прогу можно упростить и уместить в несколько строк?
2. как бы укладывать МК спать, чтобы он по сигналу с микрофона просыпался?
3. как включить компаратор на АТмеге8, я читал, но ничего не понял?
Спасибо.