реклама на сайте
подробности

 
 
> Эмулятор PS/2 клавиатуры, проблемы с передачей данных
vitko
сообщение Jul 4 2007, 12:09
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 30
Регистрация: 8-03-06
Из: Kyiv, UA
Пользователь №: 15 066



Есть устройство на AVR - считыватель карточек, включенный в разрыв PS/2-клавиатуры. При считывании карточки клавиатура блокируется и устройство от имени клавиатуры передает код карточки в виде скан-кодов. Проблема в том, что если в это время дергать PS/2-мышкой, передача идет со сбоями.
Может кто-то что-то посоветовать?
Go to the top of the page
 
+Quote Post
2 страниц V  < 1 2  
Start new topic
Ответов (15 - 18)
vitko
сообщение Jul 5 2007, 16:31
Сообщение #16


Участник
*

Группа: Участник
Сообщений: 30
Регистрация: 8-03-06
Из: Kyiv, UA
Пользователь №: 15 066



В принципе, глобально - вопрос был в том, может ли устройство корректно передать компу масив символов, не умея принимать комманды от ПК и реагировать на них. (скажем, если в середине набора символов есть код нажатия NumLock, ПК сразу начнет передачу комманды "включить/погасить индикатор на клавиатуре"). Может устройство просто проигнорировать команду, переждать несколько мс, а потом передавать оставшиеся символы.
Я так понимаю, Dimmy это удалось.
Относительно передачи байтов, я примерно так и делаю, как говорил Dimmy - перед сбросом в 0 клока проверяю уровень на нем, если 1 - передаю байт заново :

//---------------------------------------------------------
//Send 1 byte
//---------------------------------------------------------
void PS_2Send (uchar byte)
{
unsigned char n;
unsigned char SendBuff[11];

PrepareByteToSend(SendBuff,byte);
for(n=0;n<10;n++) // try 10 times
{
WaitNoSignal(); //ждем,чтоб Clock=1 ~200 мс
if (PS_2SendBit(SendBuff[0]) == false) continue;
if (PS_2SendBit(SendBuff[1]) == false) continue;
if (PS_2SendBit(SendBuff[2]) == false) continue;
if (PS_2SendBit(SendBuff[3]) == false) continue;
if (PS_2SendBit(SendBuff[4]) == false) continue;
if (PS_2SendBit(SendBuff[5]) == false) continue;
if (PS_2SendBit(SendBuff[6]) == false) continue;
if (PS_2SendBit(SendBuff[7]) == false) continue;
if (PS_2SendBit(SendBuff[8]) == false) continue;
if (PS_2SendBit(SendBuff[9]) == false) continue;
if (PS_2SendBit(SendBuff[10]) == false) continue;
PS_Delay_us(50);
break;
}
return;
}

//---------------------------------------------------------
//Send one bit
//---------------------------------------------------------
bool PS_2SendBit (uchar b )
{
PS2_PORT|=(1<<PS2_CLK); // clock high
PS_Delay_us(15);

if (b == 1) PS2_PORT|=(1<<PS2_DATA);
else PS2_PORT&=~(1<<PS2_DATA);
PS_Delay_us(22); //us;

PS2_DDR&=~(1<<PS2_CLK); //CLK as In
if (!(PS2_PIN&(1<<PS2_CLK))) return (false); //low level on PS2_CLK
PS2_DDR|=(1<<PS2_CLK); //CLK as Out
PS2_PORT&=~(1<<PS2_CLK);
PS_Delay_us(40); //us;

PS2_PORT|=(1<<PS2_CLK);
return (true);
}

Так называемый АСК, выдаваемый хостом - это запрет на передачу на время обработки им полученной комманды (буфера у него нет).
Можно ли его наличие считать признаком приема байта и какие у него тогда должны быть временные параметры ?
Go to the top of the page
 
+Quote Post
Dimmy
сообщение Jul 5 2007, 18:48
Сообщение #17


Частый гость
**

Группа: Участник
Сообщений: 106
Регистрация: 12-09-05
Пользователь №: 8 503



Цитата
В принципе, глобально - вопрос был в том, может ли устройство корректно передать компу масив символов, не умея принимать комманды от ПК и реагировать на них.

Ну, разве если вы уверены, что ваше устройство не будет включено вместо клавы на этапе загрузки... Но и в таком случае вы должны уметь обработать ситуацию, когда хост "дергает" CLK в 0 и на входе DATA - 0. Это значит, что хост "просит" передать данные. Тогда вам нужно выдать клоки для приема данных от хоста...


Цитата
Относительно передачи байтов, я примерно так и делаю, как говорил Dimmy - перед сбросом в 0 клока проверяю уровень на нем, если 1 - передаю байт заново :

...а надо проверять на 0... - что вы и делаете smile.gif if (!(PS2_PIN&(1<<PS2_CLK))) return (false); //low level on PS2_CLK
так что тут все правильно...
Только вы забыли об основной ситуации - когда клавиатура в покое, а мышка двигается. Тогда хост на время приема данных от мыши выставляет 0 на CLK. Так что я посоветовал бы Вам обрабатывать его в прерывании и в нем проверять состояние вывода DATA. Если он в 0 - то это запрос от хоста на передачу данных. Вам надо их синхронизировать. Если на DATA 1 - то Вам ничего не надо делать минимум в течение 2мс...

Сообщение отредактировал Dimmy - Jul 5 2007, 19:01
Go to the top of the page
 
+Quote Post
Dimmy
сообщение Jul 5 2007, 20:16
Сообщение #18


Частый гость
**

Группа: Участник
Сообщений: 106
Регистрация: 12-09-05
Пользователь №: 8 503



Да, настраивать прерывание по CLK надо на фронт (т.е. переход 0->1) и проверять состояние DATA в этот момент.
Цитата
Так называемый АСК, выдаваемый хостом - это запрет на передачу на время обработки им полученной комманды (буфера у него нет).

- согласен. Пересмотрел свою прогу - я действительно выдавал 11 бит (START + 8 DATA + PAR + STOP), и, помню визуально, сразу после этого фиксировал сигнал CLK , выставляемый хостом. Поскольку в штатном режиме (клавиатура к музыкальному автомату) мышка была отключена - то считал его сигналом квитирования. При его отсутствии в течение 5мс повторял передачу. Для меня именно квитирование было немаловажно, т.к. точно должны были отрабатываться сигналы от монетоприемника.

Сообщение отредактировал Dimmy - Jul 5 2007, 21:05
Go to the top of the page
 
+Quote Post
vitko
сообщение Jul 6 2007, 09:12
Сообщение #19


Участник
*

Группа: Участник
Сообщений: 30
Регистрация: 8-03-06
Из: Kyiv, UA
Пользователь №: 15 066



Цитата(Dimmy @ Jul 5 2007, 21:48) *
Только вы забыли об основной ситуации - когда клавиатура в покое, а мышка двигается. Тогда хост на время приема данных от мыши выставляет 0 на CLK. Так что я посоветовал бы Вам обрабатывать его в прерывании и в нем проверять состояние вывода DATA. Если он в 0 - то это запрос от хоста на передачу данных. Вам надо их синхронизировать.


В том то и дело - я хочу просто проигнорировать запрос хоста на передачу команды и подождать 15мс(если верить описанию контроллера клавы), когда у него произойдет таймаут ожидания реакции клавы. Надеюсь он мне это "простит" - ведь в обычном режиме устройство просто "висит" параллельно клаве и не мешает ее обмену с ПК, инициализация проходит нормально. Актуальным вопрос становится при считывании карточки, когда девайс шлет ПК масив сканкодов (код карточки + дополнительные символы).

ОК, спасибо за советы, буду экспериментировать.
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 09:38
Рейтинг@Mail.ru


Страница сгенерированна за 0.01373 секунд с 7
ELECTRONIX ©2004-2016