Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: daew13 28. 12. 2015, 16:32:25
-
Zdravím, prosím o radu. Dělám aplikaci s Arduinem Mega a potřebuji použít dvě funkce přerušení na jednom pinu. Deklarované nějak takto:
.......
attachInterrupt(4, Funkce1, RISING); //zavolá funci1 při vzestupné hraně
attachInterrupt(4, Funkce2, FALLING); //zavolá funci2 při sestupné hraně
.......
.......
Uvedené přerušení mi bohužel nikdy nezavolá Funkci1, vždy pouze Funkci2. Takže takováto dvojitá deklarace jednoho vstupu je zakázána a první deklarace se přepíše tou poslední nebo musím hledat chybu někde jinde? Díky moc, daew.
-
Interupt umi obslouzit jen jednu funkci, v ni si pak klidne rozvetvuj jak chces.
-
Je to presne jak rikas, to druhe prepise to prvni.
Musis pouzit CHANGE a udrzovat si stav jaka udalost se stala naposled, pripadne precist stav toho konkretniho pinu (ale to jsem nekde cetl, ze je pry pomale). Taky promenne ke kterym v preruseni pristupujes musi byt volatile.
A muzes pouzit makro digitalPinToInterrupt(cisloPinu) misto primo cisla interruptu, je to pak citelnejsi.
-
Bezva, děkuju vám za rychlou odpověď. Takhle, jak to mám, je to strašně jednoduché. Protože to nefungovalo, tak jsem to chtěl už udělat přes jednu funkci, ale jelikož to bude o dost složitější a tím méně přehledné, tak než jsem se do toho pustil, chtěl jsem si to nechat potvrdit, že to skutečně nejde. Díky, daew.
-
ale jelikož to bude o dost složitější a tím méně přehledné
O dost složitější?
void f3() {
if(pin == LOW) {
// falling
f2();
else {
// rising
f1();
}
}
attachInterrupt(4, f3, CHANGE);
PS: digitalRead je strašně pomalý, pro rychlé GPIO používej rovnou přístup PINX.