Yu-Cheng MBED
Dependencies: SLCD TSI mbed-src
Fork of FRDM-KL46Z-Clock by
main.cpp@3:586be3d0341d, 2014-12-16 (annotated)
- Committer:
- 19921202
- Date:
- Tue Dec 16 04:24:54 2014 +0000
- Revision:
- 3:586be3d0341d
- Parent:
- 2:46d52fa160b2
Test Code
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
tmorgan | 2:46d52fa160b2 | 1 | /* |
tmorgan | 2:46d52fa160b2 | 2 | * LCD code based on FRDM-KL46Z-LCD-rtc-Demo by Paul Staron. |
tmorgan | 2:46d52fa160b2 | 3 | * Touch slider code based on serialSENS by Aaron Huang. |
tmorgan | 2:46d52fa160b2 | 4 | */ |
star297 | 0:4f67859595b2 | 5 | #include "mbed.h" |
star297 | 0:4f67859595b2 | 6 | #include "SLCD.h" |
tmorgan | 2:46d52fa160b2 | 7 | |
19921202 | 3:586be3d0341d | 8 | // Peripherals/Global Objects/Hardware Initialization |
19921202 | 3:586be3d0341d | 9 | SLCD sLCD; //LCD Object Initialization |
19921202 | 3:586be3d0341d | 10 | Timer t; //Initialize Timer object for measuring time stamp. |
19921202 | 3:586be3d0341d | 11 | Ticker light_sensor_ticker; //Set up a timer for light sensor sampling |
19921202 | 3:586be3d0341d | 12 | Ticker adc_ticker; //Set up a timer to be used for adc sampling |
19921202 | 3:586be3d0341d | 13 | AnalogIn light_measurement(PTE22); //Light Sensor Input Pin. |
19921202 | 3:586be3d0341d | 14 | InterruptIn event_0_to_1(PTD3); //Initialize Interrupt for 0 to 1 event |
19921202 | 3:586be3d0341d | 15 | PwmOut PwmPin (LED_RED); //Initialize PWM Output Pin |
19921202 | 3:586be3d0341d | 16 | AnalogOut DAC(A4); //Initialize Analog Sine Wave Output Pin |
19921202 | 3:586be3d0341d | 17 | Ticker Sample_Period; //Set up a timer to be used for sample rate interrupts |
tmorgan | 2:46d52fa160b2 | 18 | |
19921202 | 3:586be3d0341d | 19 | //Need these global counter |
19921202 | 3:586be3d0341d | 20 | volatile int i = 0; |
19921202 | 3:586be3d0341d | 21 | float Analog_out_data[128]; |
tmorgan | 2:46d52fa160b2 | 22 | char LCDbuffer[32]; |
tmorgan | 2:46d52fa160b2 | 23 | |
19921202 | 3:586be3d0341d | 24 | // Read Real-time Clock MM:SS, for testing. |
19921202 | 3:586be3d0341d | 25 | void get_HHMMSS(int *minutes, int *seconds) |
tmorgan | 2:46d52fa160b2 | 26 | { |
19921202 | 3:586be3d0341d | 27 | time_t rtcTime = time(NULL); |
19921202 | 3:586be3d0341d | 28 | struct tm *t = localtime(&rtcTime); |
19921202 | 3:586be3d0341d | 29 | *minutes = t->tm_min; |
19921202 | 3:586be3d0341d | 30 | *seconds = t->tm_sec; |
tmorgan | 2:46d52fa160b2 | 31 | } |
star297 | 0:4f67859595b2 | 32 | |
19921202 | 3:586be3d0341d | 33 | // Set Real-time Clock HH:MM:SS, HH is set to 0. |
19921202 | 3:586be3d0341d | 34 | void set_MMSS(int minutes, int seconds) |
tmorgan | 2:46d52fa160b2 | 35 | { |
tmorgan | 2:46d52fa160b2 | 36 | struct tm t; |
tmorgan | 2:46d52fa160b2 | 37 | if(minutes > 59) minutes = 0; |
tmorgan | 2:46d52fa160b2 | 38 | t.tm_sec = seconds; |
tmorgan | 2:46d52fa160b2 | 39 | t.tm_min = minutes; |
19921202 | 3:586be3d0341d | 40 | t.tm_hour = 0; |
tmorgan | 2:46d52fa160b2 | 41 | t.tm_mday = 23; |
tmorgan | 2:46d52fa160b2 | 42 | t.tm_mon = 2; |
tmorgan | 2:46d52fa160b2 | 43 | t.tm_year = 114; |
tmorgan | 2:46d52fa160b2 | 44 | set_time (mktime(&t)); |
tmorgan | 2:46d52fa160b2 | 45 | } |
tmorgan | 2:46d52fa160b2 | 46 | |
19921202 | 3:586be3d0341d | 47 | //Show time |
19921202 | 3:586be3d0341d | 48 | void showTime(void) |
tmorgan | 2:46d52fa160b2 | 49 | { |
tmorgan | 2:46d52fa160b2 | 50 | time_t rtcTime = time(NULL); |
19921202 | 3:586be3d0341d | 51 | strftime(LCDbuffer, 4, "%M%S", localtime(&rtcTime));// display HH:MM |
19921202 | 3:586be3d0341d | 52 | sLCD.printf(LCDbuffer); // Send to LCD |
tmorgan | 2:46d52fa160b2 | 53 | } |
tmorgan | 2:46d52fa160b2 | 54 | |
19921202 | 3:586be3d0341d | 55 | //Interrupt on pin PTD3, when it goes from 0 to 1 |
19921202 | 3:586be3d0341d | 56 | void trigger(void) |
tmorgan | 2:46d52fa160b2 | 57 | { |
19921202 | 3:586be3d0341d | 58 | t.stop(); |
19921202 | 3:586be3d0341d | 59 | //Send data back to pi, not implemented yet. |
19921202 | 3:586be3d0341d | 60 | printf("Rising Event: The time taken was %f seconds\n", t.read()); |
19921202 | 3:586be3d0341d | 61 | t.start(); |
tmorgan | 2:46d52fa160b2 | 62 | } |
star297 | 0:4f67859595b2 | 63 | |
19921202 | 3:586be3d0341d | 64 | // |
19921202 | 3:586be3d0341d | 65 | void light_sensor() |
tmorgan | 2:46d52fa160b2 | 66 | { |
19921202 | 3:586be3d0341d | 67 | t.stop(); |
19921202 | 3:586be3d0341d | 68 | //Send light-sensor data, and time stamp back to pi, not implemented yet. |
19921202 | 3:586be3d0341d | 69 | printf("Light Sensor Time: The time taken was %f seconds\n", t.read()); |
19921202 | 3:586be3d0341d | 70 | printf("Light Sensor Measurement: %f\n", light_measurement.read()); //Darkness is 1, Light is 0. |
19921202 | 3:586be3d0341d | 71 | t.start(); |
19921202 | 3:586be3d0341d | 72 | } |
19921202 | 3:586be3d0341d | 73 | //Measure ADC |
19921202 | 3:586be3d0341d | 74 | void adc_measurement() |
19921202 | 3:586be3d0341d | 75 | { |
19921202 | 3:586be3d0341d | 76 | t.stop(); |
19921202 | 3:586be3d0341d | 77 | //Send ADC measurement data, and time stamp back to pi, not implemented yet. |
19921202 | 3:586be3d0341d | 78 | printf("ADC Time: The time taken was %f seconds\n", t.read()); |
19921202 | 3:586be3d0341d | 79 | printf("ADC Measurement: %f\n", PTB0); //A0 |
19921202 | 3:586be3d0341d | 80 | t.start(); |
tmorgan | 2:46d52fa160b2 | 81 | } |
tmorgan | 2:46d52fa160b2 | 82 | |
19921202 | 3:586be3d0341d | 83 | //Rate is in Hz |
19921202 | 3:586be3d0341d | 84 | void adc_rate(int rate, bool start) |
tmorgan | 2:46d52fa160b2 | 85 | { |
19921202 | 3:586be3d0341d | 86 | //Start the ticker with the given rate. |
19921202 | 3:586be3d0341d | 87 | if(start){ |
19921202 | 3:586be3d0341d | 88 | adc_ticker.attach(&adc_measurement, (1/rate)); |
19921202 | 3:586be3d0341d | 89 | }else{ |
19921202 | 3:586be3d0341d | 90 | //turn off the ticker |
19921202 | 3:586be3d0341d | 91 | adc_ticker.detach(); |
tmorgan | 2:46d52fa160b2 | 92 | } |
tmorgan | 2:46d52fa160b2 | 93 | } |
star297 | 0:4f67859595b2 | 94 | |
19921202 | 3:586be3d0341d | 95 | //True for driving pin to high, false for driving pin to low |
19921202 | 3:586be3d0341d | 96 | void set_pin(bool HIGH){ |
19921202 | 3:586be3d0341d | 97 | //To turn an LED on, you give it 0, To turn an LED off, you give it ~0. |
19921202 | 3:586be3d0341d | 98 | DigitalOut pin(PTA12); |
19921202 | 3:586be3d0341d | 99 | DigitalOut led_red(LED_RED); |
19921202 | 3:586be3d0341d | 100 | if (HIGH){ |
19921202 | 3:586be3d0341d | 101 | pin = ~pin; |
19921202 | 3:586be3d0341d | 102 | led_red = ~led_red; |
19921202 | 3:586be3d0341d | 103 | }else{ |
19921202 | 3:586be3d0341d | 104 | pin = 0; |
19921202 | 3:586be3d0341d | 105 | led_red = 0; |
tmorgan | 2:46d52fa160b2 | 106 | } |
tmorgan | 2:46d52fa160b2 | 107 | } |
star297 | 0:4f67859595b2 | 108 | |
19921202 | 3:586be3d0341d | 109 | // Interrupt routine |
19921202 | 3:586be3d0341d | 110 | // used to output next analog sample whenever a timer interrupt occurs |
19921202 | 3:586be3d0341d | 111 | void Sample_timer_interrupt(void) |
tmorgan | 2:46d52fa160b2 | 112 | { |
19921202 | 3:586be3d0341d | 113 | // send next analog sample out to D to A |
19921202 | 3:586be3d0341d | 114 | DAC = Analog_out_data[i]; |
19921202 | 3:586be3d0341d | 115 | // increment pointer and wrap around back to 0 at 128 |
19921202 | 3:586be3d0341d | 116 | i = (i+1) & 0x07F; |
19921202 | 3:586be3d0341d | 117 | } |
19921202 | 3:586be3d0341d | 118 | |
19921202 | 3:586be3d0341d | 119 | //Rate is in Hz |
19921202 | 3:586be3d0341d | 120 | void generate_sine_wave(int rate){ |
19921202 | 3:586be3d0341d | 121 | |
19921202 | 3:586be3d0341d | 122 | // precompute 128 sample points on one sine wave cycle |
19921202 | 3:586be3d0341d | 123 | // used for continuous sine wave output later |
19921202 | 3:586be3d0341d | 124 | for(int k=0; k<128; k++) { |
19921202 | 3:586be3d0341d | 125 | Analog_out_data[k]=((1.0 + sin((float(k)/128.0*6.28318530717959)))/2.0); |
19921202 | 3:586be3d0341d | 126 | // scale the sine wave from 0.0 to 1.0 - as needed for AnalogOut arg |
tmorgan | 2:46d52fa160b2 | 127 | } |
19921202 | 3:586be3d0341d | 128 | // turn on timer interrupts to start sine wave output |
19921202 | 3:586be3d0341d | 129 | // sample rate is 500Hz with 128 samples per cycle on sine wave |
19921202 | 3:586be3d0341d | 130 | Sample_Period.attach(&Sample_timer_interrupt, 1.0/(rate*128)); |
tmorgan | 2:46d52fa160b2 | 131 | } |
star297 | 0:4f67859595b2 | 132 | |
19921202 | 3:586be3d0341d | 133 | //Disable sine wave |
19921202 | 3:586be3d0341d | 134 | void disable_sine_wave(){ |
19921202 | 3:586be3d0341d | 135 | Sample_Period.detach(); |
19921202 | 3:586be3d0341d | 136 | } |
19921202 | 3:586be3d0341d | 137 | |
star297 | 0:4f67859595b2 | 138 | main() |
star297 | 1:34f0bfc62803 | 139 | { |
19921202 | 3:586be3d0341d | 140 | //Set clock time |
19921202 | 3:586be3d0341d | 141 | int MM = 9; |
19921202 | 3:586be3d0341d | 142 | int SS = 19; |
19921202 | 3:586be3d0341d | 143 | set_MMSS(MM,SS); |
star297 | 0:4f67859595b2 | 144 | |
19921202 | 3:586be3d0341d | 145 | //Set Pulse |
19921202 | 3:586be3d0341d | 146 | PwmPin.period(1); // Set frequency to 1 Hz (period = 5 us) |
tmorgan | 2:46d52fa160b2 | 147 | |
19921202 | 3:586be3d0341d | 148 | PwmPin.pulsewidth(0.5); // Set the duty cycle to 10%, 100ms, might need some delay for getting the rising edge to be on 1s |
tmorgan | 2:46d52fa160b2 | 149 | |
19921202 | 3:586be3d0341d | 150 | //Asynchronous 0-1 event interrupt. |
19921202 | 3:586be3d0341d | 151 | event_0_to_1.rise(&trigger); |
star297 | 1:34f0bfc62803 | 152 | |
19921202 | 3:586be3d0341d | 153 | //Light Sensor |
19921202 | 3:586be3d0341d | 154 | light_sensor_ticker.attach(&light_sensor, 1); // setup ticker to call flip every 1 seconds |
19921202 | 3:586be3d0341d | 155 | |
19921202 | 3:586be3d0341d | 156 | //Start the clock for time stamp. |
19921202 | 3:586be3d0341d | 157 | t.start(); |
19921202 | 3:586be3d0341d | 158 | |
19921202 | 3:586be3d0341d | 159 | generate_sine_wave(1); |
19921202 | 3:586be3d0341d | 160 | while(true) |
tmorgan | 2:46d52fa160b2 | 161 | { |
19921202 | 3:586be3d0341d | 162 | showTime(); //Might want to use a ticker on this function instead of while loop, to get rid of unneeded writes to LCD. |
19921202 | 3:586be3d0341d | 163 | get_HHMMSS(&MM, &SS); |
19921202 | 3:586be3d0341d | 164 | //printf("MM: %d\n", MM); |
19921202 | 3:586be3d0341d | 165 | //printf("SS: %d\n", SS); |
19921202 | 3:586be3d0341d | 166 | wait(1); |
star297 | 0:4f67859595b2 | 167 | } |
star297 | 1:34f0bfc62803 | 168 | } |
star297 | 0:4f67859595b2 | 169 | |
star297 | 0:4f67859595b2 | 170 |