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

[BASCOM] [ATmega8] Obsługa przycisków

KD93 13 Lut 2009 15:46 8928 8
  • #1 6144669
    KD93
    Poziom 12  
    Witam

    Chciałem poćwiczyć obsługę przycisków, sprawdzanie stanów portów i wystawianie odpowiedniej odpowiedzi na wyświetlaczu LCD. W ramach ćwiczeń napisałem krótki program:

    $regfile = "m8def.dat"
    $crystal = 1000000
    
    Config Lcd = 16 * 2
    
    Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
    
    Deflcdchar 1 , 32 , 32 , 14 , 17 , 31 , 16 , 14 , 2         'ę
    Deflcdchar 2 , 2 , 4 , 14 , 16 , 14 , 1 , 30 , 32           'ś
    
    
    
    Config Pind.0 = Input
    Config Pind.1 = Input
    
    S1 Alias Pind.0
    S2 Alias Pind.1
    
    Set Portd.0
    Set Portd.1
    
    
    
    Cursor Off Noblink
    
    
    
    '-----------------------------------------------------------------'
    
    If S1 = 0 And S2 = 0 Then
       Waitms 25
          If S1 = 0 And S2 = 0 Then
    
    
    
          Cls
          Upperline
          Lcd "Wci" ; Chr(2) ; "ni" ; Chr(1) ; "ty"
          Lowerline
          Lcd "Sw1 + Sw2"
    
    End If
    End If
    
    
    
    If S1 = 1 And S2 = 0 Then
       Waitms 25
          If S1 = 1 And S2 = 0 Then
    
          Cls
          Upperline
          Lcd "Wci" ; Chr(2) ; "ni" ; Chr(1) ; "ty"
          Lowerline
          Lcd "Sw2"
    
    End If
    End If
    
    
    If S2 = 1 And S1 = 0 Then
       Waitms 25
          If S2 = 1 And S1 = 0 Then
    
          Cls
          Upperline
          Lcd "Wci" ; Chr(2) ; "ni" ; Chr(1) ; "ty"
          Lowerline
          Lcd "Sw1"
    
    End If
    End If
    
    
    
    If S1 = 1 And S2 = 1 Then
    
    Cls
    Locate 1 , 5
    Lcd "Wci" ; Chr(2) ; "nij"
    Locate 2 , 5
    Lcd "przycisk"
    End If
    



    Nie muszę chyba objaśniać poszczególnych linijek kodu, ponieważ program jak widać jest bardzo prosty.

    Wyświetlacz w celu zaoszczędzenia miejsca na płytce stykowej jest wlutowany w płytkę drukowaną z potencjometrem, gniazdem na zasilanie i rezystorem przy podświetleniu. Połączony jest z ATmegą 8 przewodem 6-żyłowym.

    Problem jest taki, że po zaprogramowaniu najpierw prawidłowo wyświetla się napis "Wciśnij przycisk", ale:
    - po wciśnięciu przycisku nr. 1 zamiast "Wciśnięty Sw1" wyświetla się "Wciśnięty Sw1nij",
    - po wciśnięciu przycisku nr. 2 zamiast "Wciśnięty Sw2" wyświetla się "Wciśnięty Sw2Sw1",
    - po wciśnięciu obydwóch przycisków zamiast "Wciśnięty Sw1 + Sw2" wyświetla się "Wciśnięty Sw1 + Sw2Sw2".

    Przyciski to microswitche, opóźnienie dla eliminacji drgań styków przeprowadzam za pomocą If...Then, ponieważ będzie mi to potrzebne do sterowania linefollowerem.

    Dodano po 2 [godziny] 38 [minuty]:

    P.S

    Trochę próbowałem się pobawić symulacją sprzętową i napewno jest to wina programu.
  • #2 6149732
    KD93
    Poziom 12  
    OK, już sobie poradziłem.

    Okazuje się, że program musi być w pętli Do...Loop, bo inaczej nie działa poprawnie.

    Ale jakby był ktoś w stanie mi wytłumaczyć dlaczego to byłoby super.
  • #3 6149896
    dawid512
    Poziom 32  
    Program wykona się tylko raz. Jeżeli naciśniesz odpowiedni przycisk i przytrzymasz go do momentu az uruchomisz uc to odpowiedni warunek zostanie sprawdzony i wykona się odpowiednia akcja
  • #4 6149905
    klops_mops
    Poziom 17  
    Dlatego, że program po zrestartowaniu procesora się wykona i koniec. Tzn. przeleci przez Twoje warunki, a Ty byś musiał w odpowiednim czasie wcisnąć przycisk. A tak pętla powoduje Ci ciągłe sprawdzanie czy przycisk jest wciśnięty. Przez co możesz kiedy chcesz nacisnąć przycisk i zostanie on wykryty, a tak to tylko podczas uruchamiania programu.

    Dzięki pętli program wykonuje Ci się od początku do końca, i tak w kółko. Pętla "do.. loop" będzie się wykonywać w nieskończoność...
  • #5 6149925
    wader_669
    Poziom 28  
    helpa nie masz!!!!!!!! to sciagnij !!!!!!!!!! RTFM
  • #6 6154263
    KD93
    Poziom 12  
    wader_669, mam helpa, mam książkę o programowaniu w BASCOMIE, a do budowy linefollowera zainspirował mnie Twój projekt i zrobiłem płytę główną wg Twojego schematu (mam nadzieję, że mnie nie pozwiesz za to do sądu, bo gdy go skończę, to nie zamierzam go pokazywać nigdzie indziej niż u mnie w szkole na technice).

    Tylko w takim razie, gdy program się "wykona", a ja nie nacisnę żadnego z przycisków, to uważam, że nie powinien reagować już na ich naciśnięcie.
    On jednak reagował niemalże prawidłowo, wyświetlał tylko nieodpowiednią treść na wyświetlaczu, stąd myślałem, że problem tkwi gdzie indziej.

    Poza tym, jak pewnie zauważyliście, druga wersja programu również nie działa prawidłowo, bo wyświetlacz bez przerwy się resetuje i nie nadąża z wyświetlaniem tekstu, już rozwiązałem ten problem, wstawiając do każdego warunku pętlę Do...Loop Until po komendzie CLS, dzięki czemu wyświetlacz resetuje się tylko raz na początku każdego warunku:

    If S1 = 0 And S2 = 0 Then
       Waitms 25
          If S1 = 0 And S2 = 0 Then
    
    
    
          Cls
          Do
          Upperline
          Lcd "Wci" ; Chr(2) ; "ni" ; Chr(1) ; "ty"
          Lowerline
          Lcd "Sw1 + Sw2"
          Loop Until S1 = 1 Or S2 = 1
    
    End If
    
    
    Elseif ...
  • #7 6154592
    wader_669
    Poziom 28  
    hahah nie no spoko jak najbradziej pokazuj. Robilem to jako poczatkujacy i jest tam pare wad w programie jak i schemacie ale mimo to dzialal dobrze. Podaj linka do teamtu to dokladnie ci powiem o co chodzi i poprawie bledy
  • #8 6154716
    KD93
    Poziom 12  
    Tu jest Twój robot.

    Z programem sobie poradzę, a jak miałeś jakieś wady w schemacie, to mi powiedz, bo bym musiał poprawić płytę główną :D Ale i tak mi nie wyszła (20 zwór, ale tak to jest, jak się robi ścieżki pisakiem...). Fajnie by było, jakbyś mi wysłał na priv swoje GG, to wrazie czego bym się Ciebie pytał :).
  • #9 6154768
    wader_669
    Poziom 28  
    duzo bym nie zmienil dodal jeszcze kondensatory 100nF do kazdego ukladu scalonego. Jedyne co to bym pozmienial wyjscia np. zostawil bym sobie wolne int1 przerwanie (ostatnio doswiadczylem jaka to cenna rzecz) gdybys chcial dodac odbiornik podczerwieni itp. zostawil bym wolne wyjscia pwm i 2 podlaczyl do mostka-h l293d co by pozwolilo ci jeszcze sterowac predkoscia silniczkow. Zalezy ile masz miejsca na plytce, bo ten kwarc 8mhz nie jest potrzebny. Moze jeszcze bym zostawil wyjscia rxd i txd wolne do uart.

    Ogolnie radze ci zmienic procek na atmega8 gdybys chcial dalej go rozbudowac, bo tutaj wielkich mozliwosci nie masz
REKLAMA