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.

Obsługa zegara RTC DS1307 w Bascom

ewsd75 16 Apr 2010 19:35 5942 9
  • #1
    ewsd75
    Level 12  
    Witam

    Zauważyłem ze od czasu do czasu powraca temat obsługi zegara RTC w Bascom.
    Postanowiłem się podzielić z wami moim doświadczeniem jeśli chodzi o tego typu układy. Napisałem artykuł z przykładami kodu w Bascom. Artykuł jest dość duży dlatego zamieściłem do na swojej stronce. Jeśli ktoś chce się zapoznać z tym artykułem to zapraszam. Często buduję jakieś układy z wykorzystaniem RTC. Upodobałem sobie układ DS1307. Mam nadzieję że będzie to pomocny artykuł w waszych pracach. W razie pytań proszę pisać na e-mail dlatego że częściej odbieram pocztę niż zaglądam do tego działu.



    Na swojej stronie zamieszczam od pewnego czasu różne artykuły, będę starał się je publikować również w postaci plików PDF ale na razie możecie je przeczytać.

    Artykuł jest dostępny tutaj:

    Obsługa zegara RTC DS1307 w Bascom

    Moderated By Marek_Skalski:

    Zaktualizowałem link do strony z artykułem.

  • #2
    matrix0606
    Level 15  
    sorki za odświerzanie, ale akurat jest mi to potrzebne.
    ewsd75 wrote:
    Artykuł jest dostępny tutaj:
    Obsługa zegara RTC DS1307 w Bascom

    niestety u mnie nie działa. jedyne co mi wyświetla to:
    Code:
    05:05:05
  • #3
    jony15
    Level 23  
    Pierwsza myśl bit "CH" w ds1307 adres 0; może po prostu zegar jest zatrzymany? wklej kod.
  • #4
    matrix0606
    Level 15  
    kod już działa. wyłączyłem zasilanie na kilka godzin, a zegar pracował tylko na baterii i już jest ok. tylko nie wiem czemu tak było?

    a kod wygląda tak:

    Code:
    $PROG &HFF , &HA4 , &HD9 , &H00    ' generated. Take care that the chip supports all fuse bytes.
    



    $regfile = "m8def.dat"
    $crystal = 8000000
    '$baud = 19200
    '$lib "mcsbyte.lbx"
    $lib "ds1307clock.lib"
    $eepleave
    $hwstack = 40
    $swstack = 16
    $framesize = 40

    Deflcdchar 0 , 27 , 17 , 17 , 17 , 17 , 17 , 17 , 27       ' []
    Deflcdchar 1 , 27 , 17 , 21 , 31 , 31 , 21 , 17 , 27       ' replace ? with number (0-7)


    config LCD = 16 * 2
    CONFIG LCDPIN = PIN , DB4 = pind.4 , DB5 = pind.5 , DB6 = pind.6 , DB7 = pind.7 , E = pind.3 , RS = pind.2
    config sda = portc.4
    config scl = portc.3
    i2cinit

    const ds1307w = 208
    const ds1307r = 209

    dim a as byte
    dim wartosc as byte
    dim sekundy as byte
    dim minuty as byte
    dim godziny as byte
    dim dzientygodnia as byte
    dim dzien as byte
    dim miesiac as byte
    dim rok as integer

    godziny = 22
    minuty = 24
    sekundy = 0


    sekundy = makebcd(sekundy)
    minuty = makebcd(minuty)
    godziny = makebcd(godziny)
    cursor off
    cls

    gosub loading
    gosub zapis_do_zegara



    do
    home
     i2cstart
     i2cwbyte ds1307w
     i2cwbyte 0
     i2cstart
     i2cwbyte ds1307r
     i2crbyte sekundy , ack
     i2crbyte minuty , ack
     i2crbyte godziny , nack
     i2cstop

     sekundy = makedec(sekundy)
     minuty = makedec(minuty)
     godziny = makedec(godziny)

     waitms 500

     cls
     wartosc = makebcd(godziny)
      lcd bcd(wartosc) ; ":"
     wartosc = makebcd(minuty)
      lcd bcd(wartosc) ; ":"
     wartosc = makebcd(sekundy)
      lcd bcd(wartosc)



    loop
    end

    zapis_do_zegara:
     i2cstart
     i2cwbyte ds1307w
     i2cwbyte 0
     i2cwbyte sekundy
     i2cwbyte minuty
     i2cwbyte godziny
     i2cstop
    return


    loading:
    home
    locate 1 , 5
    lcd "loading"
    locate 2 , 1
    lcd chr(0) ; chr(0) ; chr(0) ; chr(0) ; chr(0) ; chr(0) ; chr(0) ; chr(0) ; chr(0) ; chr(0) ; chr(0) ; chr(0) ; chr(0) ; chr(0) ; chr(0) ; chr(0) ;
    locate 2 , 1
    for a = 1 to 16
    waitms 500
    lcd chr(1)
    next a
    return
  • #5
    janbernat
    Level 38  
    "When VCC falls below 1.25 x VBAT the device terminates an access in progress and resets the device address counter. Inputs to the device will
    not be recognized at this time to prevent erroneous data from being written to the device from an out of tolerance system."
    To oznacza że jeśli bateria ma za wysokie napięcie w stosunku do zasilania to DS1307 blokuje dostęp bo "myśli" że zasilanie spadło.
    Ten sam numer pojawia się jeśli zasilanie bateryjne jest zrobione z trzech ogniw NiCad świeżo naładowanych albo ładowanych w czasie pracy urządzenia.
    Gdy napięcie na ogniwie przekroczy 1.33V czyli całość osiągnie 4V to DS1307 rozpoznaje to jako spadek napięcia zasilanie i się blokuje.
  • #6
    Piotr Laskos
    Level 11  
    Witam . Panowie jaką macie wersję Bascoma. Bo ja mam wersję 2.0.7.1 i nie chce mi skompilować.
    Nie wie co to jest
    I2cwbyte 1307w
    i
    i2cwbyte 1307r
    Do tego jak dodam biblioteki to wywala mi błąd na końcu pętli END.
    Pomóżcie jak możecie. Pozdrawiam
  • #7
    tomaszdko
    Level 11  
    Z ciekawości sprawdziłem i kompiluje się bez problemu (bascom 2.0.8.4)
  • #8
    Piotr Laskos
    Level 11  
    Ok. Już wiem co było nie tak.
    Po pierwsze myślałem że ds1307w i r to jakaś komenda. Nikt nie napisał że trzeba ją napisać jako zmienną. Łatwiej i krócej byłoby po prostu wpisać adres 208 i 209. Ta pierwsza biblioteka wywala mi błędy. Druga już nie. Skompilowało mi program i zegar chodzi. Tylko jeszcze muszę dojść dlaczego sekundy jak dojdą do 137 to dopiero jest minuta. Ale jeszcze nie mam zmienione na bcd i pewnie dlatego. Najważniejsze że zegar śmiga. Teraz tylko dopracować całość. Jak napiszę cały program to dokładnie napiszę jak i co robić. Tak dla potomności.
  • #10
    Piotr Laskos
    Level 11  
    Oczywiście reszta to tylko mój kod. Do zegara potrzebna jest kilka linijek i to co po głównej pętli.
    Ale mam pytanie do kolegów którzy mają większe doświadczenie w temacie.
    Samo wpisywanie do rtc jest ok. Tylko co jeśli chciałbym wpisywać po kolei godziny, potem minuty, itd. Próbowałem to robić do _min, _sec ale jakoś nie chce działać.