Pimenov_2020
06.09.2022, 18:52
https://www.youtube.com/watch?v=Fo7E3_Vwk2w&t=1031s
Кто-то смотрел или повторял это? Собрал для пентагона - не работает. Память только поставил AS6C1008, так как меньше нет ничего. Все неиспользуемые ноги шины адреса заземлил. CE# - на землю, СЕ2 - подтянул к питанию. По итогу вместо прижима KD0 - KD4 к земле - там пачка импульсов. Пачка импульсов также на WE памяти. Вручную (замыкая адрес и данные) все работает. Ниже скетч для ардуины
/*
#define ADR8 A7
#define ADR9 A6
#define ADR10 A5
#define ADR11 A4
#define ADR12 A3
#define ADR13 A2
#define ADR14 A1
#define ADR15 A0
*/
#define ADR8 A0
#define ADR9 A1
#define ADR10 A2
#define ADR11 A3
#define ADR12 A4
#define ADR13 A5
#define ADR14 A6
#define ADR15 A7
#define X0 4
#define X1 5
#define X2 6
#define X3 7
#define X4 8
/*
#define X0 8
#define X1 7
#define X2 6
#define X3 5
#define X4 4
*/
#define WE 10
#define OE 9
#define PS2DATA 3
#define PS2CLK 2
#define debug 1
char ROW_7F[6] = "12345";
char ROW_BF[6] = "QWERT";
char ROW_DF[6] = "ASDFG";
char ROW_FB[6] = ":ZXCV"; // Caps Shift
char ROW_EF[6] = "09876";
char ROW_F7[6] = "POIUY";
char ROW_FD[6] = "=LKJH"; // Enter
char ROW_FE[6] = " @MNB"; // Space, Symbol Shift
byte MEM[256];
byte MAP[256];
// 0 - 9
// LShift,Backspace,Enter,,RShift
// A - Z
// UP DOWN LEFT RIGHT
char SCAN[256]= {0x45, 0x16, 0x1E, 0x26, 0x25, 0x2E, 0x36, 0x3D, 0x3E, 0x46, \
0x12, 0x66, 0xFF, 0x5A, 0xFF, 0xFF, 0x59, \
0x1C, 0x32, 0x21, 0x23, 0x24, 0x2B, 0x34, 0x33, 0x43, 0x3B, 0x42, 0x4B, 0x3A, 0x31, 0x44, 0x4D, 0x15, 0x2D, 0x1B, 0x2C, 0x3C, 0x2A, 0x1D, 0x22, 0x35, 0x1A, \
117, 114, 107, 116};
void setup() {
pinMode(OE,OUTPUT);
pinMode(WE,OUTPUT);
pinMode(PS2CLK,INPUT);
pinMode(PS2DATA,INPUT);
Idle();
for(int i=0;i<0x100;i++) {
MEM[i]=0xFF;
MAP[i]=0;
}
WriteByte(0xFF,0xFF, 0);
//for(int i=0;i<0x100;i++) {
// WriteByte(i,0xFF, 0);
//}
Idle();
digitalWrite(OE,LOW);
delay(250);
digitalWrite(OE,HIGH);
delay(250);
//#ifdef debug
Serial.begin(230400);
Serial.println("PS2 test: ");
//#endif
}
byte SYM = 0;
bool F0_MARK = false;
void loop() {
// put your main code here, to run repeatedly:
if (digitalRead(PS2CLK)==LOW) {
if (digitalRead(PS2DATA)==LOW) {
while(digitalRead(PS2CLK)==LOW) {} // wait for LOW to end
byte DATA=0;
for (int i=0;i<8;i++) {
while(digitalRead(PS2CLK)==HIGH) {} // wait for HIG to end
//delayMicroseconds(10);
byte n = digitalRead(PS2DATA) << 7;
DATA = (DATA >> 1) | n;
while(digitalRead(PS2CLK)==LOW) {} // wait for LOW to end
}
for (int i=0;i<2;i++) { // read 3 extra bits
while(digitalRead(PS2CLK)==HIGH) {} // wait for HIG to end
while(digitalRead(PS2CLK)==LOW) {} // wait for LOW to end
}
if (DATA == 0xF0) {
F0_MARK = true;
} else {
if (F0_MARK) {
MAP[DATA] = 0;
F0_MARK = false;
#ifdef debug
Serial.println((String)"RELEASE: " + (char)(Scan2Char(DATA)));
#endif
Release(Scan2Char(DATA));
if (CheckIdle()) Idle();
} else {
if (MAP[DATA]==0) {
#ifdef debug
Serial.println((String)"PRESS: " + (char)(Scan2Char(DATA)));
#endif
Press(Scan2Char(DATA));
MAP[DATA]=1;
}
}
}
}
}
} // loop
int CheckIdle() {
for (int i=0;i<256;i++) {
if (MEM[i]!=0xFF) return 0;
}
return 1;
}
int Scan2Char(byte value) {
if (value == 0x29) return 0x20; // Space
for(int i=0;i<sizeof(SCAN);i++) {
if (SCAN[i] == value) return (0x30 + i);
}
return 0;
}
void Message(char msg[]) {
for(int i=0;i<strlen(msg);i++) {
Press(msg[i]);
delay(50);
Release(msg[i]);
delay(250);
}
}
// Backspace, up, down, left, right
char extras[] = {';',':','0', \
'[',':','7', \
'\\',':','6', \
']',':','5', \
'^',':','8', \
};
void Press(char code) {
for (int i=0;i<sizeof(extras);i+=3) {
if (code == extras[i]) { // backspace
Press(extras[i+1]);
code = extras[i+2];
}
}
Post(code,1);
}
void Release(char code) {
for (int i=0;i<sizeof(extras);i+=3) {
if (code == extras[i]) { // backspace
Release(extras[i+1]);
code = extras[i+2];
}
}
Post(code,0);
}
void Post(char code,int action) {
// action = 1 PRESS
// action = 0 RELEASE
int n;
int row;
byte j;
// FE - B-SPACE
// FD - H-ENTER
// FB - CAPS - V
// F7 - Y-P
// EF - 6-0
// DF - A-G
// BF - Q-T
// 7F - 1-5
if (n=InArray(ROW_7F,code)) row=0x7F; else // 7f
if (n=InArray(ROW_BF,code)) row=0xBF; else // bf
if (n=InArray(ROW_DF,code)) row=0xDF; else // df
if (n=InArray(ROW_FB,code)) row=0xFB; else // fb
if (n=InArray(ROW_EF,code)) row=0xEF; else // ef
if (n=InArray(ROW_F7,code)) row=0xF7; else // f7
if (n=InArray(ROW_FD,code)) row=0xFD; else // fd
if (n=InArray(ROW_FE,code)) row=0xFE; // fe
n = (0b00100000 >> n) ^ 0xFF;
WriteByte(row,n,action);
Execute();
}
int InArray(char ARR[], char SEARCH) {
for(int i=0;i<5;i++) {
if (ARR[i]==SEARCH) return (i+1);
}
return 0;
}
void Idle() {
digitalWrite(WE,HIGH);
digitalWrite(OE,HIGH);
AddressBusMode(INPUT);
DataBusMode(INPUT);
}
void Execute() {
digitalWrite(WE,HIGH);
digitalWrite(OE,HIGH);
DataBusMode(INPUT);
AddressBusMode(INPUT);
digitalWrite(OE,LOW);
//delay(10);
}
void ReadByte(int address) {
digitalWrite(WE,HIGH);
digitalWrite(OE,HIGH);
DataBusMode(INPUT);
AddressBusMode(OUTPUT);
SetAddress(address);
digitalWrite(OE,LOW);
}
void WriteByte(int address,int data, int action) {
int newdata;
int j;
digitalWrite(WE,HIGH);
digitalWrite(OE,HIGH);
AddressBusMode(OUTPUT);
DataBusMode(OUTPUT);
if (action) newdata = (MEM[address] & data); else newdata = (MEM[address] | (data ^ 0xFF));
SetData(newdata);
MEM[address]=newdata;
Serial.println(newdata, BIN);
Serial.println(address, BIN);
for(j=0;j<0x100;j++) {
SetAddress(j & address);
digitalWrite(WE,LOW);
// delayMicroseconds(2);
digitalWrite(WE,HIGH);
// delayMicroseconds(2);
}
}
void AddressBusMode(int active) {
pinMode(ADR8,active);
pinMode(ADR9,active);
pinMode(ADR10,active);
pinMode(ADR11,active);
pinMode(ADR12,active);
pinMode(ADR13,active);
pinMode(ADR14,active);
pinMode(ADR15,active);
}
void DataBusMode(int active) {
pinMode(X0,active);
pinMode(X1,active);
pinMode(X2,active);
pinMode(X3,active);
pinMode(X4,active);
}
void SetAddress(int address) {
if (address & 0x01) digitalWrite(ADR8,HIGH); else digitalWrite(ADR8,LOW);
if (address & 0x02) digitalWrite(ADR9,HIGH); else digitalWrite(ADR9,LOW);
if (address & 0x04) digitalWrite(ADR10,HIGH); else digitalWrite(ADR10,LOW);
if (address & 0x08) digitalWrite(ADR11,HIGH); else digitalWrite(ADR11,LOW);
if (address & 0x10) digitalWrite(ADR12,HIGH); else digitalWrite(ADR12,LOW);
if (address & 0x20) digitalWrite(ADR13,HIGH); else digitalWrite(ADR13,LOW);
if (address & 0x40) digitalWrite(ADR14,HIGH); else digitalWrite(ADR14,LOW);
if (address & 0x80) digitalWrite(ADR15,HIGH); else digitalWrite(ADR15,LOW);
}
void SetData(int data) {
if (data & 0x01) digitalWrite(X0,HIGH); else digitalWrite(X0,LOW);
if (data & 0x02) digitalWrite(X1,HIGH); else digitalWrite(X1,LOW);
if (data & 0x04) digitalWrite(X2,HIGH); else digitalWrite(X2,LOW);
if (data & 0x08) digitalWrite(X3,HIGH); else digitalWrite(X3,LOW);
if (data & 0x10) digitalWrite(X4,HIGH); else digitalWrite(X4,LOW);
}
Кто-то смотрел или повторял это? Собрал для пентагона - не работает. Память только поставил AS6C1008, так как меньше нет ничего. Все неиспользуемые ноги шины адреса заземлил. CE# - на землю, СЕ2 - подтянул к питанию. По итогу вместо прижима KD0 - KD4 к земле - там пачка импульсов. Пачка импульсов также на WE памяти. Вручную (замыкая адрес и данные) все работает. Ниже скетч для ардуины
/*
#define ADR8 A7
#define ADR9 A6
#define ADR10 A5
#define ADR11 A4
#define ADR12 A3
#define ADR13 A2
#define ADR14 A1
#define ADR15 A0
*/
#define ADR8 A0
#define ADR9 A1
#define ADR10 A2
#define ADR11 A3
#define ADR12 A4
#define ADR13 A5
#define ADR14 A6
#define ADR15 A7
#define X0 4
#define X1 5
#define X2 6
#define X3 7
#define X4 8
/*
#define X0 8
#define X1 7
#define X2 6
#define X3 5
#define X4 4
*/
#define WE 10
#define OE 9
#define PS2DATA 3
#define PS2CLK 2
#define debug 1
char ROW_7F[6] = "12345";
char ROW_BF[6] = "QWERT";
char ROW_DF[6] = "ASDFG";
char ROW_FB[6] = ":ZXCV"; // Caps Shift
char ROW_EF[6] = "09876";
char ROW_F7[6] = "POIUY";
char ROW_FD[6] = "=LKJH"; // Enter
char ROW_FE[6] = " @MNB"; // Space, Symbol Shift
byte MEM[256];
byte MAP[256];
// 0 - 9
// LShift,Backspace,Enter,,RShift
// A - Z
// UP DOWN LEFT RIGHT
char SCAN[256]= {0x45, 0x16, 0x1E, 0x26, 0x25, 0x2E, 0x36, 0x3D, 0x3E, 0x46, \
0x12, 0x66, 0xFF, 0x5A, 0xFF, 0xFF, 0x59, \
0x1C, 0x32, 0x21, 0x23, 0x24, 0x2B, 0x34, 0x33, 0x43, 0x3B, 0x42, 0x4B, 0x3A, 0x31, 0x44, 0x4D, 0x15, 0x2D, 0x1B, 0x2C, 0x3C, 0x2A, 0x1D, 0x22, 0x35, 0x1A, \
117, 114, 107, 116};
void setup() {
pinMode(OE,OUTPUT);
pinMode(WE,OUTPUT);
pinMode(PS2CLK,INPUT);
pinMode(PS2DATA,INPUT);
Idle();
for(int i=0;i<0x100;i++) {
MEM[i]=0xFF;
MAP[i]=0;
}
WriteByte(0xFF,0xFF, 0);
//for(int i=0;i<0x100;i++) {
// WriteByte(i,0xFF, 0);
//}
Idle();
digitalWrite(OE,LOW);
delay(250);
digitalWrite(OE,HIGH);
delay(250);
//#ifdef debug
Serial.begin(230400);
Serial.println("PS2 test: ");
//#endif
}
byte SYM = 0;
bool F0_MARK = false;
void loop() {
// put your main code here, to run repeatedly:
if (digitalRead(PS2CLK)==LOW) {
if (digitalRead(PS2DATA)==LOW) {
while(digitalRead(PS2CLK)==LOW) {} // wait for LOW to end
byte DATA=0;
for (int i=0;i<8;i++) {
while(digitalRead(PS2CLK)==HIGH) {} // wait for HIG to end
//delayMicroseconds(10);
byte n = digitalRead(PS2DATA) << 7;
DATA = (DATA >> 1) | n;
while(digitalRead(PS2CLK)==LOW) {} // wait for LOW to end
}
for (int i=0;i<2;i++) { // read 3 extra bits
while(digitalRead(PS2CLK)==HIGH) {} // wait for HIG to end
while(digitalRead(PS2CLK)==LOW) {} // wait for LOW to end
}
if (DATA == 0xF0) {
F0_MARK = true;
} else {
if (F0_MARK) {
MAP[DATA] = 0;
F0_MARK = false;
#ifdef debug
Serial.println((String)"RELEASE: " + (char)(Scan2Char(DATA)));
#endif
Release(Scan2Char(DATA));
if (CheckIdle()) Idle();
} else {
if (MAP[DATA]==0) {
#ifdef debug
Serial.println((String)"PRESS: " + (char)(Scan2Char(DATA)));
#endif
Press(Scan2Char(DATA));
MAP[DATA]=1;
}
}
}
}
}
} // loop
int CheckIdle() {
for (int i=0;i<256;i++) {
if (MEM[i]!=0xFF) return 0;
}
return 1;
}
int Scan2Char(byte value) {
if (value == 0x29) return 0x20; // Space
for(int i=0;i<sizeof(SCAN);i++) {
if (SCAN[i] == value) return (0x30 + i);
}
return 0;
}
void Message(char msg[]) {
for(int i=0;i<strlen(msg);i++) {
Press(msg[i]);
delay(50);
Release(msg[i]);
delay(250);
}
}
// Backspace, up, down, left, right
char extras[] = {';',':','0', \
'[',':','7', \
'\\',':','6', \
']',':','5', \
'^',':','8', \
};
void Press(char code) {
for (int i=0;i<sizeof(extras);i+=3) {
if (code == extras[i]) { // backspace
Press(extras[i+1]);
code = extras[i+2];
}
}
Post(code,1);
}
void Release(char code) {
for (int i=0;i<sizeof(extras);i+=3) {
if (code == extras[i]) { // backspace
Release(extras[i+1]);
code = extras[i+2];
}
}
Post(code,0);
}
void Post(char code,int action) {
// action = 1 PRESS
// action = 0 RELEASE
int n;
int row;
byte j;
// FE - B-SPACE
// FD - H-ENTER
// FB - CAPS - V
// F7 - Y-P
// EF - 6-0
// DF - A-G
// BF - Q-T
// 7F - 1-5
if (n=InArray(ROW_7F,code)) row=0x7F; else // 7f
if (n=InArray(ROW_BF,code)) row=0xBF; else // bf
if (n=InArray(ROW_DF,code)) row=0xDF; else // df
if (n=InArray(ROW_FB,code)) row=0xFB; else // fb
if (n=InArray(ROW_EF,code)) row=0xEF; else // ef
if (n=InArray(ROW_F7,code)) row=0xF7; else // f7
if (n=InArray(ROW_FD,code)) row=0xFD; else // fd
if (n=InArray(ROW_FE,code)) row=0xFE; // fe
n = (0b00100000 >> n) ^ 0xFF;
WriteByte(row,n,action);
Execute();
}
int InArray(char ARR[], char SEARCH) {
for(int i=0;i<5;i++) {
if (ARR[i]==SEARCH) return (i+1);
}
return 0;
}
void Idle() {
digitalWrite(WE,HIGH);
digitalWrite(OE,HIGH);
AddressBusMode(INPUT);
DataBusMode(INPUT);
}
void Execute() {
digitalWrite(WE,HIGH);
digitalWrite(OE,HIGH);
DataBusMode(INPUT);
AddressBusMode(INPUT);
digitalWrite(OE,LOW);
//delay(10);
}
void ReadByte(int address) {
digitalWrite(WE,HIGH);
digitalWrite(OE,HIGH);
DataBusMode(INPUT);
AddressBusMode(OUTPUT);
SetAddress(address);
digitalWrite(OE,LOW);
}
void WriteByte(int address,int data, int action) {
int newdata;
int j;
digitalWrite(WE,HIGH);
digitalWrite(OE,HIGH);
AddressBusMode(OUTPUT);
DataBusMode(OUTPUT);
if (action) newdata = (MEM[address] & data); else newdata = (MEM[address] | (data ^ 0xFF));
SetData(newdata);
MEM[address]=newdata;
Serial.println(newdata, BIN);
Serial.println(address, BIN);
for(j=0;j<0x100;j++) {
SetAddress(j & address);
digitalWrite(WE,LOW);
// delayMicroseconds(2);
digitalWrite(WE,HIGH);
// delayMicroseconds(2);
}
}
void AddressBusMode(int active) {
pinMode(ADR8,active);
pinMode(ADR9,active);
pinMode(ADR10,active);
pinMode(ADR11,active);
pinMode(ADR12,active);
pinMode(ADR13,active);
pinMode(ADR14,active);
pinMode(ADR15,active);
}
void DataBusMode(int active) {
pinMode(X0,active);
pinMode(X1,active);
pinMode(X2,active);
pinMode(X3,active);
pinMode(X4,active);
}
void SetAddress(int address) {
if (address & 0x01) digitalWrite(ADR8,HIGH); else digitalWrite(ADR8,LOW);
if (address & 0x02) digitalWrite(ADR9,HIGH); else digitalWrite(ADR9,LOW);
if (address & 0x04) digitalWrite(ADR10,HIGH); else digitalWrite(ADR10,LOW);
if (address & 0x08) digitalWrite(ADR11,HIGH); else digitalWrite(ADR11,LOW);
if (address & 0x10) digitalWrite(ADR12,HIGH); else digitalWrite(ADR12,LOW);
if (address & 0x20) digitalWrite(ADR13,HIGH); else digitalWrite(ADR13,LOW);
if (address & 0x40) digitalWrite(ADR14,HIGH); else digitalWrite(ADR14,LOW);
if (address & 0x80) digitalWrite(ADR15,HIGH); else digitalWrite(ADR15,LOW);
}
void SetData(int data) {
if (data & 0x01) digitalWrite(X0,HIGH); else digitalWrite(X0,LOW);
if (data & 0x02) digitalWrite(X1,HIGH); else digitalWrite(X1,LOW);
if (data & 0x04) digitalWrite(X2,HIGH); else digitalWrite(X2,LOW);
if (data & 0x08) digitalWrite(X3,HIGH); else digitalWrite(X3,LOW);
if (data & 0x10) digitalWrite(X4,HIGH); else digitalWrite(X4,LOW);
}