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

[ATMEGA 8] [BASCOM] problem z zapamietaniem stanow wejscia

Belialek 04 Maj 2009 17:26 2025 10
REKLAMA
  • #1 6488889
    Belialek
    Poziom 22  
    Witam,

    Natknąłem się na pewien problem, mianowicie chciałem w podprogramie monitorować stan wejść. Chodzi o to, że jeżeli wejście1 jest włączone, to na wyświetlaczu w pozycji 1,1 jest znak "*", jeżeli wejscie4 jest włączone, to na wyświetlaczu w pozycji 1,4 jest znak"*" itd., po ponownym podaniu napięcia na konkretne wejście, znaczek powinien zniknąć.

    Na razie stworzyłem coś takiego:

    
    K1 = 0 
    Do
       If wejscie1 = 1 Then
          If K1 = 0 Then
             Locate 1 , 1
             Lcd "*"
             K1 = 1
          End If
    
          If K1 = 1 Then
             Locate 1 , 1
             Lcd " "
             K1 = 0
          End If
       End If
    Loop
    


    co oczywiście nie ma prawa działać poprawnie, gdyż zmienna K1 jest za każdym przejściem pętli zmieniana... Z drugiej strony bez pętli użytkownik nie ma szans zareagować. Jakim poleceniem bascom'a powinienem się zainteresować aby program czekał na reakcje użytkownika nie zapętlając kodu?

    z góry dziękuje z pomoc i pozdrawiam!

    EDIT: chyba znalazłem rozwiązanie... Zrobiłem jeszcze jednego sub'a, w którym jest warunek wciśniecia przycisku - jeżeli jest spełniony wtedy jest przekierowanie do sub'a odpowiedzialnego już tylko za wyświetlanie.Jeżeli ktos zna lepszy/bardziej zoptymalizowany sposób to będę wdzięczny za porady :)
  • REKLAMA
  • #2 6489208
    piotr5000
    Poziom 21  
    A może tak:

    Do
    If wejscie1 = 1 Then
    Locate 1 , 1
    Lcd "*"
    else
    Locate 1 , 1
    Lcd " "
    End If
    Loop
  • REKLAMA
  • #3 6489230
    Belialek
    Poziom 22  
    no nie bardzo, po pierwszym przebiegu pętli przy naciśniętym przycisku wyświetli się gwiazdka, ale w momencie jak go puszczę to wartość wejscie1=0, a że pętla jest nieskończona więc wyświetli się puste pole.

    jednak mój najnowszy pomysł się nie sprawdza - raczej sprawdza sie TYLKO do 1 wejscia :(
  • #4 6489420
    piotr5000
    Poziom 21  
    Napisałeś że chcesz monitorować stan wejść . Co to za monitoring jeżeli zmiana stanu wejścia nie zmienia stanu wyświetlacza
  • #5 6489455
    Belialek
    Poziom 22  
    no właśnie ja chcę żeby wyświetlał na LCD...

    Nie wiem czy dobrze opisałem w pierwszym poście

    Na początku wszystkie wejścia są ustawione na 0, wiec LCD wygląda tak:

    _ _ _ _ _


    Wciskam przycisk2, po czym go zwalniam i LCD się zmienia na:

    _ * _ _ _


    Wciskam przycisk3, po czym go zwalniam i LCD się zmienia na:

    _ * * _ _

    Wciskam przycisk2, po czym go zwalniam i LCD się zmienia na:

    _ _ * _ _


    Do tego potrzebuję informacje o stanie całego układu (czyli które pola są wybrane) przekazać w postaci zmiennej. Parę lat temu w liceum nauczyciel pokazywał mi metodę przekazywania tego typu zmiennych poprzez liczby binarne, np ostatni stan wyświetlacza z przykładu byłby interpretowany jako 00100, tylko nie pamiętam co i jak... ;)
  • #6 6489783
    LED5W
    Poziom 34  
    Belialek napisał:
    Parę lat temu w liceum nauczyciel pokazywał mi metodę przekazywania tego typu zmiennych poprzez liczby binarne, np ostatni stan wyświetlacza z przykładu byłby interpretowany jako 00100, tylko nie pamiętam co i jak... ;)

    B100=4 ;)

    Ja bym to napisał tak (przyciski między pin a masę):
    Cls : Cursor Off
    Dim Stan As Byte , X As Byte , Blokada As Bit
    Portb = &B11111
    
    Do
    Home                                                        'kursor na początek
    For X = 0 To 4                                              'używamy 5 przycisków
       'obsługa przycisków
       If Blokada = 0 Then
       If Pinb.x = 0 Then Toggle Stan.x                         'sprawdzamy po jednym pinie
       Set Blokada                                              'trzymanie przycisku nie może powodować ciągłej zmiany stanu
       End If
       Waitms 20
       If Pinb = &B11111 Then Reset Blokada                     'zwolnij blokadę, gdy przycisk puszczony
    
       'wyświetlamy - również po jednym bicie
       If Stan.x = 1 Then
          Lcd "*"
       Else
          Lcd "-"
       End If
       Next
    Loop

    Dla innych pinów portu wystarczy zmienić wartości x dla pętli for. ;)
  • REKLAMA
  • #7 6489809
    piotr5000
    Poziom 21  
    K1=0
    Do
    If wejscie1 = 1 Then
      k1 = not k1
      Locate 1 , 8
      if k1 = 1 then
         Lcd "*"
      else
         Lcd " "
      End If
    end if
    Loop


    Gdy ustawisz wszystkie wartości to jeśli k0 = 1 to liczba = 1,
    jeśli k1 = 1 to liczba = liczba + 2 , itd 4, 8,16 32 ...

    Jeżeli przyciski podłączysz pod port A liczba przyjmie wartość portu A

    Liczba = PortA
  • REKLAMA
  • #8 6489933
    Belialek
    Poziom 22  
    LED5W napisał:

    B100=4 ;)


    tyle to wiem, tylko w tamtym przypadku to było zapisywanie konkretnych pozycji do tablicy, potem konwersja danych z tablicy do stringa, potem do binarki no i nie pamiętam jak to się robiło :)

    Co do kodu - póki co nie działa. Wyświetla się tylko na pierwszej pozycji wyświetlacza na zmianę znaki * oraz -. Całość nie reaguje na żadne wejścia (zmieniłem na potrzeby programu głownego "pinb" na "pind", gdyż w programie mam ustawiony caly port d na wejscie, a port b na wyjście - może to mieć jakieś znaczenie? To mój pierwszy kontakt z programowaniem AVR, wiec robiłem to "na czuja" :) póki wszystkie operacje z użyciem wejścia działały na moich ustawieniach więc nie ruszałem.

    Piotr5000 - już sprawdzam

    wiec tak, kod reaguje poprawnie na wciśniecie przycisku, ale na ponowne wciśniecie już nie... jeżeli przycisk nie jest wciśnięty, to w ogóle nie wchodzi do pętli w której jest wyświetlanie znaku.

    EDIT: sam algorytm otrzymałem w tym temacie:

    Link

    Ale jak to przełożyć na BASCOM'a pojęcia nie mam...
  • #9 6493822
    LED5W
    Poziom 34  
    Co do mojego kodu, to pisałem na szybko i wkradł się błąd.
    Poprawiony kod:
    Cls : Cursor Off
    Dim Stan As Byte , X As Byte , Blokada As Bit , Pomoc As Byte
    Portd = &B11111
    
    Do
    Home                                                        'kursor na początek
    For X = 0 To 4                                              'używamy 5 przycisków
       'obsługa przycisków
       If Blokada = 0 Then
          If Pind.x = 0 Then                                    'sprawdzamy po jednym pinie
             Toggle Stan.x
             Set Blokada                                           'trzymanie przycisku nie może powodować ciągłej zmiany stanu
             End If
          End If
       Waitms 20
       Pomoc = Pind And &B11111                                 'piny wejściowe
       If Pomoc = &B11111 Then Reset Blokada                    'zwolnij blokadę, gdy przyciski puszczone
    
       'wyświetlamy - również po jednym bicie
       If Stan.x = 1 Then
          Lcd "*"
       Else
          Lcd "-"
       End If
       Next
    Loop
  • #10 6494225
    Belialek
    Poziom 22  
    Teraz wyswietla dobrze, ale tylko przy 1 przebiegu petli, tj dalej nie reaguje na wejscia - przynajmniej w symulatorze...
  • #11 6494606
    LED5W
    Poziom 34  
    Mi działa dobrze. Na symulatorze ustaw ID0...4. Stan spoczynkowy to stan wysoki.
REKLAMA