Funkcia raz za hodinu
Moderátor: Moderátori
Funkcia raz za hodinu
Ahojte, mám kód, ktorý obsahuje delaye a je dosť dlhý. Potrebujem ale spúšťať raz za hodinu jednu funkciu, ktorá bude robiť špecifický HTTP request. Loop sa opakuje každých cca 6s a tiež robí http requesty, ktoré sú pravidelné. Vedel by mi niekto poradiť ako docieliť spustenie tej funkcie raz za hodinu? Existuje niečo ako paralelne vykonavanie, alebo niečo na ten štýl? Ďakujem!
-
- Nový člen
- Príspevky: 78
- Dátum registrácie: 13 Aug 2017, 10:21
- Bydlisko: Revúca
Re: Funkcia raz za hodinu
Pre opakujúce vykonávanie príkazov stará väčšinou daemon cron.
Viac si to pozri tu
Viac si to pozri tu
0
-
- Ultimate člen
- Príspevky: 2555
- Dátum registrácie: 20 Júl 2010, 00:00
- Bydlisko: okolie KE
- Vek: 27
Re: Funkcia raz za hodinu
Otázka je v sekcii pre Arduino.
Tu budú potrebné prerušenia, a časovače Atmegy (pre Uno je to Atmega328). https://playground.arduino.cc/Code/Timer1
Problém je že časovač 1 môže byť používaný rôznymi inými knižnicami, a keď prepíšete jeho konfiguráciu, tieto knižnice prestanú fungovať.
Tu budú potrebné prerušenia, a časovače Atmegy (pre Uno je to Atmega328). https://playground.arduino.cc/Code/Timer1
Problém je že časovač 1 môže byť používaný rôznymi inými knižnicami, a keď prepíšete jeho konfiguráciu, tieto knižnice prestanú fungovať.
0
-
- Ultimate člen
- Príspevky: 3963
- Dátum registrácie: 04 Feb 2013, 22:04
- Bydlisko: U alibabky v Poprade
- Vek: 32
Re: Funkcia raz za hodinu
Paralelne vykonavanie?
Ved to je princip normalneho fungovania vsetkych jednocipov. Je blud a totalne amaterske, mat len jednu slucku v programe a zdrziavat ju nejakym delayom.
Vacsinou sa veci riesia casovacmi. Zaklad casovac dajme tomu na 1ms a v obsluhe prerusenia inkrementovat. Na zaklade toho si odvodit premenne pre napr. 10ms, 100ms a 1s. A s nimi dalej pracovat.
Ale ci to vie arduino kniznica a ako sa to robi, to uz neviem ...
Ved to je princip normalneho fungovania vsetkych jednocipov. Je blud a totalne amaterske, mat len jednu slucku v programe a zdrziavat ju nejakym delayom.
Vacsinou sa veci riesia casovacmi. Zaklad casovac dajme tomu na 1ms a v obsluhe prerusenia inkrementovat. Na zaklade toho si odvodit premenne pre napr. 10ms, 100ms a 1s. A s nimi dalej pracovat.
Ale ci to vie arduino kniznica a ako sa to robi, to uz neviem ...
0
Motto: Nikto nie je tak velky, aby sa nevosiel do truhly.
-
- Ultimate člen
- Príspevky: 2328
- Dátum registrácie: 25 Jún 2013, 21:06
- Bydlisko: Krajné
- Vek: 57
- Kontaktovať používateľa:
Re: Funkcia raz za hodinu
V prvom rade, koľko má to Arduíno jadier? Keď na to chceš ísť paralelným vykonávaním. Neškodilo by držať sa možností architektúry na ktorej úloha beží. Ak má niečo jedno CPU paralelizmus je jaksi vylúčený. To ale treba poznať rozdiel medzi paralelizmom a multitaskingom.martinius96 napísal:Vedel by mi niekto poradiť ako docieliť spustenie tej funkcie raz za hodinu? Existuje niečo ako paralelne vykonavanie, alebo niečo na ten štýl? Ďakujem!
Funkcia raz za hodinu sa spustí za pomoci rozumného kódu, napríklad s funkciou milis. Keby si si urobil to odstraňovanie zákmitov (ale sám), nie pomocou nejakej cudzej funkcii. A pochopil by si ako to pracuje tak by si možno prišiel na to, že je úplne jedno či sa čaká 10ms na ukludnenie kontaktu tlačítka, alebo 60*60*1000ms než uplynie hodina.
Ale pre teba mám tiež radu. Nájdi si nejaký projekt kde sú urobené hodiny a spúštaj si tú tvoju funkciu keď sa tam prepne hodina.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.
-
- Pokročilý člen
- Príspevky: 752
- Dátum registrácie: 24 Jún 2010, 00:00
- Bydlisko: Trnava
- Vek: 68
Re: Funkcia raz za hodinu
Pri použití funkcie milis(). treba ešte pamätať na to, že táto hodnota sa asi po 50-tich dňoch resetne.
"Returns the number of milliseconds since the Arduino board began running the current program. This number will overflow (go back to zero), after approximately 50 days."
"Returns the number of milliseconds since the Arduino board began running the current program. This number will overflow (go back to zero), after approximately 50 days."
0
S.K.
-
- Ultimate člen
- Príspevky: 2328
- Dátum registrácie: 25 Jún 2013, 21:06
- Bydlisko: Krajné
- Vek: 57
- Kontaktovať používateľa:
Re: Funkcia raz za hodinu
nerozumiem varovaniu. Veď hodina je snáď o hodne menej ako 50 dní. To že to počítadlo pretečie a pôjde zase od nuly ničomu neublíži, aj keby to bolo raz za deň. Počíta sa s rozdielom a nie s absolútnou hodnotou.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.
- boraicho
- Ultimate člen
- Príspevky: 12404
- Dátum registrácie: 03 Feb 2007, 00:00
- Bydlisko: Prešov
- Vek: 35
- Kontaktovať používateľa:
Re: Funkcia raz za hodinu
a ako vyzera ta funkcia milis?
to je špeci kod pre C? alebo pre arduiono?
to je špeci kod pre C? alebo pre arduiono?
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
-
- Ultimate člen
- Príspevky: 2328
- Dátum registrácie: 25 Jún 2013, 21:06
- Bydlisko: Krajné
- Vek: 57
- Kontaktovať používateľa:
Re: Funkcia raz za hodinu
Špécia pre arduíno. Využíva to jeden z časovačov. Ale samozrejme ak tomu rozumieš vieš si podľa toho napísať vlastnú na hocijaký procesor čo má hw časovač.
Tuto to je dopodrobna rozpitvané.
https://ucexperiment.wordpress.com/2012 ... -function/
Tuto to je dopodrobna rozpitvané.
https://ucexperiment.wordpress.com/2012 ... -function/
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.
-
- Ultimate člen
- Príspevky: 5036
- Dátum registrácie: 01 Okt 2009, 00:00
- Bydlisko: Podunajska pahorkatina
- Vek: 36
Re: Funkcia raz za hodinu
Tento kód bude rátať sekundy,keď naráta 3600s vykoná tvoju funkciu nezávisle od loop funkcie.martinius96 napísal:Ahojte, mám kód, ktorý obsahuje delaye a je dosť dlhý. Potrebujem ale spúšťať raz za hodinu jednu funkciu, ktorá bude robiť špecifický HTTP request. Loop sa opakuje každých cca 6s a tiež robí http requesty, ktoré sú pravidelné. Vedel by mi niekto poradiť ako docieliť spustenie tej funkcie raz za hodinu? Existuje niečo ako paralelne vykonavanie, alebo niečo na ten štýl? Ďakujem!
Neviem akú máš dosku a MCU,ani na akej frekvencií ti MCU tiká,ale na vačšine arduino (ATmega 328/32u4/2560) dosiek by to malo pracovať. Niektoré funkcie ako delay či millis môžu prestať pracovať korektne.Nie som si istý či využívajú časovač 0 alebo 1. Vyskúšaj a daj vedieť.
Kód: Vybrať všetko
int cycle = 0;
void setup() {
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 3036;
TCCR1B |= (1 << CS12);
TIMSK1 |= (1 << TOIE1);
}
ISR (TIMER1_OVF_vect) {
TCNT1 = 3036;
cycle++;
if (cycle == 3600) {
//"sem daj svoju funkciu ktorú potrebuješ vykonať raz za hodinu"
cycle = 0;
}
}
void loop() {}
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: Funkcia raz za hodinu
Dobrá rada stojí groš, ale za túto by som veľa nedal:
Páni majstri zapamätajte si že z prerušenia sa nevykonávajú žiadne časovo náročné funkcie. A keby náhodou záviseli na nejakom prerušení tak je to dead lock jak vyšitý.
Inak prečo je toto spoľahlivejšie ako milis()? Oboje je založené na časovači. Oboje zblbne len vtedy ak si to zblbne programátor keď nevie čo robí. Napríklad tým že volá divočiny rovno z prerušenia.
No a delay nemá žiadny dôvod nefungovať. Ten bude fungovať vždy. Jediný dôvod kedy sa môže zdať že zlyhal je zase nejaká prasačina s prerušením.
V tomto mieste sú zakázané prerušenia.mr.mio napísal: ISR (TIMER1_OVF_vect) {
TCNT1 = 3036;
cycle++;
if (cycle == 3600) {
//"sem daj svoju funkciu ktorú potrebuješ vykonať raz za hodinu"
Len to nie.
cycle = 0;
}
}
Páni majstri zapamätajte si že z prerušenia sa nevykonávajú žiadne časovo náročné funkcie. A keby náhodou záviseli na nejakom prerušení tak je to dead lock jak vyšitý.
Inak prečo je toto spoľahlivejšie ako milis()? Oboje je založené na časovači. Oboje zblbne len vtedy ak si to zblbne programátor keď nevie čo robí. Napríklad tým že volá divočiny rovno z prerušenia.
No a delay nemá žiadny dôvod nefungovať. Ten bude fungovať vždy. Jediný dôvod kedy sa môže zdať že zlyhal je zase nejaká prasačina s prerušením.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.
-
- Ultimate člen
- Príspevky: 3963
- Dátum registrácie: 04 Feb 2013, 22:04
- Bydlisko: U alibabky v Poprade
- Vek: 32
Re: Funkcia raz za hodinu
Mal som to "na jazyku", ale zas by som bol za rypaveho.
Do ISR urcite funkcia nepatri, hlavne nie copy paste, tam je potrebne si maximalne tak nastavit premennu (v tomto pripade cycle), ktoru si v hlavnej slucke skontrolujes a ak je nastavena, zavolat funkciu a znulovat.
Aj mna ucili, ze v obsluhe prerusenia sa robi minimum vlastnych instrukcii.
Do ISR urcite funkcia nepatri, hlavne nie copy paste, tam je potrebne si maximalne tak nastavit premennu (v tomto pripade cycle), ktoru si v hlavnej slucke skontrolujes a ak je nastavena, zavolat funkciu a znulovat.
Aj mna ucili, ze v obsluhe prerusenia sa robi minimum vlastnych instrukcii.
0
Motto: Nikto nie je tak velky, aby sa nevosiel do truhly.
-
- Pokročilý člen
- Príspevky: 752
- Dátum registrácie: 24 Jún 2010, 00:00
- Bydlisko: Trnava
- Vek: 68
Re: Funkcia raz za hodinu
pre peterple:
podľa zadania, chce spúšťať funkciu každú hodinu, tak predpokladám, že to pôjde nonstop.
Moje varovanie bolo myslené tak, že v prípade výpočtu hodiny tak, že urobí rozdiel aktualneho počtu milisekúnd od posledne zapamätamému, v jednom cykle (po pretečení počítadla ms) dostane záporný počet ms.
podľa zadania, chce spúšťať funkciu každú hodinu, tak predpokladám, že to pôjde nonstop.
Moje varovanie bolo myslené tak, že v prípade výpočtu hodiny tak, že urobí rozdiel aktualneho počtu milisekúnd od posledne zapamätamému, v jednom cykle (po pretečení počítadla ms) dostane záporný počet ms.
0
S.K.
-
- Ultimate člen
- Príspevky: 6186
- Dátum registrácie: 20 Júl 2007, 00:00
- Vek: 41
Re: Funkcia raz za hodinu
ja som to riesil najprimitivnejsie, ako to ide. Mam premennu, kde si ukladam datum a cas + hodina. Jednoducho porovnavam ci je >=ako aktualny, ak ano, tak si do premennej ulozim datum a cas + hodina (tzn. kedy sa ma opat vykonat), vykonam request a vybavene. Moze tam nastat +- posun, preto bud to nastavim pred vykonanim requestu, alebo natvrdo davam minuty a sekundy na 0 (ak to chcem presne).
Pri prvom spusteni ju nastavim na 0 - teda sa vykona hned. Problem tam moze nastat, ked sa synchronizuje datum a cas, ale to sa da osetrit.
Pri prvom spusteni ju nastavim na 0 - teda sa vykona hned. Problem tam moze nastat, ked sa synchronizuje datum a cas, ale to sa da osetrit.
0
Jedním z největších projevů nedůvěry v Boha je hromosvod na kostele.
Re: Funkcia raz za hodinu
Nemam zapojene Arduino, dlho som ho neprogramoval, tak len zakladná idea:
Kód: Vybrať všetko
void once_per_hour() {
if (millis()<3600*1000) return;
print ("once_per_hour executed")
// v Arduine je funkcia, co da millis na 0
reset_millis();
}
void loop() {
task_1();
task_2();
once_per_hour();
task_3();
}
0
Samozřejmě, že dědeček nemá kapesní hodinky poháněné elektřinou. Takový nesmysl si může vymyslit jen Saturnin. (Zdenek Jirotka, 1942)
-
- Pokročilý člen
- Príspevky: 752
- Dátum registrácie: 24 Jún 2010, 00:00
- Bydlisko: Trnava
- Vek: 68
Re: Funkcia raz za hodinu
nedoporučuje sa používať reset_millis0.
Arduino: How do you reset millis() ?
by James Lewis
The quick answer to “How do you reset millis()” is: You Don’t! And here’s why: if you did, it would potentially break most libraries and functions that rely on it. Generally the reason people want to reset it, is that they are concerned about rollover. Instead of focusing on resetting millis(), here is how to use it correctly.....
Arduino: How do you reset millis() ?
by James Lewis
The quick answer to “How do you reset millis()” is: You Don’t! And here’s why: if you did, it would potentially break most libraries and functions that rely on it. Generally the reason people want to reset it, is that they are concerned about rollover. Instead of focusing on resetting millis(), here is how to use it correctly.....
0
S.K.
-
- Ultimate člen
- Príspevky: 5036
- Dátum registrácie: 01 Okt 2009, 00:00
- Bydlisko: Podunajska pahorkatina
- Vek: 36
Re: Funkcia raz za hodinu
Ale veď to je už na ňom čo si tam dá. Môže tam napísať celú funkciu a zistí že to nefunguje,alebo prepísať jeden boolean na true a v loop použiť jednoduchú podmienku if v ktorej vyžiada http a boolean prepíše na false. Podmienka bude splnená raz za hodinu.peterple napísal:Páni majstri zapamätajte si že z prerušenia sa nevykonávajú žiadne časovo náročné funkcie. A keby náhodou záviseli na nejakom prerušení tak je to dead lock jak vyšitý.
A čo sa stane ak aj vykoná funkciu ktorej exekúcia je kratšia ako interval prerušení? A aj to iba raz za 3600 prerušení.
Nechcem sa hádať,nie som programátor,skôr hobbysta. Rád sa nechám poučiť.
0
- lucky62
- Zaslúžilý člen
- Príspevky: 1151
- Dátum registrácie: 14 Feb 2012, 20:16
- Bydlisko: Liptovský Mikuláš, SK
Re: Funkcia raz za hodinu
Všetko bolo dávno vymyslené - millis() funguje perfektne:
https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay
Netreba prerušenia ani delay()...
Ak by niekoho niekomu vŕtalo v hlave, že pri pretečení millis() môže dôjsť k chybe, tak nemôže... (ak bude zachovaný spôsob porovnania časových intervalov).
Finta je vtom, že sa neporovnáva priamo čas millis() ale rozdiel časov millis() - previousMillis a pretože operandy sú unsigned long, aritmetika sa s tým sama vysporiada a vypočítaný interval bude vždy OK.
Nejaké zložitejšie vysvetlenie nájdete na tomto linku.
https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay
Netreba prerušenia ani delay()...
Ak by niekoho niekomu vŕtalo v hlave, že pri pretečení millis() môže dôjsť k chybe, tak nemôže... (ak bude zachovaný spôsob porovnania časových intervalov).
Finta je vtom, že sa neporovnáva priamo čas millis() ale rozdiel časov millis() - previousMillis a pretože operandy sú unsigned long, aritmetika sa s tým sama vysporiada a vypočítaný interval bude vždy OK.
Nejaké zložitejšie vysvetlenie nájdete na tomto linku.
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: Funkcia raz za hodinu
Hurá. Konečne jeden čo vie ako funguje binárna sústava.
StefanSK: žiadne záporné číslo tam nebude.
mr.mio:
Stať sa môže všeličo:
1. nič, iba sa stratí pár prerušení, takže napr milis pôjde pár ms (alebo aj sekund) pozadu. Ak to nie sú hodiny tak sú škody minimálne.
2. zmrzne to - to vtedy ak tá volaná funkcia jednoznačne bude čakať na niečo čo sa stane len po obsluhe iného prerušenia. Toto sa volá dead lock . Pretože sú zakázané obsluhy prerušení tak sa to obslúžiť nemôže a funkcia bude čakať večne.
3. zmrzne to len niekedy. Zvyčajne dosť nepravidelne a málo často. To je napr vtedy ak za normálnych podmienok sa na prerušenie nečaká. Ale za nenormálnych to nastať môže a vtedy to padne. Trebárs u toho http môže byť takýto scenár. Normálne sa tá http požiadavka nabufruje a teda obsluha funkcie http požiadavky skončí. Potom sa to vráti z prerušenia a tá bufrovaná požiadavka sa začne obluhovať a dorazí odpoveď a je všetko v poriadku. Môže sa ale stať z nejakého dôvodu (pomalá linka ...) že ten bufer nebude prázdny a tak sa tam tá nová požiadavka nezmestí. V takom prípade to volanie prechádza do blokujúceho režimu a čaká až sa ten bufer vyprázdni. Za normálnych okolností by sa tak stalo lebo by boli povolené prerušenia a nejako by sa to odvysielalo. Lenže teraz je prerušenie zakázané, nepošleš ani byte, nie to paket. Takže ti to zamrzlo. A udeje sa ti to raz za týždeň.
Tak potom začneš rozprávať že tá alebo oná funkcia občas nefunguje. Lebo si to nevieš nijako vysvetliť prečo to nastáva.
StefanSK: žiadne záporné číslo tam nebude.
mr.mio:
Stať sa môže všeličo:
1. nič, iba sa stratí pár prerušení, takže napr milis pôjde pár ms (alebo aj sekund) pozadu. Ak to nie sú hodiny tak sú škody minimálne.
2. zmrzne to - to vtedy ak tá volaná funkcia jednoznačne bude čakať na niečo čo sa stane len po obsluhe iného prerušenia. Toto sa volá dead lock . Pretože sú zakázané obsluhy prerušení tak sa to obslúžiť nemôže a funkcia bude čakať večne.
3. zmrzne to len niekedy. Zvyčajne dosť nepravidelne a málo často. To je napr vtedy ak za normálnych podmienok sa na prerušenie nečaká. Ale za nenormálnych to nastať môže a vtedy to padne. Trebárs u toho http môže byť takýto scenár. Normálne sa tá http požiadavka nabufruje a teda obsluha funkcie http požiadavky skončí. Potom sa to vráti z prerušenia a tá bufrovaná požiadavka sa začne obluhovať a dorazí odpoveď a je všetko v poriadku. Môže sa ale stať z nejakého dôvodu (pomalá linka ...) že ten bufer nebude prázdny a tak sa tam tá nová požiadavka nezmestí. V takom prípade to volanie prechádza do blokujúceho režimu a čaká až sa ten bufer vyprázdni. Za normálnych okolností by sa tak stalo lebo by boli povolené prerušenia a nejako by sa to odvysielalo. Lenže teraz je prerušenie zakázané, nepošleš ani byte, nie to paket. Takže ti to zamrzlo. A udeje sa ti to raz za týždeň.
Tak potom začneš rozprávať že tá alebo oná funkcia občas nefunguje. Lebo si to nevieš nijako vysvetliť prečo to nastáva.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.
Re: Funkcia raz za hodinu
Celkom suhlasim, jednalo sa mi o to, dat najjadnochsie riesenie, ktore si upravi.stefanSK napísal:nedoporučuje sa používať reset_millis0.
Ta ukazka z arduino.cc za moc nestoji:
- vsetko v main(), casto sa to tazko upravuje, ak to chces adaptovat na funkciu
- zbytocne vela operacii a variables:
Kód: Vybrať všetko
if (millis()>Next) {
Next+=interval;
}
0
Samozřejmě, že dědeček nemá kapesní hodinky poháněné elektřinou. Takový nesmysl si může vymyslit jen Saturnin. (Zdenek Jirotka, 1942)