geekhack
geekhack Projects => Making Stuff Together! => Topic started by: Criterus on Mon, 11 July 2016, 19:43:15
-
Thanks to Hasu pointing out some really obvious errors I got my TMK drivers to compile error free, but I've run into a couple issues I need some direction on.
When I initially plug in the keyboard it starts spitting out random characters. Once I press a key it stops, and after that I can press keys and most of them work fine including the ones that that were showing up before anything was pressed. I've looked everything over pretty thoroughly and I don't see any obvious shorts on the wiring. I've triple checked the pin out against my matrix.c file. All my diodes are facing the right direction.
Once I get it to stop randomly posting characters I have a hand full of keys that don't work in each row. :
t -
a g k +
v Enter
Space
Looking at my wiring a couple of these sets are in the same column:
T G V - all in the same column
- + [Enter] - all in the same column
I'm not sure if this is an issue with my code or an issue with the switches/wiring. I'd just like some input before I start d-soldering and replacing things.
Link to the whole folder: https://www.dropbox.com/s/f84nu3t28cd6z6y/50_Keyboard.zip?dl=0
Matrix.c :
/*
Copyright 2012 Jun Wako <wakojun@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/*
* scan matrix
*/
#include <stdint.h>
#include <stdbool.h>
#include <avr/io.h>
#include <util/delay.h>
#include "print.h"
#include "debug.h"
#include "util.h"
#include "matrix.h"
#ifndef DEBOUNCE
# define DEBOUNCE 5
#endif
static uint8_t debouncing = DEBOUNCE;
/* matrix state(1:on, 0:off) */
static matrix_row_t matrix[MATRIX_ROWS];
static matrix_row_t matrix_debouncing[MATRIX_ROWS];
static matrix_row_t read_cols(void);
static void init_cols(void);
static void unselect_rows(void);
static void select_row(uint8_t row);
inline
uint8_t matrix_rows(void)
{
return MATRIX_ROWS;
}
inline
uint8_t matrix_cols(void)
{
return MATRIX_COLS;
}
void matrix_init(void)
{
// initialize row and col
unselect_rows();
init_cols();
// initialize matrix state: all keys off
for (uint8_t i=0; i < MATRIX_ROWS; i++) {
matrix[i] = 0;
matrix_debouncing[i] = 0;
}
}
uint8_t matrix_scan(void)
{
for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
select_row(i);
_delay_us(30); // without this wait read unstable value.
matrix_row_t cols = read_cols();
if (matrix_debouncing[i] != cols) {
matrix_debouncing[i] = cols;
if (debouncing) {
debug("bounce!: "); debug_hex(debouncing); debug("\n");
}
debouncing = DEBOUNCE;
}
unselect_rows();
}
if (debouncing) {
if (--debouncing) {
_delay_ms(1);
} else {
for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
matrix[i] = matrix_debouncing[i];
}
}
}
return 1;
}
bool matrix_is_modified(void)
{
if (debouncing) return false;
return true;
}
inline
bool matrix_is_on(uint8_t row, uint8_t col)
{
return (matrix[row] & ((matrix_row_t)1<<col));
}
inline
matrix_row_t matrix_get_row(uint8_t row)
{
return matrix[row];
}
void matrix_print(void)
{
print("\nr/c 0123456789ABCDEF\n");
for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
phex(row); print(": ");
pbin_reverse16(matrix_get_row(row));
print("\n");
}
}
uint8_t matrix_key_count(void)
{
uint8_t count = 0;
for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
count += bitpop16(matrix[i]);
}
return count;
}
/* Column pin configuration
* col: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
* pin: B0 B1 B2 B3 B7 D1 D2 D3 C6 C7 D6 D7 B4 B5 B6 F7 (Rev.A)
* pin: // // // // // // // // // // // // // // // //
*/
static void init_cols(void)
{
// Input with pull-up(DDR:0, PORT:1)
DDRF &= ~(1<<7);
PORTF |= (1<<7);
//DDRE &= ~(1<<6);
//PORTE |= (1<<6);
DDRD &= ~(1<<7 |1<<6|1<<3 |1<<2 | 1<<1);
PORTD |= (1<<7 |1<<6|1<<3 |1<<2 | 1<<1);
DDRC &= ~(1<<7 | 1<<6);
PORTC |= (1<<7 | 1<<6);
DDRB &= ~(1<<7 | 1<<6 | 1<<5 | 1<< 4 | 1<<3 | 1<<2 | 1<<1 | 1<<0);
PORTB |= (1<<7 | 1<<6 | 1<<5 | 1<< 4 | 1<<3 | 1<<2 | 1<<1 | 1<<0);
}
static matrix_row_t read_cols(void)
{
return (PINB&(1<<0) ? 0 : (1<<0)) |
(PINB&(1<<1) ? 0 : (1<<1)) |
(PINB&(1<<2) ? 0 : (1<<2)) |
(PINB&(1<<3) ? 0 : (1<<3)) |
(PINB&(1<<7) ? 0 : (1<<4)) |
(PIND&(1<<0) ? 0 : (1<<5)) |
(PIND&(1<<1) ? 0 : (1<<6)) |
(PIND&(1<<2) ? 0 : (1<<7)) |
(PIND&(1<<3) ? 0 : (1<<8)) |
(PINC&(1<<6) ? 0 : (1<<9)) |
(PINC&(1<<7) ? 0 : (1<<10)) |
(PIND&(1<<7) ? 0 : (1<<11)) |
(PINB&(1<<4) ? 0 : (1<<12)) |
(PINB&(1<<5) ? 0 : (1<<13)) |
(PINB&(1<<6) ? 0 : (1<<14)) |
(PINF&(1<<7) ? 0 : (1<<15));
}
/* Row pin configuration
* row: 0 1 2 3
* pin: F6 F5 F4 F1
*/
static void unselect_rows(void)
{
// Hi-Z(DDR:0, PORT:0) to unselect
DDRF &= ~0b01110010;
PORTF &= ~0b01110010;
}
static void select_row(uint8_t row)
{
// Output low(DDR:1, PORT:0) to select
switch (row) {
case 0:
DDRF |= (1<<6);
PORTF &= ~(1<<6);
break;
case 1:
DDRF |= (1<<5);
PORTF &= ~(1<<5);
break;
case 2:
DDRF |= (1<<4);
PORTF &= ~(1<<4);
break;
case 3:
DDRF |= (1<<1);
PORTF &= ~(1<<1);
break;
}
}
Keymap_common.h
/*
Copyright 2012,2013 Jun Wako <wakojun@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef KEYMAP_COMMON_H
#define KEYMAP_COMMON_H
#include <stdint.h>
#include <stdbool.h>
#include <avr/pgmspace.h>
#include "keycode.h"
#include "action.h"
#include "action_macro.h"
#include "report.h"
#include "host.h"
#include "print.h"
#include "debug.h"
#include "keymap.h"
extern const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS];
extern const uint16_t fn_actions[];
/* GH60 keymap definition macro
* K2C, K31 and K3C are extra keys for ISO
*/
#define KEYMAP( \
K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K0F, \
K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1B, K1C, K1D, K1E, K1F, \
K20, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, K2E, K2F, \
K30, K31, K36, K39, K3A, K3B, K3D, K3E \
) {\
{ KC_##K00, KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07, KC_##K08, KC_##K09, KC_##K0A, KC_##K0B, KC_##K0C, KC_##K0D, KC_##K0E, KC_##K0F, }, \
{ KC_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_##K17, KC_##K18, KC_##K19, KC_NO, KC_##K1B, KC_##K1C, KC_##K1D, KC_##K1E, KC_##K1F, }, \
{ KC_##K20, KC_NO, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_##K27, KC_##K28, KC_##K29, KC_##K2A, KC_##K2B, KC_##K2C, KC_##K2D, KC_##K2E, KC_##K2F, }, \
{ KC_##K30, KC_##K31, KC_NO, KC_NO, KC_NO, KC_NO, KC_##K36, KC_NO, KC_NO, KC_##K39, KC_##K3A, KC_##K3B, KC_NO, KC_##K3D, KC_##K3E, KC_NO } \
}
#endif
Keymap_poker.c :
#include "keymap_common.h"
const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KEYMAP( ESC, Q, W, E, R, T, Y, U, I, O, P, BSPC, 7, 8, 9, MINS, \
TAB, A, S, D, F, G, H, J, K, L, ENT, 4, 5, 6, PPLS, \
LSFT, Z, X, C, V, B, N, M, QUOT, LBRC, DOT, 1, 2, 3, ENT, \
LCTL, LALT, SPC, FN0, RBRC, COMM, 0, DOT),
};
const uint16_t PROGMEM fn_actions[] = {};
LED.c (I just changed this to the F0 pin which isn't soldered to anything.
/*
Copyright 2012 Jun Wako <wakojun@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <avr/io.h>
#include "stdint.h"
#include "led.h"
void led_set(uint8_t usb_led)
{
if (usb_led & (1<<USB_LED_CAPS_LOCK)) {
// output low
DDRF |= (1<<0);
PORTF &= ~(1<<0);
} else {
// Hi-Z
DDRF &= ~(1<<0);
PORTF &= ~(1<<0);
}
}
-
I just had a look through your zip file, and the first thing that stood out to me was MATRIX_COLS seems to be off by one. The definition in config.h defines it as 15, but in your other code you use 16 columns. Not sure if that will fix all your problems, but it might help.
-
That did help. it got the outer most column to work for me. That has me down to 4 keys that were not working. 1 had a hairline crack that I couldn't see so it just wasn't making good contact. 3 are all in the same column so I'm going to re-solder that pin
Thanks flashjac
-
could we keep these problems to one thread please! it will make the forum easier to read instead of the same person starting a new thread each time they encounter a problem!
-
could we keep these problems to one thread please! it will make the forum easier to read instead of the same person starting a new thread each time they encounter a problem!
There's absolutely nothing wrong with starting a new thread for a new problem.
-
Your reading D0 without initializing it as input. That should solve the T column keys, cant see anything obvious in the Enter column keys
-
I found that D0 pin I just hadn't made it back to update the post. I currently have all my keys working. I'm on to getting my housing built. With any luck I'll have some pictures of the final product minus a matching usb to show off in the next couple days.