Arduino èasování
Moderátor: Moderátoři
Arduino èasování
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
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...
- pocitujlasku
- Příspěvky: 1757
- Registrován: 12 pro 2005, 01:00
mas niekolko moznosti.
to ti ale zastavi beh programu na ten cas.
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.
Kód: Vybrat vše
if podmienka {
delay(oneskorenie);
nastav rele;
}
Kód: Vybrat vše
if podmienka {
premenna= aktualne milis+oneskorenie
}
if (premenna<=aktualne milis) {
nastav rele
}
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
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;
}
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;
}
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.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()
Nenapsal jsi zda zpožděné sepnutí bude:net píše:... jak vytvořit zpožděné sepnutí relé? ...
- 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?
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.
A software pøi startu èeká cca10-15s na brejle tedy na jejich sepnutí jinak err.
Č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).
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).