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

Obsługa zegara RTC DS1307 w Bascom

ewsd75 16 Kwi 2010 19:35 6230 9
  • #1 7969022
    ewsd75
    Poziom 13  
    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

    Moderowany przez Marek_Skalski:

    Zaktualizowałem link do strony z artykułem.

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

    niestety u mnie nie działa. jedyne co mi wyświetla to:
  • #3 8317146
    jony15
    Poziom 24  
    Pierwsza myśl bit "CH" w ds1307 adres 0; może po prostu zegar jest zatrzymany? wklej kod.
  • #4 8317153
    matrix0606
    Poziom 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:

    $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 8319748
    janbernat
    Poziom 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 19726135
    Piotr Laskos
    Poziom 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 19727232
    tomaszdko
    Poziom 12  
    Z ciekawości sprawdziłem i kompiluje się bez problemu (bascom 2.0.8.4)
  • #8 19728260
    Piotr Laskos
    Poziom 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 19746288
    Piotr Laskos
    Poziom 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ć.
REKLAMA