Advertisement
xerpi

TachDuino alpha 1

Apr 14th, 2013
148
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 0.95 KB | None | 0 0
  1. #include <avr/interrupt.h>
  2. #define PIN 2
  3. #define NUM_BLADES 2
  4. float RPM = 0.0f;
  5. int interrupted_times = 0;
  6. unsigned long last_time = 0, elapsed_time;
  7. int state = 0;
  8.  
  9. void setup()
  10. {
  11.     DDRD &= ~(1 << _BV(PIN)); //Set PIN as Input
  12.     PORTD &= ~(1 << _BV(PIN)); //Pull-Down
  13.  
  14.     cli();                    // Disable global interrupts 
  15.     EIMSK |= (1 << INT0);     // Enable external interrupt INT0
  16.     //Rising edge
  17.         EICRA |= (1 << ISC00);
  18.         EICRA |= (1 << ISC01);
  19.            
  20.     sei();                    // Enable global interrupts
  21.    
  22.     Serial.begin(9600);
  23.     pinMode(13, OUTPUT);
  24.     digitalWrite(13, state);
  25.    
  26.     last_time = micros();
  27. }
  28.  
  29. void loop()
  30. {
  31.     Serial.println(RPM);
  32.     delay(100);
  33. }
  34.  
  35. ISR(INT0_vect)
  36. {
  37.     digitalWrite(13, (state ^= 1));
  38.    
  39.     interrupted_times++;
  40.     if(interrupted_times >= NUM_BLADES)
  41.     {
  42.         elapsed_time = (micros() - last_time);
  43.         RPM = 1.0f/(((((float)elapsed_time)/1000.0f)/1000.0f)/60.0f);
  44.         interrupted_times = 0;
  45.         last_time = micros();
  46.     }
  47. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement