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] Jak napisać warunek if dla czterobitowego sygnału w BASCOM?

tumeks 10 Wrz 2010 20:59 3253 41
Najlepsze odpowiedzi

Jak w BASCOM sprawdzić czterobitowy sygnał na wejściach i wykonać akcję dla konkretnej kombinacji bitów?

Najprościej wczytaj stan wejść do zmiennej typu Byte, zmaskuj tylko 4 młodsze bity i sprawdzaj je przez `Select Case` dla wartości 0..15 [#8497607][#8497619] W BASCOM zamiast `0x0F` użyj `15` albo `&H0F`, np. `Stan = PinB And &H0F` [#8497978][#8497619] Jeśli przełączniki są podłączone do masy, odczyt trzeba odwrócić: `Stan = Not PinB` i potem jeszcze `Stan = Stan And &H00001111` [#8498108] Do odczytu stanu używaj `PinB`, a nie `PortB`, bo `Port` służy do wyjść i ustawiania poziomu/pull-upów [#8497619][#8497879] Potem robisz np. `Select Case Stan` i w `Case 8`, `Case 1` itd. wywołujesz odpowiednie instrukcje [#8497607]
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA
  • #1 8497429
    tumeks
    Poziom 17  
    Posty: 306
    Pomógł: 7
    Ocena: 12
    Witam serdecznie, potrzebuję pomocy przy napisaniu warunku, na port ma wpadać czterobitowy sygnał (załóżmy, że na portb.0..portb.3) jak stworzyć warunek if..bla bla bla then?

    Wpada sygnał np. 1000 - jeżeli wpadnie ten sygnał na te piny ma mikrokonroler wykonać czynność ( to już nie ważne :D )

    ma ktoś jakieś pomysły? jest to kod szesnastkowy max 16 kombinacji

    pozdro
  • REKLAMA
  • Pomocny post
    #2 8497469
    tadzik85
    Poziom 38  
    Posty: 3404
    Pomógł: 415
    Ocena: 16
    A o funkcjach logicznych słyszałeś? wystarczy and z wartością 0x0F.
  • #3 8497479
    electro_Nick
    Poziom 33  
    Posty: 1721
    Pomógł: 218
    Ocena: 203
    Zapisujesz stan portu do zmiennej byte i jeśli to 4 bity to uzyskujesz liczbę od zera do 15, później rozkaz case i po kolei dla każdej kombinacji. Moze mało stylowe, ale skuteczne. Wykorzystałem to do obsługi timera i sczytywał z dip-switchy .
  • #4 8497494
    tumeks
    Poziom 17  
    Posty: 306
    Pomógł: 7
    Ocena: 12
    Ok podoba mi się to a mógłbyś zasymulować fragment takiego programu? ja zmienie pod swoje wymagania.

    Dodano po 4 [minuty]:

    a jeżeli jeszcze tak spytam to może być coś takiego?
    szesnastkowo
    if portb = 1 then ...
    if portb = 2 then ...
    if portb = 3 then ...
    if portb = 4 then ...
    if portb = 5 then ...
    if portb = 6 then ...
    if portb = 7 then ...
    if portb = 8 then ...
    if portb = 9 then ...
    if portb = 10 then ...
    if portb = A then ...
    if portb = B then ...
    if portb = C then ...
    if portb = D then ...
    if portb = E then ...
    if portb = F then ...

    czy coś w tym stylu zda egzamin?

    nie śmiejcie się, jeszcze słaby jestem z bascoma :D
  • Pomocny post
    #5 8497590
    electro_Nick
    Poziom 33  
    Posty: 1721
    Pomógł: 218
    Ocena: 203
    Proponuje jednak port jako zmienna i wtedy case. Przyklad ode mnie
    If Pinb.7 = 0 Then                                          
    Jedynkaczas = 1 
    Else Jedynkaczas = 0 
    End If
    If Pinb.6 = 0 Then
    Dwojkaczas = 2
    Else
    Dwojkaczas = 0
    End If                'Sczytywanie stanów logicznych wyprowadzeń 
    If Pinb.5 = 0 Then        'z DIP-Switcha od ustawień czasu
    Czworkaczas = 4
    Else
    Czworkaczas = 0
    End If
    If Pinb.4 = 0 Then
    Osemkaczas = 8
    Else
    Osemkaczas = 0
    End If
    Czaspomoc = Jedynkaczas + Dwojkaczas 
    Czaspomocdwa = Czworkaczas + Osemkaczas  'sumowanie i konwersja 
    Czaszczytany = Czaspomoc + Czaspomocdwa
    If Pinb.3 = 0 Then              
    Jedynkatryb = 1 
    Else
    Jedynkatryb = 0
    End If
    If Pinb.2 = 0 Then
    Dwojkatryb = 2
    Else
    Dwojkatryb = 0
    End If
    If Pinb.1 = 0 Then        'Sczytywanie stanów logicznych wyprowadzeń
    Czworkatryb = 4            'z DIP-Switcha od ustawień trybu
    Else
    Czworkatryb = 0
    End If
    If Pinb.0 = 0 Then
    Osemkatryb = 8
    Else
    Osemkatryb = 0
    End If
    
    8.2 Struktura programu
    
    Trybpomoc = Jedynkatryb + Dwojkatryb 
    Trybpomocdwa = Czworkatryb + Osemkatryb          'sumowanie i konwersja           
    Tryb = Trybpomoc + Trybpomocdwa 
    Debounce Pind.6 , 0 , Wlaczanie , Sub    'po naciśnięciu przycisku...
    Loop
    End                    'koniec pętli
    
    Wlaczanie:                    'wybór czasu w
    Select Case Czaszczytany        'zależności od ustawień na DIP-Switchu 
    Case 0:
    Czas = 5                                                    '5 sekund
    Case 1:
    Czas = 10                                                   '10 sekund
    Case 2:
    Czas = 20                                                   '20 sekund
    Case 3:
    Czas = 30                                                   '30 sekund
    Case 4:
    Czas = 60                                                   '60 sekund
    
  • #7 8497617
    tumeks
    Poziom 17  
    Posty: 306
    Pomógł: 7
    Ocena: 12
    O kurczę, to mi teraz zajechałeś czarną magią, a to co wyżej napisałem da rade? bo w sumie jak bedzię zczytywać z portu od 0 do F to będzie wykorzystywał jedynie cztery najmniejsze bity portu (pierwsze cztery) tylko nie wiem czy dobrze zapisałem, a jakbym twojego użył, to nie wiem czy starczy mi pamięci na resztę programu która chce zrealizować.
  • Pomocny post
    #8 8497619
    landy13
    Poziom 31  
    Posty: 1418
    Pomógł: 195
    Ocena: 260
    tumeks napisał:

    czy coś w tym stylu zda egzamin?

    Nie zda.
    Nie Port tylko Pin.
    No i zastosuj maskowanie niepotrzebnych bitów jak radził tadzik85.
    Czyli:
    If (PINB And 0x0F) Then 
  • REKLAMA
  • #9 8497631
    tumeks
    Poziom 17  
    Posty: 306
    Pomógł: 7
    Ocena: 12
    To jakby to wyglądało? można jakiś przykład?
  • #10 8497640
    tadzik85
    Poziom 38  
    Posty: 3404
    Pomógł: 415
    Ocena: 16
    Jeśli masz wiele warunków dla stanu tego portu lepiej przepisać do zmiennej i zmasować starsze bity i dopiero sprawdzać stan zmiennej. Wielkość kodu? Tylko kilka dodatkowych bajtów.

    chcesz 4 młodsze bity?

    przykład
    
    zmienna = pinb and 0x0F
    Select zmienna 
    Case 0:
    ' dla wartości 0
    Case 1:
    ' dla wartości 1
    Case 2:
    ' dla wartości 2
    Case 3:
    
    Case 4:
     
  • #11 8497660
    tumeks
    Poziom 17  
    Posty: 306
    Pomógł: 7
    Ocena: 12
    Ok, zrobię z ta zmienną i co dalej?

    if zmienna = 1 then
    itd
    ??
    A co robi rozkaz case? przepraszam, ale nigdy go nie używałem.
  • #12 8497682
    tadzik85
    Poziom 38  
    Posty: 3404
    Pomógł: 415
    Ocena: 16
    select case to uproszczenie wielu warunków dla jednej zmiennej. HELP bascoma zalecam. Po polsku jest nawet dostępny.
  • REKLAMA
  • #13 8497685
    xury
    Specjalista automatyka domowa
    Posty: 7083
    Pomógł: 878
    Ocena: 1497
    Masz kolego helpa w Bascomie. Ponadto pan Zbigniew Gibek napisał helpa po polsku i jest on dostępny na stronie domowej Bascoma. Co prawda znikoma część się zdezaktulizowała, ale większość jest nadal aktualna.
  • Pomocny post
    #14 8497700
    ociz
    VIP Zasłużony dla elektroda
    Posty: 15844
    Pomógł: 1379
    Ocena: 3484
    Ja mam coś takiego u siebie, tylko to nie wszystkie kombinacje bo będzie ich 36, z 6 wejść.
    Dim Stan_portu As Byte
    Stan_portu = Portd
    
    Do
      If Stan_portu <> Portd Then
        Stan_portu = Portd
        Select Case Portd
          Case 128:
            instrukcje...
          Case 192:
            instrukcje...
          Case 224:
            instrukcje...
          Case 240:
            instrukcje...
          Case 248:
            instrukcje...
        End Select
      End If
    Loop
  • #15 8497797
    tumeks
    Poziom 17  
    Posty: 306
    Pomógł: 7
    Ocena: 12
    Wklepałem taki kod
    $regfile = "m8def.dat"                                      'proc
    $crystal = 16000000                                         'zegar
    Config Portb = Input
    Config Pinc.0 = Output
    Config Pinc.0 = 0                                           'led testowy
    
    Dim Stan As Byte
    Stan_portu Alias Portb
    
    Stan_portu = Portb                                          
    
    
    Do                                                          
    If Stan_portu <> Portb Then
        Stan_portu = Portb
        Select Case Portb
        Case 0:
        Case 1:
        Set Pinc.0
        Wait 5
        Reset Pinc.0
        Case 2:
        Case 3:
        Case 4:
        End Select
        End If
        Loop
        End
    

    i brak reakcji na uSwitche, gdzie błąd?
  • #16 8497814
    ociz
    VIP Zasłużony dla elektroda
    Posty: 15844
    Pomógł: 1379
    Ocena: 3484
    Stan_portu Alias Portb
    To ma być oddzielna zmienna dla porównania czy stan portu się zmienił.
  • #17 8497819
    tumeks
    Poziom 17  
    Posty: 306
    Pomógł: 7
    Ocena: 12
    Jak wymazuję tą linjikę z aliasem to program nie chce sie kompilować.
  • #19 8497827
    landy13
    Poziom 31  
    Posty: 1418
    Pomógł: 195
    Ocena: 260
    Ile razy trzeba powtarzać?
    landy13 napisał:

    Nie Port tylko Pin.
  • #20 8497833
    tumeks
    Poziom 17  
    Posty: 306
    Pomógł: 7
    Ocena: 12
    Zmieniłem wszędzie gdzie pisało portb na pinb i nie chce sie kompilować
  • #22 8497868
    tumeks
    Poziom 17  
    Posty: 306
    Pomógł: 7
    Ocena: 12
    Mógłbyś mi to przedstawić?
  • REKLAMA
  • #23 8497879
    Jaca
    Poziom 32  
    Posty: 1332
    Pomógł: 239
    Ocena: 217
    Jeśli "noga" procesora ustawiona jest jako wejście to stan logiczny na tym wejściu odczytujesz za pomocą PinX.y. Jeśli jako wyjście to stan logiczny na wyjściu ustawiasz za pomocą PortX.y. Dodatkowo, gdy "noga" procesora jest jako wejście to za pomocą PortX.y włączasz lub wyłączasz wewnętrzne podciąganie wejścia poprzez wbudowany rezystor do VCC.
  • #24 8497894
    ociz
    VIP Zasłużony dla elektroda
    Posty: 15844
    Pomógł: 1379
    Ocena: 3484
    Jeszcze tu
    Cytat:
    Dim Stan As Byte

    Ja wcześniej źle napisałem a Ty to skopiowałeś. :D
  • #25 8497921
    tumeks
    Poziom 17  
    Posty: 306
    Pomógł: 7
    Ocena: 12
    Zmieniłem na
    $regfile = "m8def.dat"                                      'proc
    $crystal = 16000000                                         'zegar
    Config Pinb.0 = Input
    Config Pinb.1 = Input
    Config Pinb.2 = Input
    Config Pinb.3 = Input
    Config Portc.0 = Output
    Config Portc.0 = 0                                          'led testowy
    
    Dim Stan_portu As Byte
    Stan_portu = Pinb                                           'portb jako stan
    
    
    Do                                                          'petla
    If Stan_portu <> Pinb Then
        Stan_portu = Pinb
        Select Case Pinb
        Case 0:
        Case 1:
        Set Portc.0
        Wait 5
        Reset Portc.0
        Case 2:
        Case 3:
        Case 4:
        End Select
        End If
        Loop
        End


    brak reakcji - poddaję się :cry:
  • #26 8497931
    tadzik85
    Poziom 38  
    Posty: 3404
    Pomógł: 415
    Ocena: 16
    Ociz namieszał, że hoho.
  • #27 8497936
    tumeks
    Poziom 17  
    Posty: 306
    Pomógł: 7
    Ocena: 12
    Microswitche
  • #28 8497945
    tadzik85
    Poziom 38  
    Posty: 3404
    Pomógł: 415
    Ocena: 16
    $regfile = "m8def.dat"                                      'proc
    $crystal = 16000000                                         'zegar
    Config Pinb.0 = Input
    Config Pinb.1 = Input
    Config Pinb.2 = Input
    Config Pinb.3 = Input
    Config Portc.0 = Output
    Config Portc.0 = 0                                          'led testowy
    
    Dim Stan_portu As Byte
    Dim cosik As Byte
    Stan_portu = Pinb                                           'portb jako stan
    
    
    Do                                                          'petla
    If Stan_portu <> Pinb Then
        Stan_portu = Pinb
        cosik= Stan_portu and 0x0F
        Select Case cosik
        Case 0:
        Case 1:
        Set Portc.0
        Wait 5
        Reset Portc.0
        Case 2:
        Case 3:
        Case 4:
        End Select
        End If
        Loop
        End


    teraz będzie dużo lepiej

    Dodano po 25 [sekundy]:

    Podciągnięcie do VCC jest?
  • #30 8497969
    Jaca
    Poziom 32  
    Posty: 1332
    Pomógł: 239
    Ocena: 217
    $regfile = "m8def.dat"                                      'proc
    $crystal = 16000000                                         'zegar
    
    Ddrb = &B11110000
    Portb = &B00001111
    Ddrc = &B11111111
    Portc = &B00000000
    
    Dim Stan_portu As Byte
    
    Do                                                          'petla
       Stan_portu = Pinb And &B00001111                         'portb jako stan
       Select Case Stan_portu
          Case 0:
          Case 1:
             Portc.0 = 1
             Wait 5
             Portc.0 = 0
          Case 2:
          Case 3:
          Case 4:
       End Select
    Loop
    End

Podsumowanie tematu

✨ W dyskusji poruszono problem napisania warunku if dla czterobitowego sygnału w BASCOM, który ma być odczytywany z portu B (portb.0..portb.3). Użytkownicy sugerowali różne podejścia, w tym użycie funkcji logicznych oraz maskowanie bitów. Proponowano zapisanie stanu portu do zmiennej typu byte, a następnie wykorzystanie instrukcji case do obsługi różnych kombinacji sygnałów. Wskazano również na konieczność użycia PinB zamiast PortB oraz na znaczenie podciągania do VCC lub GND w kontekście podłączania switchy. Użytkownik ostatecznie uzyskał działający kod po zastosowaniu wskazówek dotyczących maskowania i poprawnego odczytu stanu portu.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA