Ср янв 18, 2012 11:40:38
Обычный ваш ответ. Простой поиск по содержимому в папке WinAVR говорит о то, что подобного там нетМастер Ломастер писал(а):BerZerK-ku писал(а):Может еще подскажите в какой из библиотек?
а смысл? гуру учить - только себе проблем нажить
Ср янв 18, 2012 11:41:07
AR_AROV писал(а):Мастер Ломастер писал(а):как минимум потому, что вы не читали, как надо опрашивать кнопку - а я для вас подробно все описывал. категорически недопустимо работать с кнопкаи, опрашивая 1 раз пин порта! сколько раз еще надо повторить?!AR_AROV писал(а):почему вот такой код не работает?
а сколько раз надо опрашивать? я делал так как вы писали, но у меня не получилось
Ср янв 18, 2012 11:42:51
AR_AROV писал(а):как надо делать правильно?
я после условия поставил задержу-антидребезг в 50 мс, вроде вышло и работает
Ср янв 18, 2012 11:43:25
понял, как это работает (плохо) и стал делать по-другому - вы это имели ввиду?
Ср янв 18, 2012 11:47:45
ploop писал(а):А то получается - делай так, и будет те щааастье... а как работает не понимаем...
Мастер Ломастер писал(а):не можете поймать нажатие кнопки? поступайте, как я вам рассказывал итак, задача: есть порт МК, к которому на землю подключено до 8 кнопок. надо отловить их нажатия. как поступить? заранее настроить порт на ввод с встроенными подтяжками, тогда чтение порта с ненажатыми кнопками вернет единицы во всех разрядах байта, а если будет что-то нажато - в том месте будет ноль. кнопка может "дребезжать", т.е. некоторое время (10-25 мс) не иметь постоянного контакта - этого нужно избежать. как? опрашиваем порт, запоминаем результат. ждем 10-25 мс и снова опрашиваем порт, сравнивая результат с запомненным: если они совпали, значит, дребезг уже закончился (или не начинался) и считаны именно данны о нажатых кнопках. теперь, когда на словах разобрались с алгоритмом, опишем его на языке Си, вспоминая ранее данные рекомендации о кодах кнопок:
- Код:
#define KEY_1 (1<<PB0)
#define KEY_2 (1<<PB1)
// и так далее хоть все 8 кнопок
#define ANY_KEY (KEY_1 | KEY_2) /* тут надо перечислить все существующие кнопки, и не слушайте тех, кто скажет, что скобки лишние */
#define NO_KEY 0
// настройка порта на ввод с подтяжками - делается где-то в начале main()
DDRB &= ~ANY_KEY;
PORTB |= ANY_KEY;
// функция получения кода нажатых кнопок
unsigned char get_key_pressed(void){
unsigned char key;
key = ~(PINB & ANY_KEY);
delay_ms(15); // задержка для подавления дребезга
if(key == ~(PINB & ANY_KEY))
return key;
else
return NO_KEY; // если дребезг - вернем 0, что будет означать: не нажата ни одна кнопка
}
разумеется, лучше кодам кнопок давать более осмысленные имена, например не KEY_1, а NEXT_EFFEKT_KEY и т.п. - это позволит получить более читабельную программу.
вопросы?
Ср янв 18, 2012 11:56:38
Мастер Ломастер писал(а):ploop писал(а):А то получается - делай так, и будет те щааастье... а как работает не понимаем...
обижаешь, начальник! я всегда объясняю, почему надо делать так, как я советую:Мастер Ломастер писал(а):не можете поймать нажатие кнопки? поступайте, как я вам рассказывал итак, задача: есть порт МК, к которому на землю подключено до 8 кнопок. надо отловить их нажатия. как поступить? заранее настроить порт на ввод с встроенными подтяжками, тогда чтение порта с ненажатыми кнопками вернет единицы во всех разрядах байта, а если будет что-то нажато - в том месте будет ноль. кнопка может "дребезжать", т.е. некоторое время (10-25 мс) не иметь постоянного контакта - этого нужно избежать. как? опрашиваем порт, запоминаем результат. ждем 10-25 мс и снова опрашиваем порт, сравнивая результат с запомненным: если они совпали, значит, дребезг уже закончился (или не начинался) и считаны именно данны о нажатых кнопках. теперь, когда на словах разобрались с алгоритмом, опишем его на языке Си, вспоминая ранее данные рекомендации о кодах кнопок:
- Код:
#define KEY_1 (1<<PB0)
#define KEY_2 (1<<PB1)
// и так далее хоть все 8 кнопок
#define ANY_KEY (KEY_1 | KEY_2) /* тут надо перечислить все существующие кнопки, и не слушайте тех, кто скажет, что скобки лишние */
#define NO_KEY 0
// настройка порта на ввод с подтяжками - делается где-то в начале main()
DDRB &= ~ANY_KEY;
PORTB |= ANY_KEY;
// функция получения кода нажатых кнопок
unsigned char get_key_pressed(void){
unsigned char key;
key = ~(PINB & ANY_KEY);
delay_ms(15); // задержка для подавления дребезга
if(key == ~(PINB & ANY_KEY))
return key;
else
return NO_KEY; // если дребезг - вернем 0, что будет означать: не нажата ни одна кнопка
}
разумеется, лучше кодам кнопок давать более осмысленные имена, например не KEY_1, а NEXT_EFFEKT_KEY и т.п. - это позволит получить более читабельную программу.
вопросы?
но заставлять-то не могу - вот и делают все "вроде работает", а через 5 минут снова вопросы...
#define KEY_1 (1<<PIND0)
#define KEY_2 (1<<PIND1)
#define KEY_3 (1<<PIND2)
#define KEY_4 (1<<PIND3)
#define KEY_5 (1<<PIND4)
#define ANY_KEY (KEY_1 | KEY_2 | KEY_3 | KEY_4 | KEY_5 )
#define NO_KEY 0
// функция получения кода нажатых кнопок
unsigned char get_key_pressed(void)
{
unsigned char key;
key = ~(PIND & ANY_KEY);
delay(15); // задержка для подавления дребезга
if(key == ~(PIND & ANY_KEY))
return key;
else
return NO_KEY; // если дребезг - вернем 0, что будет означать: не нажата ни одна кнопка
}
int main( void )
{
char del;
int i;
PORTB = 0xFF;
DDRB = 0xFF;
DDRD &= ~ANY_KEY;
PORTD |= ANY_KEY;
while(1)
{
//PORTB = PIND;
switch(get_key_pressed()) // при помощи функции get_key_pressed получаем код нажатой кнопки
{
case KEY_5:
// след.эффект
effect++;
if (effect>3) effect = 0;
break;
}
switch(effect)
{
case 0:
PORTB=0x00;
break;
case 1:
PORTB=0xFF;
break;
case 2:
PORTB=0xFF;
del = 5 / delitel;
i = interval * del ;
delay(i);
PORTB=0x00;
i = interval * (1/del);
delay(i);
break;
}
}
return 0;
}
Ср янв 18, 2012 12:00:04
Ср янв 18, 2012 12:12:34
Мастер Ломастер писал(а):не работает? а почему, вы разобрались? я этот подход применяю в своих программах - работает отлично, почему у вас не работает? мне за вас всю программу написать?
подсказку последнюю помните? про то, что надо как-то дожидаться отпускания кнопки или что-то подобное делать, чтобы быстро-быстро не делать кучу действий на одно нажатие, помните? попробуйте теперь, с учетом новых знаний сделать - получится или нет?
Ср янв 18, 2012 12:17:17
while(1) PORTB = get_key_pressed();
Ср янв 18, 2012 12:31:25
Мастер Ломастер писал(а):у вас не хватает желания подумать самому. во всех строчках. для смеху сделайте вот такой код, от которого затем пляшите:разумеется, на PORTB поставьте 8 светодиодов с резисторами. или в протеусе нариссуйте, что проще и безопаснее.
- Код:
while(1) PORTB = get_key_pressed();
Ср янв 18, 2012 13:00:51
да, век живи - век учись моя вина: сам всех учу правилам преобразования типов, и сам же попал на это правило. код функции опроса кнопок надо чуть-чуть видоизменить:AR_AROV писал(а):ничего не загорается, ни в схеме ни в протеусе (((
unsigned char get_key_pressed(void){
unsigned char key;
key = ~PIND & ANY_KEY;
delay(15);
if(key == (~PIND & ANY_KEY))
return key;
else
return NO_KEY;
}
Ср янв 18, 2012 13:22:08
Было:
key = ~(PIND & ANY_KEY);
Стало:
key = ~PIND & ANY_KEY
Ср янв 18, 2012 13:25:17
Ср янв 18, 2012 16:11:20
эх, гуру, гуру... слона-то вы и не приметили. то, на что вы обратили внимание - это ЛЕЧЕНИЕ, а преобразование типов в другом месте мешало. даю подсказку.BerZerK-ku писал(а):Кхм-кхм, т.е. тут преобразование типов виновато?
- Код:
Было:
key = ~(PIND & ANY_KEY);
Стало:
key = ~PIND & ANY_KEY
Спешу огорчить, виновата как раз неправильная последовательность действий. А-ля, ставлю в скобки все что вижу
unsigned char get_key_pressed(void){
unsigned char key;
key = ~(PIND & ANY_KEY);
delay(15);
if(key == ~(PIND & ANY_KEY))
return key;
else
return NO_KEY;
}
unsigned char get_key_pressed(void){
unsigned char key;
unsigned char key2;
key = ~(PIND & ANY_KEY);
delay(15);
key2 = ~(PIND & ANY_KEY);
if(key == key2)
return key;
else
return NO_KEY;
}
Ср янв 18, 2012 16:32:56
Немного отличается от приведенного выше, не правдо ли?Мастер Ломастер писал(а):да, век живи - век учись моя вина: сам всех учу правилам преобразования типов, и сам же попал на это правило. код функции опроса кнопок надо чуть-чуть видоизменить:
Код:
unsigned char get_key_pressed(void){
unsigned char key;
key = ~PIND & ANY_KEY;
delay(15);
if(key == (~PIND & ANY_KEY))
return key;
else
return NO_KEY;
}
извините, оплошал...
unsigned char get_key_pressed(void){
unsigned char key;
unsigned char key2;
key = ~(PIND & ANY_KEY);
delay(15);
key2 = ~(PIND & ANY_KEY);
if(key == key2)
return key;
else
return NO_KEY;
}
Ср янв 18, 2012 16:35:07
unsigned char get_key_pressed(void){
unsigned char key;
key = ~PIND & ANY_KEY;
delay(15);
if(key == (~PIND & ANY_KEY))
return key;
else
return NO_KEY;
}
Ср янв 18, 2012 16:36:15
прочтите внимательно всеBerZerK-ku писал(а):пример, который "РАБОТАЛО" где работало?
Ср янв 18, 2012 16:37:29
Ср янв 18, 2012 16:43:34
умная мысля приходит опосля: когда я понял, что мои слова могут быть поняты не так, я исправил и дополнил пост.BerZerK-ku писал(а):К сожалению все появилось во время написания моего поста, до этого оно было не все
Ср янв 18, 2012 16:47:08