Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Компьютер-клавиатура-ПИК. Проблема с PS/2.
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > PIC
Al Prad
Здравствуйте, коллеги!

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

Прошу совета, как побороть проблему.
Kolia
Добрый день.

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


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

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

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


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


Попробовал. Ничего не изменилось, увы. Кнопки по-прежнему распознаются плохо.
help.gif
Omen_13
Необходимость в резисторах R3 R4 чем то обусловлена? (я не силён в ПИКах) Может в этом дело?
И ещё: если ПИК обнуляет линии RA0 RA1 может лучше использовать микросхемы с открытым коллектором?
upc2
С этой схемой все в порядке , но здесь у вас режим опроса.Наверно тут и глюк.
Попробуйте использовать предназначенные для этого выводы синхронного приема RB1 и RB2.
Если это сложно , то лучше CLK подать на вывод внешнего прерывания RB0.
Причина думаю в том, что обработка LCD занимает много времени и пропускается следующее
нажатие кнопки.Это мое предположение.Вашей программы я не видел.
Al Prad
Цитата(Omen_13 @ Apr 2 2007, 00:34) *
Необходимость в резисторах R3 R4 чем то обусловлена? (я не силён в ПИКах) Может в этом дело?
И ещё: если ПИК обнуляет линии RA0 RA1 может лучше использовать микросхемы с открытым коллектором?


Эти резисторы нужны для ограничения тока , когда пик настраивается на выход. Предположим, на линии Data высокий уровень, т.е. на выходе 4 U3B лог.1. В это время если пик выставит лог 0 на RA1, возникнет КЗ, с которым я и борюсь этими резисторами.
Пробовал и без них, кстати. Результат тот же.
Al Prad
Цитата(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;




  }
}
upc2
CapsLock и NumLock это 2-х байтные команды.Я не заметил где вы их обрабатываете, но это и не важно. Порт А не должен влиять на клавиатуру если его TRISa не переключается на вывод данных.
По фрагменту кода вашей программы -все нормально, но работу функции Ps2_Key_Read(&value, &special, &pressed) не видно.Не пробовали осциллографом посмотреть , что творится на RA0 и RA1.?
Их же необходимо подтянуть к +5в.
Напишите свою функцию Key_Read.
Al Prad
Цитата(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 и по управлению светодиодами выполняет комп.
GrayCat
М-мм... Я когда делал "разветвитель" клавиатуры (1 * PC => 2 * Keyboard) (да, я понимаю, что проще купить USB-клаву или USB-переходник для PS/2 клав за $4 smile.gif ) намаялся много, пока въехал, как работает передача ОТ компа К клаве. Но сделал. На PIC16F628, компилятор HI-TECH. Если поможет, могу выложить.

Задействованы [почти] все выводы PIC, способные вызывать прерывания wink.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.