Arduino časování

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Zpráva
Autor
Uživatelský avatar
net
Příspěvky: 205
Registrován: 07 kvě 2004, 00:00

Arduino časování

#1 Příspěvek 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
Uživatelský avatar
Zaky
Příspěvky: 7050
Registrován: 30 říj 2010, 00:00
Bydliště: Praha

#2 Příspěvek 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.
Krátce před tím, než se to rozbilo, tak to ještě fungovalo...
Uživatelský avatar
net
Příspěvky: 205
Registrován: 07 kvě 2004, 00:00

#3 Příspěvek 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
Uživatelský avatar
Zaky
Příspěvky: 7050
Registrován: 30 říj 2010, 00:00
Bydliště: Praha

#4 Příspěvek od Zaky »

Googli, je toho na netu dostatek.
Krátce před tím, než se to rozbilo, tak to ještě fungovalo...
Uživatelský avatar
net
Příspěvky: 205
Registrován: 07 kvě 2004, 00:00

#5 Příspěvek od net »

Ok díky
Uživatelský avatar
pocitujlasku
Příspěvky: 2764
Registrován: 12 pro 2005, 00:00
Bydliště: SR, Poprad

#6 Příspěvek 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.
No vidis, a tak si sa bal
Uživatelský avatar
net
Příspěvky: 205
Registrován: 07 kvě 2004, 00:00

#7 Příspěvek od net »

Díky, nějak se tím prokousávám.
Uživatelský avatar
bdn
Příspěvky: 560
Registrován: 16 led 2020, 00:00

#8 Příspěvek 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;
}
Uživatelský avatar
net
Příspěvky: 205
Registrován: 07 kvě 2004, 00:00

#9 Příspěvek od net »

Díky
Uživatelský avatar
FHonza
Příspěvky: 1443
Registrován: 20 lis 2012, 00:00
Bydliště: Praha

#10 Příspěvek 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.
Uživatelský avatar
Cowley
Příspěvky: 3557
Registrován: 04 úno 2005, 00:00

#11 Příspěvek 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?
Uživatelský avatar
net
Příspěvky: 205
Registrován: 07 kvě 2004, 00:00

#12 Příspěvek 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.
Uživatelský avatar
Cowley
Příspěvky: 3557
Registrován: 04 úno 2005, 00:00

#13 Příspěvek od Cowley »

Zařízení je napájeno z USB PC?
Po vypnutí PC už nic nezafunguje...
Uživatelský avatar
net
Příspěvky: 205
Registrován: 07 kvě 2004, 00:00

#14 Příspěvek 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.
Uživatelský avatar
mluno
Příspěvky: 266
Registrován: 18 dub 2011, 00:00
Bydliště: Benešov (u Prahy)

#15 Příspěvek 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).
Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“