Alif Ahmed / Mbed OS ADCandticker_with_interrupt_part1
Committer:
alifsohen
Date:
Thu Feb 27 14:08:44 2020 +0000
Revision:
8:f6a614ff2041
Parent:
7:af6188d78afe
Child:
9:208f11c83786
Lab 3 part 1 with interrupt

Who changed what in which revision?

UserRevisionLine numberNew contents of line
WilliamMarshQMUL 0:ad3cdc525b99 1
WilliamMarshQMUL 0:ad3cdc525b99 2 // LAB 3 SAMPLE PROGRAM 1
WilliamMarshQMUL 3:f5d7fddeef39 3 // Revised for mbed 5
alifsohen 6:2b04d2caab1f 4 // Revised to replace Ticker with event queue and thread
WilliamMarshQMUL 0:ad3cdc525b99 5
WilliamMarshQMUL 0:ad3cdc525b99 6 #include "mbed.h"
WilliamMarshQMUL 1:126dd2f5fc2d 7
WilliamMarshQMUL 0:ad3cdc525b99 8
WilliamMarshQMUL 0:ad3cdc525b99 9 AnalogIn ain(A0) ; // Analog input
alifsohen 7:af6188d78afe 10 DigitalOut led1(D2); // Red LED
alifsohen 7:af6188d78afe 11 DigitalOut led2(D3); // Red LED
alifsohen 7:af6188d78afe 12 DigitalOut led3(D4); // Green LED
alifsohen 7:af6188d78afe 13 DigitalOut led4(D5); // Red LED
alifsohen 7:af6188d78afe 14 DigitalOut led5(D6); // Green LED
WilliamMarshQMUL 4:ebd00f94455a 15 EventQueue queue; // creates an event queue, to call read ADC
WilliamMarshQMUL 0:ad3cdc525b99 16
alifsohen 7:af6188d78afe 17 volatile int pressEvent = 0 ;
alifsohen 7:af6188d78afe 18
alifsohen 8:f6a614ff2041 19 //DigitalIn b1(PTD0, PullUp);
alifsohen 8:f6a614ff2041 20 InterruptIn button(PTD0); // Pin must be on ports A or D
alifsohen 8:f6a614ff2041 21
alifsohen 8:f6a614ff2041 22
alifsohen 8:f6a614ff2041 23 // This function is invoked when then interrupt occurs
alifsohen 8:f6a614ff2041 24 // Signal that the button has been pressed
alifsohen 8:f6a614ff2041 25 // Note: bounce may occur
alifsohen 8:f6a614ff2041 26 void buttonCallback(){
alifsohen 8:f6a614ff2041 27 pressEvent = 1 ;
alifsohen 8:f6a614ff2041 28 }
alifsohen 8:f6a614ff2041 29
alifsohen 8:f6a614ff2041 30 // enum buttonPos { up, down, bounce }; // Button positions
alifsohen 7:af6188d78afe 31
alifsohen 7:af6188d78afe 32
WilliamMarshQMUL 0:ad3cdc525b99 33 Serial pc(USBTX, USBRX); // tx, rx, for debugging
WilliamMarshQMUL 0:ad3cdc525b99 34
WilliamMarshQMUL 4:ebd00f94455a 35 // This thread runs the event queue
WilliamMarshQMUL 4:ebd00f94455a 36 Thread eventThread ;
WilliamMarshQMUL 3:f5d7fddeef39 37
WilliamMarshQMUL 0:ad3cdc525b99 38 // Message type
WilliamMarshQMUL 0:ad3cdc525b99 39 typedef struct {
WilliamMarshQMUL 0:ad3cdc525b99 40 uint16_t analog; /* Analog input value */
WilliamMarshQMUL 0:ad3cdc525b99 41 } message_t;
WilliamMarshQMUL 0:ad3cdc525b99 42
WilliamMarshQMUL 0:ad3cdc525b99 43 // Mail box
WilliamMarshQMUL 0:ad3cdc525b99 44 Mail<message_t, 2> mailbox;
WilliamMarshQMUL 0:ad3cdc525b99 45
WilliamMarshQMUL 0:ad3cdc525b99 46 // Function called every 10ms to read ADC
WilliamMarshQMUL 4:ebd00f94455a 47 // Average using a low pass filter
WilliamMarshQMUL 0:ad3cdc525b99 48 // Every 10th value is sent to mailbox
WilliamMarshQMUL 4:ebd00f94455a 49 volatile int samples = 0 ;
WilliamMarshQMUL 4:ebd00f94455a 50 volatile uint16_t smoothed = 0 ;
WilliamMarshQMUL 4:ebd00f94455a 51
WilliamMarshQMUL 0:ad3cdc525b99 52 void readA0() {
alifsohen 7:af6188d78afe 53 //pollT.start(callback(polling));
WilliamMarshQMUL 4:ebd00f94455a 54 smoothed = (smoothed >> 1) + (ain.read_u16() >> 1) ;
WilliamMarshQMUL 4:ebd00f94455a 55 samples++ ;
WilliamMarshQMUL 4:ebd00f94455a 56 if (samples == 10) {
WilliamMarshQMUL 4:ebd00f94455a 57 // send to thread
WilliamMarshQMUL 4:ebd00f94455a 58 message_t *mess = mailbox.alloc() ; // may fail but does not block
WilliamMarshQMUL 4:ebd00f94455a 59 if (mess) {
WilliamMarshQMUL 4:ebd00f94455a 60 mess->analog = smoothed ;
WilliamMarshQMUL 4:ebd00f94455a 61 mailbox.put(mess); // fails but does not block if full
WilliamMarshQMUL 0:ad3cdc525b99 62 }
WilliamMarshQMUL 4:ebd00f94455a 63 samples = 0;
WilliamMarshQMUL 4:ebd00f94455a 64 }
alifsohen 7:af6188d78afe 65
WilliamMarshQMUL 0:ad3cdc525b99 66 }
WilliamMarshQMUL 0:ad3cdc525b99 67
WilliamMarshQMUL 0:ad3cdc525b99 68 // Write voltage digits
WilliamMarshQMUL 0:ad3cdc525b99 69 // v Voltage as scale int, e.g. 3.30 is 330
WilliamMarshQMUL 0:ad3cdc525b99 70 void vToString(int v, char* s) {
WilliamMarshQMUL 0:ad3cdc525b99 71 s[3] = '0' + (v % 10) ;
WilliamMarshQMUL 0:ad3cdc525b99 72 v = v / 10 ;
WilliamMarshQMUL 0:ad3cdc525b99 73 s[2] = '0' + (v % 10) ;
WilliamMarshQMUL 0:ad3cdc525b99 74 v = v / 10 ;
WilliamMarshQMUL 0:ad3cdc525b99 75 s[0] = '0' + (v % 10) ;
WilliamMarshQMUL 0:ad3cdc525b99 76 }
WilliamMarshQMUL 0:ad3cdc525b99 77
alifsohen 7:af6188d78afe 78
WilliamMarshQMUL 0:ad3cdc525b99 79 // Main program
WilliamMarshQMUL 0:ad3cdc525b99 80 // Initialise variables
WilliamMarshQMUL 0:ad3cdc525b99 81 // Attach ISR for ticker
WilliamMarshQMUL 0:ad3cdc525b99 82 // Procss messages from mailbox
WilliamMarshQMUL 0:ad3cdc525b99 83 int main() {
alifsohen 8:f6a614ff2041 84 int extra = 50;
WilliamMarshQMUL 0:ad3cdc525b99 85 led1 = 1 ; // turn off
alifsohen 7:af6188d78afe 86
WilliamMarshQMUL 0:ad3cdc525b99 87 int volts = 0 ;
alifsohen 8:f6a614ff2041 88 int threshold = 55 ; // 55 * 6 = 330
WilliamMarshQMUL 0:ad3cdc525b99 89 int counter = 0 ;
WilliamMarshQMUL 0:ad3cdc525b99 90 char vstring[] = "X.XX\r\n" ;
WilliamMarshQMUL 3:f5d7fddeef39 91
alifsohen 8:f6a614ff2041 92 // write a comment here
alifsohen 8:f6a614ff2041 93 button.mode(PullUp); // Ensure button i/p has pull up
alifsohen 8:f6a614ff2041 94 button.fall(&buttonCallback) ; // Attach function to falling edge
alifsohen 8:f6a614ff2041 95
alifsohen 7:af6188d78afe 96
WilliamMarshQMUL 4:ebd00f94455a 97 // Start the event queue
alifsohen 7:af6188d78afe 98 eventThread.start(callback( &queue, &EventQueue::dispatch_forever));
WilliamMarshQMUL 4:ebd00f94455a 99
WilliamMarshQMUL 4:ebd00f94455a 100 // call the readA0 function every 10ms
WilliamMarshQMUL 4:ebd00f94455a 101 queue.call_every(10, readA0) ;
WilliamMarshQMUL 0:ad3cdc525b99 102
WilliamMarshQMUL 0:ad3cdc525b99 103 while (true) {
WilliamMarshQMUL 0:ad3cdc525b99 104 osEvent evt = mailbox.get(); // wait for mail
WilliamMarshQMUL 0:ad3cdc525b99 105 if (evt.status == osEventMail) {
WilliamMarshQMUL 0:ad3cdc525b99 106 message_t* mess = (message_t*)evt.value.p ;
WilliamMarshQMUL 0:ad3cdc525b99 107 volts = (mess->analog * 330) / 0xffff ;
alifsohen 8:f6a614ff2041 108 if (pressEvent) {
alifsohen 8:f6a614ff2041 109 pressEvent = 0 ;
alifsohen 8:f6a614ff2041 110 threshold = volts / 6 ;
alifsohen 8:f6a614ff2041 111 }
WilliamMarshQMUL 0:ad3cdc525b99 112 mailbox.free(mess) ; // free the message space
alifsohen 7:af6188d78afe 113 if (volts < threshold) led1 = 0 ; else led1 = 1 ;
alifsohen 7:af6188d78afe 114 if (volts < threshold * 2) led2 = 0 ; else led2 = 1 ;
alifsohen 7:af6188d78afe 115 if (volts < threshold * 3) led3 = 0 ; else led3 = 1 ;
alifsohen 7:af6188d78afe 116 if (volts < threshold * 4) led4 = 0 ; else led4 = 1 ;
alifsohen 7:af6188d78afe 117 if (volts < threshold * 5) led5 = 0 ; else led5 = 1 ;
WilliamMarshQMUL 0:ad3cdc525b99 118 vToString(volts, vstring) ;
WilliamMarshQMUL 0:ad3cdc525b99 119 counter++ ;
WilliamMarshQMUL 0:ad3cdc525b99 120 if (counter == 10) { // limit bandwidth of serial
WilliamMarshQMUL 0:ad3cdc525b99 121 pc.printf(vstring) ;
WilliamMarshQMUL 0:ad3cdc525b99 122 counter = 0 ;
WilliamMarshQMUL 0:ad3cdc525b99 123 }
alifsohen 8:f6a614ff2041 124
alifsohen 8:f6a614ff2041 125 // if (!b1.read()) { // now down
alifsohen 8:f6a614ff2041 126 // while(true) {
alifsohen 8:f6a614ff2041 127 // pc.printf("Button is pressed") ;
alifsohen 8:f6a614ff2041 128 // osEvent evt = mailbox.get(); // wait for mail
alifsohen 8:f6a614ff2041 129 // if (evt.status == osEventMail) {
alifsohen 8:f6a614ff2041 130 // message_t* mess = (message_t*)evt.value.p ;
alifsohen 8:f6a614ff2041 131 // volts = ((mess->analog * 330) / 0xffff)+extra ;
alifsohen 8:f6a614ff2041 132 // mailbox.free(mess) ; // free the message space
alifsohen 8:f6a614ff2041 133 // if (volts < threshold) led1 = 0 ;
alifsohen 8:f6a614ff2041 134 // else led1 = 1 ;
alifsohen 8:f6a614ff2041 135 // if (volts < threshold * 2) led2 = 0 ;
alifsohen 8:f6a614ff2041 136 // else led2 = 1 ;
alifsohen 8:f6a614ff2041 137 // if (volts < threshold * 3) led3 = 0 ;
alifsohen 8:f6a614ff2041 138 // else led3 = 1 ;
alifsohen 8:f6a614ff2041 139 // if (volts < threshold * 4) led4 = 0 ;
alifsohen 8:f6a614ff2041 140 // else led4 = 1 ;
alifsohen 8:f6a614ff2041 141 // if (volts < threshold * 5) led5 = 0 ;
alifsohen 8:f6a614ff2041 142 // else led5 = 1 ;
alifsohen 8:f6a614ff2041 143 // vToString(volts, vstring) ;
alifsohen 8:f6a614ff2041 144 // }
alifsohen 8:f6a614ff2041 145 // }
alifsohen 8:f6a614ff2041 146 // }
WilliamMarshQMUL 0:ad3cdc525b99 147 }
WilliamMarshQMUL 0:ad3cdc525b99 148 }
WilliamMarshQMUL 0:ad3cdc525b99 149 }