Lab 3 Part 1

Committer:
alifsohen
Date:
Tue Feb 25 02:14:54 2020 +0000
Revision:
7:af6188d78afe
Parent:
6:2b04d2caab1f
lab3 part 1

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 7:af6188d78afe 19 DigitalIn b1(PTD0, PullUp);
alifsohen 7:af6188d78afe 20 enum buttonPos { up, down, bounce }; // Button positions
alifsohen 7:af6188d78afe 21
alifsohen 7:af6188d78afe 22
WilliamMarshQMUL 0:ad3cdc525b99 23 Serial pc(USBTX, USBRX); // tx, rx, for debugging
WilliamMarshQMUL 0:ad3cdc525b99 24
WilliamMarshQMUL 4:ebd00f94455a 25 // This thread runs the event queue
WilliamMarshQMUL 4:ebd00f94455a 26 Thread eventThread ;
WilliamMarshQMUL 3:f5d7fddeef39 27
WilliamMarshQMUL 0:ad3cdc525b99 28 // Message type
WilliamMarshQMUL 0:ad3cdc525b99 29 typedef struct {
WilliamMarshQMUL 0:ad3cdc525b99 30 uint16_t analog; /* Analog input value */
WilliamMarshQMUL 0:ad3cdc525b99 31 } message_t;
WilliamMarshQMUL 0:ad3cdc525b99 32
WilliamMarshQMUL 0:ad3cdc525b99 33 // Mail box
WilliamMarshQMUL 0:ad3cdc525b99 34 Mail<message_t, 2> mailbox;
WilliamMarshQMUL 0:ad3cdc525b99 35
WilliamMarshQMUL 0:ad3cdc525b99 36 // Function called every 10ms to read ADC
WilliamMarshQMUL 4:ebd00f94455a 37 // Average using a low pass filter
WilliamMarshQMUL 0:ad3cdc525b99 38 // Every 10th value is sent to mailbox
WilliamMarshQMUL 4:ebd00f94455a 39 volatile int samples = 0 ;
WilliamMarshQMUL 4:ebd00f94455a 40 volatile uint16_t smoothed = 0 ;
WilliamMarshQMUL 4:ebd00f94455a 41
WilliamMarshQMUL 0:ad3cdc525b99 42 void readA0() {
alifsohen 7:af6188d78afe 43 //pollT.start(callback(polling));
WilliamMarshQMUL 4:ebd00f94455a 44 smoothed = (smoothed >> 1) + (ain.read_u16() >> 1) ;
WilliamMarshQMUL 4:ebd00f94455a 45 samples++ ;
WilliamMarshQMUL 4:ebd00f94455a 46 if (samples == 10) {
WilliamMarshQMUL 4:ebd00f94455a 47 // send to thread
WilliamMarshQMUL 4:ebd00f94455a 48 message_t *mess = mailbox.alloc() ; // may fail but does not block
WilliamMarshQMUL 4:ebd00f94455a 49 if (mess) {
WilliamMarshQMUL 4:ebd00f94455a 50 mess->analog = smoothed ;
WilliamMarshQMUL 4:ebd00f94455a 51 mailbox.put(mess); // fails but does not block if full
WilliamMarshQMUL 0:ad3cdc525b99 52 }
WilliamMarshQMUL 4:ebd00f94455a 53 samples = 0;
WilliamMarshQMUL 4:ebd00f94455a 54 }
alifsohen 7:af6188d78afe 55
WilliamMarshQMUL 0:ad3cdc525b99 56 }
WilliamMarshQMUL 0:ad3cdc525b99 57
WilliamMarshQMUL 0:ad3cdc525b99 58 // Write voltage digits
WilliamMarshQMUL 0:ad3cdc525b99 59 // v Voltage as scale int, e.g. 3.30 is 330
WilliamMarshQMUL 0:ad3cdc525b99 60 void vToString(int v, char* s) {
WilliamMarshQMUL 0:ad3cdc525b99 61 s[3] = '0' + (v % 10) ;
WilliamMarshQMUL 0:ad3cdc525b99 62 v = v / 10 ;
WilliamMarshQMUL 0:ad3cdc525b99 63 s[2] = '0' + (v % 10) ;
WilliamMarshQMUL 0:ad3cdc525b99 64 v = v / 10 ;
WilliamMarshQMUL 0:ad3cdc525b99 65 s[0] = '0' + (v % 10) ;
WilliamMarshQMUL 0:ad3cdc525b99 66 }
WilliamMarshQMUL 0:ad3cdc525b99 67
alifsohen 7:af6188d78afe 68
WilliamMarshQMUL 0:ad3cdc525b99 69 // Main program
WilliamMarshQMUL 0:ad3cdc525b99 70 // Initialise variables
WilliamMarshQMUL 0:ad3cdc525b99 71 // Attach ISR for ticker
WilliamMarshQMUL 0:ad3cdc525b99 72 // Procss messages from mailbox
WilliamMarshQMUL 0:ad3cdc525b99 73 int main() {
WilliamMarshQMUL 0:ad3cdc525b99 74 led1 = 1 ; // turn off
alifsohen 7:af6188d78afe 75
WilliamMarshQMUL 0:ad3cdc525b99 76 int volts = 0 ;
alifsohen 7:af6188d78afe 77 const int threshold = 55 ;
WilliamMarshQMUL 0:ad3cdc525b99 78 int counter = 0 ;
WilliamMarshQMUL 0:ad3cdc525b99 79 char vstring[] = "X.XX\r\n" ;
WilliamMarshQMUL 3:f5d7fddeef39 80
alifsohen 7:af6188d78afe 81
alifsohen 7:af6188d78afe 82
WilliamMarshQMUL 4:ebd00f94455a 83 // Start the event queue
alifsohen 7:af6188d78afe 84 eventThread.start(callback( &queue, &EventQueue::dispatch_forever));
WilliamMarshQMUL 4:ebd00f94455a 85
WilliamMarshQMUL 4:ebd00f94455a 86 // call the readA0 function every 10ms
WilliamMarshQMUL 4:ebd00f94455a 87 queue.call_every(10, readA0) ;
WilliamMarshQMUL 0:ad3cdc525b99 88
WilliamMarshQMUL 0:ad3cdc525b99 89 while (true) {
WilliamMarshQMUL 0:ad3cdc525b99 90 osEvent evt = mailbox.get(); // wait for mail
WilliamMarshQMUL 0:ad3cdc525b99 91 if (evt.status == osEventMail) {
WilliamMarshQMUL 0:ad3cdc525b99 92 message_t* mess = (message_t*)evt.value.p ;
WilliamMarshQMUL 0:ad3cdc525b99 93 volts = (mess->analog * 330) / 0xffff ;
WilliamMarshQMUL 0:ad3cdc525b99 94 mailbox.free(mess) ; // free the message space
alifsohen 7:af6188d78afe 95 if (volts < threshold) led1 = 0 ; else led1 = 1 ;
alifsohen 7:af6188d78afe 96 if (volts < threshold * 2) led2 = 0 ; else led2 = 1 ;
alifsohen 7:af6188d78afe 97 if (volts < threshold * 3) led3 = 0 ; else led3 = 1 ;
alifsohen 7:af6188d78afe 98 if (volts < threshold * 4) led4 = 0 ; else led4 = 1 ;
alifsohen 7:af6188d78afe 99 if (volts < threshold * 5) led5 = 0 ; else led5 = 1 ;
WilliamMarshQMUL 0:ad3cdc525b99 100 vToString(volts, vstring) ;
WilliamMarshQMUL 0:ad3cdc525b99 101 counter++ ;
WilliamMarshQMUL 0:ad3cdc525b99 102 if (counter == 10) { // limit bandwidth of serial
alifsohen 7:af6188d78afe 103
alifsohen 7:af6188d78afe 104
alifsohen 7:af6188d78afe 105
alifsohen 7:af6188d78afe 106 if (!b1.read()) { // now down
alifsohen 7:af6188d78afe 107 while(true){
alifsohen 7:af6188d78afe 108 pc.printf("Button is pressed") ;
alifsohen 7:af6188d78afe 109 volts = 340;
alifsohen 7:af6188d78afe 110 if (volts < threshold) led1 = 0 ; else led1 = 1 ;
alifsohen 7:af6188d78afe 111 if (volts < threshold * 2) led2 = 0 ; else led2 = 1 ;
alifsohen 7:af6188d78afe 112 if (volts < threshold * 3) led3 = 0 ; else led3 = 1 ;
alifsohen 7:af6188d78afe 113 if (volts < threshold * 4) led4 = 0 ; else led4 = 1 ;
alifsohen 7:af6188d78afe 114 if (volts < threshold * 5) led5 = 0 ; else led5 = 1 ;
alifsohen 7:af6188d78afe 115
alifsohen 7:af6188d78afe 116 wait(5);
alifsohen 7:af6188d78afe 117
alifsohen 7:af6188d78afe 118 }
alifsohen 7:af6188d78afe 119 }
alifsohen 7:af6188d78afe 120
alifsohen 7:af6188d78afe 121
alifsohen 7:af6188d78afe 122
alifsohen 7:af6188d78afe 123
WilliamMarshQMUL 0:ad3cdc525b99 124 pc.printf(vstring) ;
WilliamMarshQMUL 0:ad3cdc525b99 125 counter = 0 ;
WilliamMarshQMUL 0:ad3cdc525b99 126 }
WilliamMarshQMUL 0:ad3cdc525b99 127 }
WilliamMarshQMUL 0:ad3cdc525b99 128 }
WilliamMarshQMUL 0:ad3cdc525b99 129 }