From 112037e40347a501be6c8216de2345d27d19329e Mon Sep 17 00:00:00 2001 From: Nicholas G Date: Fri, 3 Sep 2021 01:29:01 -0400 Subject: [PATCH] Added clkdiv debounce to encoders.pio --- README.md | 3 ++- build_uf2/Pico_Game_Controller.uf2 | Bin 71168 -> 71168 bytes src/encoders.pio | 6 +++++- src/pico_game_controller.c | 10 ++++++---- 4 files changed, 13 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 38fdfda..fc4495b 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ Currently working/fixed: - HID LEDs with Reactive LED fallback - sdvx/iidx spoof - Tested on EAC - 1000hz polling -- Reversable Encoders +- Reversable Encoders with debouncing - Switch and LED pins are now staggered for easier wiring - Fix 0-~71% encoder rollover in gamepad mode, uint32 max val isn't divisible evenly by ppr\*4 for joystick - thanks friends @@ -39,3 +39,4 @@ Thanks to: - https://github.com/Drewol/rp2040-gamecon for usb gamepad descriptor info. - https://github.com/veroxzik/arduino-konami-spoof for konami spoof usb descriptor info. - https://github.com/veroxzik/roxy-firmware for nkro descriptor and logic info. +- KyubiFox for bringing clkdiv to my attention for encoder debouncing \ No newline at end of file diff --git a/build_uf2/Pico_Game_Controller.uf2 b/build_uf2/Pico_Game_Controller.uf2 index 048bd735fc903e2ca9aaf156316dca0f7e6fb074..87b216cc8917c8d03c003399bb0ac0d857cabf29 100644 GIT binary patch delta 6908 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 diff --git a/src/encoders.pio b/src/encoders.pio index aa32893..c269748 100644 --- a/src/encoders.pio +++ b/src/encoders.pio @@ -34,7 +34,7 @@ send: .wrap % c-sdk { -static inline void encoders_program_init(PIO pio, uint sm, uint offset, uint pin) { +static inline void encoders_program_init(PIO pio, uint sm, uint offset, uint pin, bool debounce) { pio_sm_set_consecutive_pindirs(pio, sm, pin, 2, false); pio_gpio_init(pio, pin); pio_gpio_init(pio, pin+1); @@ -46,6 +46,10 @@ static inline void encoders_program_init(PIO pio, uint sm, uint offset, uint pin sm_config_set_jmp_pin(&c, pin +1); // Shift to left, autopull disabled sm_config_set_in_shift(&c, false, false, 2); + + // Debounce via reduced clock + if (debounce) + sm_config_set_clkdiv(&c, 5000); pio_sm_init(pio, sm, offset, &c); pio_sm_set_enabled(pio, sm, true); diff --git a/src/pico_game_controller.c b/src/pico_game_controller.c index 119d81c..aa6848c 100644 --- a/src/pico_game_controller.c +++ b/src/pico_game_controller.c @@ -16,9 +16,11 @@ #include "tusb.h" #include "usb_descriptors.h" -#define SW_GPIO_SIZE 11 // Number of switches -#define ENC_GPIO_SIZE 2 // Number of encoders -#define ENC_PPR 600 // Encoder PPR +#define SW_GPIO_SIZE 11 // Number of switches +#define ENC_GPIO_SIZE 2 // Number of encoders +#define ENC_PPR 600 // Encoder PPR +#define ENC_DEBOUNCE true // Encoder Debouncing + #define ENC_PULSE (ENC_PPR * 4) // 4 pulses per PPR #define ENC_ROLLOVER (ENC_PULSE * 2) // Delta Rollover threshold #define REACTIVE_TIMEOUT_MAX 100000 // Cycles before HID falls back to reactive @@ -270,7 +272,7 @@ void init() { enc_val[i] = 0; prev_enc_val[i] = 0; cur_enc_val[i] = 0; - encoders_program_init(pio, i, offset, ENC_GPIO[i]); + encoders_program_init(pio, i, offset, ENC_GPIO[i], ENC_DEBOUNCE); dma_channel_config c = dma_channel_get_default_config(i); channel_config_set_read_increment(&c, false);