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

DS1307 pokazuje dziwne wartości

Templarious 02 Sty 2016 11:31 1098 13
REKLAMA
  • #1 15290469
    Templarious
    Poziom 22  
    Witam,

    Udało mi się uruchomić zegarek na DS1307 ale... problem polega na tym, że godziny, minuty i sekundy mają pewien schemat złego liczenia. Tzn. na przykładzie sekund (bo najszybciej sie zmieniają) schemat ten polega na liczeniu od 0 do 12, następuje skok na 24 sekundy potem na 28 i liczy normalnie załóżmy do 40 sekund. Potem skok np. o 7 sekund itd. Dodam, że pełna minuta jest liczona poprawnie ale na wyświetlaczu jest to wartość w okolicach 80-90 sekund. Tak samo dzieje się z godzinami, minutami.

    DS1307 ma wzorzec czasowy DS32KHZ.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • Pomocny post
    #2 15290733
    excray
    Poziom 41  
    DS1307 już wystawia dane w formacie BCD a Ty jeszcze raz próbujesz je przerobić na BCD. Spróbuj tak:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    i analogicznie dla sekund, godzin, itd.
  • REKLAMA
  • #3 15290741
    Templarious
    Poziom 22  
    excray napisał:
    DS1307 już wystawia dane w formacie BCD a Ty jeszcze raz próbujesz je przerobić na BCD. Spróbuj tak:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Spróbuje zaraz ale prosze zauważyć, że nie uzywam tej funkcji convert to BCD :)

    // zrobiłem tak ale z sekundami
    SPDR = digits[sec & 0x0F];
    while(!(SPSR & _BV(SPIF)));
    SPDR = digits[sec >> 4];
    while(!(SPSR & _BV(SPIF)));

    liczy od 0 do 8 potem skok do 22 potem 23...24... skok do 16 i zaraz do 23.

    kolejny edit. źle wrzuciłem kod, działa !!! ale pytanie czemu jest przesunięcie bitowe o 4 w prawo ? :) i czemu 0x0F a nie 0xFF ?
  • Pomocny post
    #4 15290828
    excray
    Poziom 41  
    Ponieważ DS1307 dane przechowuje już w formacie BCD. Minuta 44 szesnastkowo nie jest zapisana jako 0x2C tylko jako 0x44 gdyż jednostki są w młodszej połówce a dziesiątki w starszej. Aby wyciągnąć dziesiątki wystarczy przesunąć o 4 w prawo a jednostki wyciągamy przez AND z 0x0F.
  • REKLAMA
  • #5 15290938
    Templarious
    Poziom 22  
    Ostatnie pytanie, przy zapisie jak to wygląda ? Załózmy mam typ danych uint8_t sekundy, minuty i godziny. Zapisuje je do ds w ten sposób:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    ale po ustawieniu znowu są dziwne wartości. Rozumiem, że musze to jakos sprytnie zapisać.
  • REKLAMA
  • #6 15291061
    excray
    Poziom 41  
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #7 15291066
    Templarious
    Poziom 22  
    Tylko co kryje się pod tymi wartościami? Ja do swoich zmiennych sekundy, minuty, godziny mam wartości które sobie ustawiam na wyświetlaczu.
  • #8 15291083
    excray
    Poziom 41  
    Pod tymi wartościami kryją się siekundy, minuty i godziny 14:58:31
  • #9 15291097
    Templarious
    Poziom 22  
    Ok to pytanie moje się rodzi, skoro mam ustawione w DC (decymalnie) np 15.24.00 to nie moge tego wysłać do DS?

    sekundy = 0; DEC
    minuty = 24; DEC
    godziny = 15; DEC

    wysyłam jak napisałem I2C_SendByte(sekundy); itd. Muszę dokonać zatem konwersji na hex ?
  • #10 15291138
    excray
    Poziom 41  
    Nie na hex tylko na BCD. Albo lepiej w programie operuj na wartościach BCD zamiast binarnych. Pomyśl, po co w ogóle potrzebujesz je zamieniać na binarne?
  • #11 15291165
    Templarious
    Poziom 22  
    Potrzebuje je zmieniać na binarne bo tak jest to tylko rozumiane przez DS1307. Myślałem, że tutaj dzieje się automatyczna konwersja DEC na BCD.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    coś takiego powinno zadziałać raczej ;) ?
  • #12 15291188
    excray
    Poziom 41  
    Już 3 razy Ci napisałem że DS1307 operuje w systemie BCD a nie binarnym. Zarówno jak odczytujesz to dostajesz dane w formacie BCD jak i też przy zapisywaniu powinieneś dane w takim formacie przekazywać.
  • #13 15291270
    Templarious
    Poziom 22  
    Ok zatem zrobiłem coś takiego:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Dane się zapisują ale nadal to nie jest to. Są krzaki.

    // jest ok ale myk jest taki, ze minuty wlatują na godziny, wszystko sie przesuwa tzn sekundy wlatuja na minuty, minuty na godziny a godzin nie ma w ogóle. :/
    // problem rozwiązany, ustawiłem tylko zapis godzin i minut. hula !
  • Pomocny post
    #14 15292090
    fanatykstaroci
    Poziom 13  
    Możesz odczytywać/zapisywać pojedyncze rejestry (wybierasz rejestr wysyłąjąc dan do RTC i odczytujesz jako Nack), ale u Ciebie robisz to chyba po kolei i musisz też zachować odpowiednią kolejność przy odczycie i zapisie. Inaczej odczytasz głupoty, albo dane będą Ci się przesuwać.

    Niedawno też się tym zegarkiem bawiłem i też sprawiał mi kłopoty.
    Mój kod był taki:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
REKLAMA