Технический форум по робототехнике.
dccharacter » 22 май 2011, 16:13
Так смотри, что ты делаешь (если я правильно эти ваши атмеги понимаю):
1. Ты нажимаешь кнопку
2. Через терминал и УАРТ отправляется код этой кнопки
3. МК обрабатывает нажатие этой кнопки (загорелся светодиод)
4. Ты отпускашь кнопку. Вопрос - что отправляется в терминал? Как МК узнает, что ты отпустил кнопку?
chinga » 22 май 2011, 16:16
dccharacter писал(а):4. Ты отпускашь кнопку. Вопрос - что отправляется в терминал? Как МК узнает, что ты отпустил кнопку?
вот это и хотел узнать)
dccharacter » 22 май 2011, 16:56
Правильный ответ - никак
chinga » 22 май 2011, 18:04
а если вот так сделать, то когда нажимаешь мигает потом тока горит, и когда отпускаешь нормально гаснет. вот почему когда нажимаешь и держишь в начале мигает и потом только горит?
- Код: Выделить всё • Развернуть
while (1){
char asd;
while(UCSRA.7==1){
asd = UDR;
if(asd == 'w'){
PORTB.0 = 1;
PORTB.2 = 0;
PORTB.4 = 0;
PORTB.6 = 0;
delay_ms(100);
}
if(asd == 'a'){
PORTB.2 = 1;
PORTB.0 = 0;
PORTB.4 = 0;
PORTB.6 = 0;
delay_ms(100);
}
if(asd == 'd'){
PORTB.4 = 1;
PORTB.0 = 0;
PORTB.2 = 0;
PORTB.6 = 0;
delay_ms(100);
}
if(asd == 's'){
PORTB.6 = 1;
PORTB.0 = 0;
PORTB.2 = 0;
PORTB.4 = 0;
delay_ms(100);
}
}
asd = 'q';
if(asd == 'q'){
PORTB.6 = 0;
PORTB.0 = 0;
PORTB.2 = 0;
PORTB.4 = 0;
}
}
вроде должен так работать, ну как я понимаю, когда нажимаю "w","a","s","d" заходит while(UCSRA.7==1) а когда не нажимаю, выходит из этого цикла, правильно? если я отпускаю то должны все светодиоды не гореть, то есть программа не заходит в while(UCSRA.7==1) то есть asd = 'q' и все светодиоды гаснут...я правильно понимаю?
dccharacter » 22 май 2011, 18:15
asd = 'q';
if(asd == 'q')
Это - очень круто!!!!!!
chinga » 22 май 2011, 18:21
dccharacter писал(а):asd = 'q';
if(asd == 'q')
Это - очень круто!!!!!!
ну я то буду еще что то добавлять кроме этой программы) что б еще от мк передавать сигналы на ПК)
HarryStar » 22 май 2011, 18:28
У вас нет ничего, что бы гасило светодиоды при отпускании кнопок.
Если кнопки не нажаты, вы не попадаете во внутренний while(UCSRA.7==1), и крутитесь во внешнем while(1), где ничего не гасит светодиоды. Поэтому у вас так и происходит. Поставьте перед while(UCSRA.7==1) строчку PORTB = 0; и все, светодиоды всегда будут погашены, и будут только загораться (точнее мигать) когда вы держите кнопки.
Внутри цикла вместо кучи IF поставьте лучше switch - будет короче и красивее
chinga » 22 май 2011, 18:48
вот именно, у меня мигает, а мне надо что б только горел, вообщем я хотел сделать так: когда нажимаю "w" моторы должны крутиться вперед, а когда "s" назад, "a" - влево,"d"-вправо, но у меня тут когда нажимаешь и держишь, в начале мигает(когда моторы будут то будет робот трести) потом тока горит... вообщем надо что б когда нажимаешь должны моторы нормально крутиться) вроде объяснил))
HarryStar » 22 май 2011, 19:25
Уберите задержки - будет чаще мигать, почти гореть - это простой вариант. Над более сложным уж сами подумайте
chinga » 22 май 2011, 19:38
если задержки убрать то ваще не горит)
chinga » 23 май 2011, 20:33
HarryStar писал(а):Уберите задержки - будет чаще мигать, почти гореть - это простой вариант.
а почему если задержку убрать то ваще не горит?
HarryStar » 23 май 2011, 22:56
Возможно задержка необходима для нормально работы UART, а возможно большую часть времени прога находится в состоянии обмена данными и светодиод загорается лишь на мгновение, не заметное глазу.
В вашем случае проблему можно решить несколькими способами, лучше бы конечно если бы вы сами над ними думали а не ждали чужого решения.
Вот 1 из вариантов:
настраиваете таймер, который вызывает прерывание например 10 раз в секунду (возможно придется подобрать экспериментально) именно в нем и только в нем вы гасите светодиоды (выключаете свои моторы). А в обработке нажатий клавиш вы зажигаете нужные светодиоды И переводите таймер т.о. чтоб прерывание в ближайшие 1/10 секунды не произошло.
Итого получается, что если вы держите кнопку, то таймер постоянно переводится и прерывания не происходит. Соотв светодиод горит постоянно. Как только перестали нажимать, через 1/10 сек произойдет прерывание и погасит светодиоды.
Можно придумать кучу других вариантов, тренируйтесь в алгоритмизации, это интересно и полезно.