Одномоментно можно включить или выключить один свитч, но одновременно могут быть включены хоть все, на каждый ключ есть триггер. Но в реальной жизни, мы тоже не одновременно нажимаем клавиши, все равно, какую-то первой, какую-то последней.
Одномоментно можно включить или выключить один свитч, но одновременно могут быть включены хоть все, на каждый ключ есть триггер. Но в реальной жизни, мы тоже не одновременно нажимаем клавиши, все равно, какую-то первой, какую-то последней.
Во время игры нажать диагональ (т.е. одновременно 2 направления) - ситуация обыденная. Тут важен не порядок переключения ключей, а способность оставаться переключенными одновременно.
Вот инструкция по прошивке контроллера.
https://youtu.be/EaM-3dWxztk
Подключение контроллера к Спектруму:
Разъем J2 (8 контактов) подключается к KA8, KA9, KA10, KA11, KA12, KA13, KA14, KA15. Разъем J3 (16 контактов, используются первые 5) подключается к KD0, KD1, KD2, KD3, KD4 (обозначения взяты с платы контроллера и схемы Ленинград 1).
Прошивку можно использовать как для Спектрум, так и для Спектрум 128, они совместимы и отличаются только поддержкой дополнительных кнопок. Те контроллеры, что продаются на барахолке, по умолчанию прошиты версией Спектрум 128.
Подскажите, пожалуйста, распиновку J2 и J3 для Корвета. Спасибо.
А можно (не в напряг канэшна) для алесты прошивочку соорудить? От мс-ки клавиатура как-то не комильфо однако... Я и сам в свободное время поковыряюсь, но для спецов-кодеров оно попроще наверное будет... :)
А для АТМ Турбо 4.50 нельзя дополнительные адресные линии задействовать?
http://atmturbo.nedopc.com/atmshem.htm
- - - Добавлено - - -
Одну платку я у Вас специально для атм приобрел, она у меня ввиде платы на столе, корпуса нет к сожалению.
А вторую для горячо любимой Дельты.
Без проблем! В архиве все что нужно.
Вложение 75560
Вложение 75561
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,127,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,23,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,90,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,96,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, если заработает нормально, попробую переделать латиницу на qwerty. Раскладка переключается клавишами Алф? Жаль, нет доступа к реальному железу.
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,127,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,127,127,
127,127,127,127,127,127,9,127,127,127,127,72,127,127,127,127,127,127,73,127,41,57,8,127,127,45,127,61,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, n_sonic, что-нибудь получается?
Контроллеры только получил. На днях дособираю и попробую, обязательно отпишусь в теме. Домашние заботы съедают время, сори...
Подключил к Корвету. Работает, но как-то интересно. После включения сыплет символом @, пока не сбросишь Мегу, потом вроде всё работает, но "вниз" в некоторых играх (KLAD, PACMAN) не срабатывает, хотя по меню перемещается. В других работает всё, включая "вниз".
ОК, но с @ проблема. Плюс нет клавиш : ;, - _ . / [ \ ]^
Коды для 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};
elker, попробую на днях достать свой корвет и проверить прошивку. Впрочем, может быть надо фьюзами поиграть с задержкой запуска?
elker, до Корвета я так и не добрался, но с контроллером поэкспериментировал. Похожую проблему удалось воссоздать при недостаточной блокировочной емкости по питанию. На плате, где были установлены керамические конденсаторы по 10мкФ и электролит 220мкФ сбой воспроизвести не удалось. На всякий случай можно добавить клавишу для сброса матрицы. Ее можно использовать, если вдруг какой-то из ключей "залип".
Этот код нужно вставить первым в оператор switch. Он привязывает функцию сброса матрицы к клавише Scroll Lock.Код:case 0x7E: //если считался код 0x7E
digitalWrite(CSMT, HIGH); //выбор чипа
digitalWrite(RSTMT, HIGH);
digitalWrite(RSTMT, LOW); //сброс
digitalWrite(CSMT, LOW);
break;
Закинул в прошивку, перезалил - символ : не появился((( вместо него +
Также интересует как добавить переключение на русский. Нужно просто сопоставить alf и кнопку фиксации (на клавиатуре корвета кнопка с кружком)?
- - - Добавлено - - -
НАШЕЛ!!!)))
Настало время пояснить за принцип формирования массива.
Индекс массива соответствует скан коду клавиатуры. Элементы массива кодируют контакты матрицы. Как именно происходит кодирование, видно из этого участка кода:
Матрица имеет размерность 16 столбцов и 8 строк. 4 бита AX0...AX3 кодируют столбцы, 3 бита AY0..AY2 кодируют строки. AX0 - самый младший бит, AY2 - самый старший.Код: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));
}
Для удобства я применяю такую заготовку: Вложение 75668
Для модификации лучше всего подходят прошивки для Спека 48 и Корвета - они самые простые. В прошивку Спек - 128 добавлены сочетания клавиш - при этом замыкаются несколько контактов матрицы сразу и логика работы немного усложнилась.
Доработал матрицу в прошивке для корвета с аутентичной раскладкой (JCUKEN) и переопределил в ней пины, чтобы можно было относительно просто обжать шлейф для подключения корвета:
https://pic.maxiol.com/thumbs2/16246...3.img2256j.jpg
Всю информацию для изготовления контроллера для корвета собрал в первом посту темы https://zx-pk.ru/threads/29197-kontr...laviatury.html
Почти спаял, но прошить пока что не получилось. Пишет что не видит 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\MiniCore\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 паяная пришла.
Да.
Спасибо, попробую. Через этот адаптер уже шил атмегу, но с помощью avrdude.
Upd.
Прошил. Обновил драйвер для USBasp и нашёлся адаптер.
https://pic.maxiol.com/thumbs2/16261...90913857.1.jpg
https://pic.maxiol.com/thumbs2/16261...90913857.2.jpg
Железка сразу заработала. Только не привычно что не работают цифровые клавиши справа, не работает Ctrl+Alt+Del ). Но это не сложно докрутить, наверное.
Зато работает без задержек, в отличии от фирменного контроллера, что у меня есть.
Спасибо автору.
Кто нибудь уже подключил данный контроллер к Алесте? Работает? Прошивкой не поделитесь?
Тестовую версию я выкладывал здесь. Отзывов пока не было.
К Алесте подключил. При включении питания залипает почему-то клавиша "3" на основной клавиатуре. Стоит на нее нажать, и далее все будет работать нормально до снятия питания. Выход в биос по Ф10. ESC, оба shiftа, enter вроде бы на месте. Курсорные клавиши не работают. В режиме амстрада на них цифры, соответствующие курсорным на цифровой клавиатуре. В режиме Алесты ни курсорные, ни цифровые не работают, курсор не перемещают . Как-то так...
n_sonic, отлично! Теперь можно доработать прошивку аналогично корветовской, чтобы переключалась раскладка.
Курсорные клавиши как заставить работать? И вопрос к пользователям Алесты - какая раскладка в режиме "алеста" и "амстрад", одинаковая или разная? У меня матричная клава от МС-ки есть, но там походу шлейф перебит...
Отвечаю на вопрос, как подключить последовательный порт для отладки.
В разделе 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,127,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,127,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;
}
}
}
[свернуть]