Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[Bascom] Bardzo proszę o pomoc w uporządkowaniu programu

grzegorz.d3 11 Oct 2009 21:18 1689 10
  • #1
    grzegorz.d3
    Level 14  
    Witam mógłby mi ktoś pomóc problem jest taki ze w Bascomie się nie skompiluje proszę niech mi ktoś pomoże upożądkować program.

    $regfile = "m8def.DAT"
    $crystal = 8000000
    $lib "I2C.LBX"
    $lib "Ds1307clock.lib"

    Config Lcdpin = Pind , Db4 = Portd.1 , Db5 = Portd.2 , Db6 = Portd.3 , Db7 = Portd.4 , E = Portd.0 , Rs = Portd.5
    Config Lcd = 16 * 2

    Config Sda = Portc.4 'port sda ds1307
    Config Scl = Portc.5 'port scl ds1307
    Config 1wire = Portd.7 'port 1wire czujnika temperatury ds18b20
    Config Pinc.3 = Input 'pin klawisza s1
    Config Pinc.2 = Input 'pin klawisza s2
    Config Pinc.1 = Input 'pin klawisza s3
    Config Pinc.0 = Input 'pin wejscia zapłonu
    Config Pinb.1 = Input 'pin wejscia swiateł


    Config Int1 = Low Level
    Enable Interrupts

    Dim _weekday As Byte
    Dim _day As Byte
    Dim _month As Byte
    Dim _year As Byte
    Dim _sec As Byte
    Dim _min As Byte
    Dim _hour As Byte

    Dim Ds1307w As Byte
    Dim Ds1307r As Byte

    Dim Temp1 As Integer , Ss1 As String * 6
    Dim Temp2 As Integer , Ss2 As String * 6
    Dim Dsid1(8) As Byte
    Dim Dsid2(8) As Byte
    Dim T1 As Integer
    Dim T2 As Integer
    Dim W As Byte
    Dim B As Byte
    Dim I As Byte
    Dim J As Byte
    Dim K As Byte
    Dim L As Byte



    S1 Alias Pinc.3
    S2 Alias Pinc.2
    S3 Alias Pinc.1
    'Znajdź kolejny czujnik podpięty do portu

    If Dsid1(8) = Crc8(dsid1(1) , 7) Then 'ta opcja pojawia się tylko przy włączaniu urządzenia
    Locate 1 , 1
    Lcd "CRC OK Czujnik 1 ID"
    Locate 2 , 1
    For B = 1 To 8
    Lcd Hex(dsid1(b))
    Next
    End If
    Waitms 200
    Cls

    If Dsid2(8) = Crc8(dsid2(1) , 7) Then 'ta opcja pojawia się tylko przy włączaniu urządzenia
    Locate 1 , 1
    Lcd "CRC OK Czujnik 2 ID"
    Locate 2 , 1
    For B = 1 To 8
    Lcd Hex(dsid2(b))
    Next
    End If
    Waitms 200
    Cls

    Cursor Off

    '-----------------PROGRAM GŁÓWNY---------------------------------------------------------------

    Poczatek:
    Cls
    I = 9
    J = 2
    Do
    If S1 = 0 And S3 = 0 Then Gosub _ustaw 'jesli nacisniete klawisze s1 i s2 to przechodzi do podmenu uswawienia zegara i daty
    Call Zegar
    Call Temp

    Locate 1 , 1 : Lcd Bcd(_hour) ; ":" ; Bcd(_min)
    Locate 1 , 11 : Lcd ; "w" ; Ss1 ; Chr(0)
    Locate 2 , 1 : Lcd Bcd(_day) ; "-" ; Bcd(_month) ; "-" ; Bcd(_year) ; "r"
    Locate 2 , 11 : Lcd ; "z" ; Ss2 ; Chr(0)

    If Swiatla = 1 Then 'jesli swiatła włączone to pokazuje znak na wyswietlaczu swiateł
    Locate 1 , 8 : Lcd Chr(3) 'na pozycji 8 w wierszu pirwszym
    Else 'jeslui nie to
    Locate 1 , 8 : Lcd " " 'wygaszenie znaku swiateł czyli spacja aby wygasic znak swiateł
    End If 'bez nie potrzebnego uzywania cls czyszczenia ekranu, :nie mrugal wyswietlacz


    If Zaplon = 1 Then 'jesli właczony jest zapłon to przechodzi do petli i wyswietla napis włącz siatła

    Cls

    Do
    I = 9 'początkowa wratosc pozycji na wyswietlaczu
    J = 2 'początkowa wratosc pozycji na wyswietlaczu

    For K = 1 To 7 'petla wykonywana 7 razy napis w przesuwany w lewo
    I = I - 1 'zmniejszanie wartości I o 1
    If I < 2 Then I = 2
    Cls
    Locate 1 , I : Lcd " w" ; Chr(2) ; Chr(1) ; "cz"
    Locate 2 , I : Lcd "swiat" ; Chr(2) ; "a"
    Waitms 500
    If Swiatla = 1 Then 'jesli swiatła włączone to wyjscie z petli
    Cls
    Locate 1 , 3 : Lcd "swiat" ; Chr(2) ; "a ok"
    Locate 2 , 6 : Lcd "jazda"
    Wait 2
    Call Poczatek
    End If
    Next L ' do petli L


    For L = 1 To 7 'petla wykonywana 7 razy napis w przesuwany w prawo
    J = J + 1 'zwiekszanie wartości J o 1
    If J > 9 Then J = 9
    Cls
    Locate 1 , J : Lcd " w" ; Chr(2) ; Chr(1) ; "cz"
    Locate 2 , J : Lcd "swiat" ; Chr(2) ; "a"
    Waitms 500
    If Swiatla = 1 Then 'jesli swiatła włączone to wyjscie z petli
    Cls
    Locate 1 , 3 : Lcd "swiat" ; Chr(2) ; "a ok"
    Locate 2 , 6 : Lcd "jazda"
    Wait 2
    Call Poczatek
    End If
    Next K ' do petli K


    Loop

    End If



    Loop

    '--------------------------------------------------------------------------------
    'odczyt z DS1307
    Zegar:

    I2cstart
    I2cwbyte Ds1307w
    I2cwbyte 0
    I2cstart
    I2cwbyte Ds1307r
    I2crbyte _sec , Ack
    I2crbyte _min , Ack
    I2crbyte _hour , Ack
    I2crbyte _weekday , Ack
    I2crbyte _day , Ack
    I2crbyte _month , Ack
    I2crbyte _year , Nack
    I2cstop

    Return
    '--------------------------------------------------------------------------------
    'odczyt temperatury
    Temp:

    1wreset
    1wwrite &H55
    1wverify Dsid1(1) 'wysyłamy adres pierwszego czujnika
    1wwrite &HBE
    Temp1 = 1wread(2)
    1wreset
    1wwrite &H55
    1wverify Dsid2(1) 'wysylam adres drugiego czujnika
    1wwrite &HBE
    Temp2 = 1wread(2)

    1wreset
    1wwrite &HCC
    1wwrite &H44

    Waitms 750

    Temp1 = Temp1 * 10
    Temp1 = Temp1 / 16
    T1 = Temp1 + 5
    T1 = Temp1 - 5
    Ss1 = Str(t1)
    Ss1 = Format(ss1 , "0.0")

    Temp2 = Temp2 * 10
    Temp2 = Temp2 / 16
    T2 = Temp2 + 5
    T2 = Temp2 - 5
    Ss2 = Str(t2)
    Ss2 = Format(ss2 , "0.0")

    Return
    '--------------------------------------------------------------------------------
    'ustwienie czasu w ds1307
    Settime:

    _sec = Makebcd(_sec)
    _min = Makebcd(_min)
    _hour = Makebcd(_hour)
    I2cstart
    I2cwbyte Ds1307w
    I2cwbyte 0
    I2cwbyte _sec
    I2cwbyte _min
    I2cwbyte _hour
    I2cstop
    Return
    '---------------------------------------------------------------------------
    'ustwienie daty w ds1307
    Setdate:

    _day = Makebcd(_day)
    _month = Makebcd(_month)
    _year = Makebcd(_year)
    I2cstart
    I2cwbyte Ds1307w
    I2cwbyte 3
    I2cwbyte _weekday
    I2cwbyte _day
    I2cwbyte _month
    I2cwbyte _year
    I2cstop
    Return
    '---------------------------------------------------------------------------
    Sprawdzenie:
    ' 1 Hz SQW Output
    I2cstart
    I2cwbyte Ds1307w
    I2cwbyte &H07
    I2cwbyte &B10010000
    I2cstop
    Return
    '---------------------------------------------------------------------------
    'menu ustawien daty i czasu
    _ustaw:
    Cls
    Locate 2 , 1 : Lcd "UstawieniaNastaw"
    Wait 2


    Dzien = 11 'wartosci początkowe po wejsciu do tego menu
    Miesiac = 5
    Rok = 09
    Sekunda = 00
    Minuta = 00
    Godzina = 12


    Cls

    Do
    'Cls
    _day = Dzien
    _month = Miesiac
    _year = Rok
    _sec = Sekunda
    _min = Minuta
    _hour = Godzina
    Call Setdate 'wywołanie suba Setdate
    Call Settime 'wywołanie suba Settime


    If X = 0 Then 'ustawienie godziny
    Locate 2 , 1 : Lcd "ustaw Godzina" ;
    Locate 1 , 1 : Lcd Godzina ; " powrot s1+s2 "
    If S3 = 0 Then
    Waitms 50 'jesli nacisniety s3 to zwieksza godzine
    Godzina = Godzina + 1
    If Godzina > 23 Then Godzina = 00
    Elseif S2 = 0 Then 'jesli nacisniety s2 to zmniejsza godzine
    Waitms 50
    Godzina = Godzina - 1
    If Godzina = -1 And Godzina < 0 Then Godzina = 23
    I2cwbyte _hour
    End If
    End If


    If X = 1 Then 'ustawienie minuty
    Locate 2 , 1 : Lcd "ustaw Minuta" ;
    Locate 1 , 1 : Lcd Minuta ; " powrot s1+s2 "
    If S3 = 0 Then
    Waitms 50 'jesli nacisniety s3 to zwieksza minute
    Minuta = Minuta + 1
    If Minuta > 59 Then Minuta = 00
    Elseif S2 = 0 Then 'jesli nacisniety s2 to zmniejsza minute
    Waitms 50
    Minuta = Minuta - 1
    If Minuta = -1 And Minuta < 0 Then Minuta = 59
    I2cwbyte _min
    End If
    End If

    If X = 2 Then 'ustawienie sekundy
    Locate 2 , 1 : Lcd "ustaw Sekunda" ;
    Locate 1 , 1 : Lcd Sekunda ; " powrot s1+s2 "
    If S3 = 0 Then 'jesli nacisniety s3 to zwieksza sekunde
    Waitms 50
    Sekunda = Sekunda + 1
    If Sekunda > 59 Then Sekunda = 00
    Elseif S2 = 0 Then 'jesli nacisniety s2 to zmniejsza sekunde
    Waitms 50
    Sekunda = Sekunda - 1
    If Sekunda = -1 And Sekunda < 0 Then Sekunda = 59
    I2cwbyte _sec
    End If
    End If

    If X = 3 Then 'ustawienie roku
    Locate 2 , 1 : Lcd "ustaw Rok" ;
    Locate 1 , 1 : Lcd Rok ; " powrot s1+s2 "
    If S3 = 0 Then 'jesli nacisniety s3 to zwieksza rok
    Waitms 50
    Rok = Rok + 1
    If Rok > 99 Then Rok = 00
    Elseif S2 = 0 Then 'jesli nacisniety s2 to zmniejsza rok
    Waitms 50
    Rok = Rok - 1
    If Rok = -1 And Rok < 0 Then Rok = 99
    I2cwbyte _year
    End If
    End If

    If X = 4 Then 'ustawienie miesiaca
    Locate 2 , 1 : Lcd "ustaw Miesiac" ;
    Locate 1 , 1 : Lcd Miesiac ; " powrot s1+s2 "
    If S3 = 0 Then 'jesli nacisniety s3 to zwieksza miesiąc
    Waitms 50
    Miesiac = Miesiac + 1
    If Miesiac > 12 Then Miesiac = 1
    Elseif S2 = 0 Then 'jesli nacisniety s2 to zmniejsza miesiąc
    Waitms 50
    Miesiac = Miesiac - 1
    If Miesiac = 0 And Miesiac < 1 Then Miesiac = 12
    I2cwbyte _month
    End If
    End If

    If X = 5 Then 'ustawienie dnia
    Locate 2 , 1 : Lcd "ustaw Dzien" ;
    Locate 1 , 1 : Lcd Dzien ; " powrot s1+s2 "
    If S3 = 0 Then 'jesli nacisniety s3 to zwieksza dzien
    Waitms 50
    Dzien = Dzien + 1
    If Dzien > 31 Then Dzien = 1
    Elseif S2 = 0 Then 'jesli nacisniety s2 to zmniejsza dzien
    Waitms 50
    Dzien = Dzien - 1
    If Dzien = 0 And Dzien < 1 Then Dzien = 31
    I2cwbyte _day
    End If
    End If


    Waitms 50
    If S1 = 0 Then 's1 wybór co ustawic kolejno godzina ninuta sekunda itd
    Cls
    Incr X
    If X > 5 Then X = 0
    Waitms 200
    End If




    If S1 = 0 And S2 = 0 Then 'jesli nacisniemy s1 i s2 to zatwierdzamy ustawienie
    Do
    Cls
    Locate 1 , 3 : Lcd "zaraz wracam" 'napis na lcd
    Locate 2 , 5 : Lcd "na start"
    Waitms 600 'odczekanie
    If S1 = 1 Then Gosub Poczatek 'sprawdza czy zwolniony klawisz s1 i powrót do odczytu temperatury i zegara

    Loop
    End If
    'Cls
    Loop
    Return
    [28-30.06.2022, targi] PowerUP EXPO 2022 - zasilanie w elektronice. Zarejestruj się za darmo
  • #3
    maniek1818
    Level 22  
    Heh, witam.
    Bardzo rozbudowany program, nie chcę nikogo obrażać, ale jeżeli kolega dopiero się uczy, to najlepiej zaczynać od C. A jeżeli już zostajesz przy "B", to nie wklejaj gotowców, bo często to się tak kończy.
    Pozdrawiam.
    PS: Najlepszą radą jest czytanie kodów błędów z pomocą polskiego HELPa. To zaowocuje samodzielnym rozwiązywaniem problemów i szybsze przyswajanie algorytmu pisania programów :idea:
  • #4
    atom1477
    Level 43  
    Karol966 wrote:
    Na początku brakuje Ci dwóch nawiasów przy:

    Code:

    Dim Dsid1(Cool As Byte
    Dim Dsid2(Cool As Byte
    [


    Nie wiem skąd to wziąłeś.
    Zrób „Cytuj” to zobaczysz że nawiasy zamykające są, a tam wcale nie ma „Cool” tylko „8”.

    Problem pewnie jest z bibloteką $lib "Ds1307clock.lib". Bo nie jest to specjalnie standardowa biblioteka.
    grzegorz.d3: Masz ją?
  • #5
    Karol966
    Level 30  
    Faktycznie, inaczej wygląda ten kod... Właśnie dletego powinno się umieszczać kod w znacznikach
    Code:
     [code] [/code]


    Dodano po 42 [sekundy]:

    A no i chciał bym dodać, iż kod ten kompiluje się bez błędów.