logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[tinny2313][Bascom AVR] Emulacja klawiaturyt komputerowej

kiler129 15 Maj 2008 17:00 4998 11
  • #1 5143682
    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
  • Pomocny post
    #2 5144582
    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
  • #3 5144641
    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.
  • #4 5144743
    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
  • #5 5144814
    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.
  • #6 5145301
    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" ;)
  • #7 5145587
    mr. big
    Poziom 13  
    tak ale attiny kosztuje 2zl a klawa 30 ;)
  • #8 5146308
    pixel7
    Poziom 23  
    Gotowiec:

    $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.
  • #9 5146311
    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... ;)
  • #10 5146860
    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.
  • #11 5204799
    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.
  • #12 6254923
    elektryk1981
    Poziom 2  
    jest cos takiego w biosie jak halt on :
REKLAMA