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
Moderatorzy:Jacek Bogusz, robertw, k.pawliczak, Moderatorzy
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
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
tutaj masz sporo wiedzy o PS2:
http://www.beyondlogic.org/keyboard/keybrd.htm
a tu o myszy:
http://www.computer-engineering.org/ps2mouse/
http://www.beyondlogic.org/keyboard/keybrd.htm
a tu o myszy:
http://www.computer-engineering.org/ps2mouse/
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 ;]]:
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
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
Czy takie jak tu:
http://users.ece.gatech.edu/~hamblen/48 ... mouse.html
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ą PS2a 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.
Nie poddawać się, brać się za assembler - i wszystko będzie banglało
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.
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
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ć!!
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ć!!
Kto jest online
Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 51 gości