Yu-Cheng MBED

Dependencies:   SLCD TSI mbed-src

Fork of FRDM-KL46Z-Clock by T Morgan

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?

UserRevisionLine numberNew 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