Diskuze: Funkce millis

Člen

Zobrazeno 14 zpráv z 14.
K personalizaci obsahu a reklam, poskytování funkcí sociálních médií a analýze naší návštěvnosti využíváme soubory cookie. Informace o tom, jak náš web používáte, sdílíme se svými partnery pro sociální média, inzerci a analýzy. Partneři tyto údaje mohou zkombinovat s dalšími informacemi, které jste jim poskytli nebo které získali v důsledku toho, že používáte jejich služby.
Používáme nezbytné cookies pro fungování webu a s tvým souhlasem také analytické a marketingové cookies.
Zajišťují základní funkce, bezpečnost a služby, které sis vyžádal. Nelze je vypnout.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| ITnetwork | ITnetwork | Provoz webu, relace, přihlášení a uložení nastavení cookies. | PHPSESSID, auth_token, sid, itn_consent_impression, __Host-itn_consent | Relace až 1 rok |
| Google Tag Manager | Správa značek a načítání měřicích nástrojů webu. | Žádné | Neukládá se | |
| Google Fonts | Načítání typografie webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google Hosted Libraries | Načítání potřebných knihoven a stylů webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google reCAPTCHA | Ochrana formulářů a webu před zneužitím. | _GRECAPTCHA, rc::a, rc::b, rc::c, rc::f | Relace až 180 dní | |
| YouTube | Přehrávání vloženého video obsahu. | localStorage, IndexedDB; cookies after playback interaction | Relace až trvalé úložiště | |
| Vimeo | Vimeo | Přehrávání vloženého video obsahu. | __cf_bm, _cfuvid, vuid, localStorage, IndexedDB | Relace až 2 roky |
| Facebook Login | Meta | Přihlášení pomocí účtu třetí strany. | Úložiště řízené poskytovatelem | Relace až 1 rok |
| GoPay | GoPay | Zpracování uživatelem vyžádané platby. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
Pomáhají nám porozumět používání webu a zlepšovat ho.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Analytics 4 | Měření návštěvnosti a používání webu. | _ga, _ga_* | Až 2 roky | |
| Microsoft Clarity | Microsoft | Měření návštěvnosti a používání webu. | _clck, _clsk, _cltk | Relace až 1 rok |
Slouží k měření kampaní, personalizaci reklamy a marketingové komunikaci.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Ads | Měření kampaní, reklama a remarketing. | _gcl_au, _gcl_ls | Relace až 90 dní | |
| Meta Pixel | Meta | Měření kampaní, reklama a remarketing. | _fbp, _fbc, localStorage | Až 90 dní |
| Sklik | Seznam.cz | Měření kampaní, reklama a remarketing. | retargeting, sid, szn:* | Relace až trvalé úložiště |
| LinkedIn Insight | Měření kampaní, reklama a remarketing. | bcookie, li_gc, lidc, __cf_bm | Relace až 1 rok | |
| Ecomail | Ecomail.cz | Měření kampaní, reklama a remarketing. | ecmid, Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
| Atribuce kampaní ITnetwork | ITnetwork | Přiřazení návštěvy a objednávky ke kampani. | campaign_clid[*], user_session_context | Až 1 rok |


Při stisknutí si do nějaké proměnné typu long uložíš číslo, co ti vrátí funkce millis. Na začátku loopu jenom zkontroluješ, jestli to co vrací millis teď není o pět minut větší než to co máš uložené a a pokud ano, uběhlo 5 minut a vypneš si to.
Podle dokumentace mi přijde, že by v tom neměl být problém. Ta funkce ti řekne, kolik milisekund aktuálně uplynulo od počátku vesmíru (startu aktuálního programu), takže ji můžeš využít ke měření "relativního" času.
Prosím, mohli by jste mi pomoct?
Pořád řeším to zpoždění relé, a nedaří se mi nastavit to zpoždění
vypnutí.
Předem děkuji.
#include <IRremoteInt.h>
#include <IRremote.h>
int recv_pin = 11;
IRrecv irrecv(recv_pin);
decode_results results;
int led_pin_1 = 13;
int rele_pin_1 = 10;
unsigned long otvira = 2000;
unsigned long cas_akce = 0;
unsigned long aktualni_cas = 0;
void setup()
{
pinMode(led_pin_1, OUTPUT);
pinMode(rele_pin_1, OUTPUT);
irrecv.enableIRIn(); // Start the receiver
}
void loop()
{
if (irrecv.decode(&results)) {
Serial.println(results.value, HEX);
if (results.value == 16580863) {
digitalWrite(led_pin_1, HIGH);
digitalWrite(rele_pin_1, HIGH);
cas_akce = millis();
}
if (millis() > cas_akce - otvira) {
digitalWrite(rele_pin_1, LOW);
}
irrecv.resume();
}
}
Řešíte někdo nebezpečí, že to takto budete počítat cca 50 dní po startu, kdy se millis opět mění na 0?
Pokud budeš testovat, že uplynul určitý časový interval takto
if (milis() - start > velikost_intervalu)
problém by to být neměl.
Ale jinak máš samozřejmě pravdu.
Asi to nechápu.
Pokud akce nastane méně než velikost intervalu před překlopením millis na
0, tak bude millis - start záporné. Tudíž bude menší, než velikost
intervalu.
millis vrací bezznaménkové číslo, takže zápornost nehrozí. Pak jde jenom o to pracovat s rozdílem hodnot vrácených touto funkcí, ne s hodnotami samotnými. Pak přetečení nevadí.
No a tomu všemu se vyhneš tím, že nebudeš millis()
vůbec používat - protože na časování má Atmega časovač - dokonce
několik, který běží nezávisle na procesoru a když odpočítá nastavený
čas tak ti dá vědět - vyvolá přerušení ve kterém si to relé
shodíš
Výhody: nemusíš neustále porovnávat čas, běží asynchronně, odpadne ti
ta opičárna s testováním a přepočítáváním při přetečení.
Moc mi neleze do hlavy, že tvůrci Arduina timer/counter totálně ignorují a
časy řeší funkcemi milllis/micros , nebo hůř pomocí
delay
naštěstí na Gitu je knihoven pro timer/counter hned několik.
funkce millis má snad opodstatnění u časů v řádech jednotek milisekund
Možná proto, že pro ty, co se s tím ještě moc nesetkali, jsou obecně přerušení či vícevláknové věci dosti zdrádné, takže se snažili (autoři) jimž život zjednodušit.
Pokud vím, tak Arduino knihovny časovače využívají interně, takže se můžeš dostat do průšvihu, pokud některý ze "zabraných" časovačů použiješ pro vlastní účely. Co si pamatuju, tak zrovna funkce delay je implementována přes TimerCounter0.
Ano a PWM požívá timer 2 - proto ty knihovny na Gitu jsou pro timer 1 nebo
3, ale taky nemusíš vůbec použít delay, nebo PWM - pak ti to žádnou
paseku nenadělá - to už je ale mimo začátečníky 
Jinak o vláknech bych se na osmibitovém procesoru snad ani nebavil, časovače , stejne jako všechny sériovky jsou periferie - tedy HW záležitost nezávislá na samotném procesoru - u 32 bitových mcu mají tyto periferie dokonce autonomní napájení a hodiny, takže procesor, timer a třeba SPI můžou jet každý na jiném taktu
Vím, že opravdová vlákna tam nejsou a že je to rozumné (vzhledem k režii). Prostě je to o tom, že je třeba myslet na to, že vykonávání kódu může být v každém okamžiku přerušeno (vyjma těch pevně definovaných). Toj e všechno.
Dobrý den nevíte někdo jak tohle vytvořit? s diagramem?
Napište program pro střídavé blikání LED L2 a L3 na desce Tinylab
(právě jedna LED bude svítit). Perioda blikání je 1s. Pro přepínání
stavů použijte funkci millis().
Program včetně hlavičky a vývojového diagramu
Zobrazeno 14 zpráv z 14.