First example program for ECS727 lab 3

Sample code for ECS727 lab 3, showing

  • Use of ADC (AnalogIn)
  • Use of message passing (put, get)
  • Use of event queue for periodic execution (not in an ISR)
Revision:
4:ebd00f94455a
Parent:
3:f5d7fddeef39
--- a/main.cpp	Thu Jan 31 11:10:30 2019 +0000
+++ b/main.cpp	Thu Jan 31 13:53:15 2019 +0000
@@ -1,19 +1,19 @@
 
 // LAB 3 SAMPLE PROGRAM 1
 //   Revised for mbed 5 
+//   Revised to replace Ticker with event queue and thread
 
 #include "mbed.h"
 
 
-Ticker tick;                // Ticker for reading analog
 AnalogIn ain(A0) ;          // Analog input
 DigitalOut led1(LED_RED);   // Red LED
-DigitalOut led2(LED_BLUE);   // BLUE LED
+EventQueue queue;  // creates an event queue, to call read ADC
 
 Serial pc(USBTX, USBRX); // tx, rx, for debugging
 
-// Variable for a second thread
-Thread ADCthread;
+// This thread runs the event queue
+Thread eventThread ;
 
 // Message type
 typedef struct {
@@ -24,26 +24,23 @@
 Mail<message_t, 2> mailbox;
 
 // Function called every 10ms to read ADC
-// Low pass filter  
+// Average using a low pass filter  
 // Every 10th value is sent to mailbox
+volatile int samples = 0 ;
+volatile uint16_t smoothed = 0 ; 
+
 void readA0() {
-    int samples = 0 ;
-    uint16_t smoothed = 0 ; 
-    while (true) {
-        wait(0.01) ; // every 10 ms
-        led2 = 1 ;
-        smoothed = (smoothed >> 1) + (ain.read_u16() >> 1) ;
-        samples++ ;
-        if (samples == 10) {
-            // send to thread
-            message_t *mess = mailbox.alloc() ; // may fail but does not block
-            if (mess) {
-                mess->analog = smoothed ;
-                mailbox.put(mess); // fails but does not block if full
-            }
-            samples = 0;
+    smoothed = (smoothed >> 1) + (ain.read_u16() >> 1) ;
+    samples++ ;
+    if (samples == 10) {
+        // send to thread
+        message_t *mess = mailbox.alloc() ; // may fail but does not block
+        if (mess) {
+            mess->analog = smoothed ;
+            mailbox.put(mess); // fails but does not block if full
         }
-    }       
+        samples = 0;
+    }
 }
 
 // Write voltage digits
@@ -67,8 +64,11 @@
     int counter = 0 ;
     char vstring[] = "X.XX\r\n" ;
     
-    // start the ADC reading thread
-    ADCthread.start(callback(readA0));
+    // Start the event queue
+    eventThread.start(callback(&queue, &EventQueue::dispatch_forever));
+
+    // call the readA0 function every 10ms 
+    queue.call_every(10, readA0) ; 
 
     while (true) {
         osEvent evt = mailbox.get(); // wait for mail 
@@ -84,6 +84,5 @@
                 counter = 0 ;
             }
         }
-
     }
 }