и НИКАКИХ АНТИДРЕБЕЗГОВ
Что это?
Ну да ну да.... скорей пользователь девайс разобъёт после пары дней глючащей кнопки. даже антивандальное исполнение не спасёт.так во втором нажатие кнопки будет зафиксировано
Тут тоже желательно аргументированных утверждений, а не бла бла.Alexeyslav писал(а):Ну да ну да.... скорей пользователь девайс разобъёт после пары дней глючащей кнопки. даже антивандальное исполнение не спасёт.так во втором нажатие кнопки будет зафиксировано
Хорошие кнопки с кондерами могут и не дребезжать, сталкивался с таким, вот только не знаю на долго ли их хватит без дребезгаГефестион писал(а):Чтобы зря не опрашивать её в цикле, если она нажимается редко. Плюс не будет гемора с многократным опросом кнопки за время её нажатия, поскольку прерывания происходят только по фронтам.
Не вопрос. Исходя из этой позиции, вы сидите ждете какой-то флаг. Работа МК судя по вашему производится зря, вхолостую. Временные задержки на основе счета тактов. Времянки какие угодно. От микросекунд, до секунд. И представляете, МК работает ЗРЯ! Парадокс, не правда ли?!Гефестион писал(а):Чтобы зря не опрашивать её в цикле, если она нажимается редко. Плюс не будет гемора с многократным опросом кнопки за время её нажатия, поскольку прерывания происходят только по фронтам.
Математика, закон Ома... кнопка - сопротивление контакта 0.1Ом, на конденсаторе в момент нажатия 5Вольт... калькулятор сами достанете? А для кнопки заявлен максимальный ток в 50мА. И усреднение тут не катит, ток разряда конденсатора будет таки потихоньку плавить конаткт и оставлять нагар. В итоге кнопка превращается в черт знает что.На чём основаны такие умозаключения? Аргументы будут?
Все люди у нас очень терпеливые и обладают железной выдержкой. Попробуйте к примеру поработать с планетом у которого нажатие регистрируется 9 раз из 10. Через 15 минут начинаешь присматриваться к стенке, как бы его так кинуть чтобы обои не поцарапать.Тут тоже желательно аргументированных утверждений, а не бла бла.
Alexeyslav писал(а):планетом
И тут придумал что-то своё и пытаешься это навесить на меня…Alexeyslav писал(а):Попробуйте к примеру поработать с планетом у которого нажатие регистрируется 9 раз из 10. Через 15 минут начинаешь присматриваться к стенке, как бы его так кинуть чтобы обои не поцарапать.
Код: Выделить всё
.cseg
//************************************************************************
Reset:
//------------------------------------------------------------------------
Clear_Registers
//------------------------------------------------------------------------
//------------------------------------------------------------------------
clr RCLR
ser r16
mov RSER, r16
clr FLAGS
//------------------------------------------------------------------------
//------------------------------------------------------------------------
Init_Stack // Инициализация стека.
//------------------------------------------------------------------------
//------------------------------------------------------------------------
Clear_SRAM // Очистка ОЗУ.
//------------------------------------------------------------------------
//------------------------------------------------------------------------
Init_System_Timer // Инициализация системного таймера.
//------------------------------------------------------------------------
//------------------------------------------------------------------------
Init_WDT
//------------------------------------------------------------------------
//------------------------------------------------------------------------
Init_Sleep_Mode
//------------------------------------------------------------------------
//----------------------------- Отладка ----------------------------------
#if (PROJECT==DEBUG)
sbi KEYS_PIN_HEAT_ON_OFF, KEY_HEAT_ON_OFF
sbi KEYS_PIN_FAN_UP, KEY_FAN_UP
sbi KEYS_PIN_FAN_DOWN, KEY_FAN_DOWN
sbi AC_OUT_PIN, AC_OUT
// sbi FIRE_SENS_PIN, FIRE_SENS
// sbi OVERHEAT_SENS_PIN, OVERHEAT_SENS
#endif
//==================
sei
//==================
Main:
wdr
rcall Service_Timers
rcall KBD_DRV
rcall Proc_Emerg_Sens
rcall Proc_Heater
rcall Proc_Fan
rcall Proc_ADC
rcall Proc_Pump
rcall Proc_Heat_Err
rjmp Main
//==================
Код: Выделить всё
.macro Scan_Keys
clrb FSM_FLAGS, KEYS_PRESSED_FLG
in r16, Keys_Pin
com r16
andi r16, Keys_Mask
cpi r16, 0
breq Scan_Keys_End
setb FSM_FLAGS, KEYS_PRESSED_FLG
Scan_Keys_End:
Save_Keys_Current
.endmacro
//==================
Kbd_Drv_Save_Val:
std Y+DISP_KEYS, FSM_STATE
std Y+DISP_KEYS_FLAGS, FSM_FLAGS
ret
//==================
//==================
Define_Keys:
sbrs FSM_FLAGS, DEFINE_KEYS_FLG
ret
Define_Keys_A:
clrb FSM_FLAGS, DEFINE_KEYS_FLG
ldz Table_Keys_Code*2
Read_Keys_Current
Define_Keys_Cycle:
lpm r17, Z+
cpi r17, 0xFF
brne Define_Keys_Cycle_A
ret
Define_Keys_Cycle_A:
cp r16, r17
breq Define_Keys_Equal
lpm r17, Z+
rjmp Define_Keys_Cycle
Define_Keys_Equal:
lpm r16, Z
std Y+DISP_KEYS_BUF, r16
ret
//==================
//==================
KBD_DRV:
pushiwl Kbd_Drv_Save_Val
pushiwl Define_Keys
ldy _KEYS
ldd FSM_STATE, Y+DISP_KEYS
ldd FSM_FLAGS, Y+DISP_KEYS_FLAGS
Scan_Keys // Макрос сканирование кнопок. Дефайнами подставляются нужные функции. Порт\Матрица\Несколько портов.
Proc_FSM Tab_FSM_KBD_DRV
Keys_Init:
ser r16
mov KEYS_PREV, r16
mov KEYS_CURRENT, r16
std Y+DISP_KEYS_BUF, r16
Set_State _KEYS_NONE
ret
Keys_None:
sbrs FSM_FLAGS, KEYS_PRESSED_FLG // Если что-то нажато, то пропуск команды.
ret
Read_Keys_Current
Save_Keys_Prev // Сохранение текущего состояния клавиатуры.
Set_Timer Par_Tim_Debounce_Delay // Установка задержки устранения дребезга.
Set_State _KEYS_DOWN
ret
Keys_Down:
Proc_Timer Par_Tim_Debounce_Delay
brtc Keys_Down_End
sbrs FSM_FLAGS, KEYS_PRESSED_FLG
rjmp Keys_Set_None
Comp_Last_Curr_Keys
breq Keys_Down_A
rjmp Keys_Set_None
Keys_Down_A:
setb FSM_FLAGS, DEFINE_KEYS_FLG
rjmp Keys_Set_Wait_Up
Keys_Down_End:
ret
Keys_Set_None:
Set_State _KEYS_NONE
ret
Keys_Set_Wait_Up:
Set_State _KEYS_WAIT_UP
ret
Keys_WAIT_UP:
sbrc FSM_FLAGS, KEYS_PRESSED_FLG
ret
Set_Timer Par_Tim_Debounce_Delay
Set_State _KEYS_UP
ret
Keys_UP:
Proc_Timer Par_Tim_Debounce_Delay
brtc Keys_UP_End
sbrc FSM_FLAGS, KEYS_PRESSED_FLG
rjmp Keys_Set_Wait_Up
Set_State _KEYS_NONE
Keys_UP_End:
ret
//==================
Table_Keys_Code:
.db 1<<KEY_HEAT_ON_OFF, KEY_COD_HEAT_ON_OFF
.db 1<<KEY_FAN_UP, KEY_COD_FAN_UP
.db 1<<KEY_FAN_DOWN, KEY_COD_FAN_DOWN
end_array
//==================