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.

Jak zrobić zegar z licznika

Towdee 21 Kwi 2005 12:38 1983 15
  • #1 21 Kwi 2005 12:38
    Towdee
    Poziom 10  

    No właśnie, mam sobie 32bitowy licznik zwiększany równo co sekundę i jak z niego zrobić na początek sam zegar (godz:min:sek). Chodzi o algorytm przeliczenia stanu licznika na godziny, minuty i sekundy. Tylko jedno istotne - żeby ani raz nie zerować licznika - ma sobie nabijać a procek ma przeliczać aktualny stan. Może ktos poradzić? Nie oczekuję programu w jakimś konkretnym języku tylko normalnie, matematycznie tok obliczeń (jak doliczy do iluś to co podzielić i jak).

    0 15
  • #2 21 Kwi 2005 13:04
    K_o_n_r_a_d
    Poziom 23  

    Można tak:
    temp=licznik
    sek=temp mod 60
    temp=temp-sek
    temp=temp/60
    min=temp mod 60
    temp=temp-min
    godz=temp/60
    itd.

    0
  • #3 24 Kwi 2005 10:13
    Towdee
    Poziom 10  

    Oj chyba nie bardzo. Nie może być mod60 bo w zmiennej temp (do której jest przepisywany stan licznika) nie będą liczby 0...60 . Tak będzie tylko za pierwszym razem, a potem będzie licznik dalej liczył (bo nie może byc zerowany!) i już wtedy będą inne liczby więc modulo60 odpada.
    Zaznaczę jeszcze raz - licznik raz włączony liczy sekundy bez przerwy (bez zerowania) tzn. 1, 2, 3, 4, 5, 6, ..., 58, 59, 60, 61, ..., 154489, 154490, 154491, ... i tak do ponad 4 miliardów, ponieważ może zliczać na 32bitach. I dopiero wtedy się wyzeruje, a więc po 136 latach, wcześniej nie.

    0
  • #4 24 Kwi 2005 12:24
    kordirko
    Poziom 21  

    [quote="Towdee"]No właśnie, mam sobie 32bitowy licznik zwiększany równo co sekundę i jak z niego zrobić na początek sam zegar (godz:min:sek). Chodzi o algorytm przeliczenia stanu licznika na godziny, minuty i sekundy. Tylko jedno istotne - żeby ani raz nie zerować licznika - ma sobie nabijać a procek ma przeliczać aktualny stan. Może ktos poradzić? Nie oczekuję programu w jakimś konkretnym języku tylko normalnie, matematycznie tok obliczeń (jak doliczy do iluś to co podzielić i jak).[/quote]

    Deklarujesz sobie 3 zmienne: godz, min, sek.
    I teraz algorytm jest prosty (wywołujesz go co 1 sek):

    sek++;
    if(sek >= 60) {
    sek = 0;
    min++;
    if(min>=60) {
    min = 0;
    godz++;
    if( godz >= 24)
    godz = 0;
    }
    }

    Sory że tak wyświetla ale żżera wcięcia, nie wiem jak to obejść

    0
  • #5 24 Kwi 2005 12:26
    wasi
    Poziom 12  

    To w takim razie jak będzie zorganizowane ustawianie tego "zegara". Program musi wiedzieć kiedy jest godzina 00:00:00 (np gdy licznik=145123). Wtedy

    Code:
    temp=licznik-stala0

    i w zmiennej temp mamy godzine, którejś doby. A wtedy możemy już liczyc:
    Code:

    sek=temp mod 60;

    temp=temp-sek;
    temp=temp / 60;
    min=temp mod 60;

    temp=temp-(min*60);
    temp=temp / 60;
    godz=temp mod 24;

    temp=temp - (godz * 24);
    temp=temp / 24;
    dni=temp;
    // i w tym miejscu trzeba uwzględnić tablicę dnie w miesiącach i resztę kalendarza i można liczyć dalej

    i jeśli się nie pomyliłem to jakoś tak dojdziesz do właściwej wartości. Tak mi się przynajmniej wydaje :)

    0
  • #6 24 Kwi 2005 17:14
    marek_Łódź
    Poziom 36  

    K_o_n_r_a_d napisał:
    Można tak:
    temp=licznik
    sek=temp mod 60
    temp=temp-sek
    temp=temp/60
    min=temp mod 60
    temp=temp-min
    godz=temp/60
    itd.


    Tak, jak napisał K_o_n_r_a_d:

    Code:
    temp=licznik-baza00            //sprowadzenie do początku doby
    
    //konwersja sekundy na minuty-sekundy
    sek=temp mod 60     //sekundy - końcówka
    temp=(temp-sek) div 60      //minuty

    //konwersja minuty na godziny-minuty
    min=temp mod 60              //minuty końcówka pełnej godziny
    temp=(temp-min) div 60     //godziny

    godz=temp mod 24            //ale tylko w danym dniu
    dni=(temp-godz) div 24      //to, co zostało


    funkcja modulo to nic innego jak reszta z dzielenia przez daną liczbę, czyli w przypadku sekundy mod 60 mamy liczbę sekund w ostatniej niepełnej minucie, niezależnie czy stan licznika jest 13 czy 613 czy też
    60*60*24*n+13 (trzynasta sekunda n-tego dnia).

    Oczywiście nie mamy tu licznika przepełnienia, więc trzeba by zapewnić jeszcze jakieś przeładowanie zmiennej baza00 po przepełnieniu licznika.

    0
  • #7 24 Kwi 2005 18:52
    Towdee
    Poziom 10  

    O przepełnienie licznika się nie obawiam bo i tak go nie dożyję... to będzie za jakieś 136 lat

    0
  • #8 24 Kwi 2005 19:23
    marek_Łódź
    Poziom 36  

    Towdee napisał:
    O przepełnienie licznika się nie obawiam bo i tak go nie dożyję... to będzie za jakieś 136 lat


    Ci od programów w XX wieku się nie martwili o licznik w roku 2000 czy 2001 i potem ile było problemów. Pomyśl o swoich prawnukach, które się zdziwią gdy pewnego dnia zegar prapradziadka zamiast jak co dzień wydzwonić południe, odmówi współpracy i zacznie żyć własnym życiem ;-)

    0
  • #9 25 Kwi 2005 19:47
    Towdee
    Poziom 10  

    No niestety program wg Konrada i Marka nie działa poprawnie. Tzn. co około 4 minuty gubi 5-15 sekund. Pierwsze zgubienie ma miejsce po 245sek - gdy naliczy 4min i 5 sek, jest ok a przy następnej sekundzie zeruje liczbę sekund i liczy od 4min 0sek i już dalej dobrze . Sytuacja się powtarza po około 8 minutach itd.
    Tak jakby gdzieś się kumulował jakiś błąd czy miały miejsce zaokrąglenia, albo tym zmiennych jest niewłaściwy, bo podejrzewam,że algorytm jest poprawny... sam już nie wiem

    0
  • #10 25 Kwi 2005 20:28
    marcinkwa
    Poziom 14  

    To może chodzi o coś innego. Program (algorytm) Konrada jest OK.
    A co to za urządzenie - może pastylka RTC dallasa?

    0
  • #11 25 Kwi 2005 20:38
    Towdee
    Poziom 10  

    Oj cofam to - algorytm jest ok, problem tkwił w ustawieniu zmiennych - zamiast Byte dałem Integer i już gitara. Liczy pięknie i wyświetla GG:MM:SS.

    Dziękuję wszystkim

    Do Marcina:
    Zgadza się - pastylka DS1904

    0
  • #12 25 Kwi 2005 20:48
    LordBlick
    VIP Zasłużony dla elektroda

    No to powinien gubić się nie po 245, a po 255 sekundach...

    0
  • #13 25 Kwi 2005 21:39
    marek_Łódź
    Poziom 36  

    Towdee napisał:
    Oj cofam to - algorytm jest ok, problem tkwił w ustawieniu zmiennych - zamiast Byte dałem Integer i już gitara. Liczy pięknie i wyświetla GG:MM:SS.


    A co z przepełnieniem integerów??? Czy już wszystko masz na 32 bitach?

    To co? Teraz pora na kalendarz...na początek gregoriański, potem juliański, chiński, żydowski, majów i parę innych.

    Niezależnie od tego marzy mi się NORMALNY zegar, który dobę dzieliłby na dziesięć decydób (taka trochę dłuższa godzina), decydobę na sto milidób (taka nibyminuta) i dalej jeszcze na sto czegośtam (nibysekund).

    Co za dureń wymyślił system dwunastkowy skoro człowiek ma tylko dziesięć, czy dwadzieścia palców?

    Jednostka częstotliwości w tym systemie pomiaru czasu to 1 Marek (1 impuls/(1/100000 doby)

    0
  • #14 25 Kwi 2005 22:06
    LordBlick
    VIP Zasłużony dla elektroda

    marek_Łódź napisał:
    Jednostka częstotliwości w tym systemie pomiaru czasu to 1 Marek (1 impuls/(1/100000 doby)
    Komplikujesz waść, zamiast napisać, że wpadasz w rezonans na częstotliwości 100 kHz... ;)

    0
  • #15 26 Kwi 2005 00:37
    shg
    Specjalista techniki cyfrowej

    Wszystko zmierza w kierunku komputeryzacji, więc może by tak dobę podzielić na 256 części, albo jakąś inną równie okrągłą liczbę? :D

    A podział doby na 1000 części firma Timex zastosowała w którymś ze swoich zegarków. jednostkę tą (1/1000 doby) nazwali "tick"

    A jakby tak każdy miesiąc miał 32 dni, a rok 8, albo 16 miesięcy (lepiej 8, bo dzień i miesiąc zmieszczą się w jednym bajcie :) ) Właściwie, to nie obchodzi mnie, czy w tym roku zima będzie w misiącu "1" i "$e", a za rok w miesiącu 9 :D

    Idąc dalej, można by wprowadzić banknoty i monety o nominałach będącymi potęgami dwójki.
    Jakież łatwe było by operowanie pieniędzmi. część ułamkową można by zrealizować jako kolejne ujemne potęgi dwójki (typ waluty: FIXEDPOINT), ale w ramach dążenia do prostoty można by ją odrzucić, wtedy waluta była by typu UNSIGNED INTEGER (chocziaż niektórzy ku swemu niezadowoleniu mają na kontach SIGNED INTEGER) :D

    A tak BTW, ciekawe ile trzeba być w banku na minusie, żeby wygenerować w komputerach underflow i być na plusie :twisted:

    0
  • #16 01 Maj 2005 18:46
    marek_Łódź
    Poziom 36  

    shg napisał:
    Wszystko zmierza w kierunku komputeryzacji, więc może by tak dobę podzielić na 256 części, albo jakąś inną równie okrągłą liczbę? :D

    A podział doby na 1000 części firma Timex zastosowała w którymś ze swoich zegarków. jednostkę tą (1/1000 doby) nazwali "tick"

    A jakby tak każdy miesiąc miał 32 dni, a rok 8, albo 16 miesięcy (lepiej 8, bo dzień i miesiąc zmieszczą się w jednym bajcie :) ) Właściwie, to nie obchodzi mnie, czy w tym roku zima będzie w misiącu "1" i "$e", a za rok w miesiącu 9 :D

    Idąc dalej, można by wprowadzić banknoty i monety o nominałach będącymi potęgami dwójki.
    Jakież łatwe było by operowanie pieniędzmi. część ułamkową można by zrealizować jako kolejne ujemne potęgi dwójki (typ waluty: FIXEDPOINT), ale w ramach dążenia do prostoty można by ją odrzucić, wtedy waluta była by typu UNSIGNED INTEGER (chocziaż niektórzy ku swemu niezadowoleniu mają na kontach SIGNED INTEGER) :D

    A tak BTW, ciekawe ile trzeba być w banku na minusie, żeby wygenerować w komputerach underflow i być na plusie :twisted:


    Jestem ZA a nawet ZA. Jest jeszcze jeden problem, ale to da się załatwić. Trzeba by jakoś doprowadzić do tego, żeby człowiek przy każdej kończynie miał dokładnie 4 palce i ani jednego więcej. Wchodzą w grę dwie możliwości - chirurgia albo inżynieria genetyczna.

    W ostatecznym rozrachunku 2^0 głów, 2^1 ócz i usz (nie poprawiać!), 2^2 kończyn, 2^4 palcy (nie poprawiać!) Istota Idealna

    Homo HexaDecimalPalcy to pełna doskonałość i harmonia z naturą (komputera)!!!

    A tak całkiem poważnie to człowiek już dawno nie jest uzależniony od przyrody (a jest uzależniony od komputera), więc rok może spokojnie trwać 512 dni (16 miesięcy po 32 dni).

    0