Ну так, все верно- D1 это третья нога, а D2- четвертая нога.
Спасибо, Белай Волк, сейчас попробую. (Добавление)
Не получается...
D2 работает, D1- нет.
Конкретно в Ваших программах D1 почему-то не работает. Вообще нога живая, проверял другой программой.
ОЛЕГ
Отправлено: 17 Марта, 2009 - 19:44:24
Супермодератор
Сообщений всего: 1732
Дата рег-ции: Нояб. 2008
Мне кажется, там проблема с циклами.
В любом случае, я все же решил пользоваться своей программой. Не знаю почему, но она в конкретном случае работает надежнее и без глюков.
Сегодня перепаял и перепроверил всю железную часть- все идеально, но программа с таймером дает ложные срабатывания при низкой чувствительности непосредственно к звуку из микрофона. А программа с переменными- как часы. Почему- я не знаю.
В любом случае, спасибо за помощь!
ОЛЕГ
Отправлено: 20 Марта, 2009 - 22:53:50
Супермодератор
Сообщений всего: 1732
Дата рег-ции: Нояб. 2008
Глюки при использовании программы с таймером вызваны тем, что сигнал с компаратора не является непрерывным. Таким образом, увеличивая чувствительность микрофона я получал ложные срабатывания, загрубляя- отсутствие срабатывания. Золотой середины я не нашел.
Если кому пригодится, выкладываю окончательный вариант. Д2- компаратор, Д1- кнопка с фиксацией, С4- управляющий вывод.
При коротком нажатии кнопки запускаем цикл. При коротком нажатии в процессе работы- выключаем. Фиксация кнопки- непрерывный режим. Задержка в начале нужна для того, чтобы щелчек при включении в розетку не запустил программу.
#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
_delay_ms(100); // ждем, пока стабилизируется напряжение после включения
int i = 0;
int t = 0;
DDRC = 0xff; // все порты C сконфигурировать как выходы
DDRD = 0x00; // все порты D сконфигурировать как входы
PORTD = 0xff; // установить "1" на всех портах D,
while(1) { // Бесконечный цикл
// ПРОВЕРЯЕМ НАЛИЧИЕ СИГНАЛА
while (t < 4) // цикл для определения длительности сигнала
{
if (!(PIND & (1<<PIND2)) // проверить "0" на линии 2 порта D
t++; // если 0, тогда значение t увеличиваем на 1
else
t = 0; // в противном случае t будет обнулен
_delay_ms(10); // ждем
if (!(PIND & (1<<PIND1))) // проверить "0" на линии 1 порта D
goto start; // перейти к метке start
}
// ВКЛЮЧАЕМ ИСПОЛНЯЮЩЕЕ УСТРОЙСТВО
start:
t = 0; // обнуляем значение переменной t
for (i = 1; i <= 300; i++) // цикл 300 раз
{
PORTC |= _BV(PC4); // подаем питание
_delay_ms(200); // ждем
PORTC &= ~_BV(PC4); // выключаем питание
_delay_ms(600); // ждем
if (!(PIND & (1<<PIND1))) // проверить "0" на линии 1 порта D
t = 297; // заканчиваем цикл
}
if
(!(PIND & (1<<PIND2))) // проверить "0" на линии 2 порта D
goto start; // перейти к метке start
}
}
Белый Волк
Отправлено: 21 Марта, 2009 - 03:43:28
Супермодератор
Сообщений всего: 648
Дата рег-ции: Февр. 2007
ОЛЕГ
Вместо
CODE:
if (!(PIND & (1<<PIND1))) // проверить "0" на линии 1 порта D
goto start; // перейти к метке start
Лучше записать
CODE:
if (!(PIND & (1<<PIND1))) // проверить "0" на линии 1 порта D
break; // прервать текущий цикл
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.