uwezi

AVR_measure_time

Jan 25th, 2019
93
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <avr/io.h>
  2. #include <util/atomic.h>
  3. #include <avr/interrupt.h>
  4.  
  5. volatile uint8_t overflows = 0;
  6. volatile uint8_t last_overflows = 0;
  7. volatile uint16_t timerval = 0;
  8. volatile uint8_t finished = 0;
  9.  
  10. ISR(TIMER1_OVF_vect)
  11. {
  12.   // om det nu skulle ta mer än 4 sekunder
  13.   overflows ++;
  14. }
  15.  
  16. ISR(INT0_vect)
  17. {
  18.   // ok, vi har fått en ny puls - ett nytt varv
  19.   // nettotid ca 10 CPU-cykler, 0,6 µs
  20.   //
  21.   timerval = TCNT1;  // aktuellt värde i TIMER1
  22.   TCNT1    = 0;      // redo till nästa varv, nollställ TIMER1  
  23.   last_overflows = overflows; // bygga ut till en 24bit räknare
  24.   overflows = 0;
  25.   finished  = 1;  // vi har aktuell data
  26. }
  27.  
  28. void init(void) // även känd som setup()
  29. {
  30.   // TIMER1 i normal mode, 1/1024 prescaler
  31.   // på ett 16 MHz system blir det steg på 64 µs
  32.   // WGMxx = 0b0000
  33.   // CSxx   = 0b101
  34.   // overflow interrupt enabled
  35.   TCCR1A = (0 << WGM11) | (0 << WGM10);
  36.   TCCR1B = (0 << WGM13) | (0 << WGM12) | (1 << CS12) | (0 << CS11) | (1 << CS10);
  37.   TIMSK1 = (1 << TOIE1);
  38.  
  39.   // init interrupt on INT0-pin
  40.   // assume RISING EGDE
  41.   EICRA = (1 << ISC01) | (1 << ISC00);
  42.   EIMSK = (1 << INT0);
  43.   finished = 0;
  44.   sei();  // enable global interrupts
  45. }
  46.  
  47. int main(void)
  48. {
  49.   uint32_t total_time;
  50.  
  51.   init();
  52.   while (1)
  53.   {
  54.     if (finished) // finns det trovärdig data?
  55.     {
  56.       finished = 0; // vi har hämtat data, förberedd för en ny hämtning
  57.       // det här kan säkras genom att stoppa in i ett "atomic block"
  58.       // för att undvika problem där en INTO-interrupt händer just när vi hantera de
  59.       // globala variablerna
  60.       ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
  61.       {      
  62.         total_time = timerval + overflows << 16;
  63.       }
  64.       total_time = total_time * 64; // räkna om till µs
  65.       //
  66.       // gör vad du vill nu med total_time
  67.       //
  68.     }
  69.   }
  70. }
RAW Paste Data