Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[Atmega8][bascom] ds1307 zmiana wartości zegara klawiszami

krzych 08 Maj 2009 23:06 3111 2
  • #1 08 Maj 2009 23:06
    krzych
    Poziom 13  

    mam taki program zegara ds1307 trochę już pokombinowałem
    tylko obsługa zmiany zapisanie do ds1307 mi nie działa ,
    założyłem że
    pierwszy klawisz s1 wejście w menu ustawień kolejne przyciśnięcie s1 ma zmieniać wartość x od 0 do 5 wyświetlać kolejno "godzina minuta sekunda rok miesiac dzien" a klawiszem s3 zmieniać na razie tylko w górę wartości , problem z tym że ze jak wejdę do menu "_ustaw" to kolejno pozostają śmieci po liczbach, w sumie to może mały problem tylko jak jeszcze te wartości zapisywać do ds1307

    Code:

    $regfile = "m8def.DAT"
    $crystal = 12000000
    $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
    Config Scl = Portc.5
    Config 1wire = Portb.0
    'Config Portb.0 = Input
    Config Pinc.3 = Input
    Config Pinc.2 = Input
    Config Pinc.1 = Input
    Config Pinc.6 = Input
    Config Clock = User
    Config Date = Dmy , Separator = .
    Config Int1 = Low Level
    Enable Interrupts

    Const Ds1307w = &HD0
    Const Ds1307r = &HD1

    Dim Temp1 As Integer , Ss1 As String * 6
    Dim Temp2 As Integer , Ss2 As String * 6
    Dim Tzad As Integer , Tzadana As String * 6
    Dim Tzad1 As Integer , Tzadana1 As String * 6
    Dim Tzad2 As Integer , Tzadana2 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                                               'Dane temperatura
    'Dim Kod As Integer                                          'Dane pilota RC5
    Dim Weekday As Byte                                         ' Dane zegara
    S1 Alias Pinc.3
    S2 Alias Pinc.2
    S3 Alias Pinc.1
    Set S1
    Set S2
    Set S3
    Dim Sekunda As Integer
    Dim Godzina As Integer
    Dim Minuta As Integer
    Dim Dzien As Integer
    Dim Rok As Integer
    Dim Miesiac As Integer
    Dim X As Integer

    Deflcdchar 0 , 14 , 10 , 14 , 32 , 32 , 32 , 32 , 32        'znak stopnia Celsjusza
    Cursor Off

    Declare Sub Poczatek
    Declare Sub Getdatetime
    Declare Sub Setdate
    Declare Sub Settime
    Declare Sub _ustaw
    Declare Sub _start

    _start:
    Cls : Cursor Off
    W = 1wirecount()
    Lcd "Ilosc czujnikow:"                                      'Informuje ile czujników jest podpiętych do układu (pojawia się tylko podczas włączania urządzenia)




    Waitms 500
    Locate 2 , 8
    Lcd W
    Wait 2
    Cls                                                         'Znajdź pierwszy czujnik podpięty do portu
    Dsid1(1) = 1wsearchfirst()
    Dsid2(1) = 1wsearchnext()                                   '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 900
    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 900
    Cls

    Cls
    Cursor Off

    '****************************************************************
    '                     PROGRAM GŁÓWNY
    '****************************************************************
    Poczatek:
    Cls

    Do
      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
        Ss1 = Str(t1)
       Ss1 = Format(ss1 , "0.0")


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

    Locate 1 , 1 : Lcd Time$
    Locate 1 , 10 : Lcd Ss1 ; Chr(0) ; "C"
    Locate 2 , 1 : Lcd Date$
    Locate 2 , 10 : Lcd Ss2 ; Chr(0) ; "C"
     If S1 = 0 Then Gosub _ustaw
                                 
    Loop

    Getdatetime:
     
     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
      _sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour)
      _day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year)
    Return

    Setdate:
      _day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year)
      I2cstart                                                 
      I2cwbyte Ds1307w                                       
      I2cwbyte 4                                                '
      I2cwbyte _day                                             
      I2cwbyte _month                                           
      I2cwbyte _year                                           
      I2cstop
    Return

    Settime:

    _sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour)
      I2cstart                                                 
      I2cwbyte Ds1307w                                         
      I2cwbyte 0                                               
      I2cwbyte _sec                                             
      I2cwbyte _min                                             
      I2cwbyte _hour                                           
      I2cstop
    Return

    _ustaw:

    Cls
    Locate 2 , 11 : Lcd "Ustaw"
    Godzina = Makebcd(_hour)
    Minuta = Makebcd(_min)
    Sekunda = Makebcd(_sec)
    Rok = Makebcd(_year)
    Miesiac = Makebcd(_month)
    Dzien = Makebcd(_day)

    Do

        If X = 0 Then
        Locate 2 , 1 : Lcd "ustaw Godzina"
        Locate 1 , 1 : Lcd Godzina
        If S3 = 0 Then
        Incr Godzina
        If Godzina > 23 Then Godzina = 0
        Waitms 100
        End If
        End If

        If X = 1 Then
        Locate 2 , 1 : Lcd "ustaw Minuta"
        Locate 1 , 1 : Lcd Minuta
        If S3 = 0 Then
        Incr Minuta
        If Minuta > 59 Then Minuta = 0
        Waitms 100
        End If
        End If

        If X = 2 Then
        Locate 2 , 1 : Lcd "ustaw Sekunda"
        Locate 1 , 1 : Lcd Sekunda
        If S3 = 0 Then
        Incr Sekunda
        If Sekunda > 59 Then Sekunda = 0
        Waitms 100
        End If
        End If

        If X = 3 Then
        Locate 2 , 1 : Lcd "ustaw Rok"
        Locate 1 , 1 : Lcd Rok
        If S3 = 0 Then
        Incr Rok
        If Rok > 99 Then Rok = 0
        Waitms 100
        End If
        End If

        If X = 4 Then
        Locate 2 , 1 : Lcd "ustaw Miesiac"
        Locate 1 , 1 : Lcd Miesiac
        If S3 = 0 Then
        Incr Miesiac
        If Miesiac > 12 Then Miesiac = 1
        Waitms 100
        End If
        End If

        If X = 5 Then
        Locate 2 , 1 : Lcd "ustaw Dzien"
        Locate 1 , 1 : Lcd Dzien
        If S3 = 0 Then
        Incr Dzien
        If Dzien > 31 Then Dzien = 1
        Waitms 100
        End If
        End If

        Waitms 50
        If S1 = 0 Then
        Incr X
        If X > 5 Then X = 0
        Waitms 200
        Cls

      End If

    If S2 = 0 Then Gosub _start
    Loop

    0 2
  • Pomocny post
    #2 09 Maj 2009 13:18
    janbernat
    Poziom 38  

    Dlaczego program główny jest podprogramem???
    w _ustaw trzeba się odwołać do setdate: i settime:
    Trudno zrozumieć jak TO działa-dziwne że działa.
    Gdybyś dał własne komentarze a potem je "czytał ze zrozumieniem..."

    0
  • #3 09 Maj 2009 16:28
    krzych
    Poziom 13  

    Podziałało odwołanie się do Settime i Setdate fajnie teraz śmiga , w sumie to jest ustaw raz i święto dopóki bateria nie padnie.

    0