Original version
authorJ. Hendrix <gitweb@localhost>
Sun, 1 Sep 2013 18:00:48 +0000 (20:00 +0200)
committerJ. Hendrix <gitweb@localhost>
Sun, 1 Sep 2013 18:00:48 +0000 (20:00 +0200)
millisecondInterrupt.ino [new file with mode: 0644]

diff --git a/millisecondInterrupt.ino b/millisecondInterrupt.ino
new file mode 100644 (file)
index 0000000..c219a6a
--- /dev/null
@@ -0,0 +1,53 @@
+/*
+ * (c) J.P. Hendrix
+ *
+ * 
+ * Timed interrupt using Timer2
+ * ISR is called every 1ms
+ *
+ * The LED on pin13 will blink in a 1Hz rythm
+ */
+#define _BC(bit) ( 0 << ( bit ) )
+#define _BS(bit) ( 1 << ( bit ) )
+// Pin 13 has an LED connected on most Arduino boards.
+const uint8_t led = 13;
+volatile uint16_t millisecondCounter = 0;
+volatile uint32_t secondCounter = 0;
+
+void setup() {                
+  // initialize the digital pin as an output.
+  pinMode( led , OUTPUT);
+  
+  // Set up Timer2 for 1 ms interrupts
+  // - Arduino is clocked at 16MHz
+  // - The timer is clocked through a /128 prescaler, thus 125kHz (TCCR2)
+  // - The interrupt is generated when the counter hits 125 (OCR2A)
+  //    at which moment the Timer is reset to 0, resulting in 1kHz intervals
+  TCCR2A = _BC( COM2A1 ) | _BC( COM2A0 ) |              // Normal port operation, OC2A disconnected
+           _BC( COM2B1 ) | _BC( COM2B0 ) |              // Normal port operation, OC2B disconnected 
+           _BS( WGM21 )  | _BC( WGM20 );                // Clear timer on compare match
+           
+  TCCR2B = _BC( FOC2A )  | _BC( FOC2B )  |
+           _BC( WGM22 )  |                              // Clear timer on compare match
+           _BS( CS22 )   | _BC( CS21  )  | _BS( CS20 ); // prescaler f = clk2 / 128
+  
+  OCR2A  = 125;                                         // 16MHz / 128 = 125kHz => 125kHz/125 = 1kHz
+  TCNT2  = 0; 
+  TIMSK2 = _BC( OCIE2B ) | _BS( OCIE2A ) | _BC( TOIE2 );// Enable compare match A interrupts
+  sei();                                                // Enable global interrupts
+}
+
+// Attach interrupt routine to the Timer Compare Interrupt
+ISR( TIMER2_COMPA_vect ) {
+  millisecondCounter += 1;
+  if ( millisecondCounter == 1000 ) {                   // 1000 milliseconds equals 1 second
+    secondCounter += 1;
+    millisecondCounter = 0;
+  }
+};
+
+void loop() {
+    digitalWrite( led , secondCounter & 1 );
+}