From 3c1d050abbeed9803d7f5dac818577e8fd00e3fa Mon Sep 17 00:00:00 2001 From: Dave Date: Tue, 12 May 2020 17:09:49 -0500 Subject: [PATCH] Move F_CPU to header file and clean up 2560 read_row() code --- firmware/asdf/src/Arch/asdf_arch_atmega2560.c | 16 ++++++++++------ firmware/asdf/src/Arch/asdf_arch_atmega2560.h | 5 ++++- firmware/asdf/src/Arch/asdf_arch_atmega328p.c | 2 +- firmware/asdf/src/Arch/asdf_arch_atmega328p.h | 2 ++ 4 files changed, 17 insertions(+), 8 deletions(-) diff --git a/firmware/asdf/src/Arch/asdf_arch_atmega2560.c b/firmware/asdf/src/Arch/asdf_arch_atmega2560.c index 3ea6b15..117e17a 100644 --- a/firmware/asdf/src/Arch/asdf_arch_atmega2560.c +++ b/firmware/asdf/src/Arch/asdf_arch_atmega2560.c @@ -33,6 +33,7 @@ // 23-25 PORTC0-2 ROW outputs (row number) // 27 PORTC4 +#include "asdf_arch.h" #include #include @@ -40,7 +41,6 @@ #include #include "asdf_config.h" -#include "asdf_arch.h" #include "asdf_keymap_defs.h" // Tick is true every 1 ms. @@ -728,6 +728,10 @@ void asdf_arch_init(void) // "1". So, if a keypress pulls the column line low, then the reading of the // physical bits must be inverted. // +// 2) A small delay (2usec) is required between setting the keyboard row outputs +// and reading the columns, which I think is due to capacitance across the +// reverse-biased diodes. +// // SCOPE: public // // COMPLEXITY: 1 @@ -735,13 +739,13 @@ void asdf_arch_init(void) asdf_cols_t asdf_arch_read_row(uint8_t row) { uint32_t rows = ~(1L << row); - asdf_cols_t cols; + ASDF_LOROW_PORT = (uint8_t)(rows & 0xff); ASDF_HIROW_PORT = (uint8_t)((rows >> 8) & 0xff); - cols = ~(asdf_cols_t) ASDF_COLUMNS_PIN; - ASDF_HIROW_PORT = 0xff; - ASDF_LOROW_PORT = 0xff; - return cols; + + _delay_us(ASDF_KEYBOARD_ROW_SETTLING_TIME_US); + + return ~(asdf_cols_t) ASDF_COLUMNS_PIN; } // PROCEDURE: asdf_arch_osi_read_row diff --git a/firmware/asdf/src/Arch/asdf_arch_atmega2560.h b/firmware/asdf/src/Arch/asdf_arch_atmega2560.h index 112c67a..6145470 100644 --- a/firmware/asdf/src/Arch/asdf_arch_atmega2560.h +++ b/firmware/asdf/src/Arch/asdf_arch_atmega2560.h @@ -33,8 +33,11 @@ // ASDF keyboard definitions: -#define ASDF_STROBE_LENGTH_US 10 // strobe length in microseconds +#define F_CPU 16000000L +#define ASDF_STROBE_LENGTH_US 10 // strobe length in microseconds +#define ASDF_KEYBOARD_ROW_SETTLING_TIME_US 2 // time for keyboard capacitance to + // settle before sampling // Clock definitions: #define SYSCLK_DIV1 0 diff --git a/firmware/asdf/src/Arch/asdf_arch_atmega328p.c b/firmware/asdf/src/Arch/asdf_arch_atmega328p.c index bf7eb0e..bcc752f 100644 --- a/firmware/asdf/src/Arch/asdf_arch_atmega328p.c +++ b/firmware/asdf/src/Arch/asdf_arch_atmega328p.c @@ -33,13 +33,13 @@ // 23-25 PORTC0-2 ROW outputs (row number) // 27 PORTC4 +#include "asdf_arch.h" #include #include #include #include #include "asdf_config.h" -#include "asdf_arch.h" #include "asdf_keymap_defs.h" static volatile uint8_t tick = 0; diff --git a/firmware/asdf/src/Arch/asdf_arch_atmega328p.h b/firmware/asdf/src/Arch/asdf_arch_atmega328p.h index c61e509..46690a0 100644 --- a/firmware/asdf/src/Arch/asdf_arch_atmega328p.h +++ b/firmware/asdf/src/Arch/asdf_arch_atmega328p.h @@ -33,6 +33,8 @@ // ASDF keyboard definitions: +#define F_CPU 8000000L + #define ASDF_STROBE_LENGTH_US 10 // strobe length in microseconds