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

Dlaczego mój program w BASIC nie działa poprawnie? Logika warunków i porty

PM090383 20 Mar 2006 11:21 1100 9
REKLAMA
  • #1 2435828
    PM090383
    Poziom 12  
    Posty: 107
    Ocena: 6
    Napisałem taki programik że w zależności od podania 0 na 1 końcówkę wybrany zostaje program 1 zaś gdy na 1 i 2 końcówce jest 0 wtedy wybrany zostaje program 2 ,ale coś nie działa niebardzo łapę o co chodzi więc zwracam się o pomoc proszę o dokładne wytłumaczenie co napisałem nie tak i na jakiej zasadzie się to odbywa zamieszczem programik.

    Dim Program1 As Byte
    Dim Program2 As Byte

    Config Portd.1 = Input
    Config Portd.2 = Input

    Config Portb.1 = Output
    Config Portb.2 = Output

    Program1 = 0
    Program2 = 0

    Portb.1 = 0
    Portb.2 = 0

    Portd.1 = 1
    Portd.0 = 1


    If Portd.1 = 0 Then
    Program1 = 1

    End If

    If Portd.1 = 0 And Portd.2 = 0 Then
    Program2 = 1


    Program1:
    Portb.1 = 1
    Wait 1
    Portb.1 = 0
    Wait 1


    Program2:
    Portb.2 = 1
    Wait 2
    Portb.2 = 0
    Wait 2
  • REKLAMA
  • #2 2435924
    grzesio14
    Poziom 14  
    Posty: 138
    Widzę kilka poważnych błędów.

    Cytat:

    Dim Program1 As Byte
    Dim Program2 As Byte

    Config Portd.1 = Input
    Config Portd.2 = Input

    Config Portb.1 = Output
    Config Portb.2 = Output

    Program1 = 0
    Program2 = 0


    deklarujesz tutaj zmienne program1 oraz program 2
    prypisujesz im wartości 0.
    Wszystko jak najbardziej w porządku.
    Idzmy dalej.
    Cytat:

    If Portd.1 = 0 Then

    Program1 = 1

    End If

    If Portd.1 = 0 And Portd.2 = 0 Then
    Program2 = 1


    Rozpatrując program od początku nadal jest wszystko dobrze.
    Czyli w zależności od wciśniętych klawiszy ustawiana jest zmienna Program1 bądź też program2.
    Przechodzę teraz do 3 części programu.
    Tutaj jest błąd i wyjaśnię co jest nie tak.
    Dotyczy to 2 linii:
    Cytat:


    Program1:



    oraz

    Cytat:


    Program2:



    Zrobiłeś poważny błąd
    Na początku zdefiniowałeś Program1 oraz Program2 jako zmienne.
    Teraz używasz ich jako podprogramów a ściślej procedur.
    Tak nie można i jest zong.


    Jak sobie z tym poradzić.
    są 2 sposoby zobacz oba (można podać i więcej ale podam 2 proste)
    usunąć zmienne Program1 i program2. Dopisać warunki jeżeli programx ustawiony to skok do programx. Należy jeszcze zakończyć procedury poleceniem ret. - 1 sposób
    w zależności która zmienna Program1 czy Program2 jest ustawiona wykonać skok do procedury - tutaj zmienić nazwy dotychczasowych na inne następnie należy zmienić nazwy procedur - 2 sposób.
    to tyle z mojej strony jeśli ktoś coś jeszcze zobaczy niech napisze.
    Grzegorz.
  • #3 2435955
    Jaca
    Poziom 32  
    Posty: 1332
    Pomógł: 239
    Ocena: 217
    Kolejni użytkownicy używają Portx.y do odczytu wartości pinu a powinno być:

    Pinx.y

    Pozdrawiam...
  • REKLAMA
  • #4 2435957
    grzesio14
    Poziom 14  
    Posty: 138
    W obu przypadkach należy zadeklarować że mamy procedury ( 1 i 2 linia programu)

    Declare Sub Program1
    Declare Sub Program2

    config Portd.1 = Input
    Config Portd.2 = Input

    Config Portb.1 = Output
    Config Portb.2 = Output

    Portb.1 = 0
    Portb.2 = 0

    Portd.1 = 1
    Portd.0 = 1

    Do
    If Portd.1 = 0 Then
    Program1

    End If

    If Portd.1 = 0 And Portd.2 = 0 Then
    Program2
    End If
    Loop
    Program1:
    Portb.1 = 1
    Wait 1
    Portb.1 = 0
    Wait 1
    ret

    Program2:
    Portb.2 = 1
    Wait 2
    Portb.2 = 0
    Wait 2
    ret

    Dodano po 2 [minuty]:

    Cytat:


    Kolejni użytkownicy używają Portx.y do odczytu wartości pinu a powinno być:

    Pinx.y


    Tego nie zauważyłem.
  • #5 2435974
    Mirek D
    Poziom 15  
    Posty: 120
    Pomógł: 8
    Ocena: 12
    Instrukcja AND
    0 and 0 =0
    1 and 0 =0
    0 and 1 =0
    1 and 1 =1
    Lepsza byłaby instrukcja OR
    0 or 0 =1
    0 or 1 =0
    1 or 0 =0
    1 or 1 =0
    Wymaga to przebudowy instrukcji IF. A najlepiej zastosować
    IF ... THEN ... ELSE ... END IF
  • REKLAMA
  • #6 2435978
    Jaca
    Poziom 32  
    Posty: 1332
    Pomógł: 239
    Ocena: 217
    Zamiast Ret powinno być End Sub :)

    Pozdrawiam...
  • REKLAMA
  • #7 2435988
    john_t
    Poziom 29  
    Posty: 1070
    Pomógł: 127
    Ocena: 89
    Należy usunąć zmienne Program1 i Program2 są niepotrzebne.
    po zdaniu:
    If Portd.1 = 0 And Portd.2 = 0 Then
    Program2 = 1
    brak End If.
    Brak wskaźników zakończenia podprogramów (End Sub) w Program1. Program2.
  • #8 2435992
    grzesio14
    Poziom 14  
    Posty: 138
    pomyłka z mojej strony
    powinno być ret sub
    Wina z powdu zmiany języka programowania
    przesiadka z asemblera na Bascom.
  • #9 2436346
    PM090383
    Poziom 12  
    Posty: 107
    Ocena: 6
    Dzięki koledzy jeszcze tylko jedno pytanko czy te procedury mogę zastosowac jezeli tych podprogramów mam około 20 ?
  • #10 2436621
    M. S.
    Poziom 34  
    Posty: 2107
    Pomógł: 259
    Ocena: 680
    Trochę się tu namieszało więc pozwólcie, że poprostuje.
    Może trzeba tak:

    Config Portd.1 = Input: Portd.1 = 1
    Config Portd.2 = Input: Portd.2 = 1
    Config Portb.1 = Output: Portb.1 = 0
    Config Portb.2 = Output: Portb.2 = 0
    Do
    If Pind.1 = 0 and Pind.2 = 1  Then Gosub Program1
    If Pind.1 = 0 and Pind.2 = 0  Then Gosub Program2
    If ........................................  Then Gosub Programx
    Loop
    End
    
    Program1:
    .............. np Toggle Portb.1
    Return
    
    Program2:
    ............. np Toggle Portb.2
    Return
    
    Programx:
    .............
    Return


    Będzie to najprościej napisane.
    Dodatkowo jeżeli o wyborze podprogramu decydują dwa warunki (Pind.1 i Pind.2) to trzeba je sprawdzić jednocześnie. W proponowanych programach przy Pind.1 = 0 i Pind.2= 0 wykonają się kolejno po sobie oba podprogramy. Program1 bo Pind.1 = 0 i Program2 bo Pind.1 = 0 i Pind.2= 0
    Proponuję użycie Gosub (wywołanie podprogramu) a nie funkcji deklarowanej przez Sub zawsze gdy do podprogramu nie są przekazywane żadne parametry.

Podsumowanie tematu

✨ Problem dotyczy błędów w programie napisanym w BASIC (Bascom) do sterowania portami mikrokontrolera na podstawie stanów wejść Portd.1 i Portd.2. Główne błędy to: użycie zmiennych Program1 i Program2 zarówno jako zmiennych, jak i etykiet podprogramów, brak deklaracji procedur (Sub), nieprawidłowe odczytywanie stanów pinów (należy używać Pind.x zamiast Portd.x do odczytu), brak zakończenia podprogramów poleceniem End Sub lub Return, oraz błędna logika warunków IF, która powoduje wykonywanie obu programów zamiast wyboru jednego. Zalecane jest usunięcie zmiennych Program1 i Program2, deklaracja procedur za pomocą Declare Sub, stosowanie instrukcji Gosub do wywoływania podprogramów, poprawne sprawdzanie warunków wejściowych jednocześnie (np. If Pind.1=0 And Pind.2=0 Then Gosub Program2), oraz zakończenie podprogramów poleceniem Return lub End Sub. Wskazano także, że przy większej liczbie podprogramów (np. około 20) można stosować podobną strukturę z wywołaniami Gosub. Poprawiona struktura programu powinna zapewnić prawidłowe działanie logiki wyboru programów i sterowanie portami wyjściowymi Portb.1 i Portb.2.
REKLAMA