Stránka 1 z 2

Arduino èasování

Napsal: 02 úno 2021, 09:22
od net
Zdravím, poradí nìkdo prosím, jak vytvoøit zpoždìné sepnutí relé? C nìjak moc neovládám jenom obèas nìco s PIC v asm. Díky

Napsal: 02 úno 2021, 09:59
od Zaky
Zrovna toto závisí na programovacím jazyku naprosto minimálně. Zápisem do příslušných registrů nakonfiguruješ a spustíš timer a jeho příslušné přerušení, po odčasování si v přerušení nahodíš příznak a ten budeš testovat v hlavní smyčce. Pak existují takové ty způsoby, jako nechat procesor viset v nějakém cyklu, to je ale z principu blokující a tudíž nevhodná programátorská praktika.

Napsal: 02 úno 2021, 10:19
od net
Díky a nešlo by naznaèit malej pøíklad, nebo odkaz, kde to bude nìjak rozepsané? A ještì dotaz zda je normální za provozu svítící LED RxTx_
Díkuji

Napsal: 02 úno 2021, 10:21
od Zaky
Googli, je toho na netu dostatek.

Napsal: 02 úno 2021, 10:29
od net
Ok díky

Napsal: 02 úno 2021, 11:38
od pocitujlasku
mas niekolko moznosti.

Kód: Vybrat vše

if podmienka {
delay(oneskorenie);
nastav rele;
}
to ti ale zastavi beh programu na ten cas.

Kód: Vybrat vše

if podmienka {
premenna= aktualne milis+oneskorenie
}

if (premenna<=aktualne milis) {
  nastav rele
}
Tu program bude bezat dalej

Alebo cez prerusenie, to uz ale z hlavy nedam. v principe si nastavis interny timer, a on ti po zadanom case spusti tvoju funkciu, kde nastavis rele.
V poslednom moze nastat problem, ak vyuzivas kniznice, ktore pouzivaju tiez timer.

Ja osobne pouzivam druhy sposob. program bezi a +- nejake milisekundy u mna nie su podstatne.

Napsal: 02 úno 2021, 13:01
od net
Díky, nìjak se tím prokousávám.

Napsal: 02 úno 2021, 17:16
od bdn
Arduino má ke stažení knihovnu MsTimer2
URL:https://playground.arduino.cc/Main/MsTimer2/

1/ nastavíš čas a jméno funkce přerušení
MsTimer2::set(500, flash); // 500ms period

2/ nastartuješ, kdy potřebuješ
if (podminka) MsTimer2::start();

3/ po uplynutí arduino 'zavolá' funkci flash(), což je přerušení od časovače TCNT2. Použité proměnné uvnitř by měly být deklarovány jako volatile, pokud se k nim přistupuje i mimo funkci flash()

void flash() {
static boolean output = HIGH;

digitalWrite(13, output);
output = !output;
}

Napsal: 02 úno 2021, 22:03
od net
Díky

Napsal: 03 úno 2021, 12:38
od FHonza
bdn píše:Použité proměnné uvnitř by měly být deklarovány jako volatile, pokud se k nim přistupuje i mimo funkci flash()
Jenom malá poznámka. Deklarace proměnné jako "volatile" uvnitř funkce opravdu nemění její rozsah platnosti. Tj. k takové proměnné nelze přistupovat mimo funkci, ve které je deklarována.

Napsal: 03 úno 2021, 15:24
od Cowley
net píše:... jak vytvořit zpožděné sepnutí relé? ...
Nenapsal jsi zda zpožděné sepnutí bude:
- vyvolané např. externím vstupem
- vyvolané nějakou událostí v programu nezávisle na vstupech

a zda "zpožděné sepnutí" znamená:
- čekat nějakou dobu, co nějaká událost trvá a pokud nezmizí tak teprve pak sepnout?
- nebo objeví se událost, kvůli které má být relé sepnuto a protože je událost mžiková, sepneme relé a prodloužíme jeho sepnutí na nějakou delší dobu?

Napsal: 03 úno 2021, 19:53
od net
Dìkuji za reakce. A k popisu fungování zaøízení:
Je aku 18650 na pin Arduina a po zapnutí, pokud nepadne napìtí pod cca 3,67V, sepne po 15sec. jiný pin na 1sec. Zaøízení je napájeno a nabíjeno z USB portu PC- zatím. Po vypnutí PC relé opìt sepne na 1sec.

Napsal: 03 úno 2021, 20:15
od Cowley
Zařízení je napájeno z USB PC?
Po vypnutí PC už nic nezafunguje...

Napsal: 03 úno 2021, 21:47
od net
Ano zaøízení je napájeno z PC vè. Arduina.V PC nabíhá OS a následnì software. Zaøízením je myšleno 3D brýle, které jsou krmeny 18650. Po vypnutí resp. ukonèení programu pochopitelnì musí vypnout brýle, než se ukonèí OS - ano a potom už nejde nic.
A software pøi startu èeká cca10-15s na brejle tedy na jejich sepnutí jinak err.

Napsal: 04 úno 2021, 16:35
od mluno
Časovače patří k mým oblíbeným periferiím. U arduina jsem ale několikrát narazil, protože ono pro svou potřebu nějaký ten timer používá. Dost dlouho jsem takto řešil podivné chování programu něco šlo právě na úkor toho, ale ně všechno se mi tím podařilo vysvětlit.
Pokud neni potřeba nějakou extra přesnost, dalo by se periodicky zjišťovat milis()
něco jako if milis()>=cas_akce .... Zejména pokud program nemá dělat nic jiného než právě toto.
Případně by se to dalo napsat v assembleru nebo v něčem bez použití knihoven arduina a pak to tam naloadovat přes bootloader (použít ten samý příkaz avrdude, jako používá arduino IDE ale hex soubor nahradit svým ostatní ponechat).