Форум myROBOT.ru » Шаг за шагом » Программирование микроконтроллеров » Написал программу, помогите оптимизировать.

Страниц (3): [1] 2 3 »
 

1. ОЛЕГ - 28 Февраля, 2009 - 04:27:39 - перейти к сообщению
Собтвенно, вот что родил мой мозг Замешательство , чур, яйцами не кидаться Улыбка :

Вкратце чего делает: ждем сигнал с микрофона, при его появлении измеряем его длительность. На короткие сигналы не реагируем. При превышении порога длительности начинаем управлять мосфетом, т.е. активатором. (в данном конкретном случае я светодиодом мигал) Если на момент окончания цикла качания сигнал с микрофона присутствует, продолжаем качать. Если нет- снова ждем длительного сигнала. Ухмылка

#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, я читал, но ничего не понял?

Спасибо. Улыбка
2. VCOM - 01 Марта, 2009 - 10:48:28 - перейти к сообщению
Эм... а схему подключения микрофона можно?
3. Белый Волк - 01 Марта, 2009 - 11:39:13 - перейти к сообщению
1. Для задания переменной значения при её объявлении
CODE:

int t=0;

2. Для инициализации нескольких переменных одного типа
CODE:

int i, j, k;

3. Пункт 1 не исключает 2.
CODE:

int i=0, j=1, k=i+j;

4. Для увеличения/уменьшения значения переменной на единицу применяют унарный плюс/минус
CODE:

t++;
t--;

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--. Подобная конструкция удобна для прохождения одномерного массива от начала и конца к центру.
4. ОЛЕГ - 02 Марта, 2009 - 01:01:56 - перейти к сообщению
VCOM, конечно. Схема включения микрофона взята с робозона, та, которая стереофоническая и с компаратором. Только я оставил один микрофон, убрал аналоговый выход, убрал светодиод и выкинул половину проходных конденсаторов со входа микрофона (студийное качество звука мне не интересно Замешательство ).

Белый Волк, спасибо Вам большое! Все действительно можно написать гораздо проще, что я и сделал. Улыбка
5. VCOM - 02 Марта, 2009 - 12:54:21 - перейти к сообщению
А можно ссылку на зонаробу то эту?
6. ОЛЕГ - 03 Марта, 2009 - 23:39:01 - перейти к сообщению
Да легко, VCOM. Улыбка Вот:
http://robozone.su/2008/05/31/sd...sor-na-baze.html
Оставил только один канал и цифровой выход. Остальное выкинул.

Вернусь с командировки, со славного города Кирова (да здравствует халявный вайфай в гостиницах! высший восторг ), надо будет на соплях все это хозяйство собрать, да посмотреть, будет ли оно вообще работать. не в себе

Я решил таки использовать внешний компаратор, т.к. по внутреннему в АТмеге я вообще ничего не понял. Вернее, понял все, но написать это программой, чтобы заработало, я так и не смог (вместо микрофона тыкал в ножку МК проводком с "+" ). Замешательство А тем более, связать это с измерением длительности сигнала... рёв в три ручья

Есть и другая загвоздка: насколько я помню, низкоуровневый аудиосигнал, получаемый с предусилителя (сигнал LINE), имеет напругу всего около четверти вольта. А опорное напряжение на внутреннем компараторе составляет (если не ошибаюсь) 2.7В. Так что там по-любому задействовать обе ноги компаратора и сооружать ему делитель напряжения, с чем сравнивать, либо сигнал усиливать. Грустный

В общем, если та схема окажется жизнеспособной, я ее и возьму.
Улыбка
7. ОЛЕГ - 08 Марта, 2009 - 04:31:53 - перейти к сообщению
Схема с робозона не пашет. Собрал один- в один. рёв в три ручья рёв в три ручья рёв в три ручья

VCOM, может, у Вас какие мысли есть?
8. VCOM - 08 Марта, 2009 - 17:28:02 - перейти к сообщению
На 5 ноге лм386 какая напруга? Когда тихо и когда грит ктонить...
9. ОЛЕГ - 08 Марта, 2009 - 23:14:35 - перейти к сообщению
VCOM, спасибо, что откликнулись. Улыбка

При 6В питания на 5 ноге лм386 когда тихо 2,6В, а когда громко (дую в микрофон) скачет от 2.4 до 2.8 вольт. Просто меняются значения в произвольном порядке. Меряю обычным мультиметром аля за 500 рэ.
Странно. Замешательство
10. VCOM - 09 Марта, 2009 - 18:52:24 - перейти к сообщению
А на 2 и 3 ноге lm393 скока?
11. ОЛЕГ - 09 Марта, 2009 - 21:19:47 - перейти к сообщению
На 2 ноге измерить проблематично, потому что там емкость стоит. Показания начинаются с 2,4 вольт и постепенно уменьшаются, а когда дую в микрофон падают до 1,5 где-то. Перестаю дуть- опять подскакивают до прежнего значения.
На 3 ноге стоит 3,5 вольта. Это то значение, при котором есть хоть какой-то намек на нормальную работу.

Проблема, собственно, заключается в чем- приблуда либо не реагирует вовсе, либо начинает произвольно генерить сигналы в полной тишине. Питание от крена с конденсатором, массы с МК соединил.
Улыбка
12. VCOM - 10 Марта, 2009 - 10:48:08 - перейти к сообщению
а если от 2й ноги lm393 убрать RC цепочку (чтоб в воздухе балталась) скока будет??
13. ОЛЕГ - 10 Марта, 2009 - 23:44:22 - перейти к сообщению
Убрал, получилось 0,3 вольта. Светик при этом моргает, как будто микрофон реагирует.
VCOM, что показывает Ваша математическая модель моей аудиоприблуды? Улыбка
14. VCOM - 11 Марта, 2009 - 09:29:44 - перейти к сообщению
А чо я могу сказать. Компаратор работает. Надо усилок настраивать...
15. ОЛЕГ - 11 Марта, 2009 - 14:33:24 - перейти к сообщению
Ага, я так и думал... Сапсибо, VCOM. Улыбка
Там этих усилков до дури. Все такие одинаковые, но все такие разные...
Сегодня поеду прикуплю другой какой- нибудь... Замешательство