Я думаю нужно снять видео чтоб все меня поняли. Я написал не моргание при нажатии клавиши, а вообще глюк с морганием почти всего поля. Глюк идёт несмотря на то, что ни одна клавиша не нажата.
Вид для печати
Я думаю нужно снять видео чтоб все меня поняли. Я написал не моргание при нажатии клавиши, а вообще глюк с морганием почти всего поля. Глюк идёт несмотря на то, что ни одна клавиша не нажата.
кстати - собрал адаптер, выяснил что из 6 имеющихся клавиатур работают две. полез в исходники, нашел пару багов в части работы с железом PS/2.
собственно вот:
//---------------------------------------------------------------------------
// Низкоуровневые функции протокола PS/2
#define ps2_setClock0() { PORTD.PS2_CLOCK = 0; prepared_ddrd |= (1 << PS2_CLOCK); DDRD.PS2_CLOCK = 1; }
#define ps2_setClock1() { prepared_ddrd &= ~(1 << PS2_CLOCK); DDRD.PS2_CLOCK = 0; }
// DataIn и DataOut не нужны - выходы с ОК, 0==Out, In==1
#define ps2_setData0() { PORTD.PS2_DATA = 0; prepared_ddrd |= (1 << PS2_DATA); DDRD.PS2_DATA = 1; }
#define ps2_setData1() { prepared_ddrd &= ~(1 << PS2_DATA); DDRD.PS2_DATA = 0; }
//#define ps2_setData0() { PORTD.PS2_DATA = 0; }
//#define ps2_setData1() { PORTD.PS2_DATA = 1; }
#define ps2_waitClock0() { while(PIND.PS2_CLOCK); }
#define ps2_waitClock1() { while(PIND.PS2_CLOCK==0); }
#define ps2_waitClock() { ps2_waitClock1(); ps2_waitClock0(); }
#define ps2_data() PIND.PS2_DATA
#define ps2_wait() (PIND.PS2_DATA || PIND.PS2_CLOCK)
и вот:
// Отправить байт клавиатуре
// Вход: v_a - байт
void ps2_send() {
// ps2_setDataOut();
ps2_setData0();
delay_us(20);
ps2_setClock1();
delay_us(10);
v_j=0;
ps2_waitClock0();
for(v_i=0; v_i<8; v_i++) {
delay_us(10);
if(v_a&1) { ps2_setData1(); v_j++; } else ps2_setData0();
v_a >>= 1;
ps2_waitClock();
#asm
WDR
#endasm
}
// Бит четности
delay_us(10);
if(v_j&1) { ps2_setData0(); } else { ps2_setData1(); }
ps2_waitClock();
// Стоповый бит
delay_us(10);
ps2_setData1();
ps2_waitClock();
// Пропуск ACK
// ps2_setDataIn();
// Лишний waitClock, из-за него не работали старые клавы
// ps2_waitClock();
if(ps2_data()) reboot(); // Ошибка клавиатуры. Перезагружаем её.
ps2_waitClock1();
ps2_transmitMode();
#asm
WDR
#endasm
}
Народ, а на али продаются такие вот длинноногие панельки как в посте https://zx-pk.ru/threads/20586-ps-2-...l=1#post897002
В чупа чупсе они что то не по гуманным ценам.
Сам себе и отвечу. Кто не сможет найти длинноногие панельки можно взять на али однорядные длинноногие - https://aliexpress.ru/item/329596270...5aa233edUiIE1t
Если вдруг кому еще интересно - небольшая доработка контроллера клавиатуры. Позволяет получить работающий сброс компа с сохранением возможности последовательного программирования контроллера. также поправлено переопределение кнопок - можно переопределить ресет и кнопки переключения раскладок.
схема:
Вложение 78356
прошивка, исходник и батник для avrdude с фьюзами на всякий случай:
Вложение 78354
Оперативно оформил предложение Erg6845'а у себя на сайте. Доработка размещена в разделе АДАПТЕР PS/2 КЛАВИАТУРЫ, ссылка на архив размещена в таблице.
прошил с RSTDISBL = 1
прошивку взял с поста https://zx-pk.ru/threads/20586-ps-2-...=1#post1171160
29 вывод в 0. он щас вообще висит в воздухе
Доброго дня. надо бы довести до ума....
атмега48 подойдет вместо 8-й? или можно прошивку под атмегу48?
ясно. спасибо.
решил забить окончательно на этот контроллер и спаять оригинальную клавиатуру из старой писишной