PDA

Просмотр полной версии : Универсальный контроллер PS/2 клавиатуры для компьютеров с матричными клавиатурами.



Страницы : [1] 2

Xrust
17.04.2021, 22:46
Предлагается простая схема и программное обеспечение для универсального безвейтового контроллера PS/2 клавиатуры, подходящего для большинства "древних" бытовых компьютеров типа Спектрум, Орион, Корвет и других, в конструкции которых использовалась матричная клавиатура размером до 8*16. Разведены два варианта печатных плат.

75243752447531275313753147565476182
75245
75246
75247

Код написан в среде Ардуино для ядра MiniCore, которое позволяет работать с Атмега8, 48, 168, 328 без кварца , но будет работать и на стандартном Ардуино Нано или Уно. Я использовал Атмегу168. Второй компонент системы - матрица аналоговых ключей MT8816. На Али их продают сотнями по бросовым ценам. Программа проста и написана в индийском стиле. Она содержит массив, который устанавливает соответствие между сканкодом и кодом активации соответствующего ключа матрицы.

Рекомендации по сборке. (https://zx-pk.ru/threads/33211-universalnyj-kontroller-ps-2-klaviatury-dlya-kompyuterov-s-matrichnymi-klaviaturami.html?p=1115767&viewfull=1#post1115767)

Подключение к Спектруму. (https://zx-pk.ru/threads/33211-universalnyj-kontroller-ps-2-klaviatury-dlya-kompyuterov-s-matrichnymi-klaviaturami.html?p=1118940&viewfull=1#post1118940)

Как модифицировать прошивку. (https://zx-pk.ru/threads/33211-universalnyj-kontroller-ps-2-klaviatury-dlya-kompyuterov-s-matrichnymi-klaviaturami.html?p=1121285&viewfull=1#post1121285)

Как прошить:


https://youtu.be/EaM-3dWxztk

Исходник программы для клавиатуры Спектрума


#include <PS2KeyRaw.h>
#define AX0 4
#define AX1 5
#define AX2 6
#define AX3 7
#define AY0 8
#define AY1 9
#define AY2 10
#define RSTMT 14
#define CSMT 15
#define DATMT 16
#define STBMT 17
#define DATAPIN 2
#define IRQPIN 3

volatile boolean d = HIGH;
uint8_t table[128] = {127,127,127,127,127,127,127,127,127,127,127,127,1 27,127,127,127,127,127,0,127,127,32,48,127,127,127 ,
1,17,16,33,49,127,127,3,2,18,34,51,50,127,127,112, 4,19,36,35,52,127,127,115,116,100,20,84,68,127,127 ,127,114,99,83,67,66,
127,127,127,98,82,81,64,65,127,127,127,127,97,127, 80,127,127,127,127,127,127,127,127,127,127,127,113 ,96,127,127,127,127,127,127,127,127,127,127,127,
127,127,127,127,127,127,127,127,127,127,127,127,12 7,127,127,127,127,127,127,127,127,127,127,127,127, 127};

PS2KeyRaw keyboard;
void setup() {
//Инициализация портов
pinMode(AX0, OUTPUT); //AX0
pinMode(AX1, OUTPUT); //AX1
pinMode(AX2, OUTPUT); //AX2
pinMode(AX3, OUTPUT); //AX3
pinMode(AY0, OUTPUT); //AY0
pinMode(AY1, OUTPUT); //AY1
pinMode(AY2, OUTPUT); //AY2
pinMode(RSTMT, OUTPUT); //RES
pinMode(CSMT, OUTPUT); //CS
pinMode(DATMT, OUTPUT); //DAT
pinMode(STBMT, OUTPUT); //STB
//Инициализация клавиатуры
keyboard.begin( DATAPIN, IRQPIN );
//Инициализация MT8816
SetAddr(0);
digitalWrite(RSTMT, LOW);
digitalWrite(CSMT, LOW);
digitalWrite(DATMT, LOW);
digitalWrite(STBMT, LOW); //инициализация
digitalWrite(CSMT, HIGH); //выбор чипа
digitalWrite(RSTMT, HIGH);
digitalWrite(RSTMT, LOW); //сброс
digitalWrite(CSMT, LOW);
}
void SetAddr(uint8_t addr) {
digitalWrite(AX0,bitRead(addr,0));
digitalWrite(AX1,bitRead(addr,1));
digitalWrite(AX2,bitRead(addr,2));
digitalWrite(AX3,bitRead(addr,3));
digitalWrite(AY0,bitRead(addr,4));
digitalWrite(AY1,bitRead(addr,5));
digitalWrite(AY2,bitRead(addr,6));
}
void SetKey(boolean data){
digitalWrite(CSMT, HIGH); //выбор чипа
digitalWrite(STBMT, HIGH); //строб on
digitalWrite(DATMT, data); //данные
digitalWrite(STBMT, LOW); //строб off
digitalWrite(CSMT, LOW);
}
void loop()
{
if( keyboard.available() ){
int c = keyboard.read(); //чтение кода
switch (c) {
case 0xE0: //если считался префикс 0xE0
break;
case 0xF0: //если считался префикс 0xF0 (отпускание клавиши)
d = LOW;
break;
default:
SetAddr(table[c]);
SetKey(d);
d = HIGH;
}
}
}


Исходник для клавиатуры Спектрум 128

#include <PS2KeyRaw.h>
#define AX0 4
#define AX1 5
#define AX2 6
#define AX3 7
#define AY0 8
#define AY1 9
#define AY2 10
#define RSTMT 14
#define CSMT 15
#define DATMT 16
#define STBMT 17
#define DATAPIN 2
#define IRQPIN 3

volatile boolean d = HIGH;

uint8_t table[128] = {127,127,127,127,127,127,127,127,127,127,127,127,1 27,127,127,127,127,127,0,127,127,32,48,127,127,127 ,1,17,16,33,49,127,
127,3,2,18,34,51,50,127,127,112,4,19,36,35,52,127, 127,115,116,100,20,84,68,127,127,127,114,99,83,67, 66,127,
127,127,98,82,81,64,65,127,127,127,127,97,127,80,1 27,127,127,127,127,127,127,127,127,127,127,113,96, 127,127,127,127,127,
127,127,127,127,127,127,64,127,127,127,127,52,127, 127,127,127,127,127,127,127,127,127,127,127,127,12 7,127,127,127,127,127,127};

PS2KeyRaw keyboard;
void setup() {
//Инициализация портов
pinMode(AX0, OUTPUT); //AX0
pinMode(AX1, OUTPUT); //AX1
pinMode(AX2, OUTPUT); //AX2
pinMode(AX3, OUTPUT); //AX3
pinMode(AY0, OUTPUT); //AY0
pinMode(AY1, OUTPUT); //AY1
pinMode(AY2, OUTPUT); //AY2
pinMode(RSTMT, OUTPUT); //RES
pinMode(CSMT, OUTPUT); //CS
pinMode(DATMT, OUTPUT); //DAT
pinMode(STBMT, OUTPUT); //STB
//Инициализация клавиатуры
keyboard.begin( DATAPIN, IRQPIN );
//Инициализация MT8816
SetAddr(0);
digitalWrite(RSTMT, LOW);
digitalWrite(CSMT, LOW);
digitalWrite(DATMT, LOW);
digitalWrite(STBMT, LOW); //инициализация
digitalWrite(CSMT, HIGH); //выбор чипа
digitalWrite(RSTMT, HIGH);
digitalWrite(RSTMT, LOW); //сброс
digitalWrite(CSMT, LOW);

SetAddr(table[0x12]);
SetKey(LOW);
}
void SetAddr(uint8_t addr) {
digitalWrite(AX0,bitRead(addr,0));
digitalWrite(AX1,bitRead(addr,1));
digitalWrite(AX2,bitRead(addr,2));
digitalWrite(AX3,bitRead(addr,3));
digitalWrite(AY0,bitRead(addr,4));
digitalWrite(AY1,bitRead(addr,5));
digitalWrite(AY2,bitRead(addr,6));
}
void SetKey(boolean data){
digitalWrite(CSMT, HIGH); //выбор чипа
digitalWrite(STBMT, HIGH); //строб on
digitalWrite(DATMT, data); //данные
digitalWrite(STBMT, LOW); //строб off
digitalWrite(CSMT, LOW);
}
void loop()
{
if( keyboard.available() ){
int c = keyboard.read(); //чтение кода
switch (c) {
case 0xE0: //если считался префикс 0xE0
break;
case 0xF0: //если считался префикс 0xF0 (отпускание клавиши)
d = LOW;
break;
case 0x66: //если считался код 0x66 [BS]
SetAddr(table[0x12]);
SetKey(d);
SetAddr(table[0x45]);
SetKey(d);
d = HIGH;
break;
case 0x6B: //если считался код 0x6B [Left]
SetAddr(table[0x12]);
SetKey(d);
SetAddr(table[0x2E]);
SetKey(d);
d = HIGH;
break;
case 0x72: //если считался код 0x72 [Down]
SetAddr(table[0x12]);
SetKey(d);
SetAddr(table[0x36]);
SetKey(d);
d = HIGH;
break;
case 0x75: //если считался код 0x75 [Up]
SetAddr(table[0x12]);
SetKey(d);
SetAddr(table[0x3D]);
SetKey(d);
d = HIGH;
break;
case 0x74: //если считался код 0x74 [Right]
SetAddr(table[0x12]);
SetKey(d);
SetAddr(table[0x3E]);
SetKey(d);
d = HIGH;
break;
case 0x76: //если считался код 0x76 [Edit]
SetAddr(table[0x12]);
SetKey(d);
SetAddr(table[0x16]);
SetKey(d);
d = HIGH;
break;
case 0x58: //если считался код 0x58 [Caps lock]
SetAddr(table[0x12]);
SetKey(d);
SetAddr(table[0x1E]);
SetKey(d);
d = HIGH;
break;
case 0x0D: //если считался код 0x0D [Ext mode]
SetAddr(table[0x12]);
SetKey(d);
SetAddr(table[0x59]);
SetKey(d);
d = HIGH;
break;
case 0x41: //если считался код 0x41 [,]
SetAddr(table[0x59]);
SetKey(d);
SetAddr(table[0x31]);
SetKey(d);
d = HIGH;
break;
case 0x49: //если считался код 0x49 [.]
SetAddr(table[0x59]);
SetKey(d);
SetAddr(table[0x3A]);
SetKey(d);
d = HIGH;
break;
case 0x4C: //если считался код 0x4C [;]
SetAddr(table[0x59]);
SetKey(d);
SetAddr(table[0x44]);
SetKey(d);
d = HIGH;
break;
case 0x52: //если считался код 0x52 ["]
SetAddr(table[0x59]);
SetKey(d);
SetAddr(table[0x4D]);
SetKey(d);
d = HIGH;
break;
default:
SetAddr(table[c]);
SetKey(d);
d = HIGH;
}
}
}

Новая версия прошивки для Спектрум 128

#include <PS2KeyRaw.h>
#define AX0 4
#define AX1 5
#define AX2 6
#define AX3 7
#define AY0 8
#define AY1 9
#define AY2 10
#define RSTMT 14
#define CSMT 15
#define DATMT 16
#define STBMT 17
#define DATAPIN 2
#define IRQPIN 3

volatile boolean d = HIGH;

uint8_t table[128] = {127,127,127,127,127,127,127,127,127,127,127,127,1 27,127,127,127,127,127,0,127,127,32,48,127,127,127 ,1,17,16,33,49,127,
127,3,2,18,34,51,50,127,127,112,4,19,36,35,52,127, 127,115,116,100,20,84,68,127,127,127,114,99,83,67, 66,127,
127,127,98,82,81,64,65,127,127,127,127,97,127,80,1 27,127,127,127,127,127,127,127,127,127,127,113,96, 127,127,127,127,127,
127,127,127,127,127,127,64,127,127,127,127,52,127, 127,127,127,127,127,127,127,127,127,127,127,127,12 7,127,127,127,127,127,127};

PS2KeyRaw keyboard;
void setup() {
//Инициализация портов
pinMode(AX0, OUTPUT); //AX0
pinMode(AX1, OUTPUT); //AX1
pinMode(AX2, OUTPUT); //AX2
pinMode(AX3, OUTPUT); //AX3
pinMode(AY0, OUTPUT); //AY0
pinMode(AY1, OUTPUT); //AY1
pinMode(AY2, OUTPUT); //AY2
pinMode(RSTMT, OUTPUT); //RES
pinMode(CSMT, OUTPUT); //CS
pinMode(DATMT, OUTPUT); //DAT
pinMode(STBMT, OUTPUT); //STB
//Инициализация клавиатуры
keyboard.begin( DATAPIN, IRQPIN );
//Инициализация MT8816
SetAddr(0);
digitalWrite(RSTMT, LOW);
digitalWrite(CSMT, LOW);
digitalWrite(DATMT, LOW);
digitalWrite(STBMT, LOW);
InitMt();
}
//Сброс MT
void InitMt() {
digitalWrite(STBMT, HIGH); //инициализация
digitalWrite(CSMT, HIGH); //выбор чипа
digitalWrite(RSTMT, HIGH);
digitalWrite(RSTMT, LOW); //сброс
digitalWrite(CSMT, LOW);
digitalWrite(STBMT, LOW);
}
void SetAddr(uint8_t addr) {
digitalWrite(AX0,bitRead(addr,0));
digitalWrite(AX1,bitRead(addr,1));
digitalWrite(AX2,bitRead(addr,2));
digitalWrite(AX3,bitRead(addr,3));
digitalWrite(AY0,bitRead(addr,4));
digitalWrite(AY1,bitRead(addr,5));
digitalWrite(AY2,bitRead(addr,6));
}
void SetKey(boolean data){
digitalWrite(CSMT, HIGH); //выбор чипа
digitalWrite(STBMT, HIGH); //строб on
digitalWrite(DATMT, data); //данные
digitalWrite(STBMT, LOW); //строб off
digitalWrite(CSMT, LOW);
}
void loop()
{
if( keyboard.available() ){
int c = keyboard.read(); //чтение кода
switch (c) {
case 0xE1: //Если считался префикс 0xE1 сброс MK
InitMt();
break;
case 0xE0: //если считался префикс 0xE0
break;
case 0xF0: //если считался префикс 0xF0 (отпускание клавиши)
d = LOW;
break;
case 0x66: //если считался код 0x66 [BS]
SetAddr(table[0x12]);
SetKey(d);
SetAddr(table[0x45]);
SetKey(d);
d = HIGH;
break;
case 0x6B: //если считался код 0x6B [Left]
SetAddr(table[0x12]);
SetKey(d);
SetAddr(table[0x2E]);
SetKey(d);
d = HIGH;
break;
case 0x72: //если считался код 0x72 [Down]
SetAddr(table[0x12]);
SetKey(d);
SetAddr(table[0x36]);
SetKey(d);
d = HIGH;
break;
case 0x75: //если считался код 0x75 [Up]
SetAddr(table[0x12]);
SetKey(d);
SetAddr(table[0x3D]);
SetKey(d);
d = HIGH;
break;
case 0x74: //если считался код 0x74 [Right]
SetAddr(table[0x12]);
SetKey(d);
SetAddr(table[0x3E]);
SetKey(d);
d = HIGH;
break;
case 0x76: //если считался код 0x76 [Edit]
SetAddr(table[0x12]);
SetKey(d);
SetAddr(table[0x16]);
SetKey(d);
d = HIGH;
break;
case 0x58: //если считался код 0x58 [Caps lock]
SetAddr(table[0x12]);
SetKey(d);
SetAddr(table[0x1E]);
SetKey(d);
d = HIGH;
break;
case 0x0D: //если считался код 0x0D [Ext mode]
SetAddr(table[0x12]);
SetKey(d);
SetAddr(table[0x59]);
SetKey(d);
d = HIGH;
break;
case 0x41: //если считался код 0x41 [,]
SetAddr(table[0x59]);
SetKey(d);
SetAddr(table[0x31]);
SetKey(d);
d = HIGH;
break;
case 0x49: //если считался код 0x49 [.]
SetAddr(table[0x59]);
SetKey(d);
SetAddr(table[0x3A]);
SetKey(d);
d = HIGH;
break;
case 0x4C: //если считался код 0x4C [;]
SetAddr(table[0x59]);
SetKey(d);
SetAddr(table[0x44]);
SetKey(d);
d = HIGH;
break;
case 0x52: //если считался код 0x52 ["]
SetAddr(table[0x59]);
SetKey(d);
SetAddr(table[0x4D]);
SetKey(d);
d = HIGH;
break;
default:
SetAddr(table[c]);
SetKey(d);
d = HIGH;
}
}
}

Исходник программы для клавиатуры Корвета


#include <PS2KeyRaw.h>
#define AX0 4
#define AX1 5
#define AX2 6
#define AX3 7
#define AY0 8
#define AY1 9
#define AY2 10
#define RSTMT 14
#define CSMT 15
#define DATMT 16
#define STBMT 17
#define DATAPIN 2
#define IRQPIN 3

volatile boolean d = HIGH;
uint8_t table[128] = {127,127,127,44,42,40,41,127,127,127,127,127,43,10 2,127,127,127,127,112,127,117,33,65,127,127,127,50 ,35,1,39,66,127,
127,3,48,4,5,68,67,127,127,103,38,6,36,34,69,127,1 27,22,2,16,7,49,70,127,127,127,21,18,37,71,80,127, 127,127,19,17,23,64,81,127,127,127,127,20,127,32,
127,127,127,127,127,127,127,127,127,127,127,119,96 ,127,127,127,127,127,127,127,127,127,127,127,101,1 27,127,9,127,12,15,127,127,127,8,22,10,13,14,24,
115,127,127,127,11,127,127,25,127,127};

PS2KeyRaw keyboard;
void setup() {
//Инициализация портов
pinMode(19, OUTPUT);
pinMode(AX0, OUTPUT); //AX0
pinMode(AX1, OUTPUT); //AX1
pinMode(AX2, OUTPUT); //AX2
pinMode(AX3, OUTPUT); //AX3
pinMode(AY0, OUTPUT); //AY0
pinMode(AY1, OUTPUT); //AY1
pinMode(AY2, OUTPUT); //AY2
pinMode(RSTMT, OUTPUT); //RES
pinMode(CSMT, OUTPUT); //CS
pinMode(DATMT, OUTPUT); //DAT
pinMode(STBMT, OUTPUT); //STB
//Инициализация клавиатуры
keyboard.begin( DATAPIN, IRQPIN );
//Инициализация MT8816
SetAddr(0);
digitalWrite(RSTMT, LOW);
digitalWrite(CSMT, LOW);
digitalWrite(DATMT, LOW);
digitalWrite(STBMT, LOW); //инициализация
digitalWrite(CSMT, HIGH); //выбор чипа
digitalWrite(RSTMT, HIGH);
digitalWrite(RSTMT, LOW); //сброс
digitalWrite(CSMT, LOW);
}
void SetAddr(uint8_t addr) {
digitalWrite(AX0,bitRead(addr,0));
digitalWrite(AX1,bitRead(addr,1));
digitalWrite(AX2,bitRead(addr,2));
digitalWrite(AX3,bitRead(addr,3));
digitalWrite(AY0,bitRead(addr,4));
digitalWrite(AY1,bitRead(addr,5));
digitalWrite(AY2,bitRead(addr,6));
}
void SetKey(boolean data){
digitalWrite(CSMT, HIGH); //выбор чипа
digitalWrite(STBMT, HIGH); //строб on
digitalWrite(DATMT, data); //данные
digitalWrite(STBMT, LOW); //строб off
digitalWrite(CSMT, LOW);
}
void loop()
{
if( keyboard.available() ){
int c = keyboard.read(); //чтение кода
switch (c) {
case 0xE0: //если считался префикс 0xE0
break;
case 0xF0: //если считался префикс 0xF0 (отпускание клавиши)
d = LOW;
break;
default:
SetAddr(table[c]);
SetKey(d);
d = HIGH;
}
}
}


Исходник программы для УКНЦ Электроника МС 0511 (клавиатура МС 7007)

//UKNZ
#include <PS2KeyRaw.h>
#define AX0 4
#define AX1 5
#define AX2 6
#define AX3 7
#define AY0 8
#define AY1 9
#define AY2 10
#define RSTMT 14
#define CSMT 15
#define DATMT 16
#define STBMT 17
#define DATAPIN 2
#define IRQPIN 3
#define LAT 0
#define EXT 1
#define RUS 2

volatile boolean d = HIGH;
volatile uint8_t lang = LAT;
volatile uint8_t e = lang;
uint8_t table[3][132] = {{127,116,127,8,5,3,4,127,127,11,100,117,7,17,0,12 7,
127,65,64,127,33,50,19,127,127,127,106,68,53,52,20 ,127,
127,35,72,42,22,6,21,127,127,70,90,34,71,55,23,127 ,
127,39,57,105,40,51,24,127,127,127,69,18,36,9,10,1 27,
127,74,37,54,56,121,122,127,127,88,118,41,2,38,67, 127,
127,127,58,127,25,120,127,127,66,49,102,26,127,89, 127,127,
127,127,127,127,127,127,85,127,127,82,127,83,80,12 7,127,127,
81,97,98,99,115,96,1,127,127,84,114,16,84,112,127, 127,
127,127,127,101},
{127,127,127,127,127,127,127,127,127,127,127,127,1 27,127,127,127,
127,49,127,127,33,127,127,127,127,127,127,127,127, 127,127,127,
127,127,127,127,127,127,127,127,127,127,127,127,12 7,127,127,127,
127,127,127,127,127,127,127,127,127,127,127,127,12 7,127,127,127,
127,127,127,127,127,127,127,127,127,127,119,127,12 7,127,127,127,
127,127,127,127,127,127,127,127,127,127,113,127,12 7,127,127,127,
127,127,127,127,127,127,127,127,127,127,127,73,127 ,127,127,127,
127,127,87,127,86,103,127,127,127,127,127,127,127, 127,127,127,
127,127,127,127},
{127,116,127,8,5,3,4,127,127,127,100,117,7,17,127, 127,
127,65,64,127,33,18,19,127,127,127,50,51,34,35,20, 127,
127,68,67,52,36,6,21,127,127,70,69,53,22,37,23,127 ,
127,71,54,55,38,39,24,127,127,127,72,56,40,9,10,12 7,
127,57,41,25,26,121,122,127,127,58,119,42,90,106,6 7,127,
127,127,89,127,105,120,127,127,66,49,102,104,127,1 27,127,127,
127,127,127,127,127,127,85,127,127,82,127,83,80,12 7,127,127,
81,97,98,99,115,96,1,127,127,127,114,16,84,112,127 ,127,
127,127,127,101}};
PS2KeyRaw keyboard;
void setup() {
//Инициализация портов
pinMode(AX0, OUTPUT); //AX0
pinMode(AX1, OUTPUT); //AX1
pinMode(AX2, OUTPUT); //AX2
pinMode(AX3, OUTPUT); //AX3
pinMode(AY0, OUTPUT); //AY0
pinMode(AY1, OUTPUT); //AY1
pinMode(AY2, OUTPUT); //AY2
pinMode(RSTMT, OUTPUT); //RES
pinMode(CSMT, OUTPUT); //CS
pinMode(DATMT, OUTPUT); //DAT
pinMode(STBMT, OUTPUT); //STB
//Инициализация клавиатуры
keyboard.begin( DATAPIN, IRQPIN );
//Инициализация MT8816
SetAddr(0);
digitalWrite(RSTMT, LOW);
digitalWrite(CSMT, LOW);
digitalWrite(DATMT, LOW);
digitalWrite(STBMT, LOW);
InitMt();
}
//Сброс MT
void InitMt() {
digitalWrite(STBMT, HIGH); //инициализация
digitalWrite(CSMT, HIGH); //выбор чипа
digitalWrite(RSTMT, HIGH);
digitalWrite(RSTMT, LOW); //сброс
digitalWrite(CSMT, LOW);
digitalWrite(STBMT, LOW);
}
//Установка адреса MT
void SetAddr(uint8_t addr) {
digitalWrite(AX0,bitRead(addr,0));
digitalWrite(AX1,bitRead(addr,1));
digitalWrite(AX2,bitRead(addr,2));
digitalWrite(AX3,bitRead(addr,3));
digitalWrite(AY0,bitRead(addr,4));
digitalWrite(AY1,bitRead(addr,5));
digitalWrite(AY2,bitRead(addr,6));
}
//Установка ключа MT
void SetKey(boolean data){
digitalWrite(CSMT, HIGH); //выбор чипа
digitalWrite(STBMT, HIGH); //строб on
digitalWrite(DATMT, data); //данные
digitalWrite(STBMT, LOW); //строб off
digitalWrite(CSMT, LOW);
}
void loop()
{
if( keyboard.available() ){
int c = keyboard.read(); //чтение кода
switch (c) {
case 0xE1: //Если считался префикс 0xE1 сброс MK
InitMt();
break;
case 0xE0: //Если считался префикс 0xE0
e = EXT; //тогда код будет из table[1]
break;
case 0xF0: //Если считался префикс 0xF0 (отпускание клавиши)
d = LOW; //тогда готовимся записывать "0" в MT
break;
case 0x78: //Если считался код 0x78 [F11]
lang = RUS; //переключаемся на русскую раскладку
e = lang;
d = HIGH; //помним о 0xF0 при отпускании [F11],
break; //фактически раскладка переключается дважды.
case 0x07: //Если считался код 0x07 [F12]
lang = LAT; //переключаемся на латинскую раскладку
e = lang;
d = HIGH; //помним о 0xF0 при отпускании [F12]
break;
default:
SetAddr(table[e][c]); //получаем адрес ключа из текущей таблицы
SetKey(d); //переключаем ключ в состояние d
d = HIGH; //если было отжатие ключа, принудительно переводим в нажатие
e = lang; //если был код из table[1], возвращаем на текущую раскладку
}
}
}
Схема подключения:
J2(8..1) контроллера >> XS3(8..1) УКНЦ, J3(12..1) контроллера >> XS4(12..1) УКНЦ, J3(13) контроллера >> XS3(9) УКНЦ.

Прошивка для Орион-128 (https://zx-pk.ru/threads/33211-universalnyj-kontroller-ps-2-klaviatury-dlya-kompyuterov-s-matrichnymi-klaviaturami.html?p=1139984&viewfull=1#post1139984) от камрада Helbr

Доработанная прошивка для Корвета (https://zx-pk.ru/threads/29197-kontroller-dlya-podklyucheniya-ps-2-klaviatury.html) от камрада surinm.

Прошивка для Вектор-06ц (https://zx-pk.ru/threads/33211-universalnyj-kontroller-ps-2-klaviatury-dlya-kompyuterov-s-matrichnymi-klaviaturami.html?p=1199679&viewfull=1#post1199679) от камрада Improver.

Вполне можно объединить поддержку нескольких клавиатур в одной прошивке и переключать их горячими клавишами.
Если сия поделка кого-то заинтересует, могу рассказать о ней подробнее и ответить на вопросы. У меня осталось несколько пустых плат и даже компоненты для сборки, могу создать тему на барахолке.
Продажа здесь (https://zx-pk.com/forum/viewtopic.php?f=7&t=18766).

Идею данного контроллера подсказал andykarpov

IgorR76
17.04.2021, 23:24
Оффтоп.
Радует одно — что вместо того, чтобы повторить готовое из десятка вариантов, каждый нуждающийся сам себе разрабатывает устройство и пишет код. Это очень правильно в рамках хобби.
Разрабатывайте, пишите код, делитесь наработками — это здорово!

HardWareMan
18.04.2021, 07:41
Оффтоп.
Радует одно — что вместо того, чтобы повторить готовое из десятка вариантов, каждый нуждающийся сам себе разрабатывает устройство и пишет код. Это очень правильно в рамках хобби.
Разрабатывайте, пишите код, делитесь наработками — это здорово!
Всё верно. А потом среди множества решений можно сделать наиболее оптимальное, в том числе как солянку из методов из разных проектов.

Kulich
18.04.2021, 09:37
А оно как работает? Выставляет процессору wait на время установки ножек? Без этого о принципиально работать не будет, там что-то в районе 500нс есть но а это.
А вижу, сделано через ключ/ защёлку. Достаточно интересно, они могут быстро выкатить на шину данные, главное успеть среагировать.. Нужно будет изучить схему.

Serg6845
18.04.2021, 10:22
А оно как работает? Выставляет процессору wait на время установки ножек? Без этого о принципиально работать не будет, там что-то в районе 500нс есть но а это.
А вижу, сделано через ключ/ защёлку. Достаточно интересно, они могут быстро выкатить на шину данные, главное успеть среагировать.. Нужно будет изучить схему.

не нужно ничего успевать. в том и прикол. МТ8816 - матирица аналоговых ключей, она эмулирует нажатия кнопок. которые по определению асинхронны ко всем процессам, происходящим на шине.

Xrust
18.04.2021, 10:28
А оно как работает? Выставляет процессору wait на время установки ножек?
Нет. Контроллер полностью безвейтовый. Тупо замыкает контакты. Весь секрет в микросхеме MT8816. Это управляемая матрица из 128 ключей. Любой можно замкнуть и разомкнуть. Поэтому контроллеру не требуется никаких сигналов от процессора. Только питание 5В. И он полностью универсальный. Можно настроить для работы с любым компьютером с матричной клавиатурой или даже с несколькими, переключая режимы "горячей" клавишей.

izzx
18.04.2021, 13:17
Нет. Контроллер полностью безвейтовый. Тупо замыкает контакты.
Вот это дело. Я как раз хотел спросить зачем на контроллерах клавиатуры используют сигнал wait. Надо же просто замкнуть кнопки.

HardWareMan
18.04.2021, 13:53
Вот это дело. Я как раз хотел спросить зачем на контроллерах клавиатуры используют сигнал wait. Надо же просто замкнуть кнопки.
Затем, что CPU слишком быстр и внешний контроллер не успевает среагировать. А смысл всего в том, чтобы не городить матрицу из изолированных "реле", которые могут проводить сигнал в обе стороны (актуально больше для компьютеров с клавиатурой на ВВ55). Наличие таких микросхем как МТ8816 сильно упрощает задачу - я так вообще хотел на К176КТ3 собирать. Но вовремя остановился, хотя мешочек этих КТшек прикупил (точнее, выкупил все, что были в магазе более 10 лет назад).

izzx
18.04.2021, 21:58
В прошивке для спектрума уже предусмотрены всякие сочетания клавиш, типа курсор, сброс, NMI?
Сколько примерно стоит девайс?

Xrust
18.04.2021, 22:58
В прошивке для спектрума уже предусмотрены всякие сочетания клавиш, типа курсор, сброс, NMI?

Нет, в существующей прошивке они не предусмотрены. Она рассчитана на обычную клавиатуру 40 клавиш.
В новой прошивке дополнительные клавиши добавлены. Сброс и nmi к клавиатуре отношения не имеют.


Сколько примерно стоит девайс?

Комплект основных деталей (плата, микросхемы, разъем ps/2) тянет примерно на 400р

Kulich
19.04.2021, 21:30
не нужно ничего успевать. в том и прикол. МТ8816 - матирица аналоговых ключей, она эмулирует нажатия кнопок. которые по определению асинхронны ко всем процессам, происходящим на шине.

Какая интересная штука. Заменяет десяток 595 регистров из дискретной схемы что была тут. А вообще сколько сложностей чтобы сделать то что можно сделать парой проводков и руками )

Arkanoid
26.04.2021, 14:44
Я бы прикупил в виде конструктора или собраный девайс, интересная вещь.

Xrust
26.04.2021, 19:04
Arkanoid, хорошо, выложу на барахолку. А какой вариант предпочтительнее: тот, где mt8816 в dip40 корпусе, или plcc44?

Arkanoid
27.04.2021, 05:25
Дип мне больше нравитсо.

Xrust
27.04.2021, 21:05
Arkanoid,
Продажа здесь (https://zx-pk.com/forum/viewtopic.php?f=7&t=18766).

Arkanoid
28.04.2021, 04:05
Опаздал я однако, там уже все оазобрали.

nemo
28.04.2021, 10:42
USB бы прикрутить да mega168 вроде этого не умеет....

Xrust
28.04.2021, 11:50
nemo, слышал, что современные клавиатуры универсальные, и сами определяют, в какой разъём из подключили, по крайней мере самые простые по логике так и должны работать. Но проверить эту версию я ещё не успел.

Black Cat / Era CG
28.04.2021, 13:10
слышал, что современные клавиатуры универсальныеВроде уже нет, отказались многие от поддержки старых протоколов, и все, поэтому пассивные переходники перестали работать.

izzx
28.04.2021, 14:08
Прошивку на собранном устройстве можно будет менять? И добавить сочетания разных клавиш Ext, Edit, и что ещё захочется. И чем шить?

nemo
28.04.2021, 14:36
Прошивку на собранном устройстве можно будет менять?

А почему нет? mega она и без arduino мега только шить по SPI программатором.

Xrust
28.04.2021, 14:40
izzx, не можно, а даже нужно. Думаю, пора запилить инструкцию по прошивке, настройке и программированию.

TomaTLAB
29.04.2021, 21:24
USB бы прикрутить да mega168 вроде этого не умеет.... Да какие проблемы: https://aliexpress.ru/item/4001091002703.html?spm=a2g0o.detail.1000060.3.227f fe85Oa8fco&gps-id=aerPdpSubstituteRcmd&scm=1007.33958.210224.0&scm_id=1007.33958.210224.0&scm-url=1007.33958.210224.0&pvid=d9b91d62-5d15-475e-aefb-bfac9cd5b3bf&_t=gps-id:aerPdpSubstituteRcmd,scm-url:1007.33958.210224.0,pvid:d9b91d62-5d15-475e-aefb-bfac9cd5b3bf,tpp_buckets:21387%230%23218179%230&_ga=2.51842926.676253631.1619718779-446216667.1577308968&_gac=1.57679320.1619366369.Cj0KCQjwppSEBhCGARIsANI s4p4tmuoGz2Pf41ZIuFgHeM8KxwQgJRIV7QfoGHjj0_jbMzoYA VZgMbkaApY_EALw_wcB&sku_id=10000014307196644

Kulich
29.04.2021, 21:37
Нет 350 рублей хорошо, но вообще есть библиотека софтового usb работающая и на 328 атмеге если нужно.

Xrust
01.05.2021, 17:19
Нет 350 рублей хорошо, но вообще есть библиотека софтового usb работающая и на 328 атмеге если нужно.

Не все так просто. Эта библиотека может реализовать USB HID-устройство, а нам нужен USB HOST. Таких библиотек я не видел для обычных микроконтроллеров без "железной" поддержки USB.

Mick
01.05.2021, 20:17
Не все так просто. Эта библиотека может реализовать USB HID-устройство, а нам нужен USB HOST. Таких библиотек я не видел для обычных микроконтроллеров без "железной" поддержки USB.

Раньше народ баловался с USB Keylogger, один из вариантов - http://obruboff.ru/usb-keylogger-avr/
Еще был вроде как в каком старом журнале Хакер, типа доведи до слез секретаршу. Номер не помню.
Посмотри в этом направлении.

Xrust
01.05.2021, 21:37
Mick, смысла особого нет извращаться. Я еще не видел, чтобы кто-то смог сделать USB host без аппаратной поддержки. Проще использовать готовую библиотеку для контроллеров с поддержкой USB. Вот только зачем? PS/2 клавиатуры вполне продаются, а учитывая выросшие в последнее время цены на микроконтроллеры, скорее приходят мысли о программной поддержке PS/2 в самом компьютере.

Mick
02.05.2021, 11:09
Mick, смысла особого нет извращаться. Я еще не видел, чтобы кто-то смог сделать USB host без аппаратной поддержки.

Ну скажет для формирования одного массива ключей от клавы это решение вполне годное. Но по сути каждый сам извращается как ему удобно :)

TomaTLAB
02.05.2021, 14:17
о программной поддержке PS/2 в самом компьютере. И можно забыть про добрые 9/10 игрушек и некоторое количество системного софта (напр. Nextor FDISK на MSX, он точно напрямую кнопки нюхает).

Xrust
02.05.2021, 16:11
Ну скажет для формирования одного массива ключей от клавы это решение вполне годное.
Пожалуй вы правы. Попробую что-нибудь поковырять в этом направлении.

Xrust
03.05.2021, 13:54
Особенности сборки плат универсальных контроллеров PS/2
C1,C2,C3 - блокировочные конденсаторы. Керамические можно применить емкостью от 0.01мкФ и более.

Электролитический от 100мкФ 10В. Конкретная емкость в основном зависит от качества источника питания. Конакты J2 и J3 служат для подключения матрицы к компьютеру. Разъем H2 на плате DIP-40 - последовательный порт. Его можно использовать для отладки новых прошивок. Кварц и его обвязку на обеих платах запаивать не нужно - МК работают от внутреннего тактового генератора 8МГц.

Платы содержат некоторые ошибки, которые можно легко устранить.
Вариант платы PLCC-44:
Отсутствует подтягивающий резистор R1 на ножку Res микроконтроллера. Это может вызвать нестабильную работу МК. Можно запаять резистор номиналом 10кОм между ножками 2 и 5 разъема ISP (6 контактов)
75348
Вариант платы DIP-40:
Отсутствуют боковые монтажные отверстия для корпуса разъема PS/2. Можно по месту рассверлить их сверлом Ф~2мм.

Для обновления прошивки предусмотрен порт ISP. Можно использовать любой программатор, поддерживаемый средой Arduino IDE, например USB ASP или плату Ардуино с соответствующей прошивкой

izzx
04.05.2021, 17:11
Готовые прошивки будут выложены? И какие-нибудь ещё инструкции как модифицировать их. Или исходного кода достаточно? С Arduino IDE я пока не знаком, может и зря вопросы задаю.

Error404
04.05.2021, 18:55
Не очень понятно - поддерживается ли транслирование в матрицу одновременно нескольких нажатых клавиш клавиатуры PS/2 ?

Xrust
04.05.2021, 20:26
Готовые прошивки будут выложены? И какие-нибудь ещё инструкции как модифицировать их. Или исходного кода достаточно? С Arduino IDE я пока не знаком, может и зря вопросы задаю.

Конечно, исходников достаточно. В принципе, вся необходимая информация, которая пригодится при компиляции прошивки, в теме имеется. Но я планирую сделать видосик с инструкцией, чтобы раскрыть тему полностью. Пояснения по принципам кодирования матрицы тоже будут, хотя там все элементарно.


Не очень понятно - поддерживается ли транслирование в матрицу одновременно нескольких нажатых клавиш клавиатуры PS/2 ?

Да, поддерживается.

Xrust
04.05.2021, 23:49
Добавил код для клавиатуры ZX Spectrum 128 - стрелки, BS и т.д. Удобны ли следующие соответствия: Edit = Esc, Ext Mode = Tab ? Inv video и True video делать не стал, не уверен нужно ли?

Mick
05.05.2021, 09:28
Конечно, исходников достаточно. В принципе, вся необходимая информация, которая пригодится при компиляции прошивки, в теме имеется. Но я планирую сделать видосик с инструкцией, чтобы раскрыть тему полностью. Пояснения по принципам кодирования матрицы тоже будут, хотя там все элементарно.

Если не затруднит, то можешь в первом посте по возможности выложить исходники или файлы проекта, без использования Arduino IDE. Не все им пользуются.
Как минимум будет полный пакет файлов. А то в последствии нужно будет искать где то все входящие файлы.
Конечно если это возможно.

izzx
05.05.2021, 10:01
Удобны ли следующие соответствия: Edit = Esc, Ext Mode = Tab ? Inv video и True video делать не стал, не уверен нужно ли?
Tab как-то не привычно. В Unreal так два шифта одновременно.
А в скорпионовском контроллере: "Клавиша Esc генерирует CS/1 (EDIT), а CapsLock - CS/2. Клавиша Shift(правый) имитирует клавишу SS в ZX, Ctrl - клавишу CS, а Alt - генерирует курсор E (CS/SS). "
Не знаю как на эве.

Xrust
05.05.2021, 18:40
Tab как-то не привычно.
Tab расположен примерно в том же месте, что и EM у оригинала или, например, у клавиатуры Дельты-С 128. Впрочем, это достаточно легко изменить. Гораздо проще, чем рассчитывать массив преобразования сканкодов в код матрицы.

- - - Добавлено - - -


Если не затруднит, то можешь в первом посте по возможности выложить исходники или файлы проекта, без использования Arduino IDE. Не все им пользуются.
Как минимум будет полный пакет файлов. А то в последствии нужно будет искать где то все входящие файлы.
Конечно если это возможно.

Я только в Ардуино умею. Программировать контроллеры не умею, только из готовых ардуиновских библиотек могу. На прочее просто ни времени, ни желания нет. Тем же, кто может без Ардуино обходиться, один черт. Все использованные библиотеки в открытом доступе на гите. Собирай, компилируй, прошивай, если есть свободное время и оболочка Arduino IDE почему-то не нравится.

Freiwind
17.05.2021, 21:29
Сколько места код занимает, например для 128 Спека? В Mega48 влезет?

vegapiratradio
17.05.2021, 22:06
т.е. я правильно понял, что МТ8816 умеет коммутировать в один момент времени только один ключ?
получается одновременное нажатие на клавиатуре 2 и более кнопок приведет к поочередному переключению ключей матрицы, а не одновременное их срабатывание?

p.s. во всяком случае так говорит датащит на 8816

Romych
17.05.2021, 23:07
Одномоментно можно включить или выключить один свитч, но одновременно могут быть включены хоть все, на каждый ключ есть триггер. Но в реальной жизни, мы тоже не одновременно нажимаем клавиши, все равно, какую-то первой, какую-то последней.

vegapiratradio
18.05.2021, 00:20
Одномоментно можно включить или выключить один свитч, но одновременно могут быть включены хоть все, на каждый ключ есть триггер. Но в реальной жизни, мы тоже не одновременно нажимаем клавиши, все равно, какую-то первой, какую-то последней.

да, разобрался

HardWareMan
18.05.2021, 07:36
Во время игры нажать диагональ (т.е. одновременно 2 направления) - ситуация обыденная. Тут важен не порядок переключения ключей, а способность оставаться переключенными одновременно.

Xrust
18.05.2021, 19:06
Сколько места код занимает, например для 128 Спека? В Mega48 влезет?

Влезет.

Xrust
23.05.2021, 13:16
Вот инструкция по прошивке контроллера.


https://youtu.be/EaM-3dWxztk

Xrust
01.06.2021, 18:14
Подключение контроллера к Спектруму:
Разъем J2 (8 контактов) подключается к KA8, KA9, KA10, KA11, KA12, KA13, KA14, KA15. Разъем J3 (16 контактов, используются первые 5) подключается к KD0, KD1, KD2, KD3, KD4 (обозначения взяты с платы контроллера и схемы Ленинград 1).
Прошивку можно использовать как для Спектрум, так и для Спектрум 128, они совместимы и отличаются только поддержкой дополнительных кнопок. Те контроллеры, что продаются на барахолке, по умолчанию прошиты версией Спектрум 128.

elker
03.06.2021, 05:08
Подскажите, пожалуйста, распиновку J2 и J3 для Корвета. Спасибо.

Xrust
03.06.2021, 12:01
Подскажите, пожалуйста, распиновку J2 и J3 для Корвета. Спасибо.
Для Корвета все контакты по порядку подключаются. Посмотрите схему клавиатуры Корвета, там матрица 16х8.

n_sonic
03.06.2021, 14:04
А можно (не в напряг канэшна) для алесты прошивочку соорудить? От мс-ки клавиатура как-то не комильфо однако... Я и сам в свободное время поковыряюсь, но для спецов-кодеров оно попроще наверное будет... :)

Arkanoid
03.06.2021, 17:56
А для АТМ Турбо 4.50 нельзя дополнительные адресные линии задействовать?

Xrust
03.06.2021, 18:46
А можно (не в напряг канэшна) для алесты прошивочку соорудить? От мс-ки клавиатура как-то не комильфо однако... Я и сам в свободное время поковыряюсь, но для спецов-кодеров оно попроще наверное будет... :)

Конечно можно. Мне бы только схему клавы найти.

- - - Добавлено - - -


А для АТМ Турбо 4.50 нельзя дополнительные адресные линии задействовать?

Можно, конечно. Дайте ссылочку на схему.

Arkanoid
03.06.2021, 19:34
http://atmturbo.nedopc.com/atmshem.htm

- - - Добавлено - - -

Одну платку я у Вас специально для атм приобрел, она у меня ввиде платы на столе, корпуса нет к сожалению.
А вторую для горячо любимой Дельты.

n_sonic
04.06.2021, 09:43
Конечно можно. Мне бы только схему клавы найти.

Без проблем! В архиве все что нужно.

75560
75561

Xrust
04.06.2021, 23:37
n_sonic, попробуйте, альфа версия для Алесты, сам не проверял. Пока поддержка только JCUKEN.

#include <PS2KeyRaw.h>
#define AX0 4
#define AX1 5
#define AX2 6
#define AX3 7
#define AY0 8
#define AY1 9
#define AY2 10
#define RSTMT 14
#define CSMT 15
#define DATMT 16
#define STBMT 17
#define DATAPIN 2
#define IRQPIN 3

volatile boolean d = HIGH;
uint8_t table[128] = {127,101,127,8,5,3,4,11,127,100,117,127,7,17,118,1 27,127,65,64,127,33,18,19,127,127,127,50,51,34,35, 20,49,127,68,67,52,36,6,21,74,127,70,69,53,22,37,2 3,127,127,71,54,55,38,39,24,127,127,127,72,56,40,9 ,10,127,127,57,41,25,26,121,122,127,127,58,88,42,9 0,106,120,127,127,127,89,127,119,16,127,127,66,64, 102,119,127,89,127,127,127,127,127,127,127,127,73, 127,127,82,127,83,80,127,127,127,81,97,98,99,115,9 6,1,127,116,127,114,16,84,112,127,127};

PS2KeyRaw keyboard;
void setup() {
//Инициализация портов
pinMode(19, OUTPUT);
pinMode(AX0, OUTPUT); //AX0
pinMode(AX1, OUTPUT); //AX1
pinMode(AX2, OUTPUT); //AX2
pinMode(AX3, OUTPUT); //AX3
pinMode(AY0, OUTPUT); //AY0
pinMode(AY1, OUTPUT); //AY1
pinMode(AY2, OUTPUT); //AY2
pinMode(RSTMT, OUTPUT); //RES
pinMode(CSMT, OUTPUT); //CS
pinMode(DATMT, OUTPUT); //DAT
pinMode(STBMT, OUTPUT); //STB
//Инициализация клавиатуры
keyboard.begin( DATAPIN, IRQPIN );
//Инициализация MT8816
SetAddr(0);
digitalWrite(RSTMT, LOW);
digitalWrite(CSMT, LOW);
digitalWrite(DATMT, LOW);
digitalWrite(STBMT, LOW); //инициализация
digitalWrite(CSMT, HIGH); //выбор чипа
digitalWrite(RSTMT, HIGH);
digitalWrite(RSTMT, LOW); //сброс
digitalWrite(CSMT, LOW);
}
void SetAddr(uint8_t addr) {
digitalWrite(AX0,bitRead(addr,0));
digitalWrite(AX1,bitRead(addr,1));
digitalWrite(AX2,bitRead(addr,2));
digitalWrite(AX3,bitRead(addr,3));
digitalWrite(AY0,bitRead(addr,4));
digitalWrite(AY1,bitRead(addr,5));
digitalWrite(AY2,bitRead(addr,6));
}
void SetKey(boolean data){
digitalWrite(CSMT, HIGH); //выбор чипа
digitalWrite(STBMT, HIGH); //строб on
digitalWrite(DATMT, data); //данные
digitalWrite(STBMT, LOW); //строб off
digitalWrite(CSMT, LOW);
}
void loop()
{
if( keyboard.available() ){
int c = keyboard.read(); //чтение кода
switch (c) {
case 0xE0: //если считался префикс 0xE0
break;
case 0xF0: //если считался префикс 0xF0 (отпускание клавиши)
d = LOW;
break;
default:
SetAddr(table[c]);
SetKey(d);
d = HIGH;
}
}
}

n_sonic
05.06.2021, 08:09
Ок! На днях доберусь до мастерской и обязательно отпишусь. Спасибо огромное!

Xrust
05.06.2021, 08:23
n_sonic, если заработает нормально, попробую переделать латиницу на qwerty. Раскладка переключается клавишами Алф? Жаль, нет доступа к реальному железу.

Xrust
05.06.2021, 10:29
http://atmturbo.nedopc.com/atmshem.htm

- - - Добавлено - - -

Одну платку я у Вас специально для атм приобрел, она у меня ввиде платы на столе, корпуса нет к сожалению.
А вторую для горячо любимой Дельты.

Если есть соображения по раскладке клавиатуры, напишите. Можно картинкой, как это для Алесты сделано.

Arkanoid
05.06.2021, 10:45
https://zxpress.ru/book_articles.php?id=2357
Тут про клавиатуру есть, но дело в том что дополнительные адресные линии нужны. Я стандартную спековскую о 40ка кнопках подключал. А для сипиэм там еще клавишы нужны.

Xrust
05.06.2021, 12:34
https://zxpress.ru/book_articles.php?id=2357
Тут про клавиатуру есть, но дело в том что дополнительные адресные линии нужны. Я стандартную спековскую о 40ка кнопках подключал. А для сипиэм там еще клавишы нужны.

Да это все понятно, я про другое. Тут дело личных предпочтений - какая кнопка какой будет соответствовать на PS/2 клавиатуре, кроме буквенных, разумеется.
Вот вам тестовая версия:


#include <PS2KeyRaw.h>
#define AX0 4
#define AX1 5
#define AX2 6
#define AX3 7
#define AY0 8
#define AY1 9
#define AY2 10
#define RSTMT 14
#define CSMT 15
#define DATMT 16
#define STBMT 17
#define DATAPIN 2
#define IRQPIN 3

volatile boolean d = HIGH;
uint8_t table[128] = {127,127,127,127,127,127,127,127,127,127,127,127,1 27,40,77,127,127,56,0,127,23,2,3,127,127,127,16,17 ,1,18,19,127,
127,48,32,33,34,51,35,127,127,7,64,49,66,50,67,127 ,127,55,71,70,65,69,68,127,127,127,39,54,53,52,36, 127,
127,110,38,37,21,4,20,127,127,94,58,22,26,5,11,127 ,127,127,12,127,43,29,127,127,24,10,6,27,127,74,12 7,127,
127,127,127,127,127,127,9,127,127,127,127,72,127,1 27,127,127,127,127,73,127,41,57,8,127,127,45,127,6 1,126,127,127,127};

PS2KeyRaw keyboard;
void setup() {
//Инициализация портов
pinMode(AX0, OUTPUT); //AX0
pinMode(AX1, OUTPUT); //AX1
pinMode(AX2, OUTPUT); //AX2
pinMode(AX3, OUTPUT); //AX3
pinMode(AY0, OUTPUT); //AY0
pinMode(AY1, OUTPUT); //AY1
pinMode(AY2, OUTPUT); //AY2
pinMode(RSTMT, OUTPUT); //RES
pinMode(CSMT, OUTPUT); //CS
pinMode(DATMT, OUTPUT); //DAT
pinMode(STBMT, OUTPUT); //STB
//Инициализация клавиатуры
keyboard.begin( DATAPIN, IRQPIN );
//Инициализация MT8816
SetAddr(0);
digitalWrite(RSTMT, LOW);
digitalWrite(CSMT, LOW);
digitalWrite(DATMT, LOW);
digitalWrite(STBMT, LOW); //инициализация
digitalWrite(CSMT, HIGH); //выбор чипа
digitalWrite(RSTMT, HIGH);
digitalWrite(RSTMT, LOW); //сброс
digitalWrite(CSMT, LOW);
}
void SetAddr(uint8_t addr) {
digitalWrite(AX0,bitRead(addr,0));
digitalWrite(AX1,bitRead(addr,1));
digitalWrite(AX2,bitRead(addr,2));
digitalWrite(AX3,bitRead(addr,3));
digitalWrite(AY0,bitRead(addr,4));
digitalWrite(AY1,bitRead(addr,5));
digitalWrite(AY2,bitRead(addr,6));
}
void SetKey(boolean data){
digitalWrite(CSMT, HIGH); //выбор чипа
digitalWrite(STBMT, HIGH); //строб on
digitalWrite(DATMT, data); //данные
digitalWrite(STBMT, LOW); //строб off
digitalWrite(CSMT, LOW);
}
void loop()
{
if( keyboard.available() ){
int c = keyboard.read(); //чтение кода
switch (c) {
case 0xE0: //если считался префикс 0xE0
break;
case 0xF0: //если считался префикс 0xF0 (отпускание клавиши)
d = LOW;
break;
default:
SetAddr(table[c]);
SetKey(d);
d = HIGH;
}
}
}
Подключать так: R0-R7 к J2, С0-С14 к J3

75571

Arkanoid
05.06.2021, 13:28
Благодарю Вас Уважаемый Сэр.
С ночи приду буду тестировать.

Xrust
11.06.2021, 12:07
Arkanoid, n_sonic, что-нибудь получается?

n_sonic
13.06.2021, 09:53
Контроллеры только получил. На днях дособираю и попробую, обязательно отпишусь в теме. Домашние заботы съедают время, сори...

elker
17.06.2021, 19:34
Подключил к Корвету. Работает, но как-то интересно. После включения сыплет символом @, пока не сбросишь Мегу, потом вроде всё работает, но "вниз" в некоторых играх (KLAD, PACMAN) не срабатывает, хотя по меню перемещается. В других работает всё, включая "вниз".

DDp
17.06.2021, 20:07
но "вниз" в некоторых играх (KLAD, PACMAN) не срабатывает, хотя по меню перемещается.
Потому, что в этих играх вниз, это не "стрелка_вниз/2", а "МЕНЮ/5". В Кладе можно переназначить клавиши в меню игры.

elker
17.06.2021, 21:44
ОК, но с @ проблема. Плюс нет клавиш : ;, - _ . / [ \ ]^
Коды для MT8816 82-87, 51-55 и, возможно, каких-то ещё.

Вот мой вариант матрицы с добавленными символами.


uint8_t table[1028] = {
127,127,127,44, 42, 40, 41, 127,127,127,
127,127,43, 102,54,127,127,127,112,127,
117,33, 65, 127,127,127,50, 35, 1, 39,
66, 127,127,3, 48, 4, 5, 68, 67, 127,
127,103,38, 6, 36, 34, 69, 127,127,22,
2, 16, 7, 49, 70, 127,127,127,21, 18,
37, 71, 80, 127,127,84,19, 17, 23, 64,
81, 127,127,86, 87 ,20, 83,32, 55,127,
127,127,82,127,51, 127, 127,127,127,119,
96, 53, 127,52,127,127,127,127,127,127,
127,127,101,127,127,9, 127,12, 15, 127,
127,127,8, 22, 10, 13, 14, 24, 115,127,
127,127,11, 85,127,25, 127,127};

Xrust
17.06.2021, 22:53
elker, попробую на днях достать свой корвет и проверить прошивку. Впрочем, может быть надо фьюзами поиграть с задержкой запуска?

Xrust
20.06.2021, 15:31
elker, до Корвета я так и не добрался, но с контроллером поэкспериментировал. Похожую проблему удалось воссоздать при недостаточной блокировочной емкости по питанию. На плате, где были установлены керамические конденсаторы по 10мкФ и электролит 220мкФ сбой воспроизвести не удалось. На всякий случай можно добавить клавишу для сброса матрицы. Ее можно использовать, если вдруг какой-то из ключей "залип".


case 0x7E: //если считался код 0x7E
digitalWrite(CSMT, HIGH); //выбор чипа
digitalWrite(RSTMT, HIGH);
digitalWrite(RSTMT, LOW); //сброс
digitalWrite(CSMT, LOW);
break;

Этот код нужно вставить первым в оператор switch. Он привязывает функцию сброса матрицы к клавише Scroll Lock.

surinm
22.06.2021, 21:12
Плюс нет клавиш : ;, - _ . / [ \ ]^
Закинул в прошивку, перезалил - символ : не появился((( вместо него +
Также интересует как добавить переключение на русский. Нужно просто сопоставить alf и кнопку фиксации (на клавиатуре корвета кнопка с кружком)?

- - - Добавлено - - -


Закинул в прошивку, перезалил - символ : не появился(((
НАШЕЛ!!!)))

Xrust
22.06.2021, 23:52
Настало время пояснить за принцип формирования массива.
Индекс массива соответствует скан коду клавиатуры. Элементы массива кодируют контакты матрицы. Как именно происходит кодирование, видно из этого участка кода:

void SetAddr(uint8_t addr) {
digitalWrite(AX0,bitRead(addr,0));
digitalWrite(AX1,bitRead(addr,1));
digitalWrite(AX2,bitRead(addr,2));
digitalWrite(AX3,bitRead(addr,3));
digitalWrite(AY0,bitRead(addr,4));
digitalWrite(AY1,bitRead(addr,5));
digitalWrite(AY2,bitRead(addr,6));
}
Матрица имеет размерность 16 столбцов и 8 строк. 4 бита AX0...AX3 кодируют столбцы, 3 бита AY0..AY2 кодируют строки. AX0 - самый младший бит, AY2 - самый старший.
Для удобства я применяю такую заготовку: 75668

Для модификации лучше всего подходят прошивки для Спека 48 и Корвета - они самые простые. В прошивку Спек - 128 добавлены сочетания клавиш - при этом замыкаются несколько контактов матрицы сразу и логика работы немного усложнилась.

surinm
25.06.2021, 13:06
Доработал матрицу в прошивке для корвета с аутентичной раскладкой (JCUKEN) и переопределил в ней пины, чтобы можно было относительно просто обжать шлейф для подключения корвета:
https://pic.maxiol.com/thumbs2/1624614748.1845264823.img2256j.jpg (https://pic.maxiol.com/?v=1624614748.1845264823.img2256j.jpg&dp=2)
Всю информацию для изготовления контроллера для корвета собрал в первом посту темы https://zx-pk.ru/threads/29197-kontroller-dlya-podklyucheniya-ps-2-klaviatury.html

izzx
09.07.2021, 17:57
Почти спаял, но прошить пока что не получилось. Пишет что не видит USBasp, хотя оно в устройствах есть. И vid pid такие. Питание на плату только от USBasp подал. На нём ещё перемычка установлена для медленной скорости. Но в меню IDE и медленный вариант выбирал.

Arduino: 1.8.15 (Windows 7), Плата:"ATmega168, No bootloader, EEPROM retained, 168P / 168PA, BOD 2.7V, LTO Disabled, Internal 8 MHz"


avrdude: Version 6.3-20201216 Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/ Copyright (c) 2007-2014 Joerg Wunsch System wide configuration file is "C:\Users\****\AppData\Local\Arduino15\packages\Min iCore\hardware\avr\2.1.3/avrdude.conf"
Using Port : usb Using Programmer : usbasp Setting bit clk period : 32.0avrdude:
Warning: cannot query manufacturer for device: No such file or directoryavrdude:
Warning: cannot query product for device: No such file or directoryavrdude:
error: could not find USB device with vid=0x16c0 pid=0x5dc vendor='www.fischl.de' product='USBasp'avrdude done. Thank you.Ошибка при записи загрузчика.

Купил MT8816AP PLCC-44, а там ножки как будто под разъём заточены? Но я и так припаял.
Atmega168 паяная пришла.

Serg6845
09.07.2021, 18:46
Почти спаял, но прошить пока что не получилось. Пишет что не видит USBasp, хотя оно в устройствах есть. И vid pid такие.


из-под ардуиновской оболочки? есть у нее такая фишка. что-то они c avrdude намутили. надо скачать альтернативную версию avrdude и заменить exe в папке ардуины, все взлетит.

izzx
09.07.2021, 19:47
из-под ардуиновской оболочки?
Да.
Спасибо, попробую. Через этот адаптер уже шил атмегу, но с помощью avrdude.

Upd.
Прошил. Обновил драйвер для USBasp и нашёлся адаптер.
https://pic.maxiol.com/thumbs2/1626112333.2990913857.1.jpg (https://pic.maxiol.com/?v=1626112333.2990913857.1.jpg&dp=2)
https://pic.maxiol.com/thumbs2/1626112737.2990913857.2.jpg (https://pic.maxiol.com/?v=1626112737.2990913857.2.jpg&dp=2)
Железка сразу заработала. Только не привычно что не работают цифровые клавиши справа, не работает Ctrl+Alt+Del ). Но это не сложно докрутить, наверное.
Зато работает без задержек, в отличии от фирменного контроллера, что у меня есть.
Спасибо автору.

roma
30.08.2021, 09:36
Кто нибудь уже подключил данный контроллер к Алесте? Работает? Прошивкой не поделитесь?

Xrust
30.08.2021, 16:23
Кто нибудь уже подключил данный контроллер к Алесте? Работает? Прошивкой не поделитесь?

Тестовую версию я выкладывал здесь (https://zx-pk.ru/threads/33211-universalnyj-kontroller-ps-2-klaviatury-dlya-kompyuterov-s-matrichnymi-klaviaturami.html?p=1119377&viewfull=1#post1119377). Отзывов пока не было.

n_sonic
03.09.2021, 00:21
К Алесте подключил. При включении питания залипает почему-то клавиша "3" на основной клавиатуре. Стоит на нее нажать, и далее все будет работать нормально до снятия питания. Выход в биос по Ф10. ESC, оба shiftа, enter вроде бы на месте. Курсорные клавиши не работают. В режиме амстрада на них цифры, соответствующие курсорным на цифровой клавиатуре. В режиме Алесты ни курсорные, ни цифровые не работают, курсор не перемещают . Как-то так...

Xrust
03.09.2021, 08:46
n_sonic, отлично! Теперь можно доработать прошивку аналогично корветовской, чтобы переключалась раскладка.

n_sonic
03.09.2021, 15:26
Курсорные клавиши как заставить работать? И вопрос к пользователям Алесты - какая раскладка в режиме "алеста" и "амстрад", одинаковая или разная? У меня матричная клава от МС-ки есть, но там походу шлейф перебит...

Xrust
25.09.2021, 16:03
Отвечаю на вопрос, как подключить последовательный порт для отладки.
В разделе setup нужно вставить инициализацию порта Serial.begin(115200);
Вывод в порт нужно поставить после keyboard.read(), например Serial.println(c);
Подключить к компьютеру плату можно через адаптер USB/TTL.
Просматривать сообщения из порта можно с помощью встроенного монитора порта Arduino IDE или любой терминальной программой.

#include <PS2KeyRaw.h>
#define AX0 4
#define AX1 5
#define AX2 6
#define AX3 7
#define AY0 8
#define AY1 9
#define AY2 10
#define RSTMT 14
#define CSMT 15
#define DATMT 16
#define STBMT 17
#define DATAPIN 2
#define IRQPIN 3

volatile boolean d = HIGH;
uint8_t table[128] = {127,127,127,127,127,127,127,127,127,127,127,127,1 27,127,127,127,127,127,0,127,127,32,48,127,127,127 ,
1,17,16,33,49,127,127,3,2,18,34,51,50,127,127,112, 4,19,36,35,52,127,127,115,116,100,20,84,68,127,127 ,127,114,99,83,67,66,
127,127,127,98,82,81,64,65,127,127,127,127,97,127, 80,127,127,127,127,127,127,127,127,127,127,127,113 ,96,127,127,127,127,127,127,127,127,127,127,127,
127,127,127,127,127,127,127,127,127,127,127,127,12 7,127,127,127,127,127,127,127,127,127,127,127,127, 127};

PS2KeyRaw keyboard;
void setup() {
//Инициализация портов
pinMode(AX0, OUTPUT); //AX0
pinMode(AX1, OUTPUT); //AX1
pinMode(AX2, OUTPUT); //AX2
pinMode(AX3, OUTPUT); //AX3
pinMode(AY0, OUTPUT); //AY0
pinMode(AY1, OUTPUT); //AY1
pinMode(AY2, OUTPUT); //AY2
pinMode(RSTMT, OUTPUT); //RES
pinMode(CSMT, OUTPUT); //CS
pinMode(DATMT, OUTPUT); //DAT
pinMode(STBMT, OUTPUT); //STB
//Инициализация клавиатуры
keyboard.begin( DATAPIN, IRQPIN );
//Последовательный порт
Serial.begin(115200);
Serial.println("SpeccyKey");
//Инициализация MT8816
SetAddr(0);
digitalWrite(RSTMT, LOW);
digitalWrite(CSMT, LOW);
digitalWrite(DATMT, LOW);
digitalWrite(STBMT, LOW); //инициализация
digitalWrite(CSMT, HIGH); //выбор чипа
digitalWrite(RSTMT, HIGH);
digitalWrite(RSTMT, LOW); //сброс
digitalWrite(CSMT, LOW);
}
void SetAddr(uint8_t addr) {
digitalWrite(AX0,bitRead(addr,0));
digitalWrite(AX1,bitRead(addr,1));
digitalWrite(AX2,bitRead(addr,2));
digitalWrite(AX3,bitRead(addr,3));
digitalWrite(AY0,bitRead(addr,4));
digitalWrite(AY1,bitRead(addr,5));
digitalWrite(AY2,bitRead(addr,6));
}
void SetKey(boolean data){
digitalWrite(CSMT, HIGH); //выбор чипа
digitalWrite(STBMT, HIGH); //строб on
digitalWrite(DATMT, data); //данные
digitalWrite(STBMT, LOW); //строб off
digitalWrite(CSMT, LOW);
}
void loop()
{
if( keyboard.available() ){
int c = keyboard.read(); //чтение кода
Serial.println(c);
switch (c) {
case 0xE0: //если считался префикс 0xE0
break;
case 0xF0: //если считался префикс 0xF0 (отпускание клавиши)
d = LOW;
break;
default:
SetAddr(table[c]);
SetKey(d);
d = HIGH;
}
}
}

izzx
26.09.2021, 21:13
Отвечаю на вопрос, как подключить последовательный порт для отладки.

К плате, которая не DIP, надо проводочки припаивать?

Xrust
26.09.2021, 21:29
К плате, которая не DIP, надо проводочки припаивать?

Да, на плате PLCC не предусмотрены контакты для подключения отладочного порта.

Xrust
04.12.2021, 20:54
Выкладываю альфа-версию прошивки под Вектор-06Ц
Подключение: PA - J3, PB - J2, J1: 1 - УС, 3 - РУС/ЛАТ, 4 - СС.
Раскладка пока только ЙЦУКЕН.
Сам, к сожалению, протестировать не могу.

https://i.ibb.co/wcRW23K/sdr.jpg (https://ibb.co/wcRW23K)


#include <PS2KeyRaw.h>
#define AX0 4
#define AX1 5
#define AX2 6
#define AX3 7
#define AY0 8
#define AY1 9
#define AY2 10
#define SS 11
#define US 12
#define RUS 13
#define RSTMT 14
#define CSMT 15
#define DATMT 16
#define STBMT 17
#define DATAPIN 2
#define IRQPIN 3

volatile boolean d = HIGH;
volatile boolean ss = HIGH;
volatile boolean us = HIGH;
volatile boolean rus = HIGH;
uint8_t table[128] = {127,127,127,112,80,48,64,127,127,127,127,127,96,1 27,127,127,127,1,127,127,127,37,18,127,127,127,22, 23,
100,52,34,127,127,54,103,118,86,66,50,127,127,119, 85,20,84,53,82,127,127,70,21,38,6,101,98,127,127,1 27,7,117,116,114,3,127,
127,36,69,55,87,2,19,127,127,4,115,68,102,39,83,12 7,127,127,71,127,5,127,127,127,127,17,33,87,127,71 ,127,127,127,127,127,127,
127,127,49,127,127,65,127,0,48,127,127,127,32,16,1 13,81,112,64,32,127,127,96,97,127,127,80,127,127};

PS2KeyRaw keyboard;
void setup() {
//Инициализация портов
pinMode(AX0, OUTPUT); //AX0
pinMode(AX1, OUTPUT); //AX1
pinMode(AX2, OUTPUT); //AX2
pinMode(AX3, OUTPUT); //AX3
pinMode(AY0, OUTPUT); //AY0
pinMode(AY1, OUTPUT); //AY1
pinMode(AY2, OUTPUT); //AY2
pinMode(SS, OUTPUT); //SS
pinMode(US, OUTPUT); //US
pinMode(RUS, OUTPUT); //RUS
pinMode(RSTMT, OUTPUT); //RES
pinMode(CSMT, OUTPUT); //CS
pinMode(DATMT, OUTPUT); //DAT
pinMode(STBMT, OUTPUT); //STB
//Инициализация клавиатуры
keyboard.begin( DATAPIN, IRQPIN );

digitalWrite(SS, HIGH);
digitalWrite(US, HIGH);
digitalWrite(RUS, HIGH);

//Инициализация MT8816
SetAddr(0);
digitalWrite(RSTMT, LOW);
digitalWrite(CSMT, LOW);
digitalWrite(DATMT, LOW);
digitalWrite(STBMT, LOW); //инициализация
digitalWrite(CSMT, HIGH); //выбор чипа
digitalWrite(RSTMT, HIGH);
digitalWrite(RSTMT, LOW); //сброс
digitalWrite(CSMT, LOW);
}
void SetAddr(uint8_t addr) {
digitalWrite(AX0,bitRead(addr,0));
digitalWrite(AX1,bitRead(addr,1));
digitalWrite(AX2,bitRead(addr,2));
digitalWrite(AX3,bitRead(addr,3));
digitalWrite(AY0,bitRead(addr,4));
digitalWrite(AY1,bitRead(addr,5));
digitalWrite(AY2,bitRead(addr,6));
}
void SetKey(boolean data){
digitalWrite(CSMT, HIGH); //выбор чипа
digitalWrite(STBMT, HIGH); //строб on
digitalWrite(DATMT, data); //данные
digitalWrite(STBMT, LOW); //строб off
digitalWrite(CSMT, LOW);
}
void loop()
{
if( keyboard.available() ){
int c = keyboard.read(); //чтение кода
switch (c) {
case 0xE0: //если считался префикс 0xE0
break;
case 0x12: //если считался префикс 0x12 SS
ss = !ss;
digitalWrite(SS, ss);
d = HIGH;
break;
case 0x14: //если считался префикс 0x14 RUS
if (d == HIGH) rus = !rus;
digitalWrite(RUS, rus);
d = HIGH;
break;
case 0x58: //если считался префикс 0xE0 US
us = !us;
digitalWrite(US, us);
d = HIGH;
break;
case 0xF0: //если считался префикс 0xF0 (отпускание клавиши)
d = LOW;
break;
default:
SetAddr(table[c]);
SetKey(d);
d = HIGH;
}
}
}

Arseny
08.12.2021, 22:12
Всем привет.
Собираюсь купить сей девайс для УКНЦ, но нужна помощь клуба сделать под УКНЦ прошивку и развести шлейф.
Объясните, что нужно для разведения шлейфа? В идеале, хочу взять шлейф и колодку IDC-34 и развести нужные пины (пропуская ненужные на J2) на 2 шлейфа в линию для МС-7007.

Xrust
09.12.2021, 23:36
Arseny, нужно схему клавиатуры, прошивку сделать помогу.

Arseny
10.12.2021, 00:43
Arseny, нужно схему клавиатуры, прошивку сделать помогу.
В сообщении #53 (https://zx-pk.ru/threads/33211-universalnyj-kontroller-ps-2-klaviatury-dlya-kompyuterov-s-matrichnymi-klaviaturami.html?p=1129202&viewfull=1#post1129202) есть ссылка на схемы для Алесты aleste_keyboard.zip (https://zx-pk.ru/attachment.php?attachmentid=75560&d=1622788934). Там есть и распиновка матрицы и даже картинка как будут распределены кнопки :-)

izzx
13.12.2021, 21:07
Так никто и не захотел сделать кнопки сброс и nmi? Я всё ещё надеюсь, а то привык, руки тянутся.

nemo
14.12.2021, 10:54
izzx,

Планирую, в принципе написал (хотя в С я и не ахти как разбираюсь) но еще отлаживать надо, а у меня самодельная клава пока не полностью запустилась. Однако потребуется доработка платы (хотя если только RESET и NMI) можно обойтись и без доработок, можно будет использовать пины программирования меги, надо будет просто в прошивке поправить пины) для вывода наружу не используемых пинов меги.

Xrust
14.12.2021, 19:08
nemo, еще один выход можно попробовать взять с вывода CS матрицы, а ее прицепить к +5в.

izzx, Пример реализации можно взять из кода для Ветора - там таким образом переключаются кнопки СС, УС, РУС.

izzx
14.12.2021, 20:25
Xrust, спасибо. Если не дождусь готового варианта, буду сам делать.

Xrust
14.12.2021, 22:20
izzx, попробуйте. Сам не испытывал еще, но компилируется без ошибок.


#include <PS2KeyRaw.h>
#define AX0 4
#define AX1 5
#define AX2 6
#define AX3 7
#define AY0 8
#define AY1 9
#define AY2 10
#define RES 11
#define NMI 12
#define RSTMT 14
#define CSMT 15
#define DATMT 16
#define STBMT 17
#define DATAPIN 2
#define IRQPIN 3

volatile boolean d = HIGH;
volatile boolean res = HIGH;
volatile boolean nmi = HIGH;

uint8_t table[128] = {127,127,127,127,127,127,127,127,127,127,127,127,1 27,127,127,127,127,127,0,127,127,32,48,127,127,127 ,1,17,16,33,49,127,
127,3,2,18,34,51,50,127,127,112,4,19,36,35,52,127, 127,115,116,100,20,84,68,127,127,127,114,99,83,67, 66,127,
127,127,98,82,81,64,65,127,127,127,127,97,127,80,1 27,127,127,127,127,127,127,127,127,127,127,113,96, 127,127,127,127,127,
127,127,127,127,127,127,64,127,127,127,127,52,127, 127,127,127,127,127,127,127,127,127,127,127,127,12 7,127,127,127,127,127,127};

PS2KeyRaw keyboard;
void setup() {
//Инициализация портов
pinMode(AX0, OUTPUT); //AX0
pinMode(AX1, OUTPUT); //AX1
pinMode(AX2, OUTPUT); //AX2
pinMode(AX3, OUTPUT); //AX3
pinMode(AY0, OUTPUT); //AY0
pinMode(AY1, OUTPUT); //AY1
pinMode(AY2, OUTPUT); //AY2
pinMode(RES, OUTPUT); //Reset
pinMode(NMI, OUTPUT); //NMI
pinMode(RSTMT, OUTPUT); //RES
pinMode(CSMT, OUTPUT); //CS
pinMode(DATMT, OUTPUT); //DAT
pinMode(STBMT, OUTPUT); //STB
//Инициализация клавиатуры
keyboard.begin( DATAPIN, IRQPIN );
//Инициализация MT8816
SetAddr(0);
digitalWrite(RSTMT, LOW);
digitalWrite(CSMT, LOW);
digitalWrite(DATMT, LOW);
digitalWrite(STBMT, LOW); //инициализация
digitalWrite(CSMT, HIGH); //выбор чипа
digitalWrite(RSTMT, HIGH);
digitalWrite(RSTMT, LOW); //сброс
digitalWrite(CSMT, LOW);

digitalWrite(RES, res);
digitalWrite(NMI, nmi);

SetAddr(table[0x12]);
SetKey(LOW);
}
void SetAddr(uint8_t addr) {
digitalWrite(AX0,bitRead(addr,0));
digitalWrite(AX1,bitRead(addr,1));
digitalWrite(AX2,bitRead(addr,2));
digitalWrite(AX3,bitRead(addr,3));
digitalWrite(AY0,bitRead(addr,4));
digitalWrite(AY1,bitRead(addr,5));
digitalWrite(AY2,bitRead(addr,6));
}
void SetKey(boolean data){
digitalWrite(CSMT, HIGH); //выбор чипа
digitalWrite(STBMT, HIGH); //строб on
digitalWrite(DATMT, data); //данные
digitalWrite(STBMT, LOW); //строб off
digitalWrite(CSMT, LOW);
}
void loop()
{
if( keyboard.available() ){
int c = keyboard.read(); //чтение кода
switch (c) {
case 0xE0: //если считался префикс 0xE0
break;
case 0x7E: //если считался код 0x7E RES (значит клавишу сброса нажали или отпустили - не важно)
res = !res; //просто инвертируем состояние переменной
digitalWrite(RES, res); //и записываем
d = HIGH; //даже если было отпускание клавиши, эта клавиша (Reset) не писалась в матрицу, так что LOW записывать в нее точно не надо.
break;
case 0x07: //если считался код 0x07 NMI
nmi = !nmi;
digitalWrite(NMI, nmi);
d = HIGH;
break;
case 0xF0: //если считался префикс 0xF0 (отпускание клавиши)
d = LOW; //значит при следующей записи кода в матрицу нужно будет записать LOW, если это не будет какое-то сочетание или NMI/Reset
break;
case 0x66: //если считался код 0x66 [BS]
SetAddr(table[0x12]);
SetKey(d);
SetAddr(table[0x45]);
SetKey(d);
d = HIGH;
break;
case 0x6B: //если считался код 0x6B [Left]
SetAddr(table[0x12]);
SetKey(d);
SetAddr(table[0x2E]);
SetKey(d);
d = HIGH;
break;
case 0x72: //если считался код 0x72 [Down]
SetAddr(table[0x12]);
SetKey(d);
SetAddr(table[0x36]);
SetKey(d);
d = HIGH;
break;
case 0x75: //если считался код 0x75 [Up]
SetAddr(table[0x12]);
SetKey(d);
SetAddr(table[0x3D]);
SetKey(d);
d = HIGH;
break;
case 0x74: //если считался код 0x74 [Right]
SetAddr(table[0x12]);
SetKey(d);
SetAddr(table[0x3E]);
SetKey(d);
d = HIGH;
break;
case 0x76: //если считался код 0x76 [Edit]
SetAddr(table[0x12]);
SetKey(d);
SetAddr(table[0x16]);
SetKey(d);
d = HIGH;
break;
case 0x58: //если считался код 0x58 [Caps lock]
SetAddr(table[0x12]);
SetKey(d);
SetAddr(table[0x1E]);
SetKey(d);
d = HIGH;
break;
case 0x0D: //если считался код 0x0D [Ext mode]
SetAddr(table[0x12]);
SetKey(d);
SetAddr(table[0x59]);
SetKey(d);
d = HIGH;
break;
case 0x41: //если считался код 0x41 [,]
SetAddr(table[0x59]);
SetKey(d);
SetAddr(table[0x31]);
SetKey(d);
d = HIGH;
break;
case 0x49: //если считался код 0x49 [.]
SetAddr(table[0x59]);
SetKey(d);
SetAddr(table[0x3A]);
SetKey(d);
d = HIGH;
break;
case 0x4C: //если считался код 0x4C [;]
SetAddr(table[0x59]);
SetKey(d);
SetAddr(table[0x44]);
SetKey(d);
d = HIGH;
break;
case 0x52: //если считался код 0x52 ["]
SetAddr(table[0x59]);
SetKey(d);
SetAddr(table[0x4D]);
SetKey(d);
d = HIGH;
break;
default:
SetAddr(table[c]); //Тут мы по таблице определяем адрес в матрице
SetKey(d); //Записываем состояние ключа в матрицу
d = HIGH; //Мы ведь могли и LOW записать, если ранее был считан префикс отпускания 0xF0. Так что теперь приготовимся записать HIGH.
}
}
}

Начальное состояние выходов определяется переменными res и nmi. Они расположены на J1 1 и 4. В качестве клавиши Res- Scroll Lock, в качестве NMI - F12. Если на клавиатуре есть Power, Sleep и Wake, наверное удобнее их использовать. С сочетаниями чуть сложнее, но тоже можно сделать. Давайте пока так испытаем.

izzx
15.12.2021, 09:25
Они расположены на J1 1 и 4.
На разъёме для прошивки? Не понимаю.
Оно будет замыкать на землю контакты 1 и 4?
Кстати, а мощи микросхемы хватит? А то где-то читал, что транзисторы цепляют для какой-то кнопки. На всякий случай уточняю.

nemo
15.12.2021, 14:30
Оно будет замыкать на землю контакты 1 и 4?

Ну да для скетча выше это пины разъема прошивки. На выходах mega будет устанавливаться низкий уровень. Что касается транзисторов. Я до этого делал другой контроллер (на 8 mega) там без всяких транзисторов,не помню что бы мега грелась. Да и NMI нагружен то всего на 1 вход. Так что ИМХО можно и напрямую. Другое дело что в некоторых случаях (вроде на пенте так) для NMI замыкается m1 на АГ3 вот тут наверное без ключа не обойтись. Но при желании для страховки можно и понаставить ключей.

izzx
15.12.2021, 15:02
А мега потом прошиваться снова будет? Думаю будет, раз специалисты говорят. Сигнал RST же не трогаем.
И на выходе меги MISO MOSI не будет постоянно высокий уровень? Пока клавишу не нажмёшь. А я его возьму и железной кнопкой на землю. Как бы чего не вышло ).

nemo
15.12.2021, 15:53
А мега потом прошиваться снова будет?

А куда она денется? Прошивальщик ее дергает за RES после этого она какое то время ждет начала заливки. А тут он ей "на кушай...".
А зачем железной кнопкой то :v2_dizzy_tired2: ты его клавишей на клаве, для этого скетча Res- Scroll Lock NMI - F12, клава отдаст меге ну а та разберется чего там на ногах выставить. Если ты про кнопку что на ресет припаяна так убрать ее за ненадобностью. Ну а если не хочется поставь диод.

- - - Добавлено - - -

Xrust,

Мне вот тут не понятно
case 0x7E: //если считался код 0x7E RES (значит клавишу сброса нажали или отпустили - не важно)
res = !res; //просто инвертируем состояние переменной
digitalWrite(RES, res); //и записываем
d = HIGH; //даже если было отпускание клавиши, эта клавиша (Reset) не писалась в матрицу, так что LOW записывать в нее точно не надо.
break;
LOW в порт мы записали а где мы в него опять HIGT запишем? Если там LOW постянно будет так "вечный RESET" получим?

Xrust
15.12.2021, 19:09
nemo, эти low и high пишутся в матрицу, а не в порт reset.

izzx
15.12.2021, 20:26
Прошивку опробовал. Reset подключил на контакт 1 J1. Комп не запускается с контроллером, пока не нажмёшь Ф12 для сброса. Тогда начинает работать, но через несколько секунд клава печатает случайный символ несколько раз, затем перестаёт совсем печатать.

А вообще я думал, что сброс надо не к меге подключать, а к матрице. К одному контакту землю, к другому сброс.
И кстати, кнопочка на корпусе тоже нужна. А к ней ещё и конденсатор подвешен, если что.

Xrust
15.12.2021, 21:18
izzx, сначала желательно проверить работу контроллера не подключая к компьютеру. Что у него на j1.1 в момент подачи питания? Что после нажатия клавиш?
Как реализована цепь сброса на компьютере? Если там конденсатор, то от него лучше отказаться и сделать принудительный сброс от контроллера клавиатуры. Чтобы и кнопку сброса сохранить, придется выход контроллера с ней развязать. Например, через диод.
Когда появится свободное время, прошью свой контроллер и проверю прошивку. Возможно, в ней есть незамеченные ошибки. Логика её работы всё усложняется.

nemo
16.12.2021, 08:45
пишутся в матрицу

ээээ

digitalWrite
Подает HIGH или LOW значение на цифровой вход/выход (pin).

Зачем вообще писать что то в матрицу нам же тут 8816 не нужен?
Что касается кондера когда подключал контроллер на мега8 работало нормально и с ним (но думается там нужна задержка на несколько ms).

izzx
16.12.2021, 10:34
В общем, с логикой работы не то. Включил без компа. На контакте j1.1 5 вольт. Когда нажимаешь и держишь Ф12, напряжение сначала 0, а потом скачет от 1.5 до 3.5. И иногда инвертируется. При не нажатой Ф12 уже 0, а при нажатой 5.

А в компе сигнал reset на несколько микросхем идёт.
https://pic.maxiol.com/thumbs2/1639639989.1597373949..jpg (https://pic.maxiol.com/?v=1639639989.1597373949..jpg&dp=2)

"можно порекомендовать подключить параллельно контактам кнопки "Сброс" конденсатор, емкостью 33...47 мкФ (положительный вывод "+" - на контакт Reset, отрицательный вывод - на контакт Земля)."

Думаю надо к матрице цеплять.

nemo
16.12.2021, 11:20
Думаю надо к матрице цеплять.

Матрица занята.

nemo
16.12.2021, 14:28
На контакте j1.1 5 вольт. Когда нажимаешь и держишь Ф12, напряжение сначала 0, а потом скачет от 1.5 до 3.5. И иногда инвертируется. При не нажатой Ф12 уже 0, а при нажатой 5.


Странно при +5 комп должен стартовать. Второй пункт по началу логичен но откуда там пульсации? Третий пункт о том я и говорил "вечный RESET". Может на отпускание F12 все же повесить задание высокого уровня?

izzx
16.12.2021, 14:38
Странно при +5 комп должен стартовать.
Да, странно что сразу не стартует. Вообще сбрасывается клавишей хорошо. Я несколько раз нажимал. даже после зависания клавы, вроде бы, сброс всё равно работает.

nemo
16.12.2021, 15:23
Да, странно что сразу не стартует.

Может сделать ему принудительный рестарт дописав где то перед началом основного блока программы

digitalWrite(RES, LOW);
delay 10;
digitalWrite(RES, HIGH);

reddie
16.12.2021, 16:46
Чуток не по теме, но хочу подробней узнать про коммутатор MT8816. Из доки следует, что это матрица на 128 вариантов (8х16), при стандартном порядном опросе проблем для реализации той же спектрумовской клавы нет. Но. Спектрум позволяет разом опрашивать хоть все 8 рядов одновременно конструкцией вида XOR A: IN A,(#FE), получая сочетание нажатых клавиш согласно выбранным рядам (пусть и с некоторыми условиями). Отрабатывает ли в данном случае матрица аналогично железному компу? Или как она себя поведет, если установить в ноль сразу несколько входных линий?

Ewgeny7
16.12.2021, 19:04
Матрица занята
Матрицу можно "положить набок", чтобы были свободные и ряды, и колонки.

- - - Добавлено - - -


Отрабатывает ли в данном случае матрица аналогично железному компу?
Да, на опрос со стороны рядов/линий она реагирует абсолютно параллельно, как будто к массиву кнопок или контактов реле.

Xrust
16.12.2021, 22:32
ээээ
Зачем вообще писать что то в матрицу нам же тут 8816 не нужен?
Что касается кондера когда подключал контроллер на мега8 работало нормально и с ним (но думается там нужна задержка на несколько ms).

Ну, так устроена логика обработки скан-кодов. Дело в том, что префикс отпускания клавиши фиксируется только в одном месте программы, а следующий за этим префиксом код может обрабатываться в разных местах. При этом матрица может участвовать, если код клавиши соответствует контакту матрицы, а может и не участвовать - это если скан коду соответствует что-то другое, например выход микроконтроллера. В первом случае отпускание будет нейтрализовано после записи в матрицу в ветке default, а во втором случае в отдельной ветке case, а запись в матрицу вообще не произойдет.

- - - Добавлено - - -


Странно при +5 комп должен стартовать. Второй пункт по началу логичен но откуда там пульсации? Третий пункт о том я и говорил "вечный RESET". Может на отпускание F12 все же повесить задание высокого уровня?

Конденсатор цепи сброса заряжается не через резистор, а от выхода микроконтроллера. Причем +5 там не сразу появляется, сначала там 0, затем инициализация клавиатуры, затем +5. Вероятно, из-за этого самозапуска не происходит.
Пульсации - это автоповтор клавиатуры.

nemo
17.12.2021, 08:43
Причем +5 там не сразу появляется, сначала там 0, затем инициализация клавиатуры, затем +5.

Поэтому я предложил сделать принудительно рестарт что бы зависший ZX привести в чувство.

Helbr
17.12.2021, 17:49
Доброго дня всем!

Я вот тоже спаял этот контроллер для моего старого Ориона 128. Чуть-чуть модифицировал прошивку чтобы удобнее было мэппинги вбивать.
Исходник (https://bitbucket.org/rudolff/mt8816_keyboard/src/master/mt8816_keyboard.ino)

Xrust
17.12.2021, 18:17
Матрицу можно "положить набок", чтобы были свободные и ряды, и колонки.


Как вариант, но надо учитывать, что сопротивление у ключей довольно приличное, 200-300 Ом может достигать.

Helbr
18.12.2021, 22:15
Xrust, ещё столкнулся с такой недоработкой, стоит добавить резисторы подтяжки для сигнальных линий ps/2. У меня одна клавиатура то работала, то нет. Замерил напряжения на clk и data - 2.2В. После того как добавил резисторы подтяжки по 5,1к, стало стабильно работать. Ещё, если будешь выпускать платы, хорошо бы нанести маркировку RX, TX у соответствующих выводов последовательного порта.

nemo
19.12.2021, 13:23
После того как добавил резисторы подтяжки по 5,1к, стало стабильно работать.

Мне с самодельной pc/2 клавой пришлось поставить по 1к при 5к работало но не стабильно. Где то читал что заводские должны иметь подтяжку, но видимо не все ее имеют.

Xrust
19.12.2021, 17:40
nemo, у меня все клавы с этим контроллером работали, даже те, которые с контроллером от Caro не дружили. Но есть нюанс. Инициализацию клавиатуры желательно делать как можно раньше в программе, иначе может заглючить.

OrionExt
21.12.2021, 17:28
Матрицу можно "положить набок", чтобы были свободные и ряды, и колонки. т.е. ты собираеся ее раком поставить (у меня тоже есть несколько решений по этому поводу). нет уж. а то будет как у в твоих решений, тут работает, а тут нет :D почему не работает? не помню.

Ewgeny7
27.12.2021, 12:19
OrionExt, поток сознания?

izzx
27.12.2021, 18:35
Например, через диод.
Надо диод катодом на j1.1 воткнуть? А анодом на сигнал ресет от компа?

Xrust
27.12.2021, 21:52
Надо диод катодом на j1.1 воткнуть? А анодом на сигнал ресет от компа?

Да, думаю так. Тогда выход контроллера сможет шунтировать цепь сброса.

Ewgeny7
02.01.2022, 17:15
Собрал и опробовал сей контроллер на макетке. Замечательно работает.
Потом поправил код, чтобы матрицу кнопок "положить набок", тоесть повернуть массив 5х8, чтобы стало 8х5.
Соответственно, поменял местами выходы X и Y на клавиатуру. Появились свободные ряды и по Y (5-7) и остались по Х (8-15).
Внедрил реакцию на нажатие F12 и F9 c замыканием матрицы вне поля кнопок. Сопротивление матрицы в открытом канале - около 60 Ом, что более чем достаточно и для сброса, и для Магика.
Всё работает. Выход матрицы Х8 - на землю, Y5, Y6 - в комп.
Работает теперь штатно в Скорпионе-GMX.

izzx
02.01.2022, 17:56
Выход матрицы Х8 - на землю, Y5, Y6 - в комп
Остальные выводы в том же порядке, только X поменять на Y? А прошивка будет?

Ewgeny7
02.01.2022, 19:15
А прошивка будет?
Грубо говоря - да. Разъемы X и Y меняются местами. Y0-4 становятся столбцами кнопок, Х0-7 - адресными КА рядов кнопок. В оригинале - наоборот.
Паршивку могу тебе отправить электропочтой, на проверку. Если будет всё путем и у тебя - можно выложить.

izzx
04.01.2022, 16:33
После того, как прошил скетч из сообщения 90, теперь не могу добиться, чтобы работала первоначальная прошивка для спек 128. Такое может быть?
Изменённую шью, которая с кнопками NMI - условно работает. А первоначальная уже нет.

nemo
05.01.2022, 12:25
quote="izzx;1142262"]Такое может быть?[/quote]

Если мега реально не прошивается (остается старая прошивка) попробуй сделать полное стирание чипа. Ну или не ту прошивку шьешь.


можно выложить
очень ждем

izzx
05.01.2022, 15:41
очень ждем
Я хочу проверить прошивку, но пока непонятные глюки со старой. Провода не перепаял ещё под новую, а старые прошивки толком не работают. Залил от 48к, но она тоже через несколько секунд начинает печатать один символ. И прогой SinaProg 2.1 стереть не могу, что-то она не работает. Попробую на другом компе.

Упд. Почистил плату спиртом и заработала... Сейчас буду перепаивать.

Упд2. Перепаял под прошивку Ewgeny7, но что-то я напутал. Два полуряда не работают, а остальные похоже ОК. Буду искать что не так.

Xrust
05.01.2022, 19:55
izzx, у меня все непонятные глюки как правило были связаны с плохим питанием. Еще, движок форума иногда глючит и портит текст скетча в сообщении, даже внутри [code]

Ewgeny7
05.01.2022, 20:50
По результатам - для варианта с GMX-платой не получилось только сделать переключение турбо/нетурбо, сопротивление в 60 Ом оказалось великО, чтобы обеспечить нужное падение напряжения. Тут надо или ключ, или подбирать резистор на делитель напряжения в GMX (чем и займусь), или забить и обойтись сбросом и уходом в теневик. Последнего варианта в принцмпе вполне хватает, но хочется феншуй.

- - - Добавлено - - -


Два полуряда не работают
Случаем не Н-Enter и В-Пробел? Попробуй их на на Х8 и Х9. Если найдешь, то на землю сади Х10. У меня собрано и пересобрано на макетке, и осталась еще одна загадка... Подтвердишь - исправлю.

izzx
05.01.2022, 21:32
Случаем не Н-Enter и В-Пробел?
Да, точно.

- - - Добавлено - - -


Попробуй их на на Х8 и Х9. Если найдешь, то на землю сади Х10
Не совсем понятно.

Ewgeny7
05.01.2022, 21:33
Да, точно.
Это моя ошибка, исправлю. Заблудился в бороде МГТФ и PLCC-кроватке. Попробуй на указанные ряды выходов Х подключиться.
Тоесть, не в Х6 и Х7, а в Х8 и Х9 соответственно.

izzx
05.01.2022, 21:56
Тоесть, не в Х6 и Х7, а в Х8 и Х9 соответственно
Всё, теперь все кнопки работают. И курсор. По Esc пробел печатает. Остальные комбинации не проверял. Завтра прицеплю сброс и магик. Жаль, для турбо на разъёме клавиатуры не хватит контактов.

Ewgeny7
05.01.2022, 22:09
Всё, теперь все кнопки работают.
Замечательно, спасибо!
А пока ты перепаивал, я поправил код. Выложу послезавтра, нужно сначала у себя ошибку на плате устранить и проверить.

- - - Добавлено - - -


По Esc пробел печатает.
CapsShift+Space, она же Break (большая красная кнопа на расширенных клавиатурах).

izzx
06.01.2022, 16:11
Ewgeny7, у меня тоже работают мэйджик и сброс. Я проверил. Осталось привыкнуть к новой раскладке. Нужен список всех клавиш и точная схема подключения.
А почему NMI F9?

Версия Xrust тоже получается почти рабочая, просто совпало, что у меня на плате где-то замыкание было. Потому были повторы символов и зависания. Но надо решить проблему с инверсией и со стартом компа.

Xrust
06.01.2022, 16:17
Но надо решить проблему с инверсией и
Что за проблема с инверсией?

izzx
06.01.2022, 18:08
Что за проблема с инверсией?
А вот я писал что

На контакте j1.1 5 вольт. Когда нажимаешь и держишь Ф12, напряжение сначала 0, а потом скачет от 1.5 до 3.5. И иногда инвертируется. При не нажатой Ф12 уже 0, а при нажатой 5.

Ewgeny7
06.01.2022, 18:32
А почему NMI F9
Ну, тут уже из серии "а почему бы и нет?". Какая должна быть?

- - - Добавлено - - -


Осталось привыкнуть к новой раскладке.
Не то чтоб она новая. Я взял примерно раскладку с ПентЭвы.
Esc - Break
TAB - ExtMode
Caps Lock - CapsLock
LShift - Caps Shift
LCTRL - Symbol Shift
RShift - Symbol Shift
Back Space - Back Space
Б - точка
Ю - запятая
Ж - точка с запятой
Э - кавычки
Ну и - с =.

izzx
06.01.2022, 18:50
Я взял примерно раскладку с ПентЭвы.
А на ней нет клавиши NMI?
Вот в эмуляторе unreal F11. Но правда рядом будет со сбросом F12. Может опасно.
Можно Scroll Lock, как у скорпионов принято.

Xrust
06.01.2022, 18:53
а потом скачет от 1.5 до 3.5.
Так это автоповтор. Так клавиатура устроена.

Можно

digitalWrite(RES, res);
digitalWrite(NMI, nmi);
вынести перед инициализацией клавиатуры, в инициализацию портов. Так будет быстрее.
При этом то, каким будет начальное состояние задается здесь:

volatile boolean res = HIGH;
volatile boolean nmi = HIGH;

izzx
06.01.2022, 19:11
Xrust, я про то что

И иногда инвертируется. При не нажатой Ф12 уже 0, а при нажатой 5
Там где-то в коде была инверсия, как я помню.
Ну да ничего, у нас есть рабочий вариант.

nemo
07.01.2022, 12:33
Ну, тут уже из серии "а почему бы и нет?". Какая должна быть?


Может выложить исходник и тот кому это надо (например мне) подправит "под себя"?

Ewgeny7
10.01.2022, 09:10
Может выложить исходник и тот кому это надо (например мне) подправит "под себя"?
Да разумеется, тайны там никакой, тем более я лишь чуть переделал. Вечером сегодня выложу, как с работы вернусь.

- - - Добавлено - - -


Вот в эмуляторе unreal F11. Но правда рядом будет со сбросом F12. Может опасно
Именно. Поэтому разнес.



Можно Scroll Lock, как у скорпионов принято
Надо проверить, у кнопки скроллок, в отличие от большинства, аж 6 байт вместо 2 поступает при нажатии. Если код нормально это переваривает, то можно и скролл.

Ewgeny7
10.01.2022, 20:49
Может выложить исходник
https://disk.yandex.ru/d/9-kt48hZ248m4w
Я так и не успел его проверить у себя, круговерть всего, но должно работать как надо.
NMI на старом месте, на F9.

- - - Добавлено - - -


у кнопки скроллок, в отличие от большинства, аж 6 байт вместо 2 поступает при нажатии
Ошибочка вышла, это у Pause 6 байт. У Scroll всего один - 0х7E. Можете переделать, это легко :)

nemo
11.01.2022, 10:17
круговерть всего

Аналогичная картина :(

Ewgeny7
11.01.2022, 12:57
Обновил ссылку, была ошиПка в "стрелка вниз", попутно изменил NMI на ScrLck.

izzx
11.01.2022, 20:05
Значит пины Х теперь по порядку на 0-7, а земля осталась на Х10. Хорошо, буду перепаивать.

Упд.
Что-то не работает. Перепаял с Х8-9 на Х6-7 и комп не заводится.

Egal
13.01.2022, 11:24
Всем добрый день.
Спаял этот контроллер с plcc версией ключей. Не заработал.
На 2-3 секунды работает кнопка вниз. Либо может сработать Enter - включится Tape Loader - можно нажать два раза проблем для отмены, тоже сработает.
Дальше ничего не работает. Иногда Enter начинает работать как кнопка вниз.
Посе прогрева время от времени после ресета комп практически постоянно выходит в цветовой матрас - как при зажатых шифтах.
Если при включении сразу нажать стрелку вверх - то после этого ничего больше не нажимается.

Кондеи по питанию поставил 1мкф постоянные 2 штуки и 1 на 470 электролит

Подключаюсь по ICSP программатором TL866-2-Pro - чип выбираю ATMEGA168PA - check id = 1E 94 0b
Пытаюсь прочитать -- Check ID Error 0x 1E 94 0b
Отключаю Check ID - прочитал вот это (https://disk.yandex.ru/d/h1oVxS2w6Fx5ow) - это соответствует действительности?

nemo
13.01.2022, 12:13
А мега то прошита?

Egal
13.01.2022, 12:33
А мега то прошита?
Брал конструктор на барахолке у автора темы. В том и вопрос - то что я считал это то что нужно?
Может я чего попортил пока подключал. После прогрева стабильно выходит в тест цветов - оба шифта зажаты.

- - - Добавлено - - -

Обычную клавиатуру 40 кнопок подключал - все 40 работают нормально.

nemo
13.01.2022, 15:07
Проверить пайку на "залипы" непропаи. Если все ОК попробуй подтянуть CLk и DATA резисторами 4.7к к Vcc.

Ewgeny7
13.01.2022, 17:19
а земля осталась на Х10
Нет, зачем же? для клавиатуры используется Х0-7, а на Х8 - землю.

- - - Добавлено - - -


Что-то не работает. Перепаял с Х8-9 на Х6-7 и комп не заводится.
Заменил прошивку в Меге? У меня сейчас всё работает.

Egal
13.01.2022, 18:18
Проверить пайку на "залипы" непропаи. Если все ОК попробуй подтянуть CLk и DATA резисторами 4.7к к Vcc.
Атмега уже впаяна была - и отлично впаяна, ключи вроде нормально впаял, звонятся. Не пропай привел бы скорее к отдельно неработающим кнопкам.
Подтянуть попробю.
А тот файл что я приложил - это то что должно быть или нет? Или может есть где прошивка уже готовая, я сам сравню (для п128).

izzx
13.01.2022, 18:19
Заменил прошивку в Меге
Прошивку заменил, и землю оставил на Х10. Что характерно, магик и сброс работали. Только перестали работать два последних ряда кнопок. Вот тогда и перепаял на 6-7. И тут внезапно не заработало. Отпаял контакты 6-7, заработало. Буду дальше пробовать.

Xrust
13.01.2022, 19:53
прочитал вот это (https://disk.yandex.ru/d/h1oVxS2w6Fx5ow) - это соответствует действительности?

Соответствует. Контрольная сумма совпадает с тем, что в рабочий контроллер шилось.

Попробуйте другую клавиатуру, если есть возможность. Попробуйте резисторы подтяжки для клавиатуры - некоторые жаловались, что встроенной в МК 10кОм не всегда хватает.
Если ничего не поможет, предлагаю прошить отладочную прошивку. Тут понадобится кварц, чтобы стабилизировать работу последовательного порта. Могу вам прислать такую для кварца 16МГц. К сожалению, на PLCC версии платы я не развел контакты для отладочного порта, придется провода к выводам припаивать.
Все чипы, которые я отправляю в комплектах, проходят у меня проверку. В МК я записываю тестовую прошивку, которая проверяет работоспособность портов. Матрицы тоже проходят ограниченную проверку - втыкаю их в рабочий контроллер, подключенный к спеку.

Egal
13.01.2022, 21:59
Соответствует. Контрольная сумма совпадает с тем, что в рабочий контроллер шилось.
Фух. Значит не сломал ничего ))
Клавиатуры у меня две - но они одинаковые, ОКЛИК и обе нормально работают в Speccy2010.

Я пока грешу на китайский импульсник.
Хотя сам GRM-1 все тесты проходит нормально. Я подержал всё включенным подольше - ключи сами собой переключаются, на что хотят. Хотят два шифта, хотят сами Enter нажмут.
Стрелка вверх редко когда работает, но вниз стабильно. Бывает нажмёшь вниз - и полоска-селектор полетела снизу вверху добесконечности.
Может клавиатура что-то левое пуляет? На неё какую подтяжку надо?

Давайте попробуем отладочную. А что-то нужно для порта?

- - - Добавлено - - -

Да, С1 я на 470мкф впаял

- - - Добавлено - - -

Кстати, на схеме - в pdf-ке - DATA у MT8816AE обозначена 38 пин, хотя по DS это 42 пин.

- - - Добавлено - - -


предлагаю прошить отладочную прошивку
Мне кажется я нашёл причину моих мучений ;-)
Надеюсь будет видно :biggrin:
https://pic.maxiol.com/thumbs2/1642100081.2960083253.kbd1s.jpg (https://pic.maxiol.com/?v=1642100081.2960083253.kbd1s.jpg&dp=2)

Xrust
13.01.2022, 22:20
Мне кажется я нашёл причину моих мучений ;-)
Надеюсь будет видно
Нет, ничего не замечаю.
Неужели непропай? Как всегда, у последнего лапка соскакивает...

- - - Добавлено - - -

Сейчас специально взял и спаял такой же PLCC контроллер. Мне стыдно, но новую серию фиолетовых плат PLCC я на собираемость не проверял. Впрочем, изменение там были только одно - резистор R1. Плата с первого раза не заработала, глючила, были ложные срабатывания. Тщательно отмыл китайский флюс, который остался под PLCC панелькой. Снова глюк. На этот раз не той стороной матрицу воткнул в панель. Нагрелась, но не сгорела. Поставил правильно - работает.

TomaTLAB
13.01.2022, 22:28
Нет, ничего не замечаю. 25-ая лапа

Xrust
13.01.2022, 22:31
TomaTLAB, точно, тоже заметил. :v2_blush:

Egal
14.01.2022, 00:15
25-ая лапа
Приз в студию! :v2_dizzy_vodka2:
Кстати это DATA ;-)

- - - Добавлено - - -


точно, тоже заметил.
:biggrin:

Но вот беда. Подключил всё - работает! ура! Кроме D4, все кнопки на этой линии не нажимаются. Все остальные отлично работают!
Смотрю - не туда подпаял проводок, нечётная линия то у двойной гребёнки вверху. Перепаял. Включаю - болт. Вообще.
Ни одна кнопка не работает вообще :biggrin: Пытаюсь замкнуть проводком Д0 и А14 - тот же болт.
Спалил АП5 или ИР23? Но так же не бывает :biggrin:

- - - Добавлено - - -


Спалил АП5 или ИР23? Но так же не бывает
Нет, клавиатура впорядке. Контроллер молчит. Шож так не везёт то :biggrin:

- - - Добавлено - - -

Отцепил контроллер, только А8-А15 линии, клавиатура работает. Покрайней мере Enter и space нажимается :biggrin:
Цепляю обратно не работает. Ничего не греется. Микросхема ключей холодная как судак.

Кстати -

но новую серию фиолетовых плат PLCC
На jlcpcb.com заказывали?
Я бы пару изменений внёс :biggrin: - пошире отверстя для электролита разнёс (хотя сейчас 47мкф стоит, но может и такие и такие сделать).
И панельку PLCC - хочешь паяй на плату, хочешь в панельку. Паять её то ещё удовольствие :biggrin:

- - - Добавлено - - -

Ха, начал давить на все кнопки клавиатуры - как на рояле - и она заработала.
Какая-то кнопка сброса контроллера есть?
Все кнопки пашут как нефиг делать.
https://pic.maxiol.com/thumbs2/1642106011.2960083253.kbd2.png (https://pic.maxiol.com/?v=1642106011.2960083253.kbd2.png&dp=2)

Что делать и кто виноват? :biggrin:

- - - Добавлено - - -

Ещё вопрос, на обычной клавиатуре вторая нажатая кнопка (первую нажали - и не отпускаем - что-то печатается) вызывала её нажатие и печать то что под ней или вообще ввообще прекращается?
Не могу сейчас проверить на обычной клавиатуре

Egal
14.01.2022, 11:29
Стабильное проявление, включаю на холодную - контроллер не работает.
По всем кнопкам разом пожмакаешь - начинает нормально работать.
Чудеса.

nemo
14.01.2022, 11:34
Чудеса.

Ээээ а резистор 10К на ресете меги запаян?

Egal
14.01.2022, 12:45
Ээээ а резистор 10К на ресете меги запаян?
Конечно. Может поменьше впаять? 4.7К или что-то вроде того.

nemo
14.01.2022, 14:36
По даташиту вроде 10к... С питанием все нормально?

Egal
14.01.2022, 19:37
С питанием все нормально?
Замерял - 5 вольт, под нагрузкой

- - - Добавлено - - -

Да, нашёл про 10К

По даташиту вроде 10к...
- Pull-up resistors on the dW/(RESET) line must not be smaller than 10k

- - - Добавлено - - -


И панельку PLCC - хочешь паяй на плату, хочешь в панельку
Для них же есть SMD панельки, я то про "игольчатые" подумал. Так что вопрос снимается :)
Дорожки может по ширее, или по ширше.

Xrust
14.01.2022, 20:00
Стабильное проявление, включаю на холодную - контроллер не работает.
По всем кнопкам разом пожмакаешь - начинает нормально работать.
Чудеса.

Возможно, где-то флюс плохо отмыт.

- - - Добавлено - - -


Ещё вопрос, на обычной клавиатуре вторая нажатая кнопка (первую нажали - и не отпускаем - что-то печатается) вызывала её нажатие и печать то что под ней или вообще ввообще прекращается?
Не могу сейчас проверить на обычной клавиатуре
Матрица позволяет хоть все контакты замкнуть или разомкнуть. Тут важен алгоритм работы контроллера самой PS/2 клавиатуры. А она позволяет несколько клавиш нажимать. При нажатии клавиши пересылается скан-код нажатой клавиши, а при отпускании - префикс отпускания F0H и повторно скан-код отпускаемой клавиши.

Xrust
14.01.2022, 23:09
Давайте попробуем отладочную. А что-то нужно для порта?
Для порта можно использовать преобразователь USB-TTL 5V.
Бинарник для прошивки Атмеги: 76842
Требуется кварц 16МГц и правильно выставить фьюзы.
В порт выводятся передаваемые клавиатурой сканкоды.
Вот исходник:

#include <PS2KeyRaw.h>
#define AX0 4
#define AX1 5
#define AX2 6
#define AX3 7
#define AY0 8
#define AY1 9
#define AY2 10
#define RSTMT 14
#define CSMT 15
#define DATMT 16
#define STBMT 17
#define DATAPIN 2
#define IRQPIN 3

volatile boolean d = HIGH;

uint8_t table[128] = {127,127,127,127,127,127,127,127,127,127,127,127,1 27,127,127,127,127,127,0,127,127,32,48,127,127,127 ,1,17,16,33,49,127,
127,3,2,18,34,51,50,127,127,112,4,19,36,35,52,127, 127,115,116,100,20,84,68,127,127,127,114,99,83,67, 66,127,
127,127,98,82,81,64,65,127,127,127,127,97,127,80,1 27,127,127,127,127,127,127,127,127,127,127,113,96, 127,127,127,127,127,
127,127,127,127,127,127,64,127,127,127,127,52,127, 127,127,127,127,127,127,127,127,127,127,127,127,12 7,127,127,127,127,127,127};

PS2KeyRaw keyboard;
void setup() {
//Инициализация портов
pinMode(AX0, OUTPUT); //AX0
pinMode(AX1, OUTPUT); //AX1
pinMode(AX2, OUTPUT); //AX2
pinMode(AX3, OUTPUT); //AX3
pinMode(AY0, OUTPUT); //AY0
pinMode(AY1, OUTPUT); //AY1
pinMode(AY2, OUTPUT); //AY2
pinMode(RSTMT, OUTPUT); //RES
pinMode(CSMT, OUTPUT); //CS
pinMode(DATMT, OUTPUT); //DAT
pinMode(STBMT, OUTPUT); //STB
//Инициализация клавиатуры
keyboard.begin( DATAPIN, IRQPIN );
//Последовательный порт
Serial.begin(115200);
Serial.println("Speccy+");
//Инициализация MT8816
SetAddr(0);
digitalWrite(RSTMT, LOW);
digitalWrite(CSMT, LOW);
digitalWrite(DATMT, LOW);
digitalWrite(STBMT, LOW); //инициализация
digitalWrite(CSMT, HIGH); //выбор чипа
digitalWrite(RSTMT, HIGH);
digitalWrite(RSTMT, LOW); //сброс
digitalWrite(CSMT, LOW);

SetAddr(table[0x12]);
SetKey(LOW);
}
void SetAddr(uint8_t addr) {
digitalWrite(AX0,bitRead(addr,0));
digitalWrite(AX1,bitRead(addr,1));
digitalWrite(AX2,bitRead(addr,2));
digitalWrite(AX3,bitRead(addr,3));
digitalWrite(AY0,bitRead(addr,4));
digitalWrite(AY1,bitRead(addr,5));
digitalWrite(AY2,bitRead(addr,6));
}
void SetKey(boolean data){
digitalWrite(CSMT, HIGH); //выбор чипа
digitalWrite(STBMT, HIGH); //строб on
digitalWrite(DATMT, data); //данные
digitalWrite(STBMT, LOW); //строб off
digitalWrite(CSMT, LOW);
}
void loop()
{
if( keyboard.available() ){
int c = keyboard.read(); //чтение кода
Serial.println(c); //печать в порт сканкода
switch (c) {
case 0xE0: //если считался префикс 0xE0
break;
case 0xF0: //если считался префикс 0xF0 (отпускание клавиши)
d = LOW;
break;
case 0x66: //если считался код 0x66 [BS]
SetAddr(table[0x12]);
SetKey(d);
SetAddr(table[0x45]);
SetKey(d);
d = HIGH;
break;
case 0x6B: //если считался код 0x6B [Left]
SetAddr(table[0x12]);
SetKey(d);
SetAddr(table[0x2E]);
SetKey(d);
d = HIGH;
break;
case 0x72: //если считался код 0x72 [Down]
SetAddr(table[0x12]);
SetKey(d);
SetAddr(table[0x36]);
SetKey(d);
d = HIGH;
break;
case 0x75: //если считался код 0x75 [Up]
SetAddr(table[0x12]);
SetKey(d);
SetAddr(table[0x3D]);
SetKey(d);
d = HIGH;
break;
case 0x74: //если считался код 0x74 [Right]
SetAddr(table[0x12]);
SetKey(d);
SetAddr(table[0x3E]);
SetKey(d);
d = HIGH;
break;
case 0x76: //если считался код 0x76 [Edit]
SetAddr(table[0x12]);
SetKey(d);
SetAddr(table[0x16]);
SetKey(d);
d = HIGH;
break;
case 0x58: //если считался код 0x58 [Caps lock]
SetAddr(table[0x12]);
SetKey(d);
SetAddr(table[0x1E]);
SetKey(d);
d = HIGH;
break;
case 0x0D: //если считался код 0x0D [Ext mode]
SetAddr(table[0x12]);
SetKey(d);
SetAddr(table[0x59]);
SetKey(d);
d = HIGH;
break;
case 0x41: //если считался код 0x41 [,]
SetAddr(table[0x59]);
SetKey(d);
SetAddr(table[0x31]);
SetKey(d);
d = HIGH;
break;
case 0x49: //если считался код 0x49 [.]
SetAddr(table[0x59]);
SetKey(d);
SetAddr(table[0x3A]);
SetKey(d);
d = HIGH;
break;
case 0x4C: //если считался код 0x4C [;]
SetAddr(table[0x59]);
SetKey(d);
SetAddr(table[0x44]);
SetKey(d);
d = HIGH;
break;
case 0x52: //если считался код 0x52 ["]
SetAddr(table[0x59]);
SetKey(d);
SetAddr(table[0x4D]);
SetKey(d);
d = HIGH;
break;
default:
SetAddr(table[c]);
SetKey(d);
d = HIGH;
}
}
}

Egal
14.01.2022, 23:38
Требуется кварц 16МГц
Кварц есть.


и правильно выставить фьюзы.
Ни разу в жизни не имел дело ни с фьюзами ни с атмегами :v2_unsur:
В видео же (1 пост) описано что выставлять?

- - - Добавлено - - -


Возможно, где-то флюс плохо отмыт.
"Дунул" под оба чипа вот такой (https://stroycata1og.ru/kraska/podgotovka-poverxnostej/rastvoriteli-i-ochistiteli/ochistitel-montazhnoj-penyi-oppa-cleaner-05-l.html) штукой - и всё работает.
Радуюсь - и вижу что не работет D1, отпаял вчера зачем-то. Припаиваю - фиг. Ничего не работает. Давлю ладонью всё подряд - начинает работать.
Отпаиваю D1 - включаю -> всё работает при включении. Припаиваю - не работает. Отпаиваю - работает.
Припаиваю D1 и отпаиваю D3 - не работает. В общем подключение D1 вызывает стабильное "подвисание" контроллера при старте.
Это уже совсем какие-то чудеса.

Xrust
15.01.2022, 00:02
Ни разу в жизни не имел дело ни с фьюзами ни с атмегами
В бинарнике эти фьюзы уже выставлены правильно. Но если будете перекомпилировать какой-то из исходников, надо обращать внимание на настройки. В видео об этом тоже упомянуто.

- - - Добавлено - - -

Можно так же попробовать прошить прошить версию для 48к - она значительно проще и возможно будет легче найти проблему.

Egal
15.01.2022, 00:29
Честно говоря странности какие-то. Возможно всё же залип какой-то, т.к. при включении проц пытается загрузиться в 48К - видны 1-пиксельные падающие вниз полоски, в 48К не выходит, потом чёрный квадрат 1-2 секунды и потом уже меню 128К
На ИР22 - регистр для шины Dx - на некоторых входах без D1 какой-то мусор, и на 1 ноге RDFE сигнал идёт, как строб чтоли (read #FE - порт клавиатуры). Как только подцепляю D1 - везде на входах регистра строгая 1, и на 1 ноге регистра сигнал отсутствует. Что-то подозреваю с портами клавиатуры или ещё чем-то.
Буду изучать.

В любом случае спасибо за участие!

Egal
15.01.2022, 17:11
Xrust, всё же что-то не то с контроллером.
Проверил обычную клавиатуру - никаких проблем при старте. Все кнопки и всегда работают.
Сейчас раз 10 проверил:
1. Включаю питание -> кнопки не работают
2. Отпаиваю D1 (если с 0 считать) - всё тут же начинает работать (кроме кнопок на линии D1).
Через какое-то время 2-3-4 минуты подпаиваю D1 - его линия тоже работает.

Кроме этого при включении и подпаяной D1 к контроллеру - "отключается" обычная клавиатура (по крайней мере частично - Enter не срабатывает)

Чудесатые чудеса.

- - - Добавлено - - -

В момент включения на D1 вот такой сигнал (на всех остальных чисто, единица):
https://pic.maxiol.com/thumbs2/1642255744.2960083253.kbdd11s.jpg (https://pic.maxiol.com/?v=1642255744.2960083253.kbdd11s.jpg&dp=2)

и раз в ~1-2 секунды пролетает такая загогулина:
https://pic.maxiol.com/thumbs2/1642255852.2960083253.kbdd12s.jpg (https://pic.maxiol.com/?v=1642255852.2960083253.kbdd12s.jpg&dp=2)

Какой-то ключ дребезжит?

Xrust
15.01.2022, 18:03
Egal, попробуйте прошивку от Евгения - там J2 и J3 поменяны местами - шина данных будет на J3.
76849

OrionExt
15.01.2022, 18:22
"Дунул" под оба чипа вот такой (https://stroycata1og.ru/kraska/podgotovka-poverxnostej/rastvoriteli-i-ochistiteli/ochistitel-montazhnoj-penyi-oppa-cleaner-05-l.html) штукой - и всё работает.

не смог сдержаться. эпический рассказ. пиши. талант :)

не хочу никого обидеть, но рассказы в соседних темах блеклые, ну про сказку ЛА3, надоело :) рассказы какие то без изюминки


з.ы. не стибаюсь. очень интересно, что будет дальше

izzx
15.01.2022, 19:15
попробуйте прошивку от Евгения
Да, а я посмотрю на результат. А то у меня тоже какие-то глюки с парой сигналов. Припаиваю ряды 14, 15 - не работает. Где-то замыкает.

Egal
15.01.2022, 22:37
про сказку ЛА3
Что за сказка? ))

- - - Добавлено - - -


не смог сдержаться. эпический рассказ. пиши. талант
Вот это триллер, прям до слез, такие страсти!
Мне самому понравилось чего-то.
Раз наша жизнь покруче, чем блокбастер,
Должны быть сказки посильней, чем "Фауст" Гёте. (с)

Эта. Пришла идея - не побоюсь этого слова гениальная - отцепить D1 и в после включения посмотреть что на контроллере на D1. И что на D1 на плате GRM-1.
И что мы имеем? А имеем мы следующее:
1. На D1 контроллера 0, на всех остальных Dx - единица, ~5 вольт
2. На D1 GRM-1 - единица
При подключении D1 GRM-1 к D1 контроллера - имеем выше показанную пилу, что даже где-то объяснимо.
В принципе уже на п.1 возникает вопрос с какого перепуга там 0 при старте?

Вот такая сказка про контроллер :biggrin:

- - - Добавлено - - -

Xrust, у вас plcc панельки есть? я бы может купил просто еще один конструктор скажем DIP40, панельку PLCC44 и новый набор ключей.
Так сказать для Сказки-2 :biggrin:

Xrust
15.01.2022, 23:50
Egal, все есть. Панельку и матрицу, поскольку на нее упало подозрение, вышлю бесплатно. Напишите мне на барахолке, чтобы я ничего не перепутал.

Egal
16.01.2022, 01:01
Вот такая сказка про контроллер
Небольшое дополнение - вторая гениальная мысль - включить комп с отпаяной D1, выйти в 48 Basic, и подключить D1.
Зажата 2 - двойка. Печатается постоянно. Тут мои гениальные мысли закончились. :biggrin:

- - - Добавлено - - -


Тут мои гениальные мысли закончились.
Не, третья таки нашлась - включаю, ничего не работает, разово нажимаю двойку и всё начинает работать. :biggrin:
Проверил на двух клавиатурах (одинаковых, но купленных с интервалом около полугода)

nemo
19.01.2022, 09:41
Соответственно, поменял местами выходы X и Y на клавиатуру. Появились свободные ряды и по Y (5-7) и остались по Х (8-15).
Выход матрицы Х8 - на землю, Y5, Y6 - в комп.

Я правильно понимаю что если при таком подключении если посадить например землю на Y5 (отключив ее от X8) а на Y6 плюс то можно будет подать 0 или 1 на любой из X8-X15? В таком случае образовалась бы возможность заиметь большее количество выводов для управления. Или это не возможно?

Ewgeny7
19.01.2022, 11:49
В таком случае образовалась бы возможность заиметь большее количество выводов для управления. Или это не возможно?
Я не совсем понял, что имелось ввиду.
Но на всякий случай привожу картинку матрицы, после моей "переделки".
https://i.ibb.co/yRk2cjx/matrix.jpg

- - - Добавлено - - -

Отсюда видно, что подавая на Х8 землю, мы можем замыкать на эту землю Y5, 6, 7.
При соответствующей поддержке в коде, можно использовать вообще все свободные поля матрицы.

nemo
19.01.2022, 14:23
Хотелось бы так
7686576865

Т.е. "вернуть" часть матрицы к прежнему расположению.

Egal
02.02.2022, 14:54
Egal, все есть. Панельку и матрицу, поскольку на нее упало подозрение, вышлю бесплатно.
Если интересно - то сказка-часть-вторая. :smile:

Спаял DIP40, на PLCC старый ключ выкусил, поставил панельку и воткнул новый ключ.
Итог:
1. PLCC версия - не изменилось ничего:
а) включаю - клавиатура не работает - жму 2 - клавиатура работает
б) включаю - клавиатура не работает - жму reset - клавиатура не работает - жму 2 - клавиатура работает

2. DIP40 версия - работает чётко сразу после включения. Никаких проблем пока что не выявлено.

Идей больше нет )) Может какая-то особенность у GRM-1 (в сочетании с PLCC-ключами) ?

- - - Добавлено - - -


Никаких проблем пока что не выявлено.
Загрузил Myth "с ленты" - с dip40 отлично всё работает.

- - - Добавлено - - -


Идей больше нет ))
Как идею могу предложить сделать такую прошивку чтобы D1-D5 были не 12345, а все чётные пины, 2-4-6-8-10, по нижнему ряду. Двойка это А11-D1.
В целом я не сильно переживаю - но интересно разобраться.

- - - Добавлено - - -


Загрузил Myth "с ленты" - с dip40 отлично всё работает.
С PLCC тоже работает нормально, единственный глюк - залипает двойка при включении.

max232cpe
13.02.2022, 17:49
Подскажике к бк0010 - 11м ктото подключал данное устройство?

Xrust
13.02.2022, 18:26
max232cpe, насколько мне известно, никто не пробовал. Вроде я писал тестовую прошивку, но пока никто не спрашивал. Там может быть потенциальная проблема с кнопкой СТОП, но она решаема.

max232cpe
13.02.2022, 18:36
У меня бк есть но она после любетелй драг мета проц и контролёр клавы как и панельки с разьёмами были выпаяны или выкушенны, как восстановлю бк попробую

HighLander
20.02.2022, 19:36
Составил экселевский файлик, чтобы можно было проще массив для скетча переделывать под разные варианты клавиатур и компьютеров.
В нем сейчас под пентагон забиты данные, все обозначения по схеме 1991 года.
В принципе даже ресет можно завести, пока не пробовал в железе, но теоретически должно работать. В файле висит на F12, думаю принцип понятен, кстати, так можно и другие кнопки вешать )))

По файлу:
1. Все на формулах, никаких макросов. На листе три таблицы.
2. Первая таблица - маппинг матричной клавиатуры на сканкоды PS/2.
3. Вторая таблица - матрица матричной клавиатуры, т.е. соответствие сигналов строки/столбца кнопке.
4. Третья таблица - на какой пин разъемов какой сигнал от матричной клавиатуры заведен.
5. Правее таблиц сформированные table[128]={} и table[256]={}, смотря кому какая нужна.

Есть один недостаток, и он в скетче, при нажатии любой "непрописанной" кнопки, из таблицы берется код 127, а по моей раскладке это цифра "4", поэтому над таблицей маппинга есть поле, в котором можно прописать свой код для "непрописанных" клавиш, и нужно править скетч, чтобы он не "нажимал" кнопки когда его выберет из таблицы (я пока не правил скетч, сейчас переделываю прошивку под чип ch9350, в ветке про клавиатуры спектрума тему открыл).

Форум не дает вставить экселевский файл, поэтому архив:77043

izzx
25.02.2022, 20:08
А то у меня тоже какие-то глюки с парой сигналов
Нашёл таки непропай. Теперь на прошивке Евгения все кнопочки работают, мэджик работает, а вот сброс где-то замыкает. Если не подключать сигнал сброс к контроллеру, на нём около 4.5 вольта. А если подключить, то 0.7. При нажатии Ф12, как положено, гасит совсем в 0.
Идей пока что нет.

Упд.
Почти нашёл собаку. Оказывается, если отключить от скорпионовского контроллера клавиатуры рахзъём Х5, то есть отключить сигналы kb0-kb4 и Magic, то сигнал reset не просаживается, и сабжевый контроллер полностью работает.
То есть, как-то не уживаются два контроллера, а страдает сигнал Reset.
Надо думать..
Вот тут схема скорпионовского контроллера, но нумера разъёмов не те. На этой схема Х2.
https://zx-pk.ru/threads/32223-skhema-rodnogo-kontrollera-klaviatury.html?p=1080835&viewfull=1#post1080835

HighLander
10.03.2022, 11:16
Свершилось, победил ch9350!
Контроллер ch9350 во 2-м режиме (State 2), скорость порта 115200 бод, прошивку делал на основе 128 прошивки из первого поста, у меня плата с DIP вариантом и выведенным ком портом, для другой платы придется "на проводках" выводить ком порт.
У меня вариант с 8-й мегой, результат компиляции: "Скетч использует 3106 байт (40%) памяти устройства. Всего доступно 7680 байт. Глобальные переменные используют 340 байт (33%) динамической памяти, оставляя 684 байт для локальных переменных. Максимум: 1024 байт.", так что есть место для еще чего-нибудь, планирую сделать клавиатурные макросы, как у Камиля (Caro) в ZXMC.

В принципе можно объединить оба варианта (PS/2 и USB), но мне не актуально, может кто-то сделает.
В играх не проверял, но думаю что задержки обработки нажатия нет, если вдруг задержка будет, можно попробовать у ch9350 порт настроить на 300000 бод, или поставить на мегу внешний кварц на 16МГц, как в ардуино, в крайнем случае и то и другое одновременно

Скетч:



//-------------------------------------------------------------------------------------------------------------------------
// Коды клавиш HID клавиатуры
//-------------------------------------------------------------------------------------------------------------------------
#define KEY_MOD_LCTRL 0x00 //0x01
#define KEY_MOD_LSHIFT 0x01 //0x02
#define KEY_MOD_LALT 0x02 //0x04
#define KEY_MOD_LWIN 0x03 //0x08
#define KEY_MOD_RCTRL 0x04 //0x10
#define KEY_MOD_RSHIFT 0x05 //0x20
#define KEY_MOD_RALT 0x06 //0x40
#define KEY_MOD_RWIN 0x07 //0x80

#define KEY_NONE 0x00 // No key pressed
#define KEY_ERR_OVF 0x01 // Keyboard Error Roll Over - used for all slots if too many keys are pressed ("Phantom key")
// 0x02 // Keyboard POST Fail
// 0x03 // Keyboard Error Undefined
#define KEY_A 0x04 // Keyboard a and A
#define KEY_B 0x05 // Keyboard b and B
#define KEY_C 0x06 // Keyboard c and C
#define KEY_D 0x07 // Keyboard d and D
#define KEY_E 0x08 // Keyboard e and E
#define KEY_F 0x09 // Keyboard f and F
#define KEY_G 0x0a // Keyboard g and G
#define KEY_H 0x0b // Keyboard h and H
#define KEY_I 0x0c // Keyboard i and I
#define KEY_J 0x0d // Keyboard j and J
#define KEY_K 0x0e // Keyboard k and K
#define KEY_L 0x0f // Keyboard l and L
#define KEY_M 0x10 // Keyboard m and M
#define KEY_N 0x11 // Keyboard n and N
#define KEY_O 0x12 // Keyboard o and O
#define KEY_P 0x13 // Keyboard p and P
#define KEY_Q 0x14 // Keyboard q and Q
#define KEY_R 0x15 // Keyboard r and R
#define KEY_S 0x16 // Keyboard s and S
#define KEY_T 0x17 // Keyboard t and T
#define KEY_U 0x18 // Keyboard u and U
#define KEY_V 0x19 // Keyboard v and V
#define KEY_W 0x1a // Keyboard w and W
#define KEY_X 0x1b // Keyboard x and X
#define KEY_Y 0x1c // Keyboard y and Y
#define KEY_Z 0x1d // Keyboard z and Z

#define KEY_1 0x1e // Keyboard 1 and !
#define KEY_2 0x1f // Keyboard 2 and @
#define KEY_3 0x20 // Keyboard 3 and #
#define KEY_4 0x21 // Keyboard 4 and $
#define KEY_5 0x22 // Keyboard 5 and %
#define KEY_6 0x23 // Keyboard 6 and ^
#define KEY_7 0x24 // Keyboard 7 and &
#define KEY_8 0x25 // Keyboard 8 and *
#define KEY_9 0x26 // Keyboard 9 and (
#define KEY_0 0x27 // Keyboard 0 and )

#define KEY_ENTER 0x28 // Keyboard Return (ENTER)
#define KEY_ESC 0x29 // Keyboard ESCAPE
#define KEY_BACKSPACE 0x2a // Keyboard DELETE (Backspace)
#define KEY_TAB 0x2b // Keyboard Tab
#define KEY_SPACE 0x2c // Keyboard Spacebar
#define KEY_MINUS 0x2d // Keyboard - and _
#define KEY_EQUAL 0x2e // Keyboard = and +
#define KEY_LEFTBRACE 0x2f // Keyboard [ and {
#define KEY_RIGHTBRACE 0x30 // Keyboard ] and }
#define KEY_BACKSLASH 0x31 // Keyboard \ and |
#define KEY_HASHTILDE 0x32 // Keyboard Non-US # and ~
#define KEY_SEMICOLON 0x33 // Keyboard ; and :
#define KEY_APOSTROPHE 0x34 // Keyboard ' and "
#define KEY_GRAVE 0x35 // Keyboard ` and ~
#define KEY_COMMA 0x36 // Keyboard , and <
#define KEY_DOT 0x37 // Keyboard . and >
#define KEY_SLASH 0x38 // Keyboard / and ?
#define KEY_CAPSLOCK 0x39 // Keyboard Caps Lock

#define KEY_F1 0x3a // Keyboard F1
#define KEY_F2 0x3b // Keyboard F2
#define KEY_F3 0x3c // Keyboard F3
#define KEY_F4 0x3d // Keyboard F4
#define KEY_F5 0x3e // Keyboard F5
#define KEY_F6 0x3f // Keyboard F6
#define KEY_F7 0x40 // Keyboard F7
#define KEY_F8 0x41 // Keyboard F8
#define KEY_F9 0x42 // Keyboard F9
#define KEY_F10 0x43 // Keyboard F10
#define KEY_F11 0x44 // Keyboard F11
#define KEY_F12 0x45 // Keyboard F12

#define KEY_SYSRQ 0x46 // Keyboard Print Screen
#define KEY_SCROLLLOCK 0x47 // Keyboard Scroll Lock
#define KEY_PAUSE 0x48 // Keyboard Pause
#define KEY_INSERT 0x49 // Keyboard Insert
#define KEY_HOME 0x4a // Keyboard Home
#define KEY_PAGEUP 0x4b // Keyboard Page Up
#define KEY_DELETE 0x4c // Keyboard Delete Forward
#define KEY_END 0x4d // Keyboard End
#define KEY_PAGEDOWN 0x4e // Keyboard Page Down
#define KEY_RIGHT 0x4f // Keyboard Right Arrow
#define KEY_LEFT 0x50 // Keyboard Left Arrow
#define KEY_DOWN 0x51 // Keyboard Down Arrow
#define KEY_UP 0x52 // Keyboard Up Arrow

#define KEY_NUMLOCK 0x53 // Keyboard Num Lock and Clear
#define KEY_KPSLASH 0x54 // Keypad /
#define KEY_KPASTERISK 0x55 // Keypad *
#define KEY_KPMINUS 0x56 // Keypad -
#define KEY_KPPLUS 0x57 // Keypad +
#define KEY_KPENTER 0x58 // Keypad ENTER
#define KEY_KP1 0x59 // Keypad 1 and End
#define KEY_KP2 0x5a // Keypad 2 and Down Arrow
#define KEY_KP3 0x5b // Keypad 3 and PageDn
#define KEY_KP4 0x5c // Keypad 4 and Left Arrow
#define KEY_KP5 0x5d // Keypad 5
#define KEY_KP6 0x5e // Keypad 6 and Right Arrow
#define KEY_KP7 0x5f // Keypad 7 and Home
#define KEY_KP8 0x60 // Keypad 8 and Up Arrow
#define KEY_KP9 0x61 // Keypad 9 and Page Up
#define KEY_KP0 0x62 // Keypad 0 and Insert
#define KEY_KPDOT 0x63 // Keypad . and Delete

#define KEY_102ND 0x64 // Keyboard Non-US \ and |
#define KEY_COMPOSE 0x65 // Keyboard Application
#define KEY_POWER 0x66 // Keyboard Power
#define KEY_KPEQUAL 0x67 // Keypad =

#define KEY_F13 0x68 // Keyboard F13
#define KEY_F14 0x69 // Keyboard F14
#define KEY_F15 0x6a // Keyboard F15
#define KEY_F16 0x6b // Keyboard F16
#define KEY_F17 0x6c // Keyboard F17
#define KEY_F18 0x6d // Keyboard F18
#define KEY_F19 0x6e // Keyboard F19
#define KEY_F20 0x6f // Keyboard F20
#define KEY_F21 0x70 // Keyboard F21
#define KEY_F22 0x71 // Keyboard F22
#define KEY_F23 0x72 // Keyboard F23
#define KEY_F24 0x73 // Keyboard F24

#define KEY_OPEN 0x74 // Keyboard Execute
#define KEY_HELP 0x75 // Keyboard Help
#define KEY_PROPS 0x76 // Keyboard Menu
#define KEY_FRONT 0x77 // Keyboard Select
#define KEY_STOP 0x78 // Keyboard Stop
#define KEY_AGAIN 0x79 // Keyboard Again
#define KEY_UNDO 0x7a // Keyboard Undo
#define KEY_CUT 0x7b // Keyboard Cut
#define KEY_COPY 0x7c // Keyboard Copy
#define KEY_PASTE 0x7d // Keyboard Paste
#define KEY_FIND 0x7e // Keyboard Find
#define KEY_MUTE 0x7f // Keyboard Mute
#define KEY_VOLUMEUP 0x80 // Keyboard Volume Up
#define KEY_VOLUMEDOWN 0x81 // Keyboard Volume Down
// 0x82 Keyboard Locking Caps Lock
// 0x83 Keyboard Locking Num Lock
// 0x84 Keyboard Locking Scroll Lock
#define KEY_KPCOMMA 0x85 // Keypad Comma
// 0x86 Keypad Equal Sign
#define KEY_RO 0x87 // Keyboard International1
#define KEY_KATAKANAHIRAGANA 0x88 // Keyboard International2
#define KEY_YEN 0x89 // Keyboard International3
#define KEY_HENKAN 0x8a // Keyboard International4
#define KEY_MUHENKAN 0x8b // Keyboard International5
#define KEY_KPJPCOMMA 0x8c // Keyboard International6
// 0x8d Keyboard International7
// 0x8e Keyboard International8
// 0x8f Keyboard International9
#define KEY_HANGEUL 0x90 // Keyboard LANG1
#define KEY_HANJA 0x91 // Keyboard LANG2
#define KEY_KATAKANA 0x92 // Keyboard LANG3
#define KEY_HIRAGANA 0x93 // Keyboard LANG4
#define KEY_ZENKAKUHANKAKU 0x94 // Keyboard LANG5
// 0x95 Keyboard LANG6
// 0x96 Keyboard LANG7
// 0x97 Keyboard LANG8
// 0x98 Keyboard LANG9
// 0x99 Keyboard Alternate Erase
// 0x9a Keyboard SysReq/Attention
// 0x9b Keyboard Cancel
// 0x9c Keyboard Clear
// 0x9d Keyboard Prior
// 0x9e Keyboard Return
// 0x9f Keyboard Separator
// 0xa0 Keyboard Out
// 0xa1 Keyboard Oper
// 0xa2 Keyboard Clear/Again
// 0xa3 Keyboard CrSel/Props
// 0xa4 Keyboard ExSel

// 0xb0 Keypad 00
// 0xb1 Keypad 000
// 0xb2 Thousands Separator
// 0xb3 Decimal Separator
// 0xb4 Currency Unit
// 0xb5 Currency Sub-unit
#define KEY_KPLEFTPAREN 0xb6 // Keypad (
#define KEY_KPRIGHTPAREN 0xb7 // Keypad )
// 0xb8 Keypad {
// 0xb9 Keypad }
// 0xba Keypad Tab
// 0xbb Keypad Backspace
// 0xbc Keypad A
// 0xbd Keypad B
// 0xbe Keypad C
// 0xbf Keypad D
// 0xc0 Keypad E
// 0xc1 Keypad F
// 0xc2 Keypad XOR
// 0xc3 Keypad ^
// 0xc4 Keypad %
// 0xc5 Keypad <
// 0xc6 Keypad >
// 0xc7 Keypad &
// 0xc8 Keypad &&
// 0xc9 Keypad |
// 0xca Keypad ||
// 0xcb Keypad :
// 0xcc Keypad #
// 0xcd Keypad Space
// 0xce Keypad @
// 0xcf Keypad !
// 0xd0 Keypad Memory Store
// 0xd1 Keypad Memory Recall
// 0xd2 Keypad Memory Clear
// 0xd3 Keypad Memory Add
// 0xd4 Keypad Memory Subtract
// 0xd5 Keypad Memory Multiply
// 0xd6 Keypad Memory Divide
// 0xd7 Keypad +/-
// 0xd8 Keypad Clear
// 0xd9 Keypad Clear Entry
// 0xda Keypad Binary
// 0xdb Keypad Octal
// 0xdc Keypad Decimal
// 0xdd Keypad Hexadecimal

#define KEY_LEFTCTRL 0xe0 // Keyboard Left Control
#define KEY_LEFTSHIFT 0xe1 // Keyboard Left Shift
#define KEY_LEFTALT 0xe2 // Keyboard Left Alt
#define KEY_LEFTMETA 0xe3 // Keyboard Left GUI
#define KEY_RIGHTCTRL 0xe4 // Keyboard Right Control
#define KEY_RIGHTSHIFT 0xe5 // Keyboard Right Shift
#define KEY_RIGHTALT 0xe6 // Keyboard Right Alt
#define KEY_RIGHTMETA 0xe7 // Keyboard Right GUI

#define KEY_MEDIA_PLAYPAUSE 0xe8
#define KEY_MEDIA_STOPCD 0xe9
#define KEY_MEDIA_PREVIOUSSONG 0xea
#define KEY_MEDIA_NEXTSONG 0xeb
#define KEY_MEDIA_EJECTCD 0xec
#define KEY_MEDIA_VOLUMEUP 0xed
#define KEY_MEDIA_VOLUMEDOWN 0xee
#define KEY_MEDIA_MUTE 0xef
#define KEY_MEDIA_WWW 0xf0
#define KEY_MEDIA_BACK 0xf1
#define KEY_MEDIA_FORWARD 0xf2
#define KEY_MEDIA_STOP 0xf3
#define KEY_MEDIA_FIND 0xf4
#define KEY_MEDIA_SCROLLUP 0xf5
#define KEY_MEDIA_SCROLLDOWN 0xf6
#define KEY_MEDIA_EDIT 0xf7
#define KEY_MEDIA_SLEEP 0xf8
#define KEY_MEDIA_COFFEE 0xf9
#define KEY_MEDIA_REFRESH 0xfa
#define KEY_MEDIA_CALC 0xfb

//-------------------------------------------------------------------------------------------------------------------------
// Зададим пины
//-------------------------------------------------------------------------------------------------------------------------
#define AX0 4
#define AX1 5
#define AX2 6
#define AX3 7
#define AY0 8
#define AY1 9
#define AY2 10
#define MT_RST 14
#define MT_CS 15
#define MT_DAT 16
#define MT_STB 17

//-------------------------------------------------------------------------------------------------------------------------
// Таблицы преобразования кодов клавиатуры в адреса матрицы и буфера входных данных
//-------------------------------------------------------------------------------------------------------------------------
uint8_t table[128]={128,128,128,128,59,97,121,91,93,123,107,99,85,
115,83,67,81,113,69,53,61,125,75,109,117,105,77,89 ,101,73,63,79,95,
127,111,103,119,87,71,55,51,128,128,128,49,128,128 ,128,128,128,128,
128,128,128,128,128,128,128,128,128,128,128,128,12 8,128,128,128,128,
128,10,128,128,128,128,128,128,128,128,128,128,128 ,128,128,128,128,
128,128,128,128,128,128,128,128,128,128,128,128,12 8,128,128,128,128,
128,128,128,128,128,128,128,128,128,128,128,128,12 8,128,128,128,128,
128,128,128,128,128,128,128,128,128};

uint8_t alt_table[8]={57,65,128,128,57,65,128,128};

uint8_t kbd_buff[8]={0,0,0,0,0,0,0,0}; // буфер свежих данных от клавиатуры
uint8_t kbd_old_buff[8]={0,0,0,0,0,0,0,0}; // буфер данных от клавиатуры
uint8_t mouse_buff[4]={0,0,0,0}; // буфер данных от мыши

//-------------------------------------------------------------------------------------------------------------------------
// Секция настроек
//-------------------------------------------------------------------------------------------------------------------------
void setup() {
Serial.begin(115200);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}

//Инициализация портов
pinMode(AX0, OUTPUT); //AX0
pinMode(AX1, OUTPUT); //AX1
pinMode(AX2, OUTPUT); //AX2
pinMode(AX3, OUTPUT); //AX3
pinMode(AY0, OUTPUT); //AY0
pinMode(AY1, OUTPUT); //AY1
pinMode(AY2, OUTPUT); //AY2
pinMode(MT_RST, OUTPUT); //RES
pinMode(MT_CS, OUTPUT); //CS
pinMode(MT_DAT, OUTPUT); //DAT
pinMode(MT_STB, OUTPUT); //STB

//Инициализация MT8816
digitalWrite(AX0,LOW);
digitalWrite(AX1,LOW);
digitalWrite(AX2,LOW);
digitalWrite(AX3,LOW);
digitalWrite(AY0,LOW);
digitalWrite(AY1,LOW);
digitalWrite(AY2,LOW);
digitalWrite(MT_RST, LOW);
digitalWrite(MT_CS, LOW);
digitalWrite(MT_DAT, LOW);
digitalWrite(MT_STB, LOW); //инициализация
digitalWrite(MT_CS, HIGH); //выбор чипа
digitalWrite(MT_RST, HIGH);
digitalWrite(MT_RST, LOW); //сброс
digitalWrite(MT_CS, LOW);
}

//-------------------------------------------------------------------------------------------------------------------------
// Основной цикл
//-------------------------------------------------------------------------------------------------------------------------
void loop() {
uint8_t temp_data = 0;
boolean data_enable = false; // флаг получения новых данных

//-----------------------------------------------------------
// Получаем данные от ch9350 и раскладываем по буферам
//-----------------------------------------------------------
if (Serial.available()>=3) {
if (Serial.read()==0x57) {
if (Serial.read()==0xab) {
int c = Serial.read();
switch (c) {
case 0x01: //0x01 - данные от клавиатуры
Serial.readBytes(kbd_buff, 8);
data_enable = true;
break;
case 0x02: //0x02 - данные от мыши
Serial.readBytes(mouse_buff, 4);
break;
case 0x84: //0x84 - USB устройство отключено
break;
default:
break;
}
}
}
}

if (data_enable) { // Если пришли новые данные

// "Отпустим" кнопки которые были отжаты
ReSetKey(kbd_old_buff[2]);
ReSetKey(kbd_old_buff[3]);
ReSetKey(kbd_old_buff[4]);
ReSetKey(kbd_old_buff[5]);
ReSetKey(kbd_old_buff[6]);
ReSetKey(kbd_old_buff[7]);

if(kbd_old_buff[0] != kbd_buff[0]){ // "Нажмем" шифты и альты, если у них что-то поменялось
temp_data = kbd_old_buff[0] ^ kbd_buff[0];
if(bitRead(temp_data,0)) SetKey(alt_table[0],bitRead(kbd_buff[0],0));
if(bitRead(temp_data,1)) SetKey(alt_table[1],bitRead(kbd_buff[0],1));
if(bitRead(temp_data,2)) SetKey(alt_table[2],bitRead(kbd_buff[0],2));
if(bitRead(temp_data,3)) SetKey(alt_table[3],bitRead(kbd_buff[0],3));
if(bitRead(temp_data,4)) SetKey(alt_table[4],bitRead(kbd_buff[0],4));
if(bitRead(temp_data,5)) SetKey(alt_table[5],bitRead(kbd_buff[0],5));
if(bitRead(temp_data,6)) SetKey(alt_table[6],bitRead(kbd_buff[0],6));
if(bitRead(temp_data,7)) SetKey(alt_table[7],bitRead(kbd_buff[0],7));
}

// "Нажмем" кнопки
PressKey(kbd_buff[2], HIGH);
PressKey(kbd_buff[3], HIGH);
PressKey(kbd_buff[4], HIGH);
PressKey(kbd_buff[5], HIGH);
PressKey(kbd_buff[6], HIGH);
PressKey(kbd_buff[7], HIGH);

// Заполним буфер "старых" кнопок
kbd_old_buff[0]=kbd_buff[0];
kbd_old_buff[1]=kbd_buff[1];
kbd_old_buff[2]=kbd_buff[2];
kbd_old_buff[3]=kbd_buff[3];
kbd_old_buff[4]=kbd_buff[4];
kbd_old_buff[5]=kbd_buff[5];
kbd_old_buff[6]=kbd_buff[6];
kbd_old_buff[7]=kbd_buff[7];
}
}

//-------------------------------------------------------------------------------------------------------------------------
// Управление матрицей MT8816
//-------------------------------------------------------------------------------------------------------------------------
void SetKey(uint8_t addr, boolean data) {

if (addr==128) return; // "Свободный" код клавиши пропускаем

// установим адрес
digitalWrite(AX0,bitRead(addr,0));
digitalWrite(AX1,bitRead(addr,1));
digitalWrite(AX2,bitRead(addr,2));
digitalWrite(AX3,bitRead(addr,3));
digitalWrite(AY0,bitRead(addr,4));
digitalWrite(AY1,bitRead(addr,5));
digitalWrite(AY2,bitRead(addr,6));
// нажмем или сбросим кнопку
digitalWrite(MT_CS, HIGH); //выбор чипа
digitalWrite(MT_STB, HIGH); //строб on
digitalWrite(MT_DAT, data); //данные
digitalWrite(MT_STB, LOW); //строб off
digitalWrite(MT_CS, LOW);
}

//-------------------------------------------------------------------------------------------------------------------------
// Обработка кнопок, преобразование "расширенных" кнопок в обычные (курсор, запятые и т.д.)
//-------------------------------------------------------------------------------------------------------------------------
void PressKey(uint8_t kbd, boolean data) {
if(kbd){
switch (kbd) {
case KEY_BACKSPACE:
SetKey(alt_table[KEY_MOD_LCTRL],data);
SetKey(table[KEY_0],data);
break;
case KEY_RIGHT:
SetKey(alt_table[KEY_MOD_LCTRL],data);
SetKey(table[KEY_8],data);
break;
case KEY_LEFT:
SetKey(alt_table[KEY_MOD_LCTRL],data);
SetKey(table[KEY_5],data);
break;
case KEY_DOWN:
SetKey(alt_table[KEY_MOD_LCTRL],data);
SetKey(table[KEY_6],data);
break;
case KEY_UP:
SetKey(alt_table[KEY_MOD_LCTRL],data);
SetKey(table[KEY_7],data);
break;
case KEY_ESC:
SetKey(alt_table[KEY_MOD_LCTRL],data);
SetKey(table[KEY_1],data);
break;
case KEY_CAPSLOCK:
SetKey(alt_table[KEY_MOD_LCTRL],data);
SetKey(table[KEY_2],data);
break;
case KEY_TAB:
SetKey(alt_table[KEY_MOD_LSHIFT],data);
SetKey(alt_table[KEY_MOD_LCTRL],data);
break;
case KEY_COMMA: // Keyboard , and <
SetKey(alt_table[KEY_MOD_LSHIFT],data);
SetKey(table[KEY_N],data);
break;
case KEY_DOT: // Keyboard . and >
SetKey(alt_table[KEY_MOD_LSHIFT],data);
SetKey(table[KEY_M],data);
break;
case KEY_SEMICOLON: // Keyboard ; and :
SetKey(alt_table[KEY_MOD_LSHIFT],data);
SetKey(table[KEY_O],data);
break;
case KEY_APOSTROPHE: // Keyboard ' and "
SetKey(alt_table[KEY_MOD_LSHIFT],data);
SetKey(table[KEY_P],data);
break;
default:
SetKey(table[kbd],data);
break;
}
}
}

//-------------------------------------------------------------------------------------------------------------------------
// Проверка "отпускания" кнопок
//-------------------------------------------------------------------------------------------------------------------------
void ReSetKey(uint8_t kbd) {
// Проверка, осталась кнопка нажатой или нет, и если не нажата, то "отпускаем" её
if(kbd){
if(kbd==kbd_buff[2]) return;
if(kbd==kbd_buff[3]) return;
if(kbd==kbd_buff[4]) return;
if(kbd==kbd_buff[5]) return;
if(kbd==kbd_buff[6]) return;
if(kbd==kbd_buff[7]) return;
PressKey(kbd,LOW);
}
}


Архив с экселевским файликом для генерации таблиц соответствия во вложении.
1. Первая таблица - маппинг матричной клавиатуры на сканкоды USB HID.
2. Вторая таблица - матрица матричной клавиатуры, т.е. соответствие сигналов строки/столбца кнопке.
3. Третья таблица - на какой пин разъемов какой сигнал от матричной клавиатуры заведен.
4. Правее таблиц сформированные alt_table[8]={}, table[128]={} и table[256]={}, смотря кому какая нужна.

Скетч игнорирует "непрописанные" кнопки (код 128)
Массив alt_table нужен для маппинга шифтов, контролов, альтов и WIN кнопок, т.к. они идут как флаги в отдельном байте, а не сканкодом.

Беспроводная клавиатура работает )))

HighLander
17.03.2022, 10:46
В принципе даже ресет можно завести, пока не пробовал в железе, но теоретически должно работать. В файле висит на F12, думаю принцип понятен, кстати, так можно и другие кнопки вешать )))

Проверил в железе, работает

Ser
06.04.2022, 05:10
Здравствуйте! Круто ,поздравляю с победой ,фото можно посмотреть?

azx987sa
10.04.2022, 21:53
Где можно купить набор?

Xrust
10.04.2022, 21:56
Где можно купить набор?

ссылка (https://zx-pk.com/forum/viewtopic.php?f=7&t=18766) есть в первом сообщении.

Ser
12.04.2022, 09:03
:v2_dizzy_coder:

azx987sa
03.06.2022, 11:18
Беспроводная клавиатура работает )))
Я не понял. Обычная беспроводная клава работает?


можно объединить оба варианта (PS/2 и USB)
а тут о каком USB речь?

Вопрос - можно подключить USB клаву? Ту которая совсем не PS/2

HighLander
08.06.2022, 00:45
а тут о каком USB речь?

Вопрос - можно подключить USB клаву? Ту которая совсем не PS/2

Можно, проверено в железе.

Я купил на алике контроллер на базе ch9350, он USB-HID устройства обрабатывает и по UART передает уже готовый пакет данных. Для клавиатуры - до 6-ти нажатых клавиш и win alt ctrl shift (правые и левые). Для мыши - координаты по XY, направление колесика и нажатые кнопки. Для геймпада - состояние кнопок и аналоговых стиков.

Беспроводные работают, проверял, даже комбинированные, где на одном приемнике и мышь и клава, конкретно у меня комплект от a4tech и китайская клава с трекпадом в одном корпусе.

У меня плата с дип вариантом, там последовательный порт выведен, к нему подключил и поправил прошивку, все работает, даже беспроводное.
Для варианта с PLCC, придется или подпаиваться к микроконтроллеру, или использовать библиотеку softwareserial на пинах использованных под PS/2, скорости контроллера хватает.
В варианте с softwareserial есть один момент, он с каким-то из пинов на которых висит PS/2 не работает, не помню какой именно, а на другой пин вешается прием данных, так-что придется поискать на какой. Или попробовать пины на разъеме для программирования, я не пробовал, он мне нужен был.

Ser
08.06.2022, 18:35
Сделал плату но не повезло с микросхемами ch9350,оказались дохлые. https://ibb.co/MSQbjgK

matrixplus
12.06.2022, 13:32
Как подключить контроллер на атмега 168 (планар) и мт8816ае (dip40) к ориону, имеем 2 разьема j2 (8 pin) и j3 (16 pin) к Ориону 128!!! Поделительсь схемой

doleynikov
12.06.2022, 21:30
Добрый день! Ребятушки, помогите! не могу понять, как подключить этот контролер к Композиту! там только панелька под dip-16 в левом верхнем углу платы. левый ряд контактов - а8-а15, а правый - кл0-кл4. это так? тогда x0-x7 слева, а y0-y4 справа?

Xrust
13.06.2022, 22:53
doleynikov, а родной клавы нет?

matrixplus
26.06.2022, 13:14
Кто нибуть цеплял данный контроллер к Ориону?

azx987sa
03.09.2022, 10:27
Свершилось, победил ch9350!
Контроллер ch9350 во 2-м режиме (State 2), скорость порта 115200 бод, прошивку делал на основе 128 прошивки из первого поста, у меня плата с DIP вариантом и выведенным ком портом, для другой платы придется "на проводках" выводить ком порт.
.......
Беспроводная клавиатура работает )))

Удалось разобраться как через ch9350 светодиоды на клаве зажигать?

Gutten
14.10.2022, 21:13
Извините, но так и не понял какие фьюзы правильно выставлять для прошивки. Где указано?

Xrust
15.10.2022, 13:45
Gutten, в среде Arduino не требуется явно указывать фьюзы. Компилятор их генерирует из опций меню "Инструменты". Какие выставлять опции описано в видео из первого сообщения.

Gutten
15.10.2022, 13:56
а если у меня нет среды ардуино и не надо? если я ретроград и прошиваю через TL866, где надо руками указать значения?
Так сложно указать две hex-цифры установки фьюзов?

Rio444
15.10.2022, 19:10
Так сложно указать две hex-цифры установки фьюзов?
Что Вы там ожидаете увидеть?
Тактирование от встроенного 8МГц, прошивка по JTAG не заблокирована. Остальное в большинстве случаев не играет никакой роли.
Как-то так (но лучше проверить):
https://pic.maxiol.com/thumbs2/1665850206.94825044.fuses.png (https://pic.maxiol.com/?v=1665850206.94825044.fuses.png&dp=2)

Gutten
15.10.2022, 19:34
ожидаю увидеть что-то типа такого, что уже в другом чате подсказали: H=D5, L=E2, E=FD.
Мало того, что в видео воды больше чем сути, так там ещё и не понятно какие для калькулятора фьюзов остальные параметры ставить, важны они или нет.
Да и смотреть 10 минут видео, чтоб понять какие фьюзы ставить...

Rio444
16.10.2022, 16:36
ожидаю увидеть что-то типа такого, что уже в другом чате подсказали: H=D5, L=E2, E=FD.Так смотрите самую правую колонку на скрине.
У Вас почти то же самое.
L совпадает полностью (Low Byte) = E2
H разница только в снятых (т.е. активных) EESAVE и BODLEVEL1. Первый - сохраняется содержимое EEPROM при стирании чипа. Второй - включена защита от снижения напряжения питания (вряд ли она используется в прошивке).
Разительно отличается только E. У Вас он F2, на скрине 01.
Но этот байт вообще не имеет никакого значения, т.к. отвечает за альтернативный загрузчик, который обычно используется для прошивки через один из интерфейсов Atmega или каких-то сервисный целей.
У Вас этот альтернативный загрузчик активен, в варианте на скрине - нет.

Gutten
16.10.2022, 16:52
А теперь вопрос: что сложного в том, чтобы сразу указать эти значение в первом посте с прошивками?
Вместо этого предлагается смотреть 10 минут видео, в котором воды больше чем смысла...

Rio444
16.10.2022, 17:16
А теперь вопрос: что сложного в том, чтобы сразу указать эти значение в первом посте с прошивками?
Автор же написал, что делал в ардуине, поэтому не вдавался в такие нюансы. Ему и без этого надо спасибо сказать за столь удачную конструкцию.

И важный момент. На схеме в первом сообщении указан чип Atmega168. Для него я и давал фьюзы. Но автор уточняет:
позволяет работать с Атмега8, 48, 168, 328 без кварцаПри смене чипа надо обязательно проверять фьюзы. Для Atmega8 они 100% будут другими. Иначе можно получить кирпич.

P.S. Не смотрел прошивку. Неужели она не влезет в Atmega88 или даже Atmega48?
Эти чипы побюджетнее Atmega168.

Gutten
16.10.2022, 17:44
Так автору спасибо без вопросов. НО предлагать смотреть видео вместо текстового описания какие параметры выставить (раз уже нет конкретных значений фьюзов)... Завтра ютуб заблочат или ютуб видео заблочит и что делать?

Xrust
16.10.2022, 20:32
а если у меня нет среды ардуино и не надо? если я ретроград и прошиваю через TL866, где надо руками указать значения?
Так сложно указать две hex-цифры установки фьюзов?

Ретрограды обычно сами знают, как правильно выставить фьюзы. Я не настолько погружен в тему. Можно скомпилировать в Ардуино и прошить TL866, фьюзы будут содержаться в файле прошивки.

- - - Добавлено - - -


При смене чипа надо обязательно проверять фьюзы. Для Atmega8 они 100% будут другими. Иначе можно получить кирпич.
Совершенно справедливо.

- - - Добавлено - - -


Эти чипы побюджетнее Atmega168
Когда я последний раз изучал цены на Али, там как раз Atmega168 были самыми доступными. Они просто более распространены. А пару лет назад, действительно, можно было найти Atmega8 немного дешевле.

- - - Добавлено - - -


Вместо этого предлагается смотреть 10 минут видео, в котором воды больше чем смысла...
Это один из способов отблагодарить автора.

Rio444
16.10.2022, 20:46
Когда я последний раз изучал цены на Али, там как раз Atmega168 были самыми доступными. Они просто более распространены.В последний раз смотрел цены этой весной. Самыми дешевыми были Atmega48. Как сейчас - не знаю.
Atmega8 сильно поднялись в цене, это 100%. Думаю их уже не производят, а складские остатки заканчиваются.

Gutten
16.11.2022, 20:01
Egal, попробуйте прошивку от Евгения - там J2 и J3 поменяны местами - шина данных будет на J3.
76849

Ewgeny7, можно ли получить исходник прошивки KeybRT.ino_atmega168p_8000000L? Я её использую на скорпионе+ГМХ, и она при холодном старте всегда висит. При этом исходная прошивка (не повёрнутая матрица) не висит. И кнопка переключения турбо не работает: подключена на контакты GMX, но при каждом нажатии светодиод мигает и снова загорается, т.е. турбо само разу же включается обратно.

Gutten
24.11.2022, 23:17
скажите, а реально сделать вывод 2 клавиш, потом через паузу ещё двух? Для спектрума это переход в режим ExtMode, потом нажатие кнопки вместе с SymShift.
У меня получилось перейти в режим ExtMode, но потом срабатывает только кнопка, SymShift не учитывается.

Xrust
25.11.2022, 00:38
Gutten, да можно все что угодно сделать. Матрица может любое количество ключей произвольно замыкать. Нужно только дать ей команды. ExtMode в прошивке уже реализован, символы ".,:; тоже реализованы.

Gutten
25.11.2022, 01:04
Эо я понимаю, по отдельности я и ExtMode делаю, и Y+SymShift.
Вопрос как это последовательно сделать? У меня вот пока не получилось. Не срабатывает второй SymShift.

- - - Добавлено - - -

Последовательность нажатий "Caps, Sym, пауза, Sym, Y" не отрабатывает второй Sym. Получается "Caps, Sym, Y"
Или же надо "нажать Caps+Sym, потом Caps отпустить, и нажать Y"? Как сделать отпускание одной клавиши внутри case?

Xrust
25.11.2022, 19:19
Gutten, А на реале эта последовательность правильно работает? Требуется отжимать Sym?
Чтобы "нажать клавишу" нужно записать значение HIGH, чтобы затем отпустить, надо записать значение LOW.
Чтобы разобраться что там у вас происходит, покажите ваш скетч.

Gutten
26.11.2022, 00:49
Отдельно на кнопках эта последовательность сработает, а кодом - нет. что не так? Печатается [y, должно [



case 0x54: //если считался код 0x54 [[]
SetAddr(table[0x14]);
SetKey(d); //нажали SymShift
SetAddr(table[0x12]);
SetKey(d); //нажали CapsShift
delay (100);

d = LOW;
SetAddr(table[0x12]);
SetKey(d); //отжали CapsShift
delay (100);
d = HIGH;
SetAddr(table[0x35]);
SetKey(d); //нажали Y
delay (100);
d = LOW;
SetAddr(table[0x35]);
SetKey(d); //отжали Y
SetAddr(table[0x14]);
SetKey(d); //отжали SymShift
d = HIGH;
break;

Dexus
26.11.2022, 09:02
Возможно с таймингами не так. delay(100) это по 1/10 секунды. Возможно не в каждом месте этой паузы достаточно (а где-то - с избытком). Предположительно, с зажатой "y" нужно меньше задержку делать, и шифт отпускать после. Типа вот так:

SetAddr(table[0x35]);
SetKey(d); //нажали Y
delay (50);
d = LOW;
SetAddr(table[0x35]);
SetKey(d); //отжали Y
delay (50);
SetAddr(table[0x14]);
SetKey(d); //отжали SymShift
d = HIGH;

В любом случае, это не даст возможность вводить [ с автоповтором (если не отпускать клавишу), это больше для одиночного. Для автоповтора нужно еще помудрить.

Xrust
26.11.2022, 12:02
Gutten, возможно между //отжали Y и //отжали SymShift нужно вставить задержку.

Gutten
26.11.2022, 15:52
Gutten, возможно между //отжали Y и //отжали SymShift нужно вставить задержку.



case 0x54: //если считался код 0x54 [[]
SetAddr(table[0x12]);
SetKey(d); //нажали SymShift
SetAddr(table[0x14]);
SetKey(d); //нажали CapsShift
delay (50);

d = LOW;
SetAddr(table[0x12]);
SetKey(d); //отжали CapsShift
delay (50);
d = HIGH;
SetAddr(table[0x35]);
SetKey(d); //нажали Y
delay (50);
d = LOW;
SetAddr(table[0x35]);
SetKey(d); //отжали Y
delay (50);
SetAddr(table[0x14]);
SetKey(d); //отжали SymShift
d = HIGH;
break;


Добавил. Не помогло. Проблема в том, что Y печатается дважды: в составе [, потом сама.

- - - Добавлено - - -


- - - Добавлено - - -


Возможно с таймингами не так. delay(100) это по 1/10 секунды. Возможно не в каждом месте этой паузы достаточно (а где-то - с избытком). Предположительно, с зажатой "y" нужно меньше задержку делать, и шифт отпускать после. Типа вот так:

SetAddr(table[0x35]);
SetKey(d); //нажали Y
delay (50);
d = LOW;
SetAddr(table[0x35]);
SetKey(d); //отжали Y
delay (50);
SetAddr(table[0x14]);
SetKey(d); //отжали SymShift
d = HIGH;

В любом случае, это не даст возможность вводить [ с автоповтором (если не отпускать клавишу), это больше для одиночного. Для автоповтора нужно еще помудрить.

не помогло. Хотя автоповтор как раз работает и работает правильно: пока держишь, печатается [, в конце [y. А вот если один раз нажать, то печатается [y. Ну и савтоповтором проблема: уже давно не держишь, а он выводит несколько символов.

Dexus
26.11.2022, 18:13
пока держишь, печатается [, в конце [y
Вот [y в конце означает что сканер клавиш бейсика считает, что шифт отпускается после y. Последнюю delay (50) увеличить может, до 100, 150, чтобы шифт сильно позже отпускался...

Xrust
26.11.2022, 18:21
Возможно, сама клавиатура генерирует лишний символ?
Можно попробовать использовать отладку через порт. Посмотреть, в какой момент появляется лишний символ? Клавиатура его генерирует или логика скетча?

- - - Добавлено - - -

Dexus, возможно. Delay может давать очень странные эффекты.

Dexus
27.11.2022, 16:29
Клавиатура может 1000 раз в прерывании менять состояние порта, важно только то что она прочитает в момент отработки сканирования, 1 раз в прерывание. Т.е. как минимум на 1/50 секунды там проскакивает голый Y (без shift).
Кстати после этого нужно снова Ext ткнуть.
По сути должно быть 2 сценария, на нажатие и на отжатие клавиши.

Xrust
27.11.2022, 16:41
Нужно еще учитывать, что клавиатура генерирует коды как на нажатие, так и на отжатие клавиши. Эти коды надо обрабатывать очень аккуратно, иначе вместо отжатия может сработать нажатие. Скорее всего придется весь цикл переделать, чтобы такие сложные сочетания заработали.
Gutten, распознание кода отжатия (F0) только в одном месте цикла сейчас происходит, обратите на это внимание.

Как я уже говорил, отладочный порт покажет, что происходит.

aleksy
27.11.2022, 19:03
USB бы прикрутить да mega168 вроде этого не умеет....
занимаюсь USB на STM32
тут https://zx-pk.ru/threads/34781-usb-keyboard.html думал на 595 но вот тодсказали Эту статью

vegapiratradio
29.11.2022, 05:34
занимаюсь USB на STM32
зачем там стм32?
лет 100 назад делал программный юсб на 48 меге... хватало за глаза! а тут стм32... как-то перебор.

Xrust
29.11.2022, 16:15
vegapiratradio, USB host?

vegapiratradio
29.11.2022, 16:26
нет, слэйв

Gutten
29.11.2022, 22:01
А вот интересно сделано для матрицы на альтере: https://github.com/andykarpov/ps2_cpld_kbd/blob/master/firmware/avr_kbd/avr_kbd.ino
В принципе, как-то можно и здесь аналогично сделать, был бы человек умелый и с желанием.

Xrust
29.11.2022, 23:20
нет, слэйв

Слейв - клавиатура, тут хост нужен. В принципе, были попытки и на AVR хост написать, но стабильных я не встречал.

aleksy
07.12.2022, 20:21
Да чтото не доверяю я програмному USB HOST

vegapiratradio
08.12.2022, 01:46
Да чтото не доверяю я програмному USB HOST

никто не идеален!))

gdv2002
02.02.2023, 10:57
А для Спека, Атмега8 подойдет, есть прошивка под неё?

Xrust
03.02.2023, 09:00
А для Спека, Атмега8 подойдет, есть прошивка под неё?

Да, подойдет. Просто при компиляции исходника выбираете соответствующий микроконтроллер.

gdv2002
03.02.2023, 09:05
Да, подойдет. Просто при компиляции исходника выбираете соответствующий микроконтроллер.

Я к сожалению в компиляциях этих ни в зуб ногой! Не сочтите за наглость, но можно готовую прошивку для 8-й Атмеги.

- - - Добавлено - - -

Клава вот такая у меня

https://pic.maxiol.com/thumbs2/1675404313.1441366178.1001096.jpg (https://pic.maxiol.com/?v=1675404313.1441366178.1001096.jpg&dp=2)

Xrust
03.02.2023, 09:12
gdv2002, да я сам в них ни в зуб ногой :) поэтому все через ардуину делаю. А чем вы прошивать будете контроллер?

gdv2002
03.02.2023, 09:24
У меня Usbasp для Атмег. Ну и "5 проводков" на ЛПТ.

nemo
03.02.2023, 09:51
поэтому все через ардуину делаю

Вроде по умолчанию mega8 ардуиновским IDE по умолчанию не поддерживается. Правда может быть на нее настроен. В сети как настроить встречал.

П321
03.02.2023, 11:23
У меня получилось так (там версии для 48 и 128).
Выбрал плату "Arduino NG or older" и процессор "ATmega8".

Сделал по совету ниже конкретно ATmega8.
Как удалить предыдущий файл не разобрался поэтому оставил.
Вроде как это можно просто прошить программатором.

Serg6845
03.02.2023, 11:27
Вроде по умолчанию mega8 ардуиновским IDE по умолчанию не поддерживается. Правда может быть на нее настроен. В сети как настроить встречал.

https://github.com/MCUdude/MiniCore
как вариант

Xrust
03.02.2023, 16:35
У меня Usbasp для Атмег. Ну и "5 проводков" на ЛПТ.

Тогда для вас подробная видео инструкция в первом сообщении.

Ser
05.04.2023, 13:03
Atmega88 тоже работает,проверено много раз, на CH9350L хороший вариант все клавы что у меня есть работают(без проводная тоже ). Можно менять пины подключения в экселе. Автор HighLander.

Rio444
05.04.2023, 17:12
Как решен вопрос автоповтора нажатой клавиши?
Если нажать и удерживать клавишу, клавиатура начинает сама генерировать повторные нажатия.
То же самое делает Спектрум.
Они не конфликтуют?

Xrust
06.04.2023, 23:26
Как решен вопрос автоповтора нажатой клавиши?
Если нажать и удерживать клавишу, клавиатура начинает сама генерировать повторные нажатия.
То же самое делает Спектрум.
Они не конфликтуют?

Нет. Автоповтор от клавиатуры на матрицу не передается.

Rio444
07.04.2023, 00:43
Нет. Автоповтор от клавиатуры на матрицу не передается.
Как этого удалось достичь?

Xrust
07.04.2023, 21:25
Как этого удалось достичь?
Естественным образом так получилось. Логика работы ps/2 клавиатуры. При автоповторе не передаётся префикс отпускания клавиши. Соответственно уже замкнутый контакт матрицы может ещё раз замкнуться, что никак не повлияет на работу клавиатуры "подопечного" компьютера. И если в нём нет автоповтора, то и не будет.

Rio444
07.04.2023, 22:14
При автоповторе не передаётся префикс отпускания клавиши.Спасибо! Совсем забыл про это.

otrazhenie
16.05.2023, 10:11
Доброго дня.
Ни у кого случаем нет прошивки для Специалиста?

Xrust
17.05.2023, 07:43
Доброго дня.
Ни у кого случаем нет прошивки для Специалиста?

У меня такой прошивки нет. Насколько я понимаю, там матрица клавиш 12х6. Можно переделать прошивку от Спектрума (первую). Надо только определить соответствие между скан кодом AT клавиатуры и координатой замыкаемого ключа.

otrazhenie
06.06.2023, 10:41
а не лучше править корветовскую прошивку....там вроде 16 на 8


Индекс массива соответствует скан коду клавиатуры. Элементы массива кодируют контакты матрицы. Как именно происходит кодирование, видно из этого участка кода:
Код:

void SetAddr(uint8_t addr) {
digitalWrite(AX0,bitRead(addr,0));
digitalWrite(AX1,bitRead(addr,1));
digitalWrite(AX2,bitRead(addr,2));
digitalWrite(AX3,bitRead(addr,3));
digitalWrite(AY0,bitRead(addr,4));
digitalWrite(AY1,bitRead(addr,5));
digitalWrite(AY2,bitRead(addr,6));
}

Матрица имеет размерность 16 столбцов и 8 строк. 4 бита AX0...AX3 кодируют столбцы, 3 бита AY0..AY2 кодируют строки. AX0 - самый младший бит, AY2 - самый старший.
Для удобства я применяю такую заготовку: Заготовка.txt


программист из меня еще тот...ткните где править соответствие кодов клавы и координатой

Xrust
08.06.2023, 19:53
программист из меня еще тот...ткните где править соответствие кодов клавы и координатой

Править нужно массив. Он состоит из 128 значений. Порядковый номер элемента массива - это сканкод, приходящий с клавиатуры. Сканкодов на самом деле больше, но мы упрощаем в данном случае и используем только префикс F0- отпускание клавиши. Остальные префиксы пропускаем. Значение элемента массива - это закодированный адрес матрицы. Матрица у нас 16 столбцов на 8 строк. 16 мы можем закодировать 4 битами (в данном случае младшие значащие биты элемента массива). А 8 строк можно закодировать 3 битами (здесь это старшие биты). В результате у нас будет число со значением от 0 (нулевая строка, нулевой столбец) до 127 (8 строка, 15 столбец). Т.к. ключ с этим адресом в клавиатуре Корвета не используется, с чистым сердцем присваиваем это значение всем неиспользуемым сканкодам. И так для каждого сканкода. Определяем, будет ли данный сканкод использоваться в нашем компьютере. Если да, то какой клавише (ключу на матрице) будет соответствовать. Пересчитываем адрес матрицы (а он будет завесить от того, как мы подключим матрицу) в код и вносим значение в массив.

- - - Добавлено - - -

Скан коды очень наглядно тут можно посмотреть:
https://radiokot.ru/circuit/digital/pcmod/23/

- - - Добавлено - - -

А так можно визуализировать адресацию матрицы:




0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15


0


















16


















32


















48


















64


















80


















96


















112



















Сложите значение столбца и строки, получится адрес.

1N4148
02.12.2023, 22:37
Уважаемые единочаятели, а не развел ли кто-нибудь данную схему под ЛУТ?

Xrust
04.12.2023, 19:01
Уважаемые единочаятели, а не развел ли кто-нибудь данную схему под ЛУТ?

Да там вполне можно без ЛУТа, МГТФом и макеткой обойтись.

1N4148
04.12.2023, 19:39
Да там вполне можно без ЛУТа, МГТФом и макеткой обойтись.
Ну так-то да, но хочется ведь эстетики.

Xrust
05.12.2023, 00:59
Ну так-то да, но хочется ведь эстетики.

Для эстетов есть платы заводского производства ;)

solonoid
08.12.2023, 23:37
Спасибо уважаемому Xrusty за контроллер. Посидел в Layoute и сделал под Лут для Спектрума плату на Plcc MT8816. Выкладываю файлы платы и файлы прошивок под atmega8 c фьюзами. Забыл сказать . Прилепил на плату два светодиода с двумя резисторами. Один на питание . Второй на 25 ногу Атмеги , индицирует нажатие любой кнопки на клавиатуре. Хотелось бы попросить уважаемого Xrusta доработать программу и вывести на свободные ноги Атмеги импульс сброса по ctrl alt del , nmi по нажатию какой то функциональной клавиши.