Porovnanie casovych udajov (RTC)
Moderátor: Moderátori
-
- 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)
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?
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
- Najgel
- 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)
Nemaš alarm registre v RTC ?
Nabuduce uved aj typ RTC.
Nabuduce uved aj typ RTC.
0
Keď neodpisujem tak tu nie som, alebo som a neodpisujem
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
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
-
- 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)
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.
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.
0
Naposledy upravil/-a TomasNM v 26 Aug 2016, 16:35, upravené celkom 1 krát.
- Najgel
- 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)
Nemá, tak musíš použiť nejaku inu metodu
0
Keď neodpisujem tak tu nie som, alebo som a neodpisujem
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
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
- boraicho
- Ultimate člen
- Príspevky: 12420
- Dátum registrácie: 03 Feb 2007, 00:00
- Bydlisko: Prešov
- Vek: 35
- Kontaktovať používateľa:
Re: Porovnanie casovych udajov (RTC)
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
3D REBEL II + PLA + PETG
CNC 1810 na DPS
-
- 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)
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.
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
-
- 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)
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:
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.
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 && ....)
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í.
-
- 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)
Peterple:
porovnanie samotnych hodnot ma vobec nenapadlo... hupsiii
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.
porovnanie samotnych hodnot ma vobec nenapadlo... hupsiii
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
-
- 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)
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
-
- 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)
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í.
-
- 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)
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).
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
Re: Porovnanie casovych udajov (RTC)
...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
Re: Porovnanie casovych udajov (RTC)
V inej teme som opisoval moju zavlahu. Tam porovnavam jednotlivo minuty a hodiny, nic zlozite. http://svetelektro.com/modules.php?name ... f0#p633649
PS: je to napisane v CodeVision, do Arduino IDE treba zmenit nacitanie casu z DS1307 podla funkcii z kniznice
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
0
-
- 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)
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.
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í.