Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[tinny2313][Bascom AVR] Emulacja klawiaturyt komputerowej

kiler129 15 Maj 2008 17:00 4689 11
  • #1 15 Maj 2008 17:00
    kiler129
    Poziom 27  

    A wiem mam dosc klopotliwy problem.
    Odbierac od klawy dane umiem i wszytko co tam dusza chce z nimi robic ale jak to dziala w druga strone ?
    Co klawiatura wysyla jak jest podlaczona do pc ?
    Bo jakos bios rozpoznaje ze jest podlaczona.
    Posiadam serwer i nie usmiecha mi sie trzymanie klawy przy nim bo jest zbedna a niastety bios jest na tyle glupi ze nie umozliwia wylaczenia sprawdznia klawaitury uparcie pokazujac:

    "Keyboard not found!
    Press F1 to resume" (ktos ma pomysl jak wcisnac f1 ? xD)

    Wybebeszyc klawiature nie problem ale chce cos eleganckiego mieszczacego sie na malej pcb, tj. na takiej z samym attiny, 3 czy ile tam wystajacych bolcow i plytczeka z attiny w smd.
    Tylko teraz co wyslac pc po wlaczeniu procka aby zalapal ze klawiatura jest i ma sie dobrze?

    Z gory dziekuje za pomoc :D

    0 11
  • Pomocny post
    #2 15 Maj 2008 20:50
    zumek
    Poziom 39  

    kiler129 napisał:
    A wiem mam dosc klopotliwy problem.
    Odbierac od klawy dane umiem i wszytko co tam dusza chce z nimi robic ale jak to dziala w druga strone ?
    Co klawiatura wysyla jak jest podlaczona do pc ?

    Na te pytania znajdziesz odpowiedzi w sieci , a jeśli liczysz na gotowca , to się ... przeliczyłeś :D
    Gdybym jednak źle ocenił Twoje zamiary ;) , to na początek polecam to:CLICK
    W ostateczności np. to:CLICK

    Piotrek

    0
  • #3 15 Maj 2008 21:00
    kiler129
    Poziom 27  

    Na gotowca nie licze ale jak mam wyslac cos linia do odbioru ?
    Nie zbardo to widze.
    I co konrketnie, angilski nie ejst moja mocna strona jednakze czesc rozumiem z tego co dales.
    Co do drugiego to jest platne.

    0
  • #4 15 Maj 2008 21:17
    zumek
    Poziom 39  

    kiler129 napisał:
    ... ale jak mam wyslac cos linia do odbioru ?

    Interface PS2 , nie ma osobnych linii do odbioru i nadawania.Są tylko 2 linie , gdzie jedna to "zegar" , a druga to dane.Na czym polega różnica pomiędzy wysyłaniem danych z KBD do PC(host) , czy z PC(host) do KBD widać na rysunkach , w temacie The Keyboard's Protocol. Do ich zrozumienia , angielski jest zbędny ;)
    kiler129 napisał:
    Co do drugiego to jest platne.

    A cóż to jest te paręnaście euro :?: :D

    Piotrek

    0
  • #5 15 Maj 2008 21:32
    kiler129
    Poziom 27  

    zumek napisał:
    kiler129 napisał:
    ... ale jak mam wyslac cos linia do odbioru ?

    Interface PS2 , nie ma osobnych linii do odbioru i nadawania.Są tylko 2 linie , gdzie jedna to "zegar" , a druga to dane.Na czym polega różnica pomiędzy wysyłaniem danych z KBD do PC(host) , czy z PC(host) do KBD widać na rysunkach , w temacie The Keyboard's Protocol. Do ich zrozumienia , angielski jest zbędny ;)


    Tylko ja jakos nie rozumiem :|


    zumek napisał:
    kiler129 napisał:
    Co do drugiego to jest platne.

    A cóż to jest te paręnaście euro :?: :D

    Piotrek

    Juz lepiej wybebeszyc klawiature.

    0
  • #6 15 Maj 2008 23:14
    JmL(TM)
    Poziom 24  

    kiler129 napisał:
    Juz lepiej wybebeszyc klawiature.


    Moze nie jest to za bardzo eleganckie rozwiazanie ale przynajmniej proste i szybkie. A w sumie to jaka bedzie roznica dolaczenia malej PCB z klawiatury i PCB z np. ATTINY2313? Zarowno w pierwszym jak i drugim rozwiazaniu masz PCB "uwieszone" przy obudowie. Moglbys moze znalezc jakas klawiature na USB i podlaczyc sam uklad bezposrednio w srodku do plyty glownej, wtedy masz czysto i bez zewnetrznych "upiekszaczy" ;)

    0
  • #7 16 Maj 2008 05:16
    mr. big
    Poziom 12  

    tak ale attiny kosztuje 2zl a klawa 30 ;)

    0
  • #8 16 Maj 2008 12:53
    pixel7
    Poziom 22  

    Gotowiec:

    Code:
    $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


    Przyjrzyj się funkcji WRITE PS2 DATA.

    Pozdrawiam.

    0
  • #9 16 Maj 2008 12:55
    JmL(TM)
    Poziom 24  

    Popatrz na Allegro. Ja sprawdzilem i znalazlem nowa klawiature USB za 14zl a uzywke za 5zl. Jesli liczyc koszt ATTINTY + PCB + zlacze PS/2 lub USB + lutowanie to koszt tez bedzie podobny wiec czy na pewno warto? Jesli chodzi o cele edukacyjne to na pewno warto ale jesli chcesz tylko w prosty sposob rozwiazac problem z klawiatura to rozebranie gotowej jest chyba lepsze a na pewno szybsze... ;)

    0
  • #10 16 Maj 2008 15:49
    LichyiChydy
    Poziom 12  

    Czy twoim celem jest zrobienie protezy klawiaturze na atinie czy może nie chcesz mieć klawiatury przy komputerze a ten przy starcie blokuje się na teście biosu. Jeżeli chcesz, aby komputer nie testował klawiatury wystarczy wyłączyć test w biosie. Po takim wyłączeniu komputer nie będzie sprawdzał obecności klawiatury.

    0
  • #11 01 Cze 2008 22:49
    kiler129
    Poziom 27  

    LichyiChydy napisał:
    Jeżeli chcesz, aby komputer nie testował klawiatury wystarczy wyłączyć test w biosie. Po takim wyłączeniu komputer nie będzie sprawdzał obecności klawiatury.

    NIe no sam bym na to nie wpadl! ........
    Gdybys przeczytal moje posty to wiedzialbys ze nie da sie na mojej mobo wylaczyc.

    0
  • #12 08 Mar 2009 20:23
    elektryk1981
    Poziom 2  

    jest cos takiego w biosie jak halt on :

    0