Описание: прога для кровати-качалки |
Поиск в теме | Версия для печати |
ОЛЕГ |
Отправлено: 28 Февраля, 2009 - 04:27:39
|
Супермодератор
Сообщений всего: 1732
Дата рег-ции: Нояб. 2008
|
Собтвенно, вот что родил мой мозг , чур, яйцами не кидаться :
Вкратце чего делает: ждем сигнал с микрофона, при его появлении измеряем его длительность. На короткие сигналы не реагируем. При превышении порога длительности начинаем управлять мосфетом, т.е. активатором. (в данном конкретном случае я светодиодом мигал) Если на момент окончания цикла качания сигнал с микрофона присутствует, продолжаем качать. Если нет- снова ждем длительного сигнала.
#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, я читал, но ничего не понял?
Спасибо. |
|
|
Белый Волк |
Отправлено: 01 Марта, 2009 - 11:39:13
|
Супермодератор
Сообщений всего: 648
Дата рег-ции: Февр. 2007
|
1. Для задания переменной значения при её объявлении
2. Для инициализации нескольких переменных одного типа
3. Пункт 1 не исключает 2.
CODE:
int i=0, j=1, k=i+j;
4. Для увеличения/уменьшения значения переменной на единицу применяют унарный плюс/минус
5. Имеет значение место написания унарных операций. Если оператор ++ написан до переменной, то, в составе другого оператора, сначала произойдёт увеличение переменной на единицу, а потом действие оператора.
CODE:
int i=0, j=1, k=2;
j = i++;
i = ++k;
После исполнения отрезка кода, j будет иметь значение 0, а i - значение 3
6. Для изменения значения переменной
CODE:
int i=1, j=4;
i += 2;
i *=j;
На первом шаге значение i будет 1+2=3, на втором 3*4=12.
7. Объявление переменных возможно в любом месте программы, включая for()
CODE:
for (int i = 0; i <= 20; i++)
8. Применение описанного для if()
CODE:
int i = 0, j = 1, k = i+j;
if (1) i++, j--, k *= 2;
9. Для цикла for()
CODE:
int i = 0, j = 1, k = i+j;
for (int i=0, j=10; i<j && j != k ; i++, j--);
Здесь сначала создаются i, j, k. Перед каждым шагом проверка условий и, если оба верны, выполняется тело цикла, после чего выполняются команды i++ и j--. Подобная конструкция удобна для прохождения одномерного массива от начала и конца к центру. |
|
|
ОЛЕГ |
Отправлено: 03 Марта, 2009 - 23:39:01
|
Супермодератор
Сообщений всего: 1732
Дата рег-ции: Нояб. 2008
|
Да легко, VCOM. Вот:
http://robozone.su/2008/05/31/sd...sor-na-baze.html
Оставил только один канал и цифровой выход. Остальное выкинул.
Вернусь с командировки, со славного города Кирова (да здравствует халявный вайфай в гостиницах! ), надо будет на соплях все это хозяйство собрать, да посмотреть, будет ли оно вообще работать.
Я решил таки использовать внешний компаратор, т.к. по внутреннему в АТмеге я вообще ничего не понял. Вернее, понял все, но написать это программой, чтобы заработало, я так и не смог (вместо микрофона тыкал в ножку МК проводком с "+" ). А тем более, связать это с измерением длительности сигнала...
Есть и другая загвоздка: насколько я помню, низкоуровневый аудиосигнал, получаемый с предусилителя (сигнал LINE), имеет напругу всего около четверти вольта. А опорное напряжение на внутреннем компараторе составляет (если не ошибаюсь) 2.7В. Так что там по-любому задействовать обе ноги компаратора и сооружать ему делитель напряжения, с чем сравнивать, либо сигнал усиливать.
В общем, если та схема окажется жизнеспособной, я ее и возьму.
|
|
|
ОЛЕГ |
Отправлено: 09 Марта, 2009 - 21:19:47
|
Супермодератор
Сообщений всего: 1732
Дата рег-ции: Нояб. 2008
|
На 2 ноге измерить проблематично, потому что там емкость стоит. Показания начинаются с 2,4 вольт и постепенно уменьшаются, а когда дую в микрофон падают до 1,5 где-то. Перестаю дуть- опять подскакивают до прежнего значения.
На 3 ноге стоит 3,5 вольта. Это то значение, при котором есть хоть какой-то намек на нормальную работу.
Проблема, собственно, заключается в чем- приблуда либо не реагирует вовсе, либо начинает произвольно генерить сигналы в полной тишине. Питание от крена с конденсатором, массы с МК соединил.
|
|
|
|
Поиск в теме | Версия для печати |
Страниц (3): [1] 2 3 » |
« Программирование микроконтроллеров » |
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
|
|
|
|
|