Форум РадиоКот https://radiokot.ru/forum/ |
|
Attiny2313 и PA0 https://radiokot.ru/forum/viewtopic.php?f=57&t=160015 |
Страница 1 из 1 |
Автор: | alex1126 [ Пт янв 11, 2019 14:10:34 ] |
Заголовок сообщения: | Attiny2313 и PA0 |
Есть схема, где на ноги PA0 и PA1 повешены две кнопки. Прошивка эти кнопки проверяет и делает всякие действия. Причем распознает одиночное нажатие, многократные нажатия и нажатия и удержания. Одиночные нажатия обрабатываются по отдельности каждой кнопки а многократные нажатия и удержания мне не важно с какой кнопки, поэтому проверка на них идет вместе (if(PINA&0b11)). Проблемма заключается в том что одиночные нажатия отрабатываются нормально, а когда доходит дело до многократных нажатий или удержаний, то кнопка на PA1 отрабатывает нормально, а PA0 - нет, а учитывая что проверяются на нажатия они одним условием, то я вообще не понимаю ничего... Гляньте кто нить свежим взглядом, может подскажет кто что. Код: unsigned char butt_on_state=WAVE_ALW_ON_LOW,
butt_off_state=WAVE_ALW_OFF_LOW, st_t=0; signed char lc=-1; int tmrLo=0, //счетчик таймера понижения яркости tmrOff=0, //счетчик таймера включения/отключения света tmrTun=0; //счетчик таймера настройки света unsigned char is_tune=0, //признак того что регулируют яркость и не надо выключать свет state_butt; //Состояние главного конечного автомата кнопки (общий для двух) switch (state_butt) { case BUTTON_NOT_PRESS: if ((BUTT_LOW_PRESS)||(BUTT_HI_PRESS)) { tmrLo=200; state_butt=BUTTON_PRESS; } if (BUTT_LOW_PRESS) { butt_on_state=WAVE_ALW_ON_LOW; butt_off_state=WAVE_ALW_OFF_LOW; st_t=0; lc=-1; } if (BUTT_HI_PRESS) { butt_on_state=WAVE_ALW_ON_HI; butt_off_state=WAVE_ALW_OFF_HI; st_t=SP_COUNT-1; lc=1; } tmrTun++; if (tmrTun>100) is_tune=0; break; case BUTTON_PRESS: tmrLo--; if (tmrLo<0) { if (lvl>0) { lvl--; Led_Correct(lc); } tmrLo=10; is_tune=1; tmrTun=0; } // if ((!(BUTT_LOW_PRESS))&&(!(BUTT_HI_PRESS))) { if (!(PINA&0b11)) { /* если ни одна кнопка не нажата*/ tmrOff=100; state_butt=BUTTON_UNPRESS; } break; case BUTTON_UNPRESS: tmrOff--; if (tmrOff<0) { if (!is_tune) { /* одиночное нажатие кнопки*/ if ((state<WAVE_ALW_ON_LOW) || (state>WAVE_ALW_ON)) state=butt_on_state; else state=butt_off_state; st=st_t; } state_butt=BUTTON_NOT_PRESS; } // if ((BUTT_LOW_PRESS)||(BUTT_HI_PRESS)) { if (PINA&0b11) { /*если нажата любая кнопка*/ if (lvl<245) { lvl+=10; Led_Correct(lc); } is_tune=1; tmrTun=0; state_butt=BUTTON_NOT_PRESS; } break; } |
Автор: | Dimon456 [ Пт янв 11, 2019 15:04:19 ] |
Заголовок сообщения: | Re: Attiny2313 и PA0 |
Попробуем погадать... BUTTON_PRESS - это видимо нажатие кнопки, со с значением еще не определился. BUTTON_UNPRESS - это видимо отжали кнопку. а state_butt откуда берется? первичное состояние 0 или 1? А может так как объявлен тип unsigned char state_butt, тогда видимо от 0 до 255, но так как при объявлении unsigned char state_butt принимает значение 0, и опять если, опять если..., то возможно, что BUTTON_NOT_PRESS=0, а кто у нас экстрасенс, не подскажете? Полностью проект выложите. |
Автор: | alex1126 [ Пт янв 11, 2019 15:10:47 ] |
Заголовок сообщения: | Re: Attiny2313 и PA0 |
Там enum тип и button_notpress имеет нормальное значение. Но я вроде разобрался. Там (немного в другом месте) было сравнение знакового и беззнакоаого числа. Исправил - вроде вылечилось. Странно несколько, на мой взгляд.... погоняю сейчас |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |