Takyka! Creative Commons License 2014.12.31 0 0 8063

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.