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.
Citace od: daew13 kdy 28. 12. 2015, 18:00:28
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.