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] przyciski podłączone do portów (1 przycisk=2 porty)

Ficu 04 Wrz 2009 23:03 1948 8
REKLAMA
  • #1 6981267
    Ficu
    Poziom 31  
    Witam,
    chciałbym podłączyć joystick do atmegi. Problem polega na tym, że nie mogę podłączyć przycisków "normalnie" czyli do GND.
    Poniżej znajduje się rysunek, na zielono wyprowadzone linie do uC. Czerwony, żółty, brązowy, szary niebieski to połączenie jakie uzyskuje po wciśnięciu danego przycisku (jak dam do góry to zamyka się obwód zaznaczony na czerwono itp.)
    [BASCOM] przyciski podłączone do portów (1 przycisk=2 porty)

    Próbowałem pisać coś na zasadzie "jeżeli portx.x = 1 i portx.y = 1 to przycisk 1" ale bez sukcesów.

    Jak osiągnąć, to co chcę?
  • REKLAMA
  • #2 6981372
    Karol966
    Poziom 31  
    Nic z tego rysunku w paincie nie rozumiem ale jeśli dobrze rozumiem z wypowiedzi masz problem z warunkami. To co próbowałeś mus działać - miewałem czasami problemy z tego typu warunkami ale zawsze znalazł się w takich sytuacjach jakiś błąd. Sprawdź jeszcze raz dokładnie, może nie te piny sprawdzasz...
  • REKLAMA
  • #3 6981423
    manekinen
    Poziom 29  
    Czemu nie możesz do masy? Wg tego co narysowałeś wynika, że jedynym sposobem jest ściągnięcie dwóch pinów w dół jako wyjście a pozostałe dwa jako wejścia podciągnięte w górę. W taki sposób możesz wykrywać naciśnięcia joystika, ale te dwa piny jak by nie patrzeć będą masą.

    No, chyba że chodzi ci o to żeby emulować joystik atmegą, to pozostają chyba transoptory. Chyba że chodzi o jeszcze coś innego... może wyjaśnij jak to ma działać?
  • Pomocny post
    #4 6981641
    kordirko
    Poziom 22  
    Z przyciskiem żółtym nie ma problemu - jeden pin do masy, a drugi do procka i załatwione (jak przyciśnięty to zwarty do masy).

    A z pozostałymi robisz tak ...

    najpierw rysunek:
    [BASCOM] przyciski podłączone do portów (1 przycisk=2 porty)

    Dwa piny procka podłączasz do punktów A i B - to będą "wyjścia".
    Dwa piny procka podłączasz do X i Y - to będą "wejścia".
    Krok T1: podajesz 1-kę na wyjście A (na B dajesz 0) - i czytasz piny X i Y.
    Krok T2: podajesz 1-kę na wyjście B (na A dajesz 0) - i czytasz piny X i Y.

    Dekodowanie - patrzysz do tabelek poniżej i odczytujesz który przycisk jest załączony:
    [BASCOM] przyciski podłączone do portów (1 przycisk=2 porty)
    Tabelki są zrobione wg schematu - przykładowo jak zwarty jest przycisk czerwony,
    to jak na A podasz 1-kę (na B-0), to na Y dostaniesz 1-kę (bo A-Y sa zwarte), a na X będzie 0 (bo między A-X jest przerwa),
    natomiast jak na B podasz jedynkę, to X i Y będą 0 (bo czerwony nie styka B do żadnego pinu).
    Z tabelek widać wyraźnie:
    w kroku T1: czerwony = Y, szary = X
    w kroku T2: niebieski = Y, brązowy = X

    ps. na zarzut "to nie zadziała bo jak będą zwarte na raz czerwony, brązowy i niebieski,
    to z tabelek wynika że zwarty jest szary" .....
    jest prosta odpowiedź: w dżojstiku mogą być zwarte na raz tylko 2 sąsiednie piny ;)
  • REKLAMA
  • #5 6982159
    Ficu
    Poziom 31  
    Dzięki za pomoc :!:

    Napisałem coś takiego, ale zmienna przycisk ciągle wynosi 3 (bez podłączonego joy też 3):
    $regfile = "m32def.dat"
    
    $crystal = 8000000
    
    $baud = 9600
    
    Config Pina.0 = Input
    Config Pina.1 = Input
    Config Pina.2 = Output
    Config Pina.3 = Output
    
    Config Timer0 = Timer , Prescale = 1024
    
    On Timer0 Mult_kl
    
    Dim Temp1 As Byte
    Dim Temp2 As Byte
    Dim Przycisk As Byte
    
    Dim I As Byte
    
    A Alias Porta.0
    B Alias Porta.1
    
    T1 Alias Porta.2
    T2 Alias Porta.3
    
    Enable Interrupts
    Enable Timer0
    
    Load Timer0 , 200
    
    
    Set Porta.2
    Set Porta.3
    
    Set T1
    Set T1
    
    Do
       Print Przycisk
       Waitms 100
    Loop
    End
    
    Mult_kl:
    Load Timer0 , 200
    
       For I = 1 To 2
          If I = 1 Then
             Reset T1
          Else
             Set T1
             Reset T2
          End If
    
          If A = 0 Or B = 0 Then
             Temp1 = Pinb And &B00000011
    
             Exit For
          Else
             Temp1 = 0
          End If
    
       Next I
          If Temp2 = Temp1 Then
             Przycisk = Temp1
             If I = 2 Then
                Przycisk = Przycisk + 2
             End If
          Else
             Temp2 = Temp1
          End If
    
          Set T1
          Set T2
    Return
    
    
    
    
  • Pomocny post
    #6 6982976
    LED5W
    Poziom 34  
    kordirko napisał:
    Tabelki są zrobione wg schematu - przykładowo jak zwarty jest przycisk czerwony,
    to jak na A podasz 1-kę (na B-0), to na Y dostaniesz 1-kę (bo A-Y sa zwarte), a na X będzie 0 (bo między A-X jest przerwa),
    natomiast jak na B podasz jedynkę, to X i Y będą 0 (bo czerwony nie styka B do żadnego pinu).
    A mi się wydaje, że będzie stan nieustalony.;)

    Ja bym zrobił to tak:
    1. A i B jako wyjście (stan niski), X i Y podciągnięcie. Jeżeli na X i/lub Y pojawi się stan niski to:
    2. X i Y jako wyjście (stan niski), A i B podciągnięcie. Jeżeli w 1 stan niski pojawił się na X, to teraz stan niski będzie na:
    A - szary przycisk,
    B - brązowy.

    Dodano po 47 [minuty]:

    Coś takiego:
    '1
    Config Portb.0 = Output
    Config Portb.1 = Output
    Portb.2 = 1
    Portb.3 = 1
    
    If Pinb.2 = 0 Then
       Przycisk = 1
       End If
    If Pinb.3 = 0 Then
       Przycisk = 2
       End If
    
    '2
    If Pinb.2 = 0 Or Pinb.3 = 0 Then
          Portb.2 = 0
          Portb.3 = 0
          Config Portb.0 = Input
          Config Portb.1 = Input
          Config Portb.2 = Output
          Config Portb.3 = Output
          Portb.0 = 1
          Portb.1 = 1
    
          Przycisk.2 = Pinb.0
          Przycisk.3 = Pinb.1
    
          Portb.0 = 0
          Portb.1 = 0
          Config Portb.2 = Input
          Config Portb.3 = Input
       Else
          Przycisk = 0
       End If


    Dodano po 17 [minuty]:

    A co do twojego kodu to ja go nie rozumiem. Najpierw dajesz alias
    A Alias Porta.0 
    B Alias Porta.1 
    
    T1 Alias Porta.2 
    T2 Alias Porta.3

    a potem robisz takie coś:
    Set Porta.2 
    Set Porta.3 
    
    Set T1 
    Set T1

    Czyli dwa razy to samo (rozumiem, że 2x Set T1 to pomyłka).

    Albo to:
    If A = 0 Or B = 0 Then 
             Temp1 = Pinb And &B00000011

    To się zawsze wykona, bo nigdzie nie zmieniasz stanu A(Porta.0) i B(Porta.1).
  • #7 6983541
    Ficu
    Poziom 31  
    LED5W
    sprawdziłem twój pomysł, pozmieniałem tylko porty i otrzymuje różne liczby, bez zasady.
    Aktualnie pracuje na mega8 przyciski: portc.0 - X, portc.1 - Y, portc.2 - A, portc.3 -B.
  • Pomocny post
    #8 6984071
    LED5W
    Poziom 34  
    Ficu napisał:
    LED5W
    sprawdziłem twój pomysł, pozmieniałem tylko porty i otrzymuje różne liczby, bez zasady.

    Czyli wg. Ciebie napisałem generator liczb losowych? :P

    Zawsze jest jakaś zasada. ;) Kod jest poprawny.
    Jak się zachowuje układ? Czy przycisk=0, gdy żaden przycisk nie jest naciśnięty? Czy sprawdzasz zmienną tak jak poprzednio (print)? Zmienna może być odczytana dopiero po zakończeniu tego fragmentu kodu.
  • REKLAMA
  • #9 6985158
    Ficu
    Poziom 31  
    Przylutowałem inaczej joystick i działa!
    Wielkie dzięki.
REKLAMA