Zsebacsi,
Ne félj azoktól a fránya interruptoktól. Itt az én kódom, hogyan mérek térfogatáramot a hőszipkámban.
Nem kell külső számláló meg mifene, bírni fogja az arduinó! Nekem összesen 5 megszakítás csapkod össze-vissza a cuccban és köszöni szépen, jól elvan. Az a lényeg, hogy a megszakítási rutinok rövidek legyenek.
volatile static unsigned int wellWaterCounter=0, wellWaterPulses=0;
#include "avr/interrupt.h"
void setup(){
EICRA=0b00000011; //set external interrupt rising edges
TCCR3A=0;
TCCR3B=0b00001100; //reset on compare mach 1/256 divider
OCR3A=62499; //compare register value 16M/256-1 for 1s period
}
ISR(INT0_vect){
wellWaterCounter++;
} //interrupt handler (well water meter)
ISR(TIMER3_COMPA_vect){
unsigned int wWCt;
static unsigned int wWCtLast=0;
oneSecTrigger=true;
cli();
wWCt=wellWaterCounter;
sei();
wellWaterPulses=wWCt-wWCtLast;
wWCtLast=wWCt;
return;
}
void loop(){
unsigned int tempPulses;
if (oneSecTrigger){
oneSecTrigger=false;
cli();
tempPulses=wellWaterPulses; //<<<<<---------------a tempPulsest tudod használni a főprogidban.
sei();
}
.....
Setupban beállítom az INT0 (EICRA regiszter) és a timer3 megszakításkezelést (TCCR3A, 3B, OCR3A). INT0 minden impulzusra számol, TIMER3 másodpercenként kér megszakítást. A főprogiban a tempPulses változó tárolja a másodpercenkénti impulzusok számát. Azzal meg azt csinálsz amit akarsz. Ha mindkét ventit használni akarod, akkor beállítod a INT1-4 megszakítást is a fentiek alapján.
http://www.atmel.com/images/doc2549.pdf
113. oldal
158. oldal
164. oldal
T.