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).