How to build your very own keyboard firmware
- Halvar
- Location: Baden, DE
- Main keyboard: IBM Model M SSK / Filco MT 2
- Favorite switch: Beam & buckling spring, Monterey, MX Brown
- DT Pro Member: 0051
Congratulations on getting it to work, that looks like a very nice keyboard. Beautiful keycaps!
IMO it's better to do the mapping on the side of the PC operating system. You could write macros for it in the firmware (i have no experience with this yet, but I know it's possible), but its much more of a hassle and rather unelegant if you ask me. There's a short documentation for that in Hasu's code repository.
IMO it's better to do the mapping on the side of the PC operating system. You could write macros for it in the firmware (i have no experience with this yet, but I know it's possible), but its much more of a hassle and rather unelegant if you ask me. There's a short documentation for that in Hasu's code repository.
- Ray
- Location: Germany
- Main mouse: touchpad
- DT Pro Member: -
It is quite a beauty!
I would personally do this in firmware, because then I will only have to do it once
TMK can't do that out of the box if you want shift reported to the OS normally, but it's 20 lines of code or so if your shift-layer is accessible on a normal keyboard with shift (as "+" is on the Numpad, i believe). On the OS-side though, you can do are not restricted by existing keyboard layouts.
But are the printed legends enough anyways? you might want to have tab and alt somewhere. Together with that awesome caps/func key.
I would personally do this in firmware, because then I will only have to do it once
TMK can't do that out of the box if you want shift reported to the OS normally, but it's 20 lines of code or so if your shift-layer is accessible on a normal keyboard with shift (as "+" is on the Numpad, i believe). On the OS-side though, you can do are not restricted by existing keyboard layouts.
But are the printed legends enough anyways? you might want to have tab and alt somewhere. Together with that awesome caps/func key.
-
- Location: Vancouver, Canada
- Main keyboard: HHKB Pro 2 At Work - IBM Model M 1391401 At Home
- Main mouse: G502
- Favorite switch: Topre Silenced / Buckling Spring
- DT Pro Member: -
Hey everyone,
Need a bit of help with loading my tmk keymap unto a keyboard.
I've just finished defining a keymap for a planck that I have coming in the mail. I don't have any of the other files, as the seller told me that they're already burned into the planck's controller. I followed some guides on how to define a keymap, and looked at examples of others, so as of now, all I have is this, in .txt form.
What are my next step's from here? If my understanding is correct, the last step would be to load a hex version of this unto the teensy using the loader. But I'm quite unsure as to how to transform this into the hex file.
Need a bit of help with loading my tmk keymap unto a keyboard.
I've just finished defining a keymap for a planck that I have coming in the mail. I don't have any of the other files, as the seller told me that they're already burned into the planck's controller. I followed some guides on how to define a keymap, and looked at examples of others, so as of now, all I have is this, in .txt form.
Code: Select all
#include "keymap_common.h"
const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = KEYMAP( /* QWERTY BASE */
TAB, Q, W, E, R, T, Y, U, I, O, P, BSPC,
LCTL, A, S, D, F, G, H, J, K, L, QUOT, ENT,
LSFT, Z, X, C, V, B, N, M, COMM, DOT, SLSH, FN3,
ESC, CAPS, LGUI, LALT, FN1, SPC, FN2, LEFT, DOWN, UP, RGHT),
[1] = KEYMAP( /* FN1 numbers, hold */
TRNS, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, TRNS,
TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, MINS, EQL, TRNS,
TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS,
TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS),
[2] = KEYMAP( /* FN2 numpad, toggle */
TRNS, NO, UP, NO, TRNS, TRNS, TRNS, 7, 8, 9, MINS, TRNS,
TRNS, LEFT, DOWN, RIGHT, TRNS, TRNS, TRNS, 4, 5, 6, FN4, TRNS,
TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, 1, 2, 3, ENT, TRNS,
TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, 0, DOT, ENT, TRNS),
[3] = KEYMAP( /* FN3 navigation, delete, hold down */
PSCR, MPRV, MPLY, MNXT, TRNS, NO, NO, NO, SCLN, UP, FN5, DELETE,
TRNS, VOLD, VOLU, MUTE, TRNS, NO, HOME, PGUP, LEFT, RGHT, NO, TRNS,
TRNS, TRNS, TRNS, TRNS, TRNS, NO, END, PGDN, DOWN, LBRC, RBRC, TRNS,
TRNS, TRNS, TRNS, TRNS, TRNS, NO, NO, NO, NO, NO, NO),
};
const uint16_t PROGMEM fn_actions[] = {
[1] = ACTION_LAYER_MOMENTARY(1),
[2] = ACTION_LAYER_TOGGLE(2),
[3] = ACTION_LAYER_MOMENTARY(3),
[4] = ACTION_MODS_KEY(MOD_LSFT, KC_EQL),
[5] = ACTION_MODS_KEY(MOD_LSFT, KC_SCLN),
};
- Ray
- Location: Germany
- Main mouse: touchpad
- DT Pro Member: -
with tmk, you have to compile the whole thing – not only the keymap – to a .hex (you should be able to find info of how to do that)
that's different e.g. with soarer's, where the keymap is not part of the firmware itself, but more like a configfile for it.
that's different e.g. with soarer's, where the keymap is not part of the firmware itself, but more like a configfile for it.
-
- Main keyboard: Steelseries 6Gv2 w/ DSA Dolch
- Main mouse: Logitech MX Performance
- DT Pro Member: -
You need to compile the code. If you look at the start of the first part of the guide it says to download and install WinAVR, and near the end of the second part it talks about compiling with the command make -f Makefile in a command prompt, that will produce the hex file.Caeyden wrote: ↑What are my next step's from here? If my understanding is correct, the last step would be to load a hex version of this unto the teensy using the loader. But I'm quite unsure as to how to transform this into the hex file.
Key caps are double-shot ABS, the orange BASIC function legends on the front are dye-sub or something like that. The switches are inverted cross futaba's, so close to MX mount but too fat.Halvar wrote: ↑Congratulations on getting it to work, that looks like a very nice keyboard. Beautiful keycaps!
IMO it's better to do the mapping on the side of the PC operating system. You could write macros for it in the firmware (i have no experience with this yet, but I know it's possible), but its much more of a hassle and rather unelegant if you ask me. There's a short documentation for that in Hasu's code repository.
Well my project is to turn the Acorn Electron into a computer with a Raspberry Pi 2 in it (maybe a Intel NUC later on), converting the keyboard to USB is the first part of that. I also plan to wire up a switching USB cable so the keyboard can be used for the Pi, or as a standalone keyboard on any other PC with a USB-B or Mini-USB port on the back.
So with that in mind i wanted it all in firmware so it can be used on anything.
I'll try and do it in firmware as i'd prefer it that way as well, i'll just have to play around and see what i can do.Ray wrote: ↑It is quite a beauty!
I would personally do this in firmware, because then I will only have to do it once
TMK can't do that out of the box if you want shift reported to the OS normally, but it's 20 lines of code or so if your shift-layer is accessible on a normal keyboard with shift (as "+" is on the Numpad, i believe). On the OS-side though, you can do are not restricted by existing keyboard layouts.
But are the printed legends enough anyways? you might want to have tab and alt somewhere. Together with that awesome caps/func key.
I know about the OS side being more flexible with stuff like AHK, i use it on my main board since i have DSA Dolch caps on a UK board so i made a program so the output matches the caps.
There aren't really enough keys for a fully functional layout but it's good enough. I probably won't be using the board a lot, i just like doing projects and this was part of the larger one i'm doing.
-
- Location: Vancouver, Canada
- Main keyboard: HHKB Pro 2 At Work - IBM Model M 1391401 At Home
- Main mouse: G502
- Favorite switch: Topre Silenced / Buckling Spring
- DT Pro Member: -
I see! So even though I've made the keymap myself, I still have to run through the entire process using the guide? That shouldn't be too hard then.
-
- DT Pro Member: -
this thread has helped a ton getting things setup here, but I think I'm hitting a wall & not sure if it's a simple thing I'm overlooking or more complicated.
I'm working on using a Teensy 2.0 w/ Hasu's firmware to convert a Toshiba T3100e keyboard to USB,
it has a 22 pin ribbon cable off the keyboard, according to the T3100e manual it looks to have 11 columns and 8 rows (& 3 common grounds). It also has the column pins are marked as OUT and rows are IN. (im assuming SC is column and RTN is row)
I checked continuity for all the keys with the 22 pins and determined the key layout in rows/columns in a spreadsheet, i need to finish marking the keys K** to match up with my code...
When I first tested the keyboard using 11 columns and 8 rows, I got no keys working, and also no voltage drops at a row's pin, when a row is trigged by pressing the relevant key.
So because of that I assumed the diodes are facing the opposite way..
so then swapped around the rows and columns in code, so it has 11 rows and 8 columns:
this is the current keymap_common.h
Now with that change, some keys do things, but none of them are correct, and the only unique character/codes i can get are the following (I tested all keys), they don't seem to relate to any sort of pattern in the rows/columns either...
3 f d n e b 4 a g , END 5 F6
(I also highlighted them blue in the spreadsheet above)
When I check the voltage on the row pins, it is dropping correctly when a row is activated- so for example I can press any key of a specific row, and that row's pin on the Teensy pcb will drop in voltage, which I believe means my wiring is correct/
But as far as where to go from here, I'm feeling stuck, I've been doing changes in code, like reversing the ordering of rows or columns but having no luck so far..
I've also tried disabling NKRO and enabling matrix_has_ghost and playing around with other config options
any suggestions are extremely appreciated!!
here is the important matrix.c
this is my keymap.c
I'm working on using a Teensy 2.0 w/ Hasu's firmware to convert a Toshiba T3100e keyboard to USB,
it has a 22 pin ribbon cable off the keyboard, according to the T3100e manual it looks to have 11 columns and 8 rows (& 3 common grounds). It also has the column pins are marked as OUT and rows are IN. (im assuming SC is column and RTN is row)
I checked continuity for all the keys with the 22 pins and determined the key layout in rows/columns in a spreadsheet, i need to finish marking the keys K** to match up with my code...
When I first tested the keyboard using 11 columns and 8 rows, I got no keys working, and also no voltage drops at a row's pin, when a row is trigged by pressing the relevant key.
So because of that I assumed the diodes are facing the opposite way..
so then swapped around the rows and columns in code, so it has 11 rows and 8 columns:
this is the current keymap_common.h
Code: Select all
#define KEYMAP( \
K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, \
K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \
K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, K2E, \
K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, \
K40, K41, K42, K43, K44, K45, K46, K47, K48, K49, K4A, K4B, K4C, K4D, \
K50, K51, K52, K53, K54, K55, K56, K57, K58, K59 \
) { \
{ KC_##K01, KC_##K0B, KC_##K03, KC_##K3D, KC_##K05, KC_##K07, KC_##K09, KC_##K4D },\
{ KC_##K02, KC_##K0C, KC_##K04, KC_##K2E, KC_##K06, KC_##K08, KC_##K0A, KC_##K50 },\
{ KC_##K00, KC_##K10, KC_##K20, KC_##K21, KC_##K31, KC_##K30, KC_##K40, KC_##K2D },\
{ KC_##K11, KC_##K12, KC_##K22, KC_##K23, KC_##K32, KC_##K33, KC_##K41, KC_##K42 },\
{ KC_##K13, KC_##K14, KC_##K24, KC_##K25, KC_##K34, KC_##K35, KC_##K44, KC_##K43 },\
{ KC_##K15, KC_##K16, KC_##K26, KC_##K27, KC_##K36, KC_##K45, KC_##K46, KC_##K53 },\
{ KC_##K17, KC_##K18, KC_##K28, KC_##K29, KC_##K37, KC_##K38, KC_##K48, KC_##K47 },\
{ KC_##K19, KC_##K1A, KC_##K2A, KC_##K57, KC_##K39, KC_##K3A, KC_##K49, KC_##K56 },\
{ KC_##K1B, KC_##K4C, KC_##K2B, KC_##K2C, KC_##K59, KC_##K3B, KC_##K4A, KC_##K51 },\
{ KC_##K1C, KC_##K58, KC_NO, KC_##K3C, KC_##K54, KC_##K4B, KC_##K0D, KC_##K55 },\
{ KC_##K0E, KC_##K52, KC_##K1D, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO } \
3 f d n e b 4 a g , END 5 F6
(I also highlighted them blue in the spreadsheet above)
When I check the voltage on the row pins, it is dropping correctly when a row is activated- so for example I can press any key of a specific row, and that row's pin on the Teensy pcb will drop in voltage, which I believe means my wiring is correct/
But as far as where to go from here, I'm feeling stuck, I've been doing changes in code, like reversing the ordering of rows or columns but having no luck so far..
I've also tried disabling NKRO and enabling matrix_has_ghost and playing around with other config options
any suggestions are extremely appreciated!!
here is the important matrix.c
Code: Select all
/* Column pin configuration
* col: 0 1 2 3 4 5 6 7
* pin: F4 F5 F6 F7 B6 B5 B4 D7
*/
static void init_cols(void)
{
// Input with pull-up(DDR:0, PORT:1)
DDRF &= ~(1<<7 | 1<<6 | 1<<5 | 1<<4 );
PORTF |= (1<<7 | 1<<6 | 1<<5 | 1<<4 );
DDRB &= ~(1<<6 | 1<<5 | 1<<4 );
PORTB |= (1<<6 | 1<<5 | 1<<4 );
DDRD &= ~(1<<7 );
PORTD |= (1<<7 );
}
static matrix_row_t read_cols(void)
{
return (PINF&(1<<4) ? 0 : (1<<0)) |
(PINF&(1<<5) ? 0 : (1<<1)) |
(PINF&(1<<6) ? 0 : (1<<2)) |
(PINF&(1<<7) ? 0 : (1<<3)) |
(PINB&(1<<6) ? 0 : (1<<4)) |
(PINB&(1<<5) ? 0 : (1<<5)) |
(PINB&(1<<4) ? 0 : (1<<6)) |
(PIND&(1<<7) ? 0 : (1<<7));
}
/* Row pin configuration
* row: 0 1 2 3 4 5 6 7 8 9 10
* pin: B0 B1 B2 B3 B7 D0 D1 D2 D3 C6 C7
*/
static void unselect_rows(void)
{
// Hi-Z(DDR:0, PORT:0) to unselect
DDRB &= ~0b10001111;
PORTB &= ~0b10001111;
DDRD &= ~0b00001111;
PORTD &= ~0b00001111;
DDRC &= ~0b11000000;
PORTC &= ~0b11000000;
}
static void select_row(uint8_t row)
{
// Output low(DDR:1, PORT:0) to select
switch (row) {
case 0:
DDRB |= (1<<0);
PORTB &= ~(1<<0);
break;
case 1:
DDRB |= (1<<1);
PORTB &= ~(1<<1);
break;
case 2:
DDRB |= (1<<2);
PORTB &= ~(1<<2);
break;
case 3:
DDRB |= (1<<3);
PORTB &= ~(1<<3);
break;
case 4:
DDRB |= (1<<7);
PORTB &= ~(1<<7);
break;
case 5:
DDRD |= (1<<0);
PORTD &= ~(1<<0);
break;
case 6:
DDRD |= (1<<1);
PORTD &= ~(1<<1);
break;
case 7:
DDRD |= (1<<2);
PORTD &= ~(1<<2);
break;
case 8:
DDRD |= (1<<3);
PORTD &= ~(1<<3);
break;
case 9:
DDRC |= (1<<6);
PORTC &= ~(1<<6);
break;
case 10:
DDRC |= (1<<7);
PORTC &= ~(1<<7);
break;
}
}
Code: Select all
const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* 0: qwerty */
KEYMAP(ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, NLCK, SLCK, PSCR, TRNS,\
1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS, EQL, BSPC, HOME,\
TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC, RBRC, BSLS, PGUP,\
LCTL, A, S, D, F, G, H, J, K, L, SCLN, QUOT, ENT, PGDN,\
LSFT, Z, X, C, V, B, N, M, COMM, DOT, SLSH, RSFT, UP, END, \
LALT, CAPS, FN0, SPC, GRV, INS, DEL, LEFT, DOWN, RGHT),
};
- Ray
- Location: Germany
- Main mouse: touchpad
- DT Pro Member: -
well, that's strange. If it is on software or on hardware, either way, it would be related to rows/columns…XRA wrote:Now with that change, some keys do things, but none of them are correct, and the only unique character/codes i can get are the following (I tested all keys), they don't seem to relate to any sort of pattern in the rows/columns either...
Can you check that the pins in matrix.c are the actual ones connected to the ribbon cable?
keymap_common.h looks good enough, as does keymap.c
as long as it compiles, your problem doesn't sit there.
to sum it up:
you got a keyboard matrix where you tested every switch for continuity at the ribbon cables. You double checked the rows/colums while doing so.
you got a KEYMAP that fits that.
only 13 keys register something.
at that point I would double check my wireing and soldering.
and check if my changes in code are actually compiled.
-
- DT Pro Member: -
thanks for the suggestions! I started making sure it was compiling my changes, I ended up clearing some unused files, (all the keymap c's i wasnt using since i started with the gh60), as a result I modified the makefile to point to just the specific keymap.cRay wrote: ↑well, that's strange. If it is on software or on hardware, either way, it would be related to rows/columns…
Can you check that the pins in matrix.c are the actual ones connected to the ribbon cable?
keymap_common.h looks good enough, as does keymap.c
as long as it compiles, your problem doesn't sit there.
to sum it up:
you got a keyboard matrix where you tested every switch for continuity at the ribbon cables. You double checked the rows/colums while doing so.
you got a KEYMAP that fits that.
only 13 keys register something.
at that point I would double check my wireing and soldering.
and check if my changes in code are actually compiled.
there still wasn't a difference, but then while looking in the makefile I tried commenting out these lines:
Code: Select all
#BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000)
#MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
#EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
I'm not exactly sure why those build options were causing trouble for me, but I'm really glad it is working finally!
- Eszett
- Location: Germany
- Main keyboard: Filco Majestouch 2 TKL DE MX blue
- Main mouse: Logitech MX Master 2S
- DT Pro Member: -
Can someone help me with this configuration problem:
Here my configuration files.
My guess would be, that it has to do with hexadecimal counting, because col17 and col18 don't work anymore. All the other keys on the keyboard work. It is a software problem, no hardware problem, because the same hardware worked flawlessly before with Soarer's firmware. - hasu
- Location: Japan
- Main keyboard: HHKB
- Main mouse: HHKB
- Favorite switch: Topre
- DT Pro Member: -
Probably this code are handled 16bit integer and col16 and col17 bit are ignored.
https://github.com/tmk/tmk_keyboard/wik ... -beyond-16
https://github.com/tmk/tmk_keyboard/wik ... -beyond-16
Code: Select all
static matrix_row_t read_cols(void)
{
return (PINF&(1<<1) ? 0 : (1<<0)) |
(PINF&(1<<0) ? 0 : (1<<1)) |
(PINE&(1<<6) ? 0 : (1<<2)) |
(PIND&(1<<5) ? 0 : (1<<3)) |
(PINC&(1<<7) ? 0 : (1<<4)) |
(PINC&(1<<6) ? 0 : (1<<5)) |
(PIND&(1<<3) ? 0 : (1<<6)) |
(PIND&(1<<2) ? 0 : (1<<7)) |
(PIND&(1<<1) ? 0 : (1<<8)) |
(PIND&(1<<0) ? 0 : (1<<9)) |
(PINB&(1<<7) ? 0 : (1<<10)) |
(PINB&(1<<3) ? 0 : (1<<11)) |
(PINB&(1<<2) ? 0 : (1<<12)) |
(PINB&(1<<1) ? 0 : (1<<13)) |
(PINB&(1<<0) ? 0 : (1<<14)) |
(PIND&(1<<4) ? 0 : (1<<15)) |
(PIND&(1<<7) ? 0 : (1<<16)) |
(PINB&(1<<4) ? 0 : (1<<17));
}
- Eszett
- Location: Germany
- Main keyboard: Filco Majestouch 2 TKL DE MX blue
- Main mouse: Logitech MX Master 2S
- DT Pro Member: -
Hi hasu. That was it, it works now! I changed to "1UL<<...". Cheers!
Code: Select all
static matrix_row_t read_cols(void)
{
return (PINF&(1<<1) ? 0 : (1UL<<0)) |
(PINF&(1<<0) ? 0 : (1UL<<1)) |
(PINE&(1<<6) ? 0 : (1UL<<2)) |
(PIND&(1<<5) ? 0 : (1UL<<3)) |
(PINC&(1<<7) ? 0 : (1UL<<4)) |
(PINC&(1<<6) ? 0 : (1UL<<5)) |
(PIND&(1<<3) ? 0 : (1UL<<6)) |
(PIND&(1<<2) ? 0 : (1UL<<7)) |
(PIND&(1<<1) ? 0 : (1UL<<8)) |
(PIND&(1<<0) ? 0 : (1UL<<9)) |
(PINB&(1<<7) ? 0 : (1UL<<10)) |
(PINB&(1<<3) ? 0 : (1UL<<11)) |
(PINB&(1<<2) ? 0 : (1UL<<12)) |
(PINB&(1<<1) ? 0 : (1UL<<13)) |
(PINB&(1<<0) ? 0 : (1UL<<14)) |
(PIND&(1<<4) ? 0 : (1UL<<15)) |
(PIND&(1<<7) ? 0 : (1UL<<16)) |
(PINB&(1<<4) ? 0 : (1UL<<17));
}
-
- Main keyboard: Pok3r Clears
- Main mouse: Anker Ergo
- Favorite switch: MX Clear
- DT Pro Member: -
I just built a Quark and I'm trying to compile my firmware but I am winding up with this error and I can't figure out what's wrong:
Here is my keymap_poker file:keymap_poker.c:10: error: expected '}' before '{' token
make: *** [obj_gh60_lufa/keymap_poker.o] Error 1
And my keymap_common file:#include "keymap_common.h"
const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* 0: qwerty */
KEYMAP(ESC, Q, W, E, R, T, Y, U, I, O, P, BSPC,
TAB, A, S, D, F, G, H, J, K, L, ENT,
FN1, LSFT, Z, X, C, V, B, N, M, COMM, DOT, LSFT,
LCTL, LALT, PAUSE, FN2, SPC, FN1, COPY, PASTE, UNDO)
/* 1: FN 1 */
KEYMAP(TRNS, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, DEL,
TRNS, VOLUP, VOLDOWN, MUTE, TRNS, LBRC, RBRC, BSLS, MINS, EQL, TRNS,
TRNS, TRNS, TRNS, TRNS, TRNS, GRAVE, SCLN, QUOT, SLSH, HOME, PGUP, TRNS,
TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, END, PGDN, TRNS)
/* 2: FN 2 */
KEYMAP(TRNS, F1, F2, F3, F4, F5, F6, F7, F8, F9, F0, TRNS,
TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS,
TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, UP, TRNS,
TRNS, LGUI, TRNS, TRNS, TRNS, TRNS, LEFT, DOWN, RGHT)
};
const uint16_t PROGMEM fn_actions[] = {
[0] = ACTION_LAYER_MOMENTARY(1),
};
Thanks for any help!/* 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, \
K10, K11, K12, K13, K14, K15, K16, K18, K19, K1A, K1B, \
K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, \
K30, K31, K32, K34, K35, K38, K39, K3A, K3B \
) { \
{ 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_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_NO, KC_##K18, KC_##K19, KC_##K1A, KC_##K1B }, \
{ KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_##K27, KC_##K28, KC_##K29, KC_##K2A, KC_##K2B }, \
{ KC_##K30, KC_##K31, KC_##K32, KC_NO, KC_##K34, KC_##K35, KC_NO, KC_NO, KC_##K38, KC_##K39, KC_##K3A, KC_##K3B }, \
}
-
- Main keyboard: Pok3r Clears
- Main mouse: Anker Ergo
- Favorite switch: MX Clear
- DT Pro Member: -
I put semicolons where you described and I got:
keymap_poker.c:8: error: expected '}' before ';' token
make: *** [obj_gh60_lufa/keymap_poker.o] Error 1
-
- Main keyboard: Pok3r Clears
- Main mouse: Anker Ergo
- Favorite switch: MX Clear
- DT Pro Member: -
Figured it out thanks to you Shaymdev, there were supposed to be comma's after each (...) on the poker_keymap. Time to flash, cross your fingers for me!
-
- Main keyboard: Pok3r Clears
- Main mouse: Anker Ergo
- Favorite switch: MX Clear
- DT Pro Member: -
So, I flashed the firmware and the keyboard goes crazy firing random keys and freaking out in general. Here are all of the files that I edited. Thanks for any help!
https://gist.github.com/ambergrismonger ... 068cc09a1b
https://gist.github.com/ambergrismonger ... 068cc09a1b
-
- Main keyboard: CM Storm
- Main mouse: Kinzu v3
- Favorite switch: Blue
- DT Pro Member: -
Could Someone help me compile my code? I have no clue how to and I honestly don't understand how I would go about compiling it. Any help or advice or tutorial would be greatly appreciated. I modified all the code in the gh60 directory and the poker keymap directory, just like the tutorial, however I don't know how or what to do to open the GNU GCC compiler or terminal and then turn it into a hex file.
Thanks
Thanks
-
- Main keyboard: Pok3r Clears
- Main mouse: Anker Ergo
- Favorite switch: MX Clear
- DT Pro Member: -
I figured out my first issue and got my keyboard working! Unfortunately the fn buttons aren't working. When I press the FN1 key it registers as an 8 keypress and when I press FN2 it registers as g. Any idea what's going on here? Everything else seems to be firing right.
-
- Main keyboard: CM Storm
- Main mouse: Kinzu v3
- Favorite switch: Blue
- DT Pro Member: -
So I figured out how to compile my code, however now I get errors saying that say this
No idea what its doing and I've tried getting the newest firmware from github, still no success.
Code: Select all
-------- begin --------
avr-gcc (WinAVR 20100110) 4.3.3
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
mkdir -p obj_gh60_lufa
Compiling C: keymap_poker.c
avr-gcc -c -mmcu=atmega32u4 -gdwarf-2 -DF_CPU=16000000UL -DINTERRUPT_CONTROL_ENDPOINT -DBOOTLOADER_SIZE=4096 -DF_USB=16000000UL -DARCH=ARCH_AVR8 -DUSB_DEVICE_ONLY -DUSE_FLASH_DESCRIPTORS -DUSE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)" -DFIXED_CONTROL_ENDPOINT_SIZE=8 -DFIXED_NUM_CONFIGURATIONS=1 -DPROTOCOL_LUFA -DBOOTMAGIC_ENABLE -DMOUSEKEY_ENABLE -DMOUSE_ENABLE -DEXTRAKEY_ENABLE -DCONSOLE_ENABLE -DCOMMAND_ENABLE -DNKRO_ENABLE -DVERSION=unknown -Os -funsigned-char -funsigned-bitfields -ffunction-sections -fdata-sections -fno-inline-small-functions -fpack-struct -fshort-enums -fno-strict-aliasing -Wall -Wstrict-prototypes -Wa,-adhlns=obj_gh60_lufa/keymap_poker.lst -I. -I../../tmk_core -I../../tmk_core/protocol/lufa -I../../tmk_core/protocol/lufa/LUFA-git -I../../tmk_core/common -std=gnu99 -include config.h -MMD -MP -MF .dep/obj_gh60_lufa_keymap_poker.o.d keymap_poker.c -o obj_gh60_lufa/keymap_poker.o
In file included from keymap_poker.c:1:
keymap_poker.c:5: warning: implicit declaration of function 'KEYMAP'
keymap_poker.c:5: error: 'ESC' undeclared here (not in a function)
keymap_poker.c:5: error: 'MINS' undeclared here (not in a function)
keymap_poker.c:5: error: 'EQL' undeclared here (not in a function)
keymap_poker.c:5: error: 'BSPC' undeclared here (not in a function)
keymap_poker.c:5: error: 'PGUP' undeclared here (not in a function)
keymap_poker.c:6: error: 'TAB' undeclared here (not in a function)
keymap_poker.c:6: error: 'Q' undeclared here (not in a function)
keymap_poker.c:6: error: 'W' undeclared here (not in a function)
keymap_poker.c:6: error: 'E' undeclared here (not in a function)
keymap_poker.c:6: error: 'R' undeclared here (not in a function)
keymap_poker.c:6: error: 'T' undeclared here (not in a function)
keymap_poker.c:6: error: 'Y' undeclared here (not in a function)
keymap_poker.c:6: error: 'U' undeclared here (not in a function)
keymap_poker.c:6: error: 'I' undeclared here (not in a function)
keymap_poker.c:6: error: 'O' undeclared here (not in a function)
keymap_poker.c:6: error: 'P' undeclared here (not in a function)
keymap_poker.c:6: error: 'LBRC' undeclared here (not in a function)
keymap_poker.c:6: error: 'RBRC' undeclared here (not in a function)
keymap_poker.c:6: error: 'BSLS' undeclared here (not in a function)
keymap_poker.c:6: error: 'PGDN' undeclared here (not in a function)
keymap_poker.c:7: error: expected ')' before 'CAPS'
keymap_poker.c:7: warning: missing braces around initializer
keymap_poker.c:7: warning: (near initialization for 'keymaps[0]')
keymap_poker.c:7: error: initializer element is not constant
keymap_poker.c:7: error: (near initialization for 'keymaps[0][0][0]')
keymap_poker.c:11: error: 'MUTE' undeclared here (not in a function)
keymap_poker.c:11: error: 'F1' undeclared here (not in a function)
keymap_poker.c:11: error: 'F2' undeclared here (not in a function)
keymap_poker.c:11: error: 'F3' undeclared here (not in a function)
keymap_poker.c:11: error: 'F4' undeclared here (not in a function)
keymap_poker.c:11: error: 'F5' undeclared here (not in a function)
keymap_poker.c:11: error: 'F6' undeclared here (not in a function)
keymap_poker.c:11: error: 'F7' undeclared here (not in a function)
keymap_poker.c:11: error: 'F8' undeclared here (not in a function)
keymap_poker.c:11: error: 'F9' undeclared here (not in a function)
keymap_poker.c:11: error: 'F10' undeclared here (not in a function)
keymap_poker.c:11: error: 'F11' undeclared here (not in a function)
keymap_poker.c:11: error: 'F12' undeclared here (not in a function)
keymap_poker.c:11: error: 'VOLU' undeclared here (not in a function)
keymap_poker.c:11: error: 'VOLD' undeclared here (not in a function)
keymap_poker.c:12: error: 'TRNS' undeclared here (not in a function)
keymap_poker.c:12: error: 'UP' undeclared here (not in a function)
keymap_poker.c:12: error: 'DEL' undeclared here (not in a function)
keymap_poker.c:13: error: 'MYCM' undeclared here (not in a function)
keymap_poker.c:13: error: 'LEFT' undeclared here (not in a function)
keymap_poker.c:13: error: 'RGHT' undeclared here (not in a function)
keymap_poker.c:14: error: 'CALC' undeclared here (not in a function)
keymap_poker.c:14: error: 'HOME' undeclared here (not in a function)
keymap_poker.c:14: error: 'DOWN' undeclared here (not in a function)
keymap_poker.c:15: error: 'LGUI' undeclared here (not in a function)
keymap_poker.c:15: error: 'RCTL' undeclared here (not in a function)
keymap_poker.c:11: error: initializer element is not constant
keymap_poker.c:11: error: (near initialization for 'keymaps[0][0][1]')
make.exe: *** [obj_gh60_lufa/keymap_poker.o] Error 1
- Halvar
- Location: Baden, DE
- Main keyboard: IBM Model M SSK / Filco MT 2
- Favorite switch: Beam & buckling spring, Monterey, MX Brown
- DT Pro Member: 0051
The important part are the first error messages shown:
So what's going on in your keymap_poker.c file around line around line 5?
Show us the first 10 lines or so...
Code: Select all
In file included from keymap_poker.c:1:
keymap_poker.c:5: warning: implicit declaration of function 'KEYMAP'
Show us the first 10 lines or so...
-
- Main keyboard: CM Storm
- Main mouse: Kinzu v3
- Favorite switch: Blue
- DT Pro Member: -
Thanks for responding! So I got all the code to compile now however, after loading it onto my teensy, the bottom three rows dont work! The top two work fine, yet the last three arn't working properly. Instead of normal output, some of the keys open the start menu, while others are acting as arrow keys. I checked all the wiring and I can't find a short.Halvar wrote: ↑The important part are the first error messages shown:
So what's going on in your keymap_poker.c file around line around line 5?Code: Select all
In file included from keymap_poker.c:1: keymap_poker.c:5: warning: implicit declaration of function 'KEYMAP'
Show us the first 10 lines or so...
Here is all my code
Keymap common.h
Code: Select all
/*
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( \
K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K0F, \
K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E, K1F, \
K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, K2F, \
K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3D, K3E, K3F, \
K40, K41, K42, K46, K4A, K4B, K4C, K4D, K4E, K4F \
) { \
{ KC_NO , 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_NO , KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_##K17, KC_##K18, KC_##K19, KC_##K1A, KC_##K1B, KC_##K1C, KC_##K1D, KC_##K1E, KC_##K1F }, \
{ KC_NO , KC_##K21, 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_NO, KC_##K2F }, \
{ KC_NO , KC_##K31, KC_##K32, KC_##K33, KC_##K34, KC_##K35, KC_##K36, KC_##K37, KC_##K38, KC_##K39, KC_##K3A, KC_##K3B, KC_NO, KC_##K3D, KC_##K3E, KC_##K3F }, \
{ KC_##K40, KC_##K41, KC_##K42, KC_NO, KC_NO, KC_NO, KC_##K46, KC_NO, KC_NO, KC_NO, KC_##K4A, KC_##K4B, KC_##K4C, KC_##K4D, KC_##K4E, KC_##K4F } \
}
/* ANSI valiant. No extra keys for ISO */
#define KEYMAP_ANSI( \
K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, \
K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \
K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2D, \
K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3D, \
K40, K41, K42, K45, K4A, K4B, K4C, K4D \
) KEYMAP( \
K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, \
K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \
K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, NO, K2D, \
K30, NO, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, NO, K3D, \
K40, K41, K42, K45, NO, K4A, K4B, K4C, K4D \
)
#define KEYMAP_HHKB( \
K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K49,\
K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \
K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2D, \
K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3D, K3C, \
K40, K41, K42, K45, K4A, K4B, K4C, K4D \
) KEYMAP( \
K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, \
K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \
K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, NO, K2D, \
K30, NO, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, \
K40, K41, K42, K45, K49, K4A, K4B, K4C, K4D \
)
#endif
Code: Select all
/*
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
* pin: F0 F1 E6 C7 C6 B6 D4 B1 B0 B5 B4 D7 D6 B3 (Rev.A)
* pin: B7 (Rev.B)
*/
static void init_cols(void)
{
// Input with pull-up(DDR:0, PORT:1)
DDRF &= ~(1<<7);
PORTF |= (1<<7);
DDRD &= ~(1<<5 | 1<<4 | 1<<3 | 1<<2 | 1<<1 | 1<<0);
PORTD |= (1<<5 | 1<<4 | 1<<3 | 1<<2 | 1<<1 | 1<<0);
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)) | // Rev.A and B
(PIND&(1<<4) ? 0 : (1<<9)) |
(PINF&(1<<7) ? 0 : (1<<10)) |
(PINB&(1<<6) ? 0 : (1<<11)) |
(PINB&(1<<4) ? 0 : (1<<12)) |
(PINB&(1<<5) ? 0 : (1<<13)) |
(PIND&(1<<5) ? 0 : (1<<14)) |
(PINC&(1<<7) ? 0 : (1<<15));
}
/* Row pin configuration
* row: 0 1 2 3 4
* pin: D0 D1 D2 D3 D5
*/
static void unselect_rows(void)
{
// Hi-Z(DDR:0, PORT:0) to unselect
DDRF &= ~0b01110011;
PORTF &= ~0b01110011;
}
static void select_row(uint8_t row)
{
// Output low(DDR:1, PORT:0) to select
switch (row) {
case 0:
DDRF |= (1<<0);
PORTF &= ~(1<<0);
break;
case 1:
DDRF |= (1<<1);
PORTF &= ~(1<<1);
break;
case 2:
DDRF |= (1<<2);
PORTF &= ~(1<<2);
break;
case 3:
DDRF |= (1<<3);
PORTF &= ~(1<<3);
break;
case 4:
DDRF |= (1<<5);
PORTF &= ~(1<<5);
break;
}
}
Code: Select all
#include "keymap_common.h"
const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* 0: qwerty */
KEYMAP(ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL,BSPC,PGUP, \
TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSLS,PGDN, \
CAPS, A, S, D, F, G, H, J, K, L, SCLN,QUOT,ENT,END, \
LSFT, Z, X, C, V, B, N, M, COMM,DOT, SLSH,RSFT,UP,DEL, \
LCTL,LGUI,LALT, SPC, PAUS,HOME,FN1,LEFT,DOWN,RGHT),
/* 1: FN 1 */
KEYMAP(MUTE, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, VOLU, VOLD, \
TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, PGUP, UP, TRNS, DEL, TRNS, \
TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, MYCM, TRNS, TRNS, PGDN, LEFT, RGHT, TRNS, TRNS, \
TRNS, TRNS, TRNS, CALC, TRNS, TRNS, TRNS, TRNS, HOME, END, DOWN, TRNS, TRNS, TRNS, \
LGUI, TRNS, TRNS, TRNS, TRNS, RCTL, TRNS,TRNS,TRNS,TRNS),
};
const uint16_t PROGMEM fn_actions[] = {
[0] = ACTION_LAYER_TOGGLE(1),
};
Thanks for any and all help!
- Halvar
- Location: Baden, DE
- Main keyboard: IBM Model M SSK / Filco MT 2
- Favorite switch: Beam & buckling spring, Monterey, MX Brown
- DT Pro Member: 0051
This part looks suspicious, although I think it doesn't fit the problem you see:
Which pins are you using, D0 D1 D2 D3 D5 as it says in the comment, or F0 F1 F2 F3 F5 as it says in the code? Also seems like you're "unselecting" the wrong bits.
Which pins are you using, D0 D1 D2 D3 D5 as it says in the comment, or F0 F1 F2 F3 F5 as it says in the code? Also seems like you're "unselecting" the wrong bits.
Code: Select all
/* Row pin configuration
* row: 0 1 2 3 4
* pin: D0 D1 D2 D3 D5
*/
static void unselect_rows(void)
{
// Hi-Z(DDR:0, PORT:0) to unselect
DDRF &= ~0b01110011;
PORTF &= ~0b01110011;
}
static void select_row(uint8_t row)
{
// Output low(DDR:1, PORT:0) to select
switch (row) {
case 0:
DDRF |= (1<<0);
PORTF &= ~(1<<0);
break;
case 1:
DDRF |= (1<<1);
PORTF &= ~(1<<1);
break;
case 2:
DDRF |= (1<<2);
PORTF &= ~(1<<2);
break;
case 3:
DDRF |= (1<<3);
PORTF &= ~(1<<3);
break;
case 4:
DDRF |= (1<<5);
PORTF &= ~(1<<5);
break;
}
}
-
- Main keyboard: CM Storm
- Main mouse: Kinzu v3
- Favorite switch: Blue
- DT Pro Member: -
Ahh success..... almost. so now almost everything works, except row 3 is firing 1qaz(alt), b doesn't work, and when i press g it also triggers aHalvar wrote: ↑OK, then check the select_row() function. You're setting F0 F1 F2 F3 F5 there at the moment.
Where could these problems originate from?
- flabbergast
- Location: Southampton, UK
- DT Pro Member: 0120
- Contact:
@Boywonder: I'm not sure this will solve your problem (which might be a diode backwards?), but you should also initialise the C7 pin you're using for column 15:
in the init_cols function.
EDIT: (What I wrote before in the edit was completely wrong.)
Code: Select all
DDRC &= ~(1<<7);
PORTC |= (1<<7);
EDIT: (What I wrote before in the edit was completely wrong.)
-
- Main keyboard: CM Storm
- Main mouse: Kinzu v3
- Favorite switch: Blue
- DT Pro Member: -
Thank you very much! I'm typing on it right now!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! woooooooooo except my B key doesn't work might e a ad switchflabbergast wrote: ↑@Boywonder: I'm not sure this will solve your problem (which might be a diode backwards?), but you should also initialise the C7 pin you're using for column 15:in the init_cols function.Code: Select all
DDRC &= ~(1<<7); PORTC |= (1<<7);
EDIT: (What I wrote before in the edit was completely wrong.)
- flabbergast
- Location: Southampton, UK
- DT Pro Member: 0120
- Contact:
No worries. Glad it helped!Boywonder wrote: ↑ Thank you very much! I'm typing on it right now!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! woooooooooo except my B key doesn't work might e a ad switch
For the 'B': check the diode, and the switch by itself with a multimeter.