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

emulacja klawiatury PC bascom po raz kolejny

21 Maj 2006 14:53 1574 3
  • Poziom 12  
    Witam!
    Dziwny problem. Dlaczego? Zobaczcie.
    Code:

    $crystal = 12000000
    $regfile = "89c2051.dat"
    Config Scl = P3.0
    Config Sda = P3.1

    Reset Tcon.0
    Enable Interrupts
    Enable Int0
    On Int0 Odczyt

    Const Adresw = 160                                            'adres do zapisu układu 2404
    Const Adresr = 161

    Dim P As Bit , A As Byte , X As Byte , Y As Byte , I As Byte
    Dim Z(10) As Byte
    Kbdclk Alias P3.3
    Kbddta Alias P3.4

    A = 0
    I = 0
    Wait 1

    '---- Główna Pętla programu ----
    Do
      X = 0
      If Kbdclk = 0 Then X = 0

      Bitwait Kbdclk , Reset                                      'Oczekiwanie na znak od klawiatury.
      Bitwait Kbdclk , Set
      Bitwait Kbdclk , Reset
      If Kbddta = 1 Then Set X.0
      Bitwait Kbdclk , Set
      Bitwait Kbdclk , Reset
      If Kbddta = 1 Then Set X.1
      Bitwait Kbdclk , Set
      Bitwait Kbdclk , Reset
      If Kbddta = 1 Then Set X.2
      Bitwait Kbdclk , Set
      Bitwait Kbdclk , Reset
      If Kbddta = 1 Then Set X.3
      Bitwait Kbdclk , Set
      Bitwait Kbdclk , Reset
      If Kbddta = 1 Then Set X.4
      Bitwait Kbdclk , Set
      Bitwait Kbdclk , Reset
      If Kbddta = 1 Then Set X.5
      Bitwait Kbdclk , Set
      Bitwait Kbdclk , Reset
      If Kbddta = 1 Then Set X.6
      Bitwait Kbdclk , Set
      Bitwait Kbdclk , Reset
      If Kbddta = 1 Then Set X.7
      Bitwait Kbdclk , Set
      Bitwait Kbdclk , Reset
      If Kbddta = 1 Then Set P
      Bitwait Kbdclk , Set
      Bitwait Kbdclk , Reset
      Delay : Delay
      Gosub Savei2c
      Delay : Delay
    Loop
    '-------------------------------dane

    Odczyt:
    Wait 1
      X = &H23
      Gosub Przeslij
      X = &H1C
      Gosub Przeslij
      X = &H31
      Gosub Przeslij
      X = &H24
      Gosub Przeslij
      'Delay
    Wait 1
      Gosub Readi2c
      For I = 0 To 5
      X = Z(i)
      Gosub Przeslij
      Next I
      Delay
    Return


    Przeslij:                                                     'Podprogram przesylajacy kod komputerowi:
      A = 0                                                       '  Sprawdzanie parzystosci bajtu przesylanego
      If X.0 = 1 Then : A = A + 1 : End If                        '  co bedzie potrzebne w czasie transmisji.
      If X.1 = 1 Then : A = A + 1 : End If                        '  Sprawdzanie to polega na policzeniu ilosci
      If X.2 = 1 Then : A = A + 1 : End If                        '  "jedynek" w danym bajcie a nastepnie
      If X.3 = 1 Then : A = A + 1 : End If                        '  sprawdzeniu, czy dzielenie tej liczby jedynek
      If X.4 = 1 Then : A = A + 1 : End If                        '  przez 2 daje jakas reszte.
      If X.5 = 1 Then : A = A + 1 : End If
      If X.6 = 1 Then : A = A + 1 : End If
      If X.7 = 1 Then : A = A + 1 : End If
      A = A Mod 2
      If A = 0 Then : Set P : Else : Reset P : End If
      Kbddta = 0 : Delay : Kbdclk = 0 : Delay                     '  Przesylanie kodu komputerowi bit po bicie.
      Kbddta = X.0 : Kbdclk = 1 : Delay : Kbdclk = 0 : Delay
      Kbddta = X.1 : Kbdclk = 1 : Delay : Kbdclk = 0 : Delay
      Kbddta = X.2 : Kbdclk = 1 : Delay : Kbdclk = 0 : Delay
      Kbddta = X.3 : Kbdclk = 1 : Delay : Kbdclk = 0 : Delay
      Kbddta = X.4 : Kbdclk = 1 : Delay : Kbdclk = 0 : Delay
      Kbddta = X.5 : Kbdclk = 1 : Delay : Kbdclk = 0 : Delay
      Kbddta = X.6 : Kbdclk = 1 : Delay : Kbdclk = 0 : Delay
      Kbddta = X.7 : Kbdclk = 1 : Delay : Kbdclk = 0 : Delay
      Kbddta = P : Kbdclk = 1 : Delay : Kbdclk = 0 : Delay
      Kbddta = 1 : Kbdclk = 1 : Delay : Kbdclk = 0 : Delay : Kbdclk = 1       '  Koniec przesylania kodu.
    Return

    Readi2c:
      For I = 0 To 5
       I2cstart
       I2cwbyte Adresw
       I2cwbyte I
       I2cstart
       I2cwbyte Adresr
       I2crbyte Z(i) , Nack .
       I2cstop
       Incr I
      Next I
    Return

    Savei2c:
    If X <> &HF0 Then
      I2cstart
      I2cwbyte Adresw
      I2cwbyte I
      I2cwbyte X
      I2cstop
      Waitms 10
      Incr I
    End If
    Return


    Zapisuje do pamięci dane z klawiatury. Eeprom wygląda tak:
    &H1C &H1B &H23 &H2B &H34 - czyli nic innego jak 'asdfg'.
    Problem polega na tym. że nie wyświetla mi tych danych, pomimo tego, że ładuję je do tablicy (myślałem że to wina czasów odczytywania z eepromu wiec pierw zczytuje jego zawartość).

    Code:

    Odczyt:
    Wait 1
      X = &H23
      Gosub Przeslij
      X = &H1C
      Gosub Przeslij
      X = &H31
      Gosub Przeslij
      X = &H24
      Gosub Przeslij
      'Delay
    Wait 1
      Gosub Readi2c
      For I = 0 To 5
      X = Z(i)
      Gosub Przeslij
      Next I
      Delay
    Return

    Dziwne jest to, że te wartości, które sa wpisane na sztywno (dane &H23
    &H1C &H31 &H24) zostają poprawnie wyświetlone - ukazuje się na ekranie napis 'dane'.
    Ktoś ma jakiś pomysł w czym tkwi problem?

    Pozdrawiam.
    Robert.
    Darmowe szkolenie: Ethernet w przemyśle dziś i jutro. Zarejestruj się za darmo.
  • Poziom 30  
    Code:
    I2crbyte Z(i) , Nack 

    Wcześniej masz for i=0 to 5

    Nie wyrzuci ci takiego błedu ale zapis jest zly. W bascomie adresowanie tablicy zaczyna się od 1 (z(1) - to jest pierwszy element tablicy)

    Błąd wyświetla dopiero chyba bascom avr. Daj pętle przesuniętą o 1 i będzie dobrze. Ale uważaj - to przesuniecie (for i=1 to 6) może ci też pogmatwać inne rzeczy.

    A i jeszcze jedno:

    Code:
    incr i
    
    next i


    Po co dodatkowo zwiększasz I? Ma to jakis cel czy tylko błąd?
  • Poziom 12  
    Ok szymtro, to był mój babol, ale poprawiony program dalej nie działa jak należy, mało tego podpiąłem urządzenie pod inny komputer i okazuje się, że jakieś totalne głupoty zapisuje mi w eepromie, więc błąd mam już na starcie w procedurze odczytu i zapisu danych przechwyconych z klawiatury PC.
    Jakieś pomysły?


    Pozdrawiam.
    Robert.
  • Poziom 30  
    Mały uC ale pewnie starczy wyprowadzeń żeby podpiać lcd - będzie odrazu widać co się dzieje. Jak nie to może chociaż sprzętowy uart - tylko musiałbyś pamieć przypiąć pod inne wyprowadzenia.

    Code:
    Reset Tcon.0
    
    Enable Interrupts
    Enable Int0
    On Int0 Odczyt


    zapisz tak dla pewności:
    Code:
    On Int0 Odczyt
    
    Reset Tcon.0
    Enable Int0
    Enable Interrupts

    albo tak:
    Code:
    on int0 odczyt
    
    clr tcon.0 'przelacza przerwanie na niski poziom (nie zbocze)
    mov ie,#&b10000001 'zalacza przerwania i int0

    Swoją drogą to wyglada mi to na zbyt prosto napisane zeby działało pewnie ale skoro mówisz że działało do tej pory to pewnie może być.
    I co z tym niskim poziomem przerwania - napewno ma być na niski nie na zbocze?

    Szymek.