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: 200
Registrován: 07 kvě 2004, 02: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: 6129
Registrován: 30 říj 2010, 02: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: 200
Registrován: 07 kvě 2004, 02: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: 6129
Registrován: 30 říj 2010, 02: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: 200
Registrován: 07 kvě 2004, 02:00

#5 Příspěvek od net »

Ok díky

Uživatelský avatar
pocitujlasku
Příspěvky: 1757
Registrován: 12 pro 2005, 01:00

#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: 200
Registrován: 07 kvě 2004, 02:00

#7 Příspěvek od net »

Díky, nìjak se tím prokousávám.

Uživatelský avatar
bdn
Příspěvky: 436
Registrován: 16 led 2020, 01: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: 200
Registrován: 07 kvě 2004, 02:00

#9 Příspěvek od net »

Díky

Uživatelský avatar
FHonza
Příspěvky: 1443
Registrován: 20 lis 2012, 01: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: 3087
Registrován: 04 úno 2005, 01: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: 200
Registrován: 07 kvě 2004, 02: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: 3087
Registrován: 04 úno 2005, 01: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: 200
Registrován: 07 kvě 2004, 02: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: 227
Registrován: 18 dub 2011, 02: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ů“