Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

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

kRzaQ 28 May 2009 16:38 2225 2
  • #1
    kRzaQ
    Level 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...

    Code:

     
       ________/ ._______  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]
  • #2
    wdogli
    Level 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
    kRzaQ
    Level 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

    Code:

    $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