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

[Bascom][ATMega8]Klawiatura matrycowa, przełączniki.

kRzaQ 28 Maj 2009 16:38 2285 2
REKLAMA
  • #1 6586076
    kRzaQ
    Poziom 11  
    Witam.

    Wiem, że temat był wielokrotnie wałkowany na forum, ale mimo przebrnięcia przez sporą ilość informacji jakoś nadal mam problem z poradzeniem sobie z moim przypadkiem.

    Buduję 'klawiaturę matrycową' ale nie na przyciskach, ale na przełącznikach, zatem program sterujący nie będzie miał rozpoznać naciśnięcia przełącznika, a stan wszystkich linii...

    
     
       ________/ ._______  A
      |
      |________/ ._______  B
      |
      |________/ ._______  C
      |
      |
      |
     KOL1
    
    
    


    I teraz może przedstawię jak ja to widzę i ktoś życzliwy wyprowadzi mnie z błędu :P

    Po skonfigurowaniu typu uC, kwarcu, ustawieniu KOL1 jako wej, ustawieniu linii portu podłączonego do A,B,C jako wyjścia i podciągnięciu wszystkiego do 1, konfiguracji timera i ustawienia przerwania od timera na podprogram do sprawdzania stanu linii sytuacja jest taka:

    ustawiam 0 na KOL1 (fizycznie kolumn jest 3, wierszy 3 na porcie D. wiec ustawiam port tak: portd=&b111111110)
    wszystko sobie niby działa, przy przełączeniu A, B lub C na KOL 1 zmienia się stan i zapala się diodka podłączona na drugim porcie, ALE przy przełączeniu drugiego przełącznika (czyli dwa są przełączone) diodka gaśnie...

    Nie wiem czy to jest problem tego że nie są to klawisze przełączniki tylko przełączniki przełączniki, ale strasznie zależy mi na tym, aby sprawdzać stany przy możliwych wielu kombinacjach przełączników...


    Z tego co załapałem jak to zrobić wynikało mniej więcej tyle, że

    Trzeba ustawić linie wejść i wyjść.
    trzeba ustawić stany wysokie na wyjściach
    Trzeba podciągnąć wejścia do rezystorów podciągających (czyli też ustawić 1)
    Potem żeby wybrać linię to takie wejście ustawić na 0 i sprawdzać czy przy przełączaniu stan na tym wejściu się zmienia.

    Gmatwa mi się już całkowicie czy np ustawianie set pind.0 czymś sie różni od portd.0 = 1 ? jest tu różnica? bo być może gdzieś tutaj robię błędy. [wiem ze przydałby się kod, ale mam go na drugim kompie wiec wstawię jak tylko będzie to możliwe], a tymczasem będę wdzięczny za jakieś rady....

    Pozdrawiam.

    Poprawiłem tytuł.
    [zumek]
  • REKLAMA
  • #2 6586128
    wdogli
    Poziom 18  
    Hej.
    Za bardzo nie kumam co to urządzenie ma robić.
    Poza tym napisz dokładnie gdzie masz podłączoną diodę. Czy ta dioda jest podłączona do linii ABC i KOL1 czy może jest zapalana z całkiem innego potu.
    Jeśli chodzi o samo badanie stanu na przełącznikach to ja linie A,B,C ustawił bym jako wejścia reagujące na stan wysoki. A KOL 1 ustawił bym jako wyjście w stanie wysokim. Diodę podłączył bym do innego portu mikrokontrolera i gdy mikrokontroler wykryje stan wysoki na którymś z wejść A,B,C (zwarcie przełącznika) mikrokontroler zapala diodę :)
  • #3 6586160
    kRzaQ
    Poziom 11  
    Faktycznie troche nieczytelnie to wszystko opisałem..

    Jeszcze raz.

    Robię tablicę z przełącznikami.
    Przełączniki te, będą mogły być ustawione w różnych konfiguracjach np. 2 na raz włączone w pierwszej kolumnie, jeden w drugiej i trzy w trzeciej.

    Aktualnie dla testów i napisania poprawnie mojego kodu podłączyłem tylko jedną kolumnę i 3 wiersze, ale gdzieś między zerami i jedynkami się gubię i mimo wszystko nie działa to tak jak chcę ;)

    aha.. dioda.. tak dioda jest na innym porcie. Ogólnie chodzi o to, zeby docelowo mikrokontroler wyświetlał mi na porcie C za pomocą diod które przełączniki są włączone, a już całkiem docelowo będzie to miało współpracować z USB i robić za dodatkowy kontroler gier ;) - zamiast kombinacji klawiaturowych.

    Tutaj jest jakis wczesniejszy kod ktory pisalem... moze na bazie tego ktoś wychwyci moj błędny tok rozumowania i sproboje pomóc

    
    $regfile = "m8def.dat"
    $crystal = 8000000
    
    Config Pind.0 = Input
    Config Pind.1 = Input
    'Config Pind.2 = Input
    
    Config Pind.3 = Output
    Config Pind.4 = Output
    Config Pind.5 = Output
    
    Config Portc = Output
           Portc = &B11111111
    
    Config Timer0 = Timer , Prescale = 1024
    On Timer0 Sprawdz
    
    Dim Przycisk As Byte
    
    Dim I As Byte
    
    L1 Alias Pind.0
    L2 Alias Pind.1
    L3 Alias Pind.2
    
    Sw1 Alias Portd.3
    Sw2 Alias Portd.4
    Sw3 Alias Portd.5
    
    Enable Interrupts
    Enable Timer0
    
    Load Timer0 , 200
    
    Set Portd.0
    Set Portd.1
    Set Portd.2
    
    Set Sw1
    Set Sw2
    Set Sw3
    
    Portc = &B11111111
    Do
       Portc = Przycisk
       Waitms 200
    Loop
    
    End
    
    Sprawdz:
    
            Reset Portd
            For I = 3 To 5
             Set Portd.i
             If Pind.0 = 1 Then
               Przycisk = &B11111110
             Else
               Przycisk = &B11111111
               Exit For
             End If
            Next I
    Return
    
REKLAMA