|
|
  |
Компьютер-клавиатура-ПИК. Проблема с PS/2. |
|
|
|
Mar 27 2007, 09:55
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 21-09-06
Пользователь №: 20 568

|
Здравствуйте, коллеги! Собираю устройство, включаемое параллельно PS/2 между компьютером и клавиатурой. Устройство должно отображать на LCD нажатые клавиши. Использую MikroC v 6.2. Все работает нормально до тех пор, пока я не нажму CapsLock или NumLock. После этого клавиатура виснет и приходится ее выдергивать и вставлять обратно. На форуме производителя MikroC предположили , что ПИК согласно протоколу обмена выставляет 0 на Data и тем самым вносит помехи в обмен между РС и клавиатурой. Тогда я добавил по два инвертора на Clk и Data, идущие к ПИКу. В таком случае пик уже не может влиять на эти шины. Теперь CapsLock нажимается без последующих зависаний, но кнопки опознаются одна из пяти примерно. Прошу совета, как побороть проблему.
--------------------
|
|
|
|
|
Mar 27 2007, 15:52
|
Частый гость
 
Группа: Свой
Сообщений: 188
Регистрация: 28-09-06
Из: Minsk
Пользователь №: 20 762

|
Добрый день. Цитата но кнопки опознаются одна из пяти примерно. Резаки R6, R7 сделайте моменьше - порядка 2-4 кОм. если не поможет то вместо CD4011A попробуйте ТЛ2 или ТЛ1 (с триггером Шмитта).
|
|
|
|
|
Mar 27 2007, 20:21
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 21-09-06
Пользователь №: 20 568

|
Цитата(Kolia @ Mar 27 2007, 15:52)  Добрый день. Резаки R6, R7 сделайте моменьше - порядка 2-4 кОм.
если не поможет то вместо CD4011A попробуйте ТЛ2 или ТЛ1 (с триггером Шмитта). Спасибо , попробую эту идею.
--------------------
|
|
|
|
|
Apr 2 2007, 00:23
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 21-09-06
Пользователь №: 20 568

|
Цитата(Al Prad @ Mar 27 2007, 21:21)  Спасибо , попробую эту идею. Попробовал. Ничего не изменилось, увы. Кнопки по-прежнему распознаются плохо.
--------------------
|
|
|
|
|
Apr 2 2007, 09:21
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 21-09-06
Пользователь №: 20 568

|
Цитата(Omen_13 @ Apr 2 2007, 00:34)  Необходимость в резисторах R3 R4 чем то обусловлена? (я не силён в ПИКах) Может в этом дело? И ещё: если ПИК обнуляет линии RA0 RA1 может лучше использовать микросхемы с открытым коллектором? Эти резисторы нужны для ограничения тока , когда пик настраивается на выход. Предположим, на линии Data высокий уровень, т.е. на выходе 4 U3B лог.1. В это время если пик выставит лог 0 на RA1, возникнет КЗ, с которым я и борюсь этими резисторами. Пробовал и без них, кстати. Результат тот же.
--------------------
|
|
|
|
|
Apr 2 2007, 15:00
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 21-09-06
Пользователь №: 20 568

|
Цитата(upc2 @ Apr 2 2007, 07:56)  С этой схемой все в порядке , но здесь у вас режим опроса.Наверно тут и глюк. Попробуйте использовать предназначенные для этого выводы синхронного приема RB1 и RB2. Если это сложно , то лучше CLK подать на вывод внешнего прерывания RB0. Причина думаю в том, что обработка LCD занимает много времени и пропускается следующее нажатие кнопки.Это мое предположение.Вашей программы я не видел. Програма написана в среде MikroC v 6.2. Используются встроенные функции для обмена с клавиатурой и LCD, так что вмешаться в их работу нет возможности. Замечу, что все работает прекрасно без U3, R3, R4; так что предположительно проблемы с программой нет. Так бы оно и работало, если бы не одно "Но": при нажатии на CapsLock или NumLock все виснет. (хотя не на всех клавиатурах). Вероятно, ПИК вмешивается в обмен между клавиатурой и РС. Для устранения этого влияния я и ввел U3, R3, R4. Теперь ничего не виснет, но и кнопки опознаются крайне неуверенно. Программу выкладываю Код char Temp; char LangChangeFlag=0; char BackSpaceFlag=0; char Up [16]= " BSIU "; char Down [16]= " Automation "; // char Up [16]; // char Down [16]; char value; char special; char pressed;
char i; char j;//debug char Lang; enum Loc {Lat=0,Rus=255};
// char *text = "mikroElektronika";
#define Lang_Indicator PORTB.F0
//PS/2 #define Data 1 #define Clock 0
//LCD Lcd_Config (&PORTB,2,3,1,7,6,5,4) ; //rs,en,wr,d7,d6,d5,d4 #define rs 2 #define en 3 #define wr 1 #define d7 7 #define d6 6 #define d5 5 #define d4 4
void Ruschar (void) { if (value == 'a') {value = 228; return;} if (value == 'A') {value = 228;return;} if (value == 'b') {value = 184;return;} if (value == 'B') {value =165;return;} if (value == 'c') {value =99;return;} if (value == 'C') {value =67;return;} if (value == 'd') {value =179;return;} if (value == 'D') {value =66;return;} if (value == 'e') {value =121;return;} if (value == 'E') {value =169;return;} if (value == 'f') {value =97;return;} if (value == 'F') {value =65;return;} if (value == 'g') {value =190;return;} if (value == 'G') {value =168;return;} if (value == 'h') {value =112;return;} if (value == 'H') {value =80;return;} if (value == 'i') {value =193;return;} if (value == 'I') {value =172;return;} if (value == 'j') {value = 111;return;} if (value == 'J') {value = 79;return;} if (value == 'k') {value = 187;return;} if (value == 'K') {value = 167;return;} if (value == 'l') {value = 227;return;} if (value == 'L') {value = 224;return;} if (value == 'm') {value = 196;return;} if (value == 'M') {value = 98;return;} if (value == 'n') {value = 191;return;} if (value == 'N') {value = 84;return;} if (value == 'o') {value = 230;return;} if (value == 'O') {value = 226;return;} if (value == 'p') {value = 183;return;} if (value == 'P') {value = 164;return;} if (value == 'q') {value = 185;return;} if (value == 'Q') {value = 166;return;} if (value == 'r') {value = 186;return;} if (value == 'R') {value = 75;return;} if (value == 's') {value = 195;return;} if (value == 'S') {value = 174;return;} if (value == 't') {value = 101;return;} if (value == 'T') {value = 69;return;} if (value == 'u') {value = 180;return;} if (value == 'U') {value = 161;return;} if (value == 'v') {value = 188;return;} if (value == 'V') {value = 77;return;} if (value == 'w') {value = 229;return;} if (value == 'W') {value = 225;return;} if (value == 'x') {value = 192;return;} if (value == 'X') {value = 171;return;} if (value == 'y') {value = 189;return;} if (value == 'Y') {value = 72;return;} if (value == 'z') {value = 199;return;} if (value == 'Z') {value =177;return;} /////////////////////////////// if (value == '[') {value = 120;return;} //x if (value == '{') {value =88;return;}
if (value == ']') {value = 194;return;} //ъ if (value == '}') {value = 173;return;}
if (value == ';') {value = 182;return;} //ж if (value == ':') {value = 163;return;}
if (value == 39) {value = 0xC5;return;} //э if (value == 34) {value = 0xAF;return;} //
if (value == ',') {value = 178;return;} //б if (value == '<') {value = 160;return;}
if (value == '.') {value = 198;return;} //ю if (value == '>') {value = 176;return;}
if (value == '/') {value = 46;return;} //. if (value == '?') {value = 44;return;} //,
//if (value == '\') {value = 92;return;} // \ same if (value == '|') {value =0x2f;return;} // /
if (value == '`') {value = 0xB5;return;}//ё if (value == '~') {value =0xA2;return;}
if (value == '@') {value = '"';return;}// " (2) if (value == '#') {value = 0xCC;return;}// № (3) if (value == '$') {value = ';';return;}// ; (4) if (value == '^') {value = ':';return;}// : (6) if (value == '&') {value = '?';return;}// ? (7) }
void main() { //j=0; OPTION_REG = 0b00011111;
TRISB=0;// output
Lcd_Config (&PORTB,rs,en,wr,d7,d6,d5,d4) ; //rs,en,wr,d7,d6,d5,d4 lcd_cmd(lcd_clear);
//__set_configuration_word(0xff46); // b'1111111101000110' //FOSC0 = 0 crystal generator //FOSC1 = 1 crystal generator //WDTE = 1 WDT enabled //PWRTE = 0 PWRT enabled //FOSC2 = 0 crystal generator //MCLRE = 0 internal MCLR //BODEN = 1 BOR enabled //LVP = 0 RB4/PGM is I/O pin //CPD = 1 EEPROM protect disabled //absent =1 //CP0 = 1 Chip Protect DEactivated //CP1 = 1 Chip Protect DEactivated //CP0 = 1 Chip Protect DEactivated //CP1 = 1 Chip Protect DEactivated //? //? Up [15]= ' '; Down [15]= ' ';
Ps2_Config (&PORTA,Clock,Data); //clock, data
while (1) {
//Reciever DISABLE RCSTA = 0;
T2CON = 0x00;/
CMCON = 0x07;
CCP1CON = 0; //disable PWM module
INTCON = 0x00; //bank1 TRISA = 0b11000011; //1=input; 0=output TRISB=0;// //all pins are out
PIE1 = 0;//Interrupt from peripherie is disabled VRCON = 0; //Vref shut down //Transmitter DISABLE TXSTA =0;
// Needed do reinit often OPTION_REG = 0b00011111;
if (Ps2_Key_Read(&value, &special, &pressed)) //keyboard read {
if ( value ==34 ) { if (!LangChangeFlag) { LangChangeFlag=1;
if (lang==rus) lang=lat; else lang=rus; } } else { LangChangeFlag=0; }
//backspace if ( pressed && value ==16) { if (!BackSpaceFlag) { BackSpaceFlag=1; Special=1; Temp= Up[15];//store
for (i=15;i>0;i--) { Up[i]=Up[i-1]; //shift right Down[i]=Down[i-1]; //shift right }
Up[0]=' '; //clear Down[0]=Temp; //restore } }
else { BackSpaceFlag=0; }
if (pressed && !special && value>31 && value<=127) {
Temp= Down[0]; //store first letter in second row for (i=0;i<15;i++) { Up[i]=Up[i+1]; //shift left Down[i]=Down[i+1]; //shift left }
Up[15]=Temp; //restore last letter in first row
if (lang==rus) { Ruschar(); //russkij Lang_Indicator=0; } else { Lang_Indicator=1; }
Down [15] = value ; // current letter (last place in the second row) }
lcd_cmd(lcd_first_row);
for (i=0;i<16;i++) { lcd_chr_cp (Up[i]); //print first row // Delay_ms (5); }
lcd_cmd(lcd_second_row);
for (i=0;i<16;i++) { lcd_chr_cp (Down[i]); //print second row //Delay_ms (5); }
} a: // temp = 'Ц'; vdelay_ms (10); // temp=Rus;
//reset watcdogtimer asm CLRWDT;
} }
Сообщение отредактировал Al Prad - Apr 2 2007, 15:04
--------------------
|
|
|
|
|
Apr 2 2007, 17:44
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 21-09-06
Пользователь №: 20 568

|
Цитата(upc2 @ Apr 2 2007, 16:05)  CapsLock и NumLock это 2-х байтные команды.Я не заметил где вы их обрабатываете, но это и не важно. Порт А не должен влиять на клавиатуру если его TRISa не переключается на вывод данных. По фрагменту кода вашей программы -все нормально, но работу функции Ps2_Key_Read(&value, &special, &pressed) не видно.Не пробовали осциллографом посмотреть , что творится на RA0 и RA1.? Их же необходимо подтянуть к +5в. Напишите свою функцию Key_Read. Ps2_Key_Read - встроенная функция компиллятора, и что она делает - не известно (переключает ли TRIS и в какой момент ?) . Если ПИК мешает обмену, то скорее всего - переключает.. Она согласно документации возвращает ASCII коды нажатых клавиш, и как детально действует - не известно  И изменить ее, понятно. тоже невозможно. Моя задача - тольно отображать на LCD нажимаемые буквы. Функции по обработке CapsLock и по управлению светодиодами выполняет комп.
--------------------
|
|
|
|
|
Apr 6 2007, 16:55
|

Местный
  
Группа: Свой
Сообщений: 263
Регистрация: 7-10-05
Из: UA
Пользователь №: 9 342

|
М-мм... Я когда делал "разветвитель" клавиатуры (1 * PC => 2 * Keyboard) (да, я понимаю, что проще купить USB-клаву или USB-переходник для PS/2 клав за $4 ) намаялся много, пока въехал, как работает передача ОТ компа К клаве. Но сделал. На PIC16F628, компилятор HI-TECH. Если поможет, могу выложить. Задействованы [почти] все выводы PIC, способные вызывать прерывания
--------------------
Gray©at
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|