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]Kłopoty z instrukcją If Then

marek19951 07 Sty 2010 15:04 3385 18
REKLAMA
  • #1 7498960
    marek19951
    Poziom 16  
    Witam,

    Zaczynam naukę BASCOM'a, uczę się go głównie po to, aby stworzyć urządzenie, które będzie sterować podajnikiem do pieca oraz wentylatorem.
    Napisałem sobie pewien programik, bardzo łatwy, zaledwie Do:Loop i kilka zmiennych, wszystko ładnie się kompiluje, więc postanowiłem go trochę udoskonalić poprzez instrukcję If Then, ale niestety tu już zaczęły się schody.

    Proszę nie zwracać uwagi na wyrażenie po If, bo jeszcze nie wiem w jaki sposób zapisywać odczytaną temperaturę z czujnika, który będzie podłączony, ale to już kwestia doczytania co zrobię później na razie chcę się dowiedzieć czemu ten kod wywala mi błędy.

    Program:
    $regfile = "2313def.dat"                                    'program jest pisany na procesor attinny2313
    $crystal = 4000000                                          'procesor będzie pracował z kwarcem bądź na wewnętrznym oscylatorze 4Mhz
    
    Config Portb = Input                                        'port b  jako wejścia
           Portb = &B00000000                                   'wszędzie stan spoczynkowy-0
    Config Portd = Output                                       'port d jako wyjścia
           Portd = &B0000000                                    'wszędzie stan spoczynkowy-0
    
    
       Do
    
           If Pinb.0 =< 30 Then                                 'jeżeli temperatura jest mniejsza niż 30'C
    
           Portd.0 = 1                                          'włącz podajnik
           Portd.1 = 1                                          'włącz wentylator
           Wait 300                                             'czekaj 5 minut
           Portd.0 = 0                                          'wyłącz podajnik
           Wait 120                                             'czekaj 2 minuty
           Portd.1 = 0                                          'wyłącz wentylator
    
           Elseif Pinb.0 => 30 < 50                             'jeżeli temperatura wynosi 30-50'C
           Portd.0 = 1                                          'włącz podajnik
           Portd.1 = 1                                          ' włącz wentylator
           Wait 360                                             'czekaj 6 minut
           Portd.0 = 0                                          'wyłącz podajnik
           Wait 60                                              'czekaj 60 sekund
           Portd.1 = 0                                          'wyłącz wentylator
    
           Elseif Pinb.0 => 50 < 70
           Portd.0 = 1                                          'włącz podajnik
           Portd.1 = 1                                          'włącz wentylator
           Wait 480                                             'czekaj 8 minut
           Portd.0 = 0                                          'wyłącz podajnik
           Portd.1 = 0                                          'wyłącz wentylator
           Wait 300                                             'czekaj 5 minut
           Portd.1 = 1                                          'włącz wentylator
           Wait 120                                             'czekaj 2 minuty
           Portd.1 = 0                                          'wyłącz wentylator
    
           End If
    
       Loop
    
    
    End[/quote]
    [quote]
    Error : 36    Line :   21    THEN expected  , in File 
    Error : 36    Line :   29    THEN expected  , in File
    Error : 7     Line :   0     IF THEN expected [ 29]  , in File :
    Error : 123   Line :   0     END IF expected  , in File :


    Czemu wywala np. błąd, że nie ma End If, skoro jest?

    Z góry dzięki za pomoc.
  • REKLAMA
  • #2 7499034
    Ciapol
    Poziom 24  
    Po "Then" musisz rozpocząć nową linię. To tak na szybko.
  • REKLAMA
  • #3 7499117
    marek19951
    Poziom 16  
    Po THEN jest rozpoczęta nowa linia, jest tylko komentarz po then nic więcej.
  • #4 7499142
    M. S.
    Poziom 34  

    Pinb.0 jest bitem (stanem wejścia b.0) więc przyjmuje wartości 0 lub 1. Jaki jest zatem cel przyrównania go do trzydziestu?
    Elseif Pinb.0 => 50 < 70

    Musi być:
    Elseif Pinb.0 => 50 And Pinb.0 < 70 Then

    (z zastrzeżeniem tego co na początku)
    Jeśli temperaturę podajesz w sposób binarny na portb to miałoby to sens ale musiałoby wyglądać tak:
    Elseif Pinb => 50 And Pinb < 70 Then
  • REKLAMA
  • #5 7499173
    marek19951
    Poziom 16  
    Cytat:
    Error : 35 Line : 20 3 parameters expected , in File :
    Error : 35 Line : 28 3 parameters expected , in File :
    Error : 7 Line : 0 IF THEN expected [ 28] , in File :
    Error : 123 Line : 0 END IF expected , in File :


    Teraz wyskakują mi takie błędy, dałem then po każdym Else If. 2 pierwsze błędy rozumiem, są one po prostu za ten stan wejścia tak jak piszesz i wystarczy odpowiednio odczyt temperaturę napisać, ale nie rozumiem 2 ostatnich błędów, nie wskazują one żadnej linii, czyżby po każdym Else If trzeba by zamknąć to instrukcją End If? Jeżeli nie to w czym tkwi błąd?
  • #6 7499188
    M. S.
    Poziom 34  
    Popatrz wyżej. Jest tam magiczne "And"

    Spróbuj tego
    $regfile = "2313def.dat" 'program jest pisany na procesor attinny2313
    $crystal = 4000000 'procesor będzie pracował z kwarcem bądź na wewnętrznym oscylatorze 4Mhz
    
    Config Portb = Input 'port b jako wejścia
    Portb = &B00000000 'wszędzie stan spoczynkowy-0
    Config Portd = Output 'port d jako wyjścia
    Portd = &B0000000 'wszędzie stan spoczynkowy-0
    
    
    Do
    
    If Pinb.0 =< 30 Then 'jeżeli temperatura jest mniejsza niż 30'C
    
    Portd.0 = 1 'włącz podajnik
    Portd.1 = 1 'włącz wentylator
    Wait 300 'czekaj 5 minut
    Portd.0 = 0 'wyłącz podajnik
    Wait 120 'czekaj 2 minuty
    Portd.1 = 0 'wyłącz wentylator
    
    Elseif Pinb.0 => 30 And Pinb.0 < 50 Then                    'jeżeli temperatura wynosi 30-50'C
    Portd.0 = 1 'włącz podajnik
    Portd.1 = 1 ' włącz wentylator
    Wait 360 'czekaj 6 minut
    Portd.0 = 0 'wyłącz podajnik
    Wait 60 'czekaj 60 sekund
    Portd.1 = 0 'wyłącz wentylator
    
    Elseif Pinb.0 => 50 And Pinb.0 < 70 Then
    Portd.0 = 1 'włącz podajnik
    Portd.1 = 1 'włącz wentylator
    Wait 480 'czekaj 8 minut
    Portd.0 = 0 'wyłącz podajnik
    Portd.1 = 0 'wyłącz wentylator
    Wait 300 'czekaj 5 minut
    Portd.1 = 1 'włącz wentylator
    Wait 120 'czekaj 2 minuty
    Portd.1 = 0 'wyłącz wentylator
    
    End If
    
    Loop
    
    
    End

    Błędy składniowe poprawiłem. Sens musisz poprawić sam.
  • #7 7499199
    marek19951
    Poziom 16  
    To magiczne And też dodałem i nadal nie działa. Program wygląda tak:

    Cytat:
    $regfile = "2313def.dat" 'program jest pisany na procesor attinny2313
    $crystal = 4000000 'procesor będzie pracował z kwarcem bądź na wewnętrznym oscylatorze 4Mhz

    Config Portb = Input 'port b jako wejścia
    Portb = &B00000000 'wszędzie stan spoczynkowy-0
    Config Portd = Output 'port d jako wyjścia
    Portd = &B0000000 'wszędzie stan spoczynkowy-0


    Do

    If Pinb.0 =< 30 Then 'jeżeli temperatura jest mniejsza niż 30'C
    Portd.0 = 1 'włącz podajnik
    Portd.1 = 1 'włącz wentylator
    Wait 300 'czekaj 5 minut
    Portd.0 = 0 'wyłącz podajnik
    Wait 120 'czekaj 2 minuty
    Portd.1 = 0 'wyłącz wentylator

    Elseif Pinb.0 => 30 And < 50 Then 'jeżeli temperatura wynosi 30-50'C
    Portd.0 = 1 'włącz podajnik
    Portd.1 = 1 ' włącz wentylator
    Wait 360 'czekaj 6 minut
    Portd.0 = 0 'wyłącz podajnik
    Wait 60 'czekaj 60 sekund
    Portd.1 = 0 'wyłącz wentylator

    Elseif Pinb.0 => 50 And < 70 Then
    Portd.0 = 1 'włącz podajnik
    Portd.1 = 1 'włącz wentylator
    Wait 480 'czekaj 8 minut
    Portd.0 = 0 'wyłącz podajnik
    Portd.1 = 0 'wyłącz wentylator
    Wait 300 'czekaj 5 minut
    Portd.1 = 1 'włącz wentylator
    Wait 120 'czekaj 2 minuty
    Portd.1 = 0 'wyłącz wentylator

    End If

    Loop


    End


    A errory są takie same jak 2 posty wyżej.
  • REKLAMA
  • #9 7499220
    sp3ots
    Poziom 38  
    Witam !

    Zamiast :
    If Pinb.0 =< 30 Then .....

    powinieneś np.

    dim temperatura as byte
    If temperatura =< 30 Then
  • #10 7499235
    marek19951
    Poziom 16  
    Faktycznie, nie zauważyłem po And Pinb.0, dzięki wielkie, masz pomógł i 10pkt za szybką pomoc i zwrócenie uwagi na problemy ze wzrokiem :D. Teraz wszystko kompiluję się bez problemów.
  • #12 7499280
    sp3ots
    Poziom 38  
    Na początek można przetestować tak:

    dim temperatura as byte
    temperatura =25 ' 25 zmieniać prawie dowolnie, programując procesor
    do
    if temperatura < 25 then

    loop
    end
  • #13 7499385
    marek19951
    Poziom 16  
    Dzięki za tą wskazówkę za porównanie temperatury, dostajesz pomógł.

    A "temperatura" nie trzeba zrobić jako alias któregoś portu, do którego jest podpięty czujnik?
  • #14 7499412
    sp3ots
    Poziom 38  
    dim temperatura as byte ' - to jest ten alias
    Powodzenia życzę. Stefan GG6293398
  • #15 7507560
    Konto nie istnieje
    Poziom 1  
  • #16 7508005
    marek19951
    Poziom 16  
    Temperaturę mogę odczytać w ten sposób?
    Cytat:
    Dim Temperatura As Byte
    Config 1wire = Portb.0
    1wreset
    1wwrite &H33

    Temperatura = 1wread()


    I jak ją porównać np. do 30'C?

    A co do wyjaśnienia, to ja jeszcze nie wiedziałem jak odczytać temperaturę, co nadmieniłem w pierwszym poście i wiedziałem, że tamte piny są złe, chodziło mi po prostu o użycie If Then na sucho.
  • #17 7508297
    Konto nie istnieje
    Poziom 1  
  • #18 7508348
    marek19951
    Poziom 16  
    atom1477 mógłbyś opisać po co jest 4x wwrite i co oznaczają te &HCC, H44, HBE? Bo w helpie widzę tylko &H33 i jest to zmienna tylko co ona robi? Tam się zapisuje temperatura? Dzielenie i mnożenie rozumiem po co jest, tylko to wwrite nie wiem.
  • #19 7508815
    Konto nie istnieje
    Poziom 1  
REKLAMA