Отговори на тема  [ 23 мнения ]  Отиди на страница Предишна  1, 2
Клавиатура PS2 с Pic 
Автор Съобщение
Ранг: Напреднал
Ранг: Напреднал
Аватар

Регистриран на: Пет Фев 14, 2014 3:45 pm
Мнения: 420
Местоположение: Монтана
Мнение Re: Клавиатура PS2 с Pic
ToHu написа:
… Ще пусна по-късно нещо.


Сетих се нещо. Понеже PS2 шината е по-скоро като обърната наопаки I2C - може би ще стане с библиотека за I2C Slave, ако някой има написана подръка.

_________________
Не карай по-бързо от своя ангел-пазител!


Пет Май 19, 2017 1:02 am
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 8:21 pm
Мнения: 27949
Местоположение: София
Мнение Re: Клавиатура PS2 с Pic
В i2c имаш и адрес ще трябва много да го лъжеш, иначе може. Серийния порт е най-близък, но с тоя контролер си доста ограничен, но не е невъзможно да хващаш първия клок, да го мериш и да настройваш серийния порт. Но за писане чисто софтуерното е по-малко код.


Пет Май 19, 2017 4:34 am
Профил
Ранг: Напреднал
Ранг: Напреднал
Аватар

Регистриран на: Пет Фев 14, 2014 3:45 pm
Мнения: 420
Местоположение: Монтана
Мнение Re: Клавиатура PS2 с Pic
ToHu написа:


Но как през серийния порт ще се "хванат" двата сигнала едновременно, като Rx-а е само един? И с тия вариращи честоти ще стане доста нестабилно.

Адресирането в I2C е въпрос на специфика на слейв-устройството. Самата шина иначе е почти същата, с основната разлика, че при PS2 клавиатурата клока го генерира клавиатурата, а не мастър-устройството (процесора). PS2 позволява обратно предаване на данни като мастъра може да инициира начало като свали нивата на шината според спецификацията, и тогава клавиатурата започва да генерира клок, и да "слуша".

В случая идеята ми за I2C Slave беше, че е възможно някой да има такава библиотека за Proton-а, и с леко "пипване" да стане и за PS2, та да му свърши работа на човека, като е почнал на Proton. За MikroBasic или MikroC няма смисъл от такава интерпретация.

_________________
Не карай по-бързо от своя ангел-пазител!


Пет Май 19, 2017 4:49 am
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 20, 2005 11:02 am
Мнения: 8873
Местоположение: Разград
Мнение Re: Клавиатура PS2 с Pic
Протон-а си има и софтуерна и хардуерна поддръжка на I2C мастер. Е хардуерната е твърде грубо казано хардуерна, ама поне ползва модула, пиновете и тактовия генератор. За слейв може би ще трябва да си го напише - аз не съм виждал готова.


Пет Май 19, 2017 1:58 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 8:21 pm
Мнения: 27949
Местоположение: София
Мнение Re: Клавиатура PS2 с Pic
За серийния порт, ако забелязваш пакета си е жив 232, старт, дата, стоп и парити. Не ти трябва clock-а, ако RS е настроен на правилната честота. Тъй като честотата варира, може да изпозлваш клока за да измериш първи преден- първи заден фронт и по тях да настроиш порта. Ако се изпозлва още някоя периферия, кепчъра заедно с още един подходящо сетнат таймер,е напълно възможно да получиш сетинга на серийния порт почти без сметки, или с 1-2 прости сметки от резултата на кепчъра. Това обаче изисква да изпозлваш отщ от перифериите, които може да са нужни за други цели, освен това си заемаш серийния порт.
Тъкмо стигнах мехико, юе пусна след малко нещо което е чисто софтуерно и не яде допълнителен хардуер, освен пин с прекъсване, по избор външно или RB4-7.


Съб Май 20, 2017 10:08 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 8:21 pm
Мнения: 27949
Местоположение: София
Мнение Re: Клавиатура PS2 с Pic
Ето нещо което драснах набързо, нямам как да го тествам в момента, нямам инсталиран протеус. Каква е идеята :
PortB.0 - clock, сетваш го да прави прекъсване по заден фронт.
Разрешаваш прекъсването, тък може да се направи да го разрешаваш само след някакъв таймоут след невалиден пакет или данни.

В прекъсването не правиш нищо освен да вземаш стойността на данните, PortB.1

Имаш функция ps_2() която връща char като както следва :
bit 0 : 0 - нямаш приет валиден стоп бит ; 1 - имаш приет валиден стоп бит , по спецификация стоп бита трябва да е 1-ца.
bit 1 : 0 - невалиден парити бит ; 1 - валиден парити бит
bit 3 : 0 - нямаш излизане по тайм оут ; 1 - излизане по тайм оут
приетите данни са в променлива data.

Идеята е някъде да имаш еидн таймер, в който да инкрементваш променлива ps_time през интервал 10 ms, това горе долу е тайм оута при 10 kHz. Хардкоднато е на 100, можеш да си го изнесеш да се дефинира някъде отгоре.

Реализирано е почти най-простото приемане като все пак се следи за структурата на данните. Сложил съм повечко флагове да ти е по-ясно как работи, надявам се де.
Флах ps_start - вдига се в единица при наличие на стартов бит, изискване дата да е в 0.

След като веднъж си вдигнал ps_start при всеки клок се проверява колко са приетите битове. Ако са по-малко от 8 проверява състоянието на пин данни, и ако е 1-ца прави най-старшият бит на ps_bufer в 1. Също така при единица инвертира ps_parity, който първоначално е 0, накрая шифтва веднъж целия ps_bufer на дясно, след което инкрементва брояча на получените битове. Манипулирам най-старшия байт защото данните се предават от МЗР към СЗР.

На 9-тия бит /тук изключваме стартовия / сравнявам ps_parity с това кеото е на пин данни, ако са еднакви вигам флаг за валидни данни.

На-10-тия бит проверявам дали данните са в 1-ца, ако са сетвам валиден стоп бит.

В цялото нещо имаш една проверка за таймоут която ако излезе връщаш статус за таймоут.

Функцията връща 0 ако няма приети данни.

Като за написано на летищен терминал толкова за сега, по-късно ако ми с епояви време може да го симулирам в протеуса , логиката е ясно но какво съм написал е друг въпрос.

Код:
#bit ps_data_pin = 0x06.1

int1 ps_clock_in, ps_data, ps_parity, ps_start, ps_receive;
char bufer, ps_bits, data, ps_time;


#INT_EXT
void  EXT_isr(void)
{
   ps_data = ps_data_pin;
   ps_clock_in=true;
}

char ps_2()
{
   char state = 0;
   if(!ps_clock_in) return (state);
   ps_clock_in = false;   
   if(ps_start) {
            if(ps_bits<8) {
                           if(ps_data) {
                                          bufer=bufer||0x80;
                                          ps_parity=!ps_parity; }
                           bufer>>1;
                           ps_bits++; }
             else {
                     if(ps_bits<9){
                                    if(ps_parity == ps_data) data_valid=true;
                                    ps_bites++;
                                  }
                     else
                                 {
                                    ps_start = false;
                                    if(ps_data) state |= 0x01;
                                    if(data_valid) state |=0x02;
                                    data=buffer;                                                                               
                                 }
         }
      else  {
               if(!ps_data) {
                              ps_time=0;
                              ps_start=true;
                              ps_bits=0;
                              ps_parity=0;
                              bufer=0; }
             }
     if(ps_time>100){
                        state|=0x04;
                        ps_start = false;}
      return(state);
}


Нед Май 21, 2017 12:12 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 8:21 pm
Мнения: 27949
Местоположение: София
Мнение Re: Клавиатура PS2 с Pic
п.с. забравих да пиша че тази функция ps_2 трябва да я викаш постоянно в тялото на програмата, ако се отплесва някъде за дълги интервали от време, и за теб е допустимо, може кода да го вкараш направо в прекъсването като махнеш проверката на ps_clock_in, може и вместо ps_data да използваш ps_data_in.


Нед Май 21, 2017 12:15 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Ное 25, 2005 10:41 am
Мнения: 1657
Мнение Re: Клавиатура PS2 с Pic
Няма нищо за умуване. На сърбите PS2 библиотеката за mikroC, mikroP или mikroB работи читаво.....


Сря Май 24, 2017 10:51 am
Профил ICQ WWW
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 23 мнения ]  Отиди на страница Предишна  1, 2

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 8 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни