Porovnanie casovych udajov (RTC)

Sekcia určená pre Arduino nadšencov

Moderátor: Moderátori

TomasNM
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1379
Dátum registrácie: 22 Jan 2012, 19:24
Bydlisko: Nové Mesto nad Váhom
Vek: 43

Porovnanie casovych udajov (RTC)

Príspevok od používateľa TomasNM » 26 Aug 2016, 16:05

Pani,

kodujem,kodujem a zrazu som sa zasekol na jednej banalite.
Potrebujem porovnat aktualny cas z RTC s mojim nastavenym casom.
V pripade,ze RTC cas dosiahne nastaveny,spusti sa procedura a zastavi sa s dosiahnutim ineho nastaveneho casu.

Chcel som to povodne spravit tak,ze by som zratal cely casovy udaj do jedneho velkeho cisla a potom by som porovnal,ale to sa mi nevojde do unsigned long.
Takato bola predstava:
Cas 16:01:40 datum 26.8.2016, by mal tento format dlheho cisla(datum defacto odzadu): 160826160140
Ibaze toto nefunguje z vyssie spomenuteho dovodu,ze 32bit premenna je na take velke cislo malo a nieco ako double long som v Arduine nenasiel.

Ako by ste to vy riesili?
0

Používateľov profilový obrázok
Najgel
Ultimate člen
Ultimate člen
Príspevky: 1696
Dátum registrácie: 02 Júl 2010, 00:00
Bydlisko: Námestovo, Žilina(škola)
Vek: 29

Re: Porovnanie casovych udajov (RTC)

Príspevok od používateľa Najgel » 26 Aug 2016, 16:16

Nemaš alarm registre v RTC ?

Nabuduce uved aj typ RTC.
0
Keď neodpisujem tak tu nie som, alebo som a neodpisujem :D

MPLAB & PIC
Texas Instruments DSP TMS320Fxxxxx
Tevo Tarantula 3D
Ponúkam 3D tlač.
Ponúkam návrh a vývoj elektroniky na zákazku.

UNIZA 5.ročník

TomasNM
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1379
Dátum registrácie: 22 Jan 2012, 19:24
Bydlisko: Nové Mesto nad Váhom
Vek: 43

Re: Porovnanie casovych udajov (RTC)

Príspevok od používateľa TomasNM » 26 Aug 2016, 16:27

Tak to netusim.
Je to klasicky RTC+SD Shield:
http://www.ebay.com/itm/222115548221?_t ... EBIDX%3AIT
Pouziva kniznicu DS1307RTC.h
Ani ma nenapadlo,ze by to mohol(teda ak vobec) mat ten cip zabudovane,uberal som sa "konvencnou" metodou citania a porovnania.
Prílohy
1311669564603.png
0
Naposledy upravil/-a TomasNM v 26 Aug 2016, 16:35, upravené celkom 1 krát.

Používateľov profilový obrázok
Najgel
Ultimate člen
Ultimate člen
Príspevky: 1696
Dátum registrácie: 02 Júl 2010, 00:00
Bydlisko: Námestovo, Žilina(škola)
Vek: 29

Re: Porovnanie casovych udajov (RTC)

Príspevok od používateľa Najgel » 26 Aug 2016, 16:31

Nemá, tak musíš použiť nejaku inu metodu :)
0
Keď neodpisujem tak tu nie som, alebo som a neodpisujem :D

MPLAB & PIC
Texas Instruments DSP TMS320Fxxxxx
Tevo Tarantula 3D
Ponúkam 3D tlač.
Ponúkam návrh a vývoj elektroniky na zákazku.

UNIZA 5.ročník

Používateľov profilový obrázok
boraicho
Ultimate člen
Ultimate člen
Príspevky: 12418
Dátum registrácie: 03 Feb 2007, 00:00
Bydlisko: Prešov
Vek: 35
Kontaktovať používateľa:

Re: Porovnanie casovych udajov (RTC)

Príspevok od používateľa boraicho » 26 Aug 2016, 18:18

a to skadiaľ maš tu knižnicu?
0
"Aj nevinne vyzerajúca súčiastka, môže byť príčinou nefunkčnosti zariadenia a tou kondenzator 100% je"
3D REBEL II + PLA + PETG
CNC 1810 na DPS

TomasNM
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1379
Dátum registrácie: 22 Jan 2012, 19:24
Bydlisko: Nové Mesto nad Váhom
Vek: 43

Re: Porovnanie casovych udajov (RTC)

Príspevok od používateľa TomasNM » 26 Aug 2016, 18:40

Normalne som ju stiahol tak,aby fungovala.
Bolo to davno.
Teraz myslim,ze bud SD alebo RTC kniznicu som stiahol modifikovanu,ktora umoznuje tento shield pouzit s Mega2560.

Kazdopadne,vypada to tak,ze som problem vyriesil konverziou z tmElements_t do time_t,pricom potom uz iba staci porovnat 2 hodnoty time_t. Tiez som vynechal sekundy zo sledovaneho casu,staci ked sa proces spusti s minutovou presnostou.

Kód: Vybrať všetko

    tmElements_t testtm;
    testtm.Hour=timestart[0];testtm.Minute=timestart[1];testtm.Second=0;testtm.Day=timestart[2];testtm.Month=timestart[3];testtm.Year=CalendarYrToTm(timestart[4]);
    RTC.read(tm);
    time_t time1=makeTime(tm);
    time_t time2=makeTime(testtm);
    if(time1<time2) { lcd.setCursor(0,0);lcd.print("-");} else { lcd.setCursor(0,0);lcd.print("+");}
    lcd.setCursor(0,2);
    lcd.print(inttostr2(tm.Hour)+":"+inttostr2(tm.Minute)+":"+inttostr2(tm.Second)+"  "+inttostr2(tm.Day)+"."+inttostr2(tm.Month)+"."+tmYearToCalendar(tm.Year));
    lcd.setCursor(0,3);
    lcd.print(inttostr2(testtm.Hour)+":"+inttostr2(testtm.Minute)+":"+inttostr2(testtm.Second)+"  "+inttostr2(testtm.Day)+"."+inttostr2(testtm.Month)+"."+tmYearToCalendar(testtm.Year));
0

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: Porovnanie casovych udajov (RTC)

Príspevok od používateľa peterple » 26 Aug 2016, 20:31

32bitový int stačí do roku 2038 ak sa ako začiatok epochy berie rok 1970.
https://en.wikipedia.org/wiki/Year_2038_problem

V tvojom prípade by úplne stačílo aj:

Kód: Vybrať všetko

if (min==xx && hod==xx && ....)
Ale prevod je zase výhodný ak ide o interval a potrebuješ zistiť či si vo vnútri intervalu hocikedy. Nielen v okamihu kedy nastane hraničná hodnota. Napríklad po výpadku napätia.

Ten tvoj prevod na číslo je málo efektívny lebo napr hodiny si násobil *100 v skutočnosti stačí iba 24. A pod.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

martin63
Ultimate člen
Ultimate člen
Príspevky: 1738
Dátum registrácie: 11 Máj 2008, 00:00
Bydlisko: Námestovo
Vek: 34

Re: Porovnanie casovych udajov (RTC)

Príspevok od používateľa martin63 » 26 Aug 2016, 21:39

Nemohol by si spocitat datum?
0

TomasNM
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1379
Dátum registrácie: 22 Jan 2012, 19:24
Bydlisko: Nové Mesto nad Váhom
Vek: 43

Re: Porovnanie casovych udajov (RTC)

Príspevok od používateľa TomasNM » 26 Aug 2016, 21:49

Peterple:
porovnanie samotnych hodnot ma vobec nenapadlo... hupsiii :oops:
Nejako som mal vsugerovane,ze to ma byt rovne ALEBO VIAC,aby sa to spustilo.
Silvester 2037 mi bude stacit bohato.

Martin63:
scitat iba datum a iba cas nestaci,
Cas prechadza dnami,mesiacmi,rokmi atd.a to by zasa skomplikovalo porovnavanie absolutneho casu.

Kazdopadne dakujem za tipy.
0

martin63
Ultimate člen
Ultimate člen
Príspevky: 1738
Dátum registrácie: 11 Máj 2008, 00:00
Bydlisko: Námestovo
Vek: 34

Re: Porovnanie casovych udajov (RTC)

Príspevok od používateľa martin63 » 26 Aug 2016, 22:03

myslel som iba datum. Neviem sice aky sa bude dat nastavit maximany datum, ale ak to nieje viac ako 28dni, tak to mozes podla mna spravit. Cas samozrejme nemozes, lebo ten sediet nebude.
0

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: Porovnanie casovych udajov (RTC)

Príspevok od používateľa peterple » 26 Aug 2016, 22:48

dá sa aj väčší (menší) rovný bez prevodu. To musia byť tie if vnorené do seba (v prípade rovnosti) a porovnáva sa od hora (rok, mesiac, den ..) Na osembitoch si myslím že je to najrýchlejší spôsob. Lebo také násobenie nad 32bitovým int niečo koštuje(ale nieje to žiadna tragédia).
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

TomasNM
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1379
Dátum registrácie: 22 Jan 2012, 19:24
Bydlisko: Nové Mesto nad Váhom
Vek: 43

Re: Porovnanie casovych udajov (RTC)

Príspevok od používateľa TomasNM » 27 Aug 2016, 23:03

Peter,

to som niekde cital,ze 32+ bitove cisla su z nejakeho dovodu neumerne narocnejsie.
Vies prosim vysvetlit,ze preco?
Mne by to az tak nevadilo,ze by to zaberalo vela RAM pocas behu,mam to na Mege a moj projekt(software) mam defacto hotovy a cele je to na stvrtinu moznosti.
Vadil by akurat straveny cas porovnavanim,ak by bol velmi dlhy(>10ms).
0

Používateľov profilový obrázok
Radus
Ultimate člen
Ultimate člen
Príspevky: 1510
Dátum registrácie: 27 Okt 2009, 00:00
Bydlisko: Prešov
Vek: 42

Re: Porovnanie casovych udajov (RTC)

Príspevok od používateľa Radus » 27 Aug 2016, 23:47

...ja by som to testoval vnorenými podmienkami ale od sekúnd, v tom prípade by ti za jednu sekundu zbehla len jedna podmienka, raz za minútu 2 a tak ďalej...a keby ti zbehli všetky, tak si doma :)
0

MiroH
Stály člen
Stály člen
Príspevky: 176
Dátum registrácie: 13 Dec 2009, 00:00
Bydlisko: Nitra
Vek: 60

Re: Porovnanie casovych udajov (RTC)

Príspevok od používateľa MiroH » 28 Aug 2016, 08:57

V inej teme som opisoval moju zavlahu. Tam porovnavam jednotlivo minuty a hodiny, nic zlozite. http://svetelektro.com/modules.php?name ... f0#p633649

Kód: Vybrať všetko

unsigned char porovnaj_cas()
{
    unsigned char i,hod,minute,sec,denx; 
    unsigned char *p_hod, *p_minute, *p_sec;
                 
    p_hod    = &hod;
    p_minute = &minute;
    p_sec    = &sec;

    rtc_get_time(p_hod,p_minute,p_sec);		// nacitam cas z DS1307

    denx= rtc_read(den_t);    				// nacitam aktualny den

    for(i=1; i<= sp_casov; i++)				// cyklus podla poctu spinacich casov
    {
        if (hod == run_times[i].hod)			// porovnam hodiny
        {
            if ( minute == run_times[i].min) 		// porovnam minty
            { 
                if (run_times[i].den & ( 0x01 << denx))      // porovna dni v tyzdni
                {                                                              // -NSPSSUP  <- pondelok
                    return i;                                               // hotovy, vrati index casu, ktory sa zhoduje
                }
            }
        }
    } 
    return 0xff;					// nic sa nezhoduje

PS: je to napisane v CodeVision, do Arduino IDE treba zmenit nacitanie casu z DS1307 podla funkcii z kniznice
0

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: Porovnanie casovych udajov (RTC)

Príspevok od používateľa peterple » 28 Aug 2016, 10:48

MiroH:
je to písané v C. Použitý editor (vývojové prostredie) je tu nepodstatná informácia. Páči sa mi ako si urobil testovanie dní v týždni pomocou jednotlivých bitov v jednom byte. Efektívne riešenie. Ešte by si mohol ušetriť tie pointrové premenné. Vôbec ich nepotrebuješ, pointre na premenné môžeš rovno vyrátať pri volaní funkcie.
Keď už pomocnú premennú tak na 1 << denx, aby sa to nemuselo počítať v každom cykle testu. On totiž má AVR iba rotáciu o jeden bit. Takže na to potrebuje tiež cyklus.

Radus:
Pri teste na zhodu musíš testovať všetky zložky času a tak je jedno či od hora alebo od dola. Pri teste na väčší/menší sa to dá skrátiť ako popisuješ ale testovať treba od hora.
Edit:
Už som pochopil čo si chcel povedať. Ale toto rieši spôsob ipmlementácie konštrukcie if ( podmienka && ....) Akonáhle je niektorá podmienka false tak sa vyhodnocovanie ukončí. Áno ak bude test na sekundy prvý môže to vyjsť efektívnejšie na čas

Tomáš:
To neúmerne by som bral z rezervou. Oproti char alebo int povedzme. Najčastejšie operácie nad celými čislami sú + - * /
teraz to trochu porovnám.
+- nad char je 1 inštrukcia, nad int sú dve a nad longint štyri. Nič dramatického

* nad char je to 1 inštrukcia ale potrebuje dva hodinové cykly, int tam sa to dá rozdeliť na niekoľko násobení pomocou char a spočítania. Long int tam už na to treba cyklus bez všetky bity (teda 32) kde sa robia nejaké rotácie, porovnania a spočítania. Našťastie registrov v AVR je dosť takže všetky potrebné čísla sa dajú držať v nich a netreba robiť dodatočné presuvy medzi pamäťou a CPU

/ kedže AVR nemá inštrukciu na delenie tak sa musí delenie robiť programom. To znamená opäť cyklus cez všetky bity plus rotácie, porovnania a odčítania. Teda pre char to je 8 cyklov pre int je to 16cyklov a pre long int je to 32 cyklov.

Bližšie o tých cyklovaných výpočtoch sa dá dočítať napríklad
http://www.atmel.com/Images/doc0936.pdf
Existujú dve varianty jedna je optimalizovaná na rýchlosť a druhá na veľkosť kódu.

Nejde teda o rád milisekund ale sú to tak desiatky mikrosekund. Dá sa to odmerať v simulátore, alebo ak tomu neveríš, tak aj pomocou osciloskopu. Stačí zacvičiť pred a po výpočte nejakým pinom.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

Napísať odpoveď