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.

[DSM-51] Problem z klawiatura sekwencyjna

domininLatex 20 Gru 2005 14:31 3072 8
  • #1 20 Gru 2005 14:31
    domininLatex
    Poziom 9  

    Witam, dopiero ucze sie programowania mikroprocesorow jednak juz na poczatku mam problem z klawiatura sekwencyjna, kiedy probuje korzystac z linii P3.5 otrzymuje komunikat bledu. Przedstawiam tutaj pelny kod zrodlowy zaczerpniety z ksiazki podst. progr. mikrokon. 8051:

    Code:

    LED EQU P1.7
    KEY EQU P3.5

    KEY_COD EQU 00001001B

    LJMP START
    ORG 100H

    START:

    MOV R0,#CSDS
    MOV A,#KEY_COD
    MOVX @R0,A

    LOOP:

    MOV C,KEY
    CPL C
    MOV LED,C

    SJMP LOOP


    Byłbym wdzieczny za pomoc, gdyz zatrzymalem sie i nie moge ruszyc dalej.
    Mam jeszcze taki przyklad i tutaj klawiatura dziala bezblednie:
    Code:


       LJMP   START
       ORG   100H

    START:
       LCALL   LCD_INIT
       MOV   R1, #1H
       MOV   R0, #CSDS
       
    LOOP:
       MOV   A, R1
       RR   A
       MOV   R1, A
       MOV   A, R1
       MOVX   @R0, A

       JNB   0B5H, LOOP

       LCALL   LCD_CLR
       MOV   A, R1
       MOV   R2, #00H

    LOOP2:
       INC   R2
       RRC   A
       JNC   LOOP2
       
       MOV   A, R2
       LCALL   WRITE_HEX

       LJMP   LOOP

    Jednak nie jestem w stanie ogarnac tego programu, jesli ktos by mial chwile na skomentowanie jak on dziala to tez bym byl wdzieczny. Najbardziej tajemnicze wydaja mi sie te wartosci hex bo to chyba wlasnie one odpowiadaja za sterowanie klawiaturka, nie wiem tez dokladnie jak dziala RRC, udalo mi sie znalezc taki opis tego polecenia Rotate Accumulator Right Through Carry ale nie wiem co to oznacza w praktyce. Pozdrawiam

    0 8
  • #2 20 Gru 2005 15:05
    genetix
    Poziom 24  

    Wartości HEX wyglądają na adresy - używane są w instrukcji MOVX @R0, A...

    Dodano po 11 [minuty]:

    RRC przesuwa wszystkie bity w akumulatorze w prawo. W miejsce MSB wstawiana jest zawartość flagi Carry, natomiast wysunięty bit z pozycji LSB trafia spowrotem do flagi Carry

    0
  • #3 20 Gru 2005 16:55
    domininLatex
    Poziom 9  

    A jak zainicjować klawiature sekwencyjna?

    0
  • #4 20 Gru 2005 17:33
    genetix
    Poziom 24  

    Wszystko zależy od konkretnego układu. Powinieneś oprzeć się na dokumentacji DSM-51, ewentualnie wyciągnąć fragmenty programu z innych przykładów. Niestety nie mam w tej chwili tej książki, żeby Ci napisać kod.

    0
  • Pomocny post
    #5 20 Gru 2005 18:44
    pepson
    Poziom 17  

    Jeżeli masz tę książkę z której zaczerpnięte są te przykłady, to jest tam dobrze opisane jak to działa.
    Pierwszy listing to bardzo prosty test wprowadzający w zagadnienie obsługi klawiatury sekwencyjnej. Nie robi nic konkretnego, tylko przy naciśnięciu klawisza enter lub esc powoduje zaświecenie diody LED.
    Ogólnie idea klawiatury sekwencyjnej polega na tym, żeby jak najmniejszą ilością linii obsłużyć jak największą ilość klawiszy.
    W tym przypadku na styki klawiszy podawane są sygnały z portu nazwijmy go wyjściowego, a drukie styki klawiszy są połączone razem i doprowadzone do linii portu P3.5 . Do odczytania, który klawisz jest wciśnięty musimy po kolei (sekwencyjnie) wystawiać na port wyjściowy określoną kombinację bitów (tak aby zawsze wysterować tylko jeden z klawiszy) i odczytując stan linii wejściowej możemy ustalić który klawisz w danej chwili jest wciśnięty

    Dodano po 41 [minuty]:

    LJMP START
    ORG 100H

    START:
    LCALL LCD_INIT ;inicjalizacja wyswietlacza LCD
    MOV R1, #1H ;w rejestrze pomocniczym ustawia najmłodszy bit
    MOV R0, #CSDS ;do drugiego rejestru wpisuje adres bufora klawiatury
    ;w systemie DSM51

    LOOP:
    MOV A, R1 ;przepisuje do akumulatora stan rejestru R1
    ;(na początku w R1 jest 1H czyli 00000001B)
    RR A ;przesuwa bity w akumulatorze w prawo
    ;(najmłodszy wchodzi w miejsce najstarszego)
    MOV R1, A ;przechowanie stanu akumulatora w rejestrze pomocniczym
    MOV A, R1 ;tu nie widzę sensu, bo w obu rejestrach jest to samo
    MOVX @R0, A ;wystawia bajt z akumulatora do bufora klawiatury
    ;który jest pod adresem wcześniej wpisanym do R0

    JNB 0B5H, LOOP ;testowanie linii wejściowej P3.5
    ;nie wiem dlaczego posłużono się adresem bitu P3.5
    ;można było prościej JNB P3.5, LOOP
    ;jeżeli bit(tu port P3.5) będzie w stanie niskim
    ;ciągle będzie wykonywany skok do początku pętli LOOP

    LCALL LCD_CLR ;czysczenie wyświetlacza LCD
    MOV A, R1 ;przepisuje bajt z R1 do akumulatora
    MOV R2, #00H ;zeruje bajt w rejestre R2
    ;(rejestr R2 będzie pełnił funkcję licznika)

    LOOP2: ;jeżeli program się tu znalazł to znaczy, że nacisnięto jakiś klawisz
    INC R2 ;zwiększa o 1 zawartość naszego licznika
    RRC A ;znowu przesuwa bity w akumulatorze (w prawo), ale teraz
    ;najmłodszy bit jest przeniesiony do znacznika C
    JNC LOOP2 ;tak długo skacze do LOOP2, aż znacznik (flaga,bit) C
    ;będzie w stanie niskim
    ;to był sposób na określenie, który bit w akumulatorze
    ;był ustawiony(czyli miał wartość 1)

    MOV A, R2 ;w R2 mamy zliczoną ilość obiegów petli LOOP2
    LCALL WRITE_HEX ;wyświetla na LCD stan licznika (naszego R2)
    ;tym samym wyświetla numer wciśniętego klawisza

    LJMP LOOP ;skacze do początku pętli głównej

    0
  • #6 20 Gru 2005 23:28
    domininLatex
    Poziom 9  

    Swietnie opisane, wielkie dzieki. Postaram sie z tym cos zwojowac.

    Cytat:
    JNB 0B5H, LOOP ;testowanie linii wejściowej P3.5
    ;nie wiem dlaczego posłużono się adresem bitu P3.5
    ;można było prościej JNB P3.5, LOOP

    P3.5 nie chcialo u mnie dzialac, moze dlatego zostal podany adres. Na tym polegal moj glowny problem, ze proba uzycia P3.5 skutkowala errorem i nie wiedzialem jak to obejsc. Jeszcze raz wielkie dzieki!

    0
  • #7 21 Gru 2005 13:20
    pepson
    Poziom 17  

    Cytat:
    1 0000: 02 01 00 LJMP START
    2 0100: ORG 100H
    3
    4 0100: START:
    5 0100: 12 81 08 LCALL LCD_INIT
    6 0103: 79 01 MOV R1, #1H
    7 0105: 78 30 MOV R0, #CSDS
    8
    9 0107: LOOP:
    10 0107: E9 MOV A, R1
    11 0108: 03 RR A
    12 0109: F9 MOV R1, A
    13 010A: E9 MOV A, R1
    14 010B: F2 MOVX @R0, A
    15
    16 010C: 30 B5 F8 JNB P3.5, LOOP
    17
    18 010F: 12 81 0C LCALL LCD_CLR
    19 0112: E9 MOV A, R1
    20 0113: 7A 00 MOV R2, #00H
    21
    22 0115: LOOP2:
    23 0115: 0A INC R2
    24 0116: 13 RRC A
    25 0117: 50 FC JNC LOOP2
    26
    27 0119: EA MOV A, R2
    28 011A: 12 81 04 LCALL WRITE_HEX
    29
    30 011D: 02 01 07 LJMP LOOP
    31

    Wszystko się kompiluje bez błędów nawet gdy użyjemy P3.5

    W pierwszym listingu też jest prawie wszystko ok
    jedynym błędem jest sposób zapisu
    trzeba trzymać się pewnych zasad:
    etykiety muszą zaczynać się od poczatku linii i być zakończone dwukropkiem
    natomiast (nazwijmy to polecenia) nie mogą zaczynać się od poczatku linii.
    Należy je poprzedzić minimum jedną spacją lub tabulatorem
    W pierwszym przykładzie wszystko jest pisane od początku linii
    i to powoduje lawinę komunikatów o błędach.

    0
  • #8 24 Gru 2005 19:31
    domininLatex
    Poziom 9  

    Probowalem podarzyc za twoja rada i zastosowalem wciecia pomimo to doswiadczam bledow, korzystam z jagody - moze ma jakiegos buga i to jest przyczyna moich niepowodzen.
    BTW Wesolych Swiat :D

    0
  • Pomocny post
    #9 26 Gru 2005 20:24
    mofo
    Poziom 10  

    domininLatex napisał:
    Probowalem podarzyc za twoja rada i zastosowalem wciecia pomimo to doswiadczam bledow, korzystam z jagody - moze ma jakiegos buga i to jest przyczyna moich niepowodzen.

    jest bug w Jagodzie, zamiat P3.5 uzyj T1 lub 0B5h

    KEY EQU T1

    0