Aktyw Forum

Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.

Sprawdź punkty Zarejestruj się

[BASCOM] Czytanie danych z PS2- mysz

GruX
-
-
Posty: 4
Rejestracja: 9 gru 2007, o 23:43
Lokalizacja: Gdynia
Kontaktowanie:

[BASCOM] Czytanie danych z PS2- mysz

Postautor: GruX » 9 gru 2007, o 23:48

Witam,

już trochę czasu walczę z odczytaniem danych z ps2, a konkretnie myszki, potrzebuje odczytać z niej dane o przesunięciu. Czy ktoś może wie jak to zrobić w bascomie??

Pozdrawiam,
GruX

Awatar użytkownika
j_bravo
-
-
Posty: 189
Rejestracja: 14 wrz 2005, o 16:30
Lokalizacja: Lublin
Kontaktowanie:

Postautor: j_bravo » 10 gru 2007, o 17:30


GruX
-
-
Posty: 4
Rejestracja: 9 gru 2007, o 23:43
Lokalizacja: Gdynia
Kontaktowanie:

Postautor: GruX » 10 gru 2007, o 20:17

robimy z kumplem wszystko według tych instrukcji i nadal nie działa:/

poniżej kod[przerobiona wersja kodu kogos innego, wiec ma kupe niepotrzebnych rzeczy ;]]:

Kod: Zaznacz cały

$regfile = "m32def.dat" ' Atmel 8535 AVR register file $include $crystal = 8000000 ' 8mhz AVR clock Ddrd = &B11111111 ' Set PortC DDR (PS2 lines toggle direction in code) Config Lcdpin = Pin , Db4 = Portd.6 , Db5 = Portd.7 , Db6 = Portd.4 , Db7 = Portd.5 , E = Portd.1 , Rs = Portd.0 Config Lcd = 16 * 2 Clockin Alias Pind.2 ' Touchpad clock (PS2) PINS 1-2 Clockout Alias Portd.2 Clockdir Alias Ddrd.2 Datain Alias Pind.3 ' Touchpad serial data in/out (PS2) PINS 3-4 Dataout Alias Portd.3 Datadir Alias Ddrd.3 Declare Sub Padcfg ' Configure touchpad Declare Sub Readpad ' Read pad data Declare Function Readps2() As Byte ' Recieve PS2 data Declare Function Writeps2(byval D As Byte) As Byte ' Send PS2 data Dim Text As String * 16 ' VFD text Dim T As String * 1 ' Single character storage Dim Tx As String * 5 ' Text formatting Dim Ty As String * 5 ' Text formatting Dim X As Byte ' General purpose byte Dim I As Byte ' For/Next indexing Dim P As Byte ' Wasted space for hacked code Dim Length As Byte ' Text length Dim Ps2 As Byte ' PS2 data Dim P1 As Byte ' PS2 packet byte 1 Dim P2 As Byte ' PS2 packet byte 2 Dim P3 As Byte ' PS2 packet byte 3 Dim P4 As Byte ' PS2 packet byte 4 Dim P5 As Byte ' PS2 packet byte 5 Dim P6 As Byte ' PS2 packet byte 6 Dim Z As Byte ' Pad pressure Dim Bleft As Bit ' Pad button left Dim Bright As Bit ' Pad button right Dim Xp As Integer ' Calculated pad X Dim Yp As Integer ' Calculated pad Y Dim Xs As Single ' Float X Dim Ys As Single ' Float Y Dim Rad As Single ' Pad angle in radians Dim Deg As Byte ' Pad angle in degrees 0 = East Dim Lastdeg As Integer ' Last degree value Dim Pdata As Byte ' Pad command byte Dim Finger As Bit ' Finger flag 1 = on pad Dim Displaymode As Byte ' What to display on VFD ' ========== PROGRAM CODE BEGINS ============== Clockdir = 0 Datadir = 0 Clockout = 1 Dataout = 1 Waitms 100 ' Give devices time to reset Cls Lcd "Initializing1" Wait 1 ' Pause display 1 second Cls Lcd "Sending pad cfg" ' Debug msg Wait 1 Call Padcfg ' Call pad cfg to set absolute mode Cls Lcd "Pad cfg sent OK " ' Debug msg Wait 1 ' ========== MAIN PROGRAM LOOP ================= Main: Call Readpad ' Read touchpad data Cls Lcd "X :" ; Xp Lowerline Lcd "Y: " ; Yp Waitms 50 ' Loop delay Goto Main ' Loop ' End of running code End ' ============ READ PS2 DATA ============================= Function Readps2() As Byte Do Loop Until Clockin = 0 While Clockin = 0 ' Wait for first clock pulse Wend Readps2 = 0 For I = 1 To 8 While Clockin = 1 Wend Shift Readps2 , Right , 1 If Datain = 1 Then Readps2 = Readps2 + 128 ' Shift in data... While Clockin = 0 ' ...and wait for clock rising edge Wend Next I For I = 1 To 2 While Clockin = 1 Wend While Clockin = 0 ' Wait for parity and stop bits Wend Next I End Function ' ============= WRITE PS2 DATA ======================== Function Writeps2(byval D As Byte) As Byte ' PS2 out code ' Returns ack or error code from device Ps2send: Clockout = 0 Clockdir = 1 Waitus 200 ' Hold clock low for at least 100us Dataout = 0 Datadir = 1 Waitus 5 ' Send start bit Clockdir = 0 Clockout = 1 Waitus 5 ' Release clock line While Clockin = 1 Wend ' Wait for clock to go low again P = 1 For I = 1 To 8 Dataout = D.0 ' Shift out data P = P.0 Xor D.0 Shift D , Right , 1 Cls Lcd "debug 1" While Clockin = 0 Wend Cls Lcd "debug 2" While Clockin = 1 Wend Cls Lcd "debug 3" Next I Dataout = P.0 ' Shift out parity bit While Clockin = 0 Wend While Clockin = 1 Wend Dataout = 1 Datadir = 0 Dataout = 1 ' Send stop bit While Clockin = 0 Wend While Clockin = 1 Wend While Clockin = 0 Wend Writeps2 = Readps2() ' Get pad response If Writeps2 = &HFA Then Exit Function ' ACK = OK ($FA) so return If Writeps2 = &HFE Then ' Check for resend request Cls Lcd "PS2 resend" ' Debug msg Goto Ps2send End If If Writeps2 = &HFC Then ' Check for Error ($FC) Cls Lcd "PS2 write error" Else Text = Hex(writeps2) ' Unknown response Cls Lcd "PS2 returns " ; Text End If Cls Lcd Text Wait 1 End Function ' ============= CONFIGURE TOUCHPAD ====================== Sub Padcfg ' Send pad configuration mode byte as 4X $E8,b1b0 followed by Set Sample Rate ' Mode byte format = [ABS RATE NA NA SLEEP DIGEST 0 WMODE] ' Refer to Synaptics Interfacing PDF for details ' Should be optimized to a command string after testing Cls Lcd "1" Waitms 100 Pdata = &HFF ' Disable pad Ps2 = Writeps2(pdata) Cls Lcd "2" Waitms 100 Pdata = &HFF Ps2 = Writeps2(pdata) ' Set absolute mode to get actual pad coordinates Pdata = &HFF ' ABS=1 RATE=0 Ps2 = Writeps2(pdata) Pdata = &HFF Ps2 = Writeps2(pdata) Pdata = &HF3 'NA NA (Bits not used) Ps2 = Writeps2(pdata) Pdata = &HC8 Ps2 = Writeps2(pdata) Pdata = &HF3 'SLEEP=0 DIGEST=0 Ps2 = Writeps2(pdata) Pdata = &H64 Ps2 = Writeps2(pdata) Pdata = &H00 ' PACKSIZE=0 WMODE=0 Ps2 = Writeps2(pdata) Pdata = &HF3 ' Sample Rate CMD Ps2 = Writeps2(pdata) Pdata = &H50 ' Sample Rate = $14 (20 sps) to enable mode settings Ps2 = Writeps2(pdata) Pdata = &HF2 ' Set REMOTE MODE (pad only sends data on request) Ps2 = Writeps2(pdata) Pdata = &HF3 Ps2 = Writeps2(pdata) ' Enable pad Pdata = &H0A Ps2 = Writeps2(pdata) ' Enable pad Pdata = &HF2 Ps2 = Writeps2(pdata) ' Enable pad Pdata = &HE8 Ps2 = Writeps2(pdata) ' Enable pad Pdata = &H03 Ps2 = Writeps2(pdata) ' Enable pad Pdata = &HE6 Ps2 = Writeps2(pdata) ' Enable pad Pdata = &HF3 Ps2 = Writeps2(pdata) ' Enable pad Pdata = &H28 Ps2 = Writeps2(pdata) ' Enable pad Pdata = &HF4 Ps2 = Writeps2(pdata) ' Enable pad End Sub ' ============ READ PAD DATA ========================== Sub Readpad Cls Lcd "readpad" Pdata = &HBH ' Send pad read request cmd Cls Lcd Ps2 P1 = Readps2() ' ABS Packet Byte 1 = 1 0 Finger Res 0 Gesture BtnR BtnL P2 = Readps2() ' ABS Packet Byte 2 = Y(11..8) X(11..8) P3 = Readps2() ' ABS Packet Byte 3 = Zpressure P4 = Readps2() ' ABS Packet Byte 4 = 1 1 Y12 X12 0 Gesture BtnR BtnL P5 = Readps2() ' ABS Packet Byte 5 = X(7..0) P6 = Readps2() ' ABS Packet Byte 6 = Y(7..0) Xp = P2 And 15 ' Calculate Pad X coordinate Shift Xp , Left , 8 ' It's a mess; 13 bits scrambled in 3 different bytes Xp = Xp + P5 Xp.12 = P4.4 Yp = P2 And 240 ' Calculate Pad Y coordinate Shift Yp , Left , 4 Yp = Yp + P6 Yp.12 = P4.5 Z = P3 ' Calculate Pad Z Bleft = P1.1 ' Check Flags Bright = P1.2 Finger = P1.5 End Sub ' END OF FILE

Awatar użytkownika
j_bravo
-
-
Posty: 189
Rejestracja: 14 wrz 2005, o 16:30
Lokalizacja: Lublin
Kontaktowanie:

Postautor: j_bravo » 11 gru 2007, o 14:39

fusebits dobrze ustawione ?? JTAG wylaczony ??

kcala
-
-
Posty: 1
Rejestracja: 1 kwie 2008, o 19:21
Lokalizacja: Kraków

Postautor: kcala » 5 maja 2008, o 19:35

słuchajcie, myszka wysyła 3 bajtowy pakiet. Szukam po necie i nie moge znaleść co się dzieje miedzy wyslaniem pierwszego a drugiego bajtu? Wie ktos jaka ma być przerwa? jaki ma być clock, jakie data?
Czy takie jak tu:
http://users.ece.gatech.edu/~hamblen/48 ... mouse.html

GruX
-
-
Posty: 4
Rejestracja: 9 gru 2007, o 23:43
Lokalizacja: Gdynia
Kontaktowanie:

Postautor: GruX » 5 maja 2008, o 20:54

a wiec, walczyliśmy z tym ps2 jakieś 12h i daliśmy sobie spokój wychodząc z założenia, że jest to nie do zrobienia na atmedze 16/32 z powodu zbyt wysokiej częstotliwość ps2. W necie jest dużo na temat ps, jak odkopie archiwum ze wszystkim linkami do stron poświęconych temu protokołowi, to wrzucę na forum.

KonradB
-
-
Posty: 12
Rejestracja: 29 lis 2003, o 12:22
Lokalizacja: Warszawa

Postautor: KonradB » 6 maja 2008, o 10:24

a wiec, walczyliśmy z tym ps2 jakieś 12h i daliśmy sobie spokój wychodząc z założenia, że jest to nie do zrobienia na atmedze 16/32 z powodu zbyt wysokiej częstotliwość ps2. W necie jest dużo na temat ps, jak odkopie archiwum ze wszystkim linkami do stron poświęconych temu protokołowi, to wrzucę na forum.
Między zboczami sygnału zegarowego na PS2 nie będzie mniej niż 50 us... W asemblerze to nawet 12 MHz 8051-ce (zwykłej, 12 cyklowej) zostawało trochę czasu na inne zadania poza obsługą PS2 ;)

Nie poddawać się, brać się za assembler - i wszystko będzie banglało :P

Awatar użytkownika
j_bravo
-
-
Posty: 189
Rejestracja: 14 wrz 2005, o 16:30
Lokalizacja: Lublin
Kontaktowanie:

Postautor: j_bravo » 6 maja 2008, o 13:32

PS/2 Mouse Interface:
Maximum Data Rate - 40 kbps .... no i to ma być szybkość ?? myślę zez każdy język programowania/procesor sobie poradzi... proponuje zacząć od dobrego algorytmu i optymalizacji programu.

GruX
-
-
Posty: 4
Rejestracja: 9 gru 2007, o 23:43
Lokalizacja: Gdynia
Kontaktowanie:

Postautor: GruX » 6 maja 2008, o 20:03

pisaliśmy to w magicznym bascomie, może dlatego....

Awatar użytkownika
pajaczek
Moderator
Moderator
Posty: 2650
Rejestracja: 24 sty 2005, o 00:39
Lokalizacja: Winny gród

Postautor: pajaczek » 6 maja 2008, o 20:15

Bascom jaki by magiczny nie byl, i jakbym za nim nie "przepadal"... to i tak powinien umozliwic nawet programowa obsluge transmisji z takimi predkosciami.
Ostatnio zmieniony 6 maja 2008, o 21:34 przez pajaczek, łącznie zmieniany 1 raz.

Awatar użytkownika
j_bravo
-
-
Posty: 189
Rejestracja: 14 wrz 2005, o 16:30
Lokalizacja: Lublin
Kontaktowanie:

Postautor: j_bravo » 6 maja 2008, o 20:49

hm.. jeśli nie udało ci sie tego napisać w "magicznym bascomie" to raczej nie pochodź do innego języka programowania bo polegniesz na starcie :617:
podłącz analizator stanów logicznych, przeanalizuj program. może popełniłeś w programie błąd. AVR pociągnie obsługę myszy nawet jak będzie taktowany zegarem 1MHz...

ps. nie poddawać sie. kombinować!! ;)

Wróć do „Projektowanie PCB, programy EDA, CAD, narzędziowe”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 22 gości