test interruptIn feature with 555 timer

Dependencies:   ClockControl PowerControl mbed

Fork of Frequency_counter by Satoru Yoshida

Test interruptIn function with using LMC555 timer IC

LPC 1768 自身が持つタイマー割り込み機能を使わずに、 あえて外部のタイマー IC 555 からの信号で周期的に割り込みするテスト。

下記の回路例では、555 の output 端子が 約 10 秒周期のうち、0.3 秒間 Low になるはず。 ただし、コンデンサーおよび抵抗の誤差の影響があり、実測値は約7秒周期

C を 47μ から 330 μ に変えると約1分前後で周期的に割り込みがかかります。

/media/uploads/strysd/int555_10s.png

なるべく配線が交差しないように部品配置してみた例

/media/uploads/strysd/555test.jpg

Revision:
6:7f90a61e1a69
Parent:
5:9be3080ca8ba
Child:
7:42e7f18361c8
--- a/main.cpp	Tue Jun 04 06:14:19 2013 +0000
+++ b/main.cpp	Sun Aug 11 08:34:00 2013 +0000
@@ -1,14 +1,6 @@
+//see mbed.org/users/strysd/notebook/measure_humidity_with_hs15p_and_lmc555/
 #include "mbed.h"
-
-//see mbed.org/users/strysd/notebook/measure_humidity_with_hs15p_and_lmc555/
-#define CONV_KILO_OHM 0.0072 //if use 0.1 micro F
-#define IN_TIMES  10 //interrupt times
-#define READ_TIMER 3 //rest times when reads timer
-#define WAIT_IN   1000 //wait interrupts       in msec
-#define WAIT_NEXT 4000 //wait next measurement in msec
-#define MAX_INTERVAL 100000 //  > 0.1 sec ( < 10 Hz)  in microseconds
-#define MIN_INTERVAL 20 // < 20 micro sec ( > 50 kHz) in microseconds
-#define ONESEC_BY_MICRO 1000000//   1 sec             in microseconds
+#include "main.h"
 
 InterruptIn in(p8);   //connect to the Discharge of 555
 DigitalOut run555(p9);//connect to the Reset     of 555
@@ -22,15 +14,14 @@
 
 void flip(void)
 {
-    if(rest_in > 0){
-        if(rest_in < READ_TIMER){
-            my_interval = t1.read_us();// Get time since last interrupt
-        }
-        t1.reset();// Reset timer and wait for next interrupt
-        rest_in--;
+    if(rest_in < READ_TIMER){
+        my_interval = t1.read_us();// Get time since last interrupt
     }
 
-    if(rest_in == 0){
+    t1.reset();// Reset timer and wait for next interrupt
+    rest_in--;
+
+    if(rest_in <= 0){
         //No use interrupt
         run555 = led = 0;
         t1.stop();
@@ -41,7 +32,7 @@
     run555 = led = 0;
     // Set up the interrupt
     in.mode(PullUp);
-    in.fall(&flip);
+    in.rise(&flip);
 
     printf("\rStarting measure\n");
 
@@ -52,14 +43,15 @@
         rest_in = IN_TIMES;
         run555 = led = 1;
         wait_ms(WAIT_IN);
+        run555 = led = 0;//force stop
 
         if (my_interval < MIN_INTERVAL || my_interval > MAX_INTERVAL){
             printf("\r not ready\n");
         } else {
             my_freq = ONESEC_BY_MICRO / my_interval;  // Convert to Hz
             my_ohm  = my_interval     * CONV_KILO_OHM;// Convert to kilo ohm
-            printf("\r %d Hz, %d micro sec, %4.1f kilo ohm \n",
-                   (int)my_freq, (int)my_interval, my_ohm);
+            printf("\r %.0f Hz, %.0f micro sec, %.1f kilo ohm \n",
+                   my_freq, my_interval, my_ohm);
         }
 
          wait_ms(WAIT_NEXT);