Да, на плате PLCC не предусмотрены контакты для подключения отладочного порта.
Выкладываю альфа-версию прошивки под Вектор-06Ц
Подключение: PA - J3, PB - J2, J1: 1 - УС, 3 - РУС/ЛАТ, 4 - СС.
Раскладка пока только ЙЦУКЕН.
Сам, к сожалению, протестировать не могу.
https://i.ibb.co/wcRW23K/sdr.jpg
Код:#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,127,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,127,7,117,116,114,3,127,
127,36,69,55,87,2,19,127,127,4,115,68,102,39,83,127,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,113,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;
}
}
}
Всем привет.
Собираюсь купить сей девайс для УКНЦ, но нужна помощь клуба сделать под УКНЦ прошивку и развести шлейф.
Объясните, что нужно для разведения шлейфа? В идеале, хочу взять шлейф и колодку IDC-34 и развести нужные пины (пропуская ненужные на J2) на 2 шлейфа в линию для МС-7007.
Arseny, нужно схему клавиатуры, прошивку сделать помогу.
В сообщении #53 есть ссылка на схемы для Алесты aleste_keyboard.zip. Там есть и распиновка матрицы и даже картинка как будут распределены кнопки :-)
Так никто и не захотел сделать кнопки сброс и nmi? Я всё ещё надеюсь, а то привык, руки тянутся.
izzx,
Планирую, в принципе написал (хотя в С я и не ахти как разбираюсь) но еще отлаживать надо, а у меня самодельная клава пока не полностью запустилась. Однако потребуется доработка платы (хотя если только RESET и NMI) можно обойтись и без доработок, можно будет использовать пины программирования меги, надо будет просто в прошивке поправить пины) для вывода наружу не используемых пинов меги.
nemo, еще один выход можно попробовать взять с вывода CS матрицы, а ее прицепить к +5в.
izzx, Пример реализации можно взять из кода для Ветора - там таким образом переключаются кнопки СС, УС, РУС.
Xrust, спасибо. Если не дождусь готового варианта, буду сам делать.
izzx, попробуйте. Сам не испытывал еще, но компилируется без ошибок.
Начальное состояние выходов определяется переменными res и nmi. Они расположены на J1 1 и 4. В качестве клавиши Res- Scroll Lock, в качестве NMI - F12. Если на клавиатуре есть Power, Sleep и Wake, наверное удобнее их использовать. С сочетаниями чуть сложнее, но тоже можно сделать. Давайте пока так испытаем.Код:#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,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,64,127,127,127,127,52,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(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.
}
}
}
Ну да для скетча выше это пины разъема прошивки. На выходах mega будет устанавливаться низкий уровень. Что касается транзисторов. Я до этого делал другой контроллер (на 8 mega) там без всяких транзисторов,не помню что бы мега грелась. Да и NMI нагружен то всего на 1 вход. Так что ИМХО можно и напрямую. Другое дело что в некоторых случаях (вроде на пенте так) для NMI замыкается m1 на АГ3 вот тут наверное без ключа не обойтись. Но при желании для страховки можно и понаставить ключей.
А мега потом прошиваться снова будет? Думаю будет, раз специалисты говорят. Сигнал RST же не трогаем.
И на выходе меги MISO MOSI не будет постоянно высокий уровень? Пока клавишу не нажмёшь. А я его возьму и железной кнопкой на землю. Как бы чего не вышло ).
А куда она денется? Прошивальщик ее дергает за 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" получим?
nemo, эти low и high пишутся в матрицу, а не в порт reset.
Прошивку опробовал. Reset подключил на контакт 1 J1. Комп не запускается с контроллером, пока не нажмёшь Ф12 для сброса. Тогда начинает работать, но через несколько секунд клава печатает случайный символ несколько раз, затем перестаёт совсем печатать.
А вообще я думал, что сброс надо не к меге подключать, а к матрице. К одному контакту землю, к другому сброс.
И кстати, кнопочка на корпусе тоже нужна. А к ней ещё и конденсатор подвешен, если что.
izzx, сначала желательно проверить работу контроллера не подключая к компьютеру. Что у него на j1.1 в момент подачи питания? Что после нажатия клавиш?
Как реализована цепь сброса на компьютере? Если там конденсатор, то от него лучше отказаться и сделать принудительный сброс от контроллера клавиатуры. Чтобы и кнопку сброса сохранить, придется выход контроллера с ней развязать. Например, через диод.
Когда появится свободное время, прошью свой контроллер и проверю прошивку. Возможно, в ней есть незамеченные ошибки. Логика её работы всё усложняется.
ээээ
digitalWrite
Подает HIGH или LOW значение на цифровой вход/выход (pin).
Зачем вообще писать что то в матрицу нам же тут 8816 не нужен?
Что касается кондера когда подключал контроллер на мега8 работало нормально и с ним (но думается там нужна задержка на несколько ms).
В общем, с логикой работы не то. Включил без компа. На контакте j1.1 5 вольт. Когда нажимаешь и держишь Ф12, напряжение сначала 0, а потом скачет от 1.5 до 3.5. И иногда инвертируется. При не нажатой Ф12 уже 0, а при нажатой 5.
А в компе сигнал reset на несколько микросхем идёт.
https://pic.maxiol.com/thumbs2/16396...597373949..jpg
"можно порекомендовать подключить параллельно контактам кнопки "Сброс" конденсатор, емкостью 33...47 мкФ (положительный вывод "+" - на контакт Reset, отрицательный вывод - на контакт Земля)."
Думаю надо к матрице цеплять.
Чуток не по теме, но хочу подробней узнать про коммутатор MT8816. Из доки следует, что это матрица на 128 вариантов (8х16), при стандартном порядном опросе проблем для реализации той же спектрумовской клавы нет. Но. Спектрум позволяет разом опрашивать хоть все 8 рядов одновременно конструкцией вида XOR A: IN A,(#FE), получая сочетание нажатых клавиш согласно выбранным рядам (пусть и с некоторыми условиями). Отрабатывает ли в данном случае матрица аналогично железному компу? Или как она себя поведет, если установить в ноль сразу несколько входных линий?
Ну, так устроена логика обработки скан-кодов. Дело в том, что префикс отпускания клавиши фиксируется только в одном месте программы, а следующий за этим префиксом код может обрабатываться в разных местах. При этом матрица может участвовать, если код клавиши соответствует контакту матрицы, а может и не участвовать - это если скан коду соответствует что-то другое, например выход микроконтроллера. В первом случае отпускание будет нейтрализовано после записи в матрицу в ветке default, а во втором случае в отдельной ветке case, а запись в матрицу вообще не произойдет.
- - - Добавлено - - -
Конденсатор цепи сброса заряжается не через резистор, а от выхода микроконтроллера. Причем +5 там не сразу появляется, сначала там 0, затем инициализация клавиатуры, затем +5. Вероятно, из-за этого самозапуска не происходит.
Пульсации - это автоповтор клавиатуры.
Доброго дня всем!
Я вот тоже спаял этот контроллер для моего старого Ориона 128. Чуть-чуть модифицировал прошивку чтобы удобнее было мэппинги вбивать.
Исходник
Xrust, ещё столкнулся с такой недоработкой, стоит добавить резисторы подтяжки для сигнальных линий ps/2. У меня одна клавиатура то работала, то нет. Замерил напряжения на clk и data - 2.2В. После того как добавил резисторы подтяжки по 5,1к, стало стабильно работать. Ещё, если будешь выпускать платы, хорошо бы нанести маркировку RX, TX у соответствующих выводов последовательного порта.
nemo, у меня все клавы с этим контроллером работали, даже те, которые с контроллером от Caro не дружили. Но есть нюанс. Инициализацию клавиатуры желательно делать как можно раньше в программе, иначе может заглючить.
OrionExt, поток сознания?
Собрал и опробовал сей контроллер на макетке. Замечательно работает.
Потом поправил код, чтобы матрицу кнопок "положить набок", тоесть повернуть массив 5х8, чтобы стало 8х5.
Соответственно, поменял местами выходы X и Y на клавиатуру. Появились свободные ряды и по Y (5-7) и остались по Х (8-15).
Внедрил реакцию на нажатие F12 и F9 c замыканием матрицы вне поля кнопок. Сопротивление матрицы в открытом канале - около 60 Ом, что более чем достаточно и для сброса, и для Магика.
Всё работает. Выход матрицы Х8 - на землю, Y5, Y6 - в комп.
Работает теперь штатно в Скорпионе-GMX.
После того, как прошил скетч из сообщения 90, теперь не могу добиться, чтобы работала первоначальная прошивка для спек 128. Такое может быть?
Изменённую шью, которая с кнопками NMI - условно работает. А первоначальная уже нет.