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

 
 
 
Reply to this topicStart new topic
> Компьютер-клавиатура-ПИК. Проблема с PS/2.
Al Prad
сообщение Mar 27 2007, 09:55
Сообщение #1


Участник
*

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



Здравствуйте, коллеги!

Собираю устройство, включаемое параллельно PS/2 между компьютером и клавиатурой. Устройство должно отображать на LCD нажатые клавиши. Использую MikroC v 6.2. Все работает нормально до тех пор, пока я не нажму CapsLock или NumLock. После этого клавиатура виснет и приходится ее выдергивать и вставлять обратно. На форуме производителя MikroC предположили , что ПИК согласно протоколу обмена выставляет 0 на Data и тем самым вносит помехи в обмен между РС и клавиатурой. Тогда я добавил по два инвертора на Clk и Data, идущие к ПИКу. В таком случае пик уже не может влиять на эти шины. Теперь CapsLock нажимается без последующих зависаний, но кнопки опознаются одна из пяти примерно.

Прошу совета, как побороть проблему.


--------------------
Go to the top of the page
 
+Quote Post
Kolia
сообщение Mar 27 2007, 15:52
Сообщение #2


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

Группа: Свой
Сообщений: 188
Регистрация: 28-09-06
Из: Minsk
Пользователь №: 20 762



Добрый день.

Цитата
но кнопки опознаются одна из пяти примерно.


Резаки R6, R7 сделайте моменьше - порядка 2-4 кОм.

если не поможет то вместо CD4011A попробуйте ТЛ2 или ТЛ1 (с триггером Шмитта).
Go to the top of the page
 
+Quote Post
Al Prad
сообщение Mar 27 2007, 20:21
Сообщение #3


Участник
*

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



Цитата(Kolia @ Mar 27 2007, 15:52) *
Добрый день.
Резаки R6, R7 сделайте моменьше - порядка 2-4 кОм.

если не поможет то вместо CD4011A попробуйте ТЛ2 или ТЛ1 (с триггером Шмитта).


Спасибо , попробую эту идею.


--------------------
Go to the top of the page
 
+Quote Post
Al Prad
сообщение Apr 2 2007, 00:23
Сообщение #4


Участник
*

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



Цитата(Al Prad @ Mar 27 2007, 21:21) *
Спасибо , попробую эту идею.


Попробовал. Ничего не изменилось, увы. Кнопки по-прежнему распознаются плохо.
help.gif


--------------------
Go to the top of the page
 
+Quote Post
Omen_13
сообщение Apr 2 2007, 00:34
Сообщение #5


Силовик-затейник
****

Группа: Модераторы
Сообщений: 766
Регистрация: 18-02-07
Из: Столица солнечного Башкортостана
Пользователь №: 25 467



Необходимость в резисторах R3 R4 чем то обусловлена? (я не силён в ПИКах) Может в этом дело?
И ещё: если ПИК обнуляет линии RA0 RA1 может лучше использовать микросхемы с открытым коллектором?

Сообщение отредактировал Omen_13 - Apr 2 2007, 00:40


--------------------
"Вперёд на мины, ордена потом!"
"инжинер/разработчик создает нечто, в отличии от многих других профессий. В этом есть сходность с художниками или музыкантами"(с)CodeWarrior1241
Go to the top of the page
 
+Quote Post
upc2
сообщение Apr 2 2007, 07:56
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 506
Регистрация: 29-09-05
Из: Донецк
Пользователь №: 9 063



С этой схемой все в порядке , но здесь у вас режим опроса.Наверно тут и глюк.
Попробуйте использовать предназначенные для этого выводы синхронного приема RB1 и RB2.
Если это сложно , то лучше CLK подать на вывод внешнего прерывания RB0.
Причина думаю в том, что обработка LCD занимает много времени и пропускается следующее
нажатие кнопки.Это мое предположение.Вашей программы я не видел.
Go to the top of the page
 
+Quote Post
Al Prad
сообщение Apr 2 2007, 09:21
Сообщение #7


Участник
*

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



Цитата(Omen_13 @ Apr 2 2007, 00:34) *
Необходимость в резисторах R3 R4 чем то обусловлена? (я не силён в ПИКах) Может в этом дело?
И ещё: если ПИК обнуляет линии RA0 RA1 может лучше использовать микросхемы с открытым коллектором?


Эти резисторы нужны для ограничения тока , когда пик настраивается на выход. Предположим, на линии Data высокий уровень, т.е. на выходе 4 U3B лог.1. В это время если пик выставит лог 0 на RA1, возникнет КЗ, с которым я и борюсь этими резисторами.
Пробовал и без них, кстати. Результат тот же.


--------------------
Go to the top of the page
 
+Quote Post
Al Prad
сообщение Apr 2 2007, 15:00
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 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


--------------------
Go to the top of the page
 
+Quote Post
upc2
сообщение Apr 2 2007, 16:05
Сообщение #9


Знающий
****

Группа: Свой
Сообщений: 506
Регистрация: 29-09-05
Из: Донецк
Пользователь №: 9 063



CapsLock и NumLock это 2-х байтные команды.Я не заметил где вы их обрабатываете, но это и не важно. Порт А не должен влиять на клавиатуру если его TRISa не переключается на вывод данных.
По фрагменту кода вашей программы -все нормально, но работу функции Ps2_Key_Read(&value, &special, &pressed) не видно.Не пробовали осциллографом посмотреть , что творится на RA0 и RA1.?
Их же необходимо подтянуть к +5в.
Напишите свою функцию Key_Read.
Go to the top of the page
 
+Quote Post
Al Prad
сообщение Apr 2 2007, 17:44
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 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 коды нажатых клавиш, и как детально действует - не известно sad.gif И изменить ее, понятно. тоже невозможно.

Моя задача - тольно отображать на LCD нажимаемые буквы. Функции по обработке CapsLock и по управлению светодиодами выполняет комп.


--------------------
Go to the top of the page
 
+Quote Post
GrayCat
сообщение Apr 6 2007, 16:55
Сообщение #11


Местный
***

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



М-мм... Я когда делал "разветвитель" клавиатуры (1 * PC => 2 * Keyboard) (да, я понимаю, что проще купить USB-клаву или USB-переходник для PS/2 клав за $4 smile.gif ) намаялся много, пока въехал, как работает передача ОТ компа К клаве. Но сделал. На PIC16F628, компилятор HI-TECH. Если поможет, могу выложить.

Задействованы [почти] все выводы PIC, способные вызывать прерывания wink.gif


--------------------
Gray©at
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 6th July 2025 - 13:34
Рейтинг@Mail.ru


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