FRDM-KL46Z board sLCD demo code using RTC clock.
Fork of FRDM-KL46Z LCD rtc Demo by
Revision 2:1c12897871e5, committed 2014-12-18
- Comitter:
- arthshah1
- Date:
- Thu Dec 18 21:47:44 2014 +0000
- Parent:
- 1:34f0bfc62803
- Commit message:
- asdf
Changed in this revision
diff -r 34f0bfc62803 -r 1c12897871e5 SLCD.lib --- a/SLCD.lib Mon Jan 27 21:58:45 2014 +0000 +++ b/SLCD.lib Thu Dec 18 21:47:44 2014 +0000 @@ -1,1 +1,1 @@ -https://mbed.org/users/Sissors/code/SLCD/#f70873bc6121 +https://mbed.org/users/Sissors/code/SLCD/#ef2b3b7f1b01
diff -r 34f0bfc62803 -r 1c12897871e5 TPM_init.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/TPM_init.cpp Thu Dec 18 21:47:44 2014 +0000 @@ -0,0 +1,95 @@ +#include "TPM_init.h" + +void TPM0_init(unsigned int modulo_val){ + volatile unsigned int *ptrMyReg; + unsigned int prev; + + //ptrMyReg = (volatile unsigned int *) MCG_C1_ADDR; + //pc.printf("MCG_C1 = 0x%x ", *ptrMyReg); + + ptrMyReg = (volatile unsigned int *) SIM_SOPT2_ADDR; + prev = *ptrMyReg; + + // Use MCFGFLLCLK or MCGPLLCLK/2 for TPM ( [25:24] = 01 ) + //pc.printf("Previous value of SIM_SOPT2 = 0x%x ", *ptrMyReg); + prev = prev & 0xFDFFFFFF; //16:PLLFLLSEL, 0:MCFGFLLCLK, 1:MCGPLLCLK/2 + //pc.printf("prev after AND MASK = %x", prev); + prev = prev | 0x01000000; + //pc.printf("prev after AND MASK = %x", prev); + *ptrMyReg = prev; + + //pc.printf("SIM_SOPT2 = 0x%x\n", *ptrMyReg); + + //Turn on TPM0 CLK + ptrMyReg = (volatile unsigned int *) SIM_SCGC6_ADDR; //bit [26-24]: TPM3-0 CLK gating + prev = *ptrMyReg; + prev = prev | 0x07000000; + *ptrMyReg = prev; + //pc.printf("New value of SIM_SCGC6 = 0x%x ", *ptrMyReg); + + //clear TPM0_SC + ptrMyReg = (volatile unsigned int *) TPM0_SC_ADDR; //all bits set to 0 + *ptrMyReg = 0x0; + //pc.printf("TPM0_SC = 0x%x\n", *ptrMyReg); + + ptrMyReg = (volatile unsigned int *) TPM0_C0SC_ADDR; + prev = *ptrMyReg; + prev = prev | 0x00000040; // bit[6]: channel interrupt enable + *ptrMyReg = prev; + //pc.printf("TPM0_C0SC = 0x%x\n", *ptrMyReg); + + //clear the counter + ptrMyReg = (volatile unsigned int *) TPM0_CNT_ADDR; //all bits set to 0 + *ptrMyReg = 0x0; + //pc.printf("TPM0_CNT = 0x%x\n", *ptrMyReg); + + ptrMyReg = (volatile unsigned int *) TPM0_MOD_ADDR; + *ptrMyReg = modulo_val; + //*ptrMyReg = 0xFFFF; + //pc.printf("TPM0_MOD = 0x%x\n", *ptrMyReg); + + // Enable overflow interrupt + //ptrMyReg = (volatile unsigned int *) TPM0_SC_ADDR; //all bits set to 0 + //*ptrMyReg = 0x00000040; //bit [6]:1, Enable Overflow Interrupts + //pc.printf("TPM0_SC = 0x%x\n", *ptrMyReg); + +} + +unsigned int TPM0_SC_read() { + volatile unsigned int *ptrMyReg; + unsigned int value; + ptrMyReg = (volatile unsigned int *) TPM0_SC_ADDR; //all bits set to 0 + value = *ptrMyReg; + return value; +} + +unsigned int TPM0_read() { + volatile unsigned int *ptrMyReg; + unsigned int value; + ptrMyReg = (volatile unsigned int *) TPM0_CNT_ADDR; //all bits set to 0 + value = *ptrMyReg; + return value; +} + +void TPM0_clear_overflow() { + volatile unsigned int *ptrMyReg; + unsigned int prev; + + ptrMyReg = (volatile unsigned int *) TPM0_SC_ADDR; //all bits set to 0 + prev = *ptrMyReg; + *ptrMyReg = prev | 0x00000080; //bit[4:3]: 0x01, on every TPM counter clk, bit[6]: Timer Overflow Interrupt Enable, bit[7]: Timer Overflow Flag +} + +void TPM0_start() { + volatile unsigned int *ptrMyReg; + + ptrMyReg = (volatile unsigned int *) TPM0_SC_ADDR; //all bits set to 0 + *ptrMyReg = 0x00000000; //bit[4:3]: 0x01, on every TPM counter clk, bit[6]: Timer Overflow Interrupt Enable, bit[7]: Timer Overflow Flag + + //clear the counter + ptrMyReg = (volatile unsigned int *) TPM0_CNT_ADDR; //all bits set to 0 + *ptrMyReg = 0x0; + + ptrMyReg = (volatile unsigned int *) TPM0_SC_ADDR; //all bits set to 0 + *ptrMyReg = 0x000000C8; //bit[4:3]: 0x01, on every TPM counter clk, bit[6]: Timer Overflow Interrupt Enable, bit[7]: Timer Overflow Flag +} \ No newline at end of file
diff -r 34f0bfc62803 -r 1c12897871e5 TPM_init.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/TPM_init.h Thu Dec 18 21:47:44 2014 +0000 @@ -0,0 +1,21 @@ +#ifndef TPM_INIT_H +#define TPM_INIT_H + +#include "mbed.h" + +#define SIM_SOPT2_ADDR 0x40048004 +#define SIM_SCGC6_ADDR 0x4004803C +#define MCG_C1_ADDR 0x40064000 +#define TPM0_SC_ADDR 0x40038000 +#define TPM0_C0SC_ADDR 0x4003800C +#define TPM0_CNT_ADDR 0x40038004 +#define TPM0_MOD_ADDR 0x40038008 + +void TPM0_init(unsigned int modulo_val); + +void TPM0_clear_overflow(); +unsigned int TPM0_read(); +unsigned int TPM0_SC_read(); + +void TPM0_start(); +#endif \ No newline at end of file
diff -r 34f0bfc62803 -r 1c12897871e5 main.cpp --- a/main.cpp Mon Jan 27 21:58:45 2014 +0000 +++ b/main.cpp Thu Dec 18 21:47:44 2014 +0000 @@ -1,136 +1,414 @@ #include "mbed.h" #include "SLCD.h" +#include "InterruptManager.h" +#include "TPM_init.h" +#define TOTAL_SYNC 3 +#define PI 3.1415926f + +DigitalOut d_out(D2); +DigitalIn d_in(D3); +InterruptIn d_IRQ(D3); + +int temp_pulse_flag[TOTAL_SYNC]; +int temp_pulse_tpm[TOTAL_SYNC]; + +int temp_sync_flag[TOTAL_SYNC]; +int temp_sync_tpm[TOTAL_SYNC]; + +bool dbg = 0; time_t seconds = time(NULL); // needed to start rtc on reset to maintain reasonable time if hard reset SLCD slcd; -Timer scroll; +//Timer scroll; + +Serial pc(USBTX, USBRX); // tx, rx +RawSerial rpi(USBTX, USBRX); // tx, rx DigitalOut led1(LED1); DigitalOut led2(LED2); -InterruptIn setmin (SW1); -InterruptIn sethour (SW3); +DigitalOut led_r(LED_RED); +DigitalOut pps(D7); +AnalogIn lightSensor(PTE22); +//InterruptIn setmin (SW1); +//InterruptIn sethour (SW3); -struct tm t; +//struct tm t; -int i,j,k,lastscroll,display_timer,minute,hour,colon,dp; +//int i,j,k,lastscroll,display_timer,minute,hour,colon,dp; +int i; char message[60]; -void scroll_message(); +//void scroll_message(); char buffer[32]; -void setminIRQ(); -void sethourIRQ(); +//void setminIRQ(); +//void sethourIRQ(); +void Tx_interrupt(); +void Rx_interrupt(); +void send_line(); +void read_line(); + +// Circular buffers for serial TX and RX data - used by interrupt routines +const int buffer_size = 255; +// might need to increase buffer size for high baud rates +char tx_buffer[buffer_size+1]; +char rx_buffer[buffer_size+1]; +char temp_rx_buffer[2]; +char str[6]; +// Circular buffer pointers +// volatile makes read-modify-write atomic +volatile int tx_in=0; +volatile int tx_out=0; +volatile int rx_in=0; +volatile int rx_out=0; +// Line buffers for sprintf and sscanf +char tx_line[80]; +char rx_line[80]; +unsigned int flag = 0; +unsigned int modulo_val = 48000; //period = 1 ms + +unsigned int new_sync_flag = 0; +unsigned int new_sync_tpm = 0; +unsigned int old_sync_flag = 0; +unsigned int old_sync_tpm = 0; +unsigned int sync_flag = 0; +unsigned int sync_tpm = 0; + +unsigned int new_pulse_flag = 100; +unsigned int new_pulse_tpm = 0; +unsigned int old_pulse_flag = 100; +unsigned int old_pulse_tpm = 0; +unsigned int pulse_flag = 0; +unsigned int pulse_tpm = 0; + +unsigned int new_arrival_flag = 0; +unsigned int new_arrival_tpm = 0; +unsigned int old_arrival_flag = 0; +unsigned int old_arrival_tpm = 0; +unsigned int arrival_flag = 0; +unsigned int arrival_tpm = 0; + +unsigned int state = 0; +unsigned int pps_state = 0; + +Ticker tick_DAC; +Ticker tick_test; +AnalogOut DAC(PTE30); + +const long num_samp_per_sec = 10000; +const int freq_DAC[4] = {1,10,100,1000}; +int count_ADC; +long count_DAC; +int sel_freq_DAC; +char ADC_string[6]; +char final_string[7] = "V"; +bool on_DAC; + +AnalogIn in_0(A0); +//AnalogIn in_1(A1); +bool flag_for_d; +void sine_gen() { + float tem = on_DAC? 0.5*sin(2*PI*freq_DAC[sel_freq_DAC]*count_DAC/num_samp_per_sec) + 0.5 : 0.0; + //float temf = 0.1; + //float tem = 0.5*sin(2*PI*temf*count_DAC/num_samp_per_sec) + 0.5; + //if (count_DAC % 10 == 0) pc.printf("write%f\n",tem); + DAC.write(tem); + count_DAC += 1; + if (count_DAC == num_samp_per_sec - 1) count_DAC = 0; + //if (count_DAC == 10*num_samp_per_sec - 1) count_DAC = 0; + count_ADC += 1; + if (count_ADC == 10000) + { + //sprintf(str, "v%0.3f",in_0.read()); + //for(i=0; i<6; i++) rpi.putc(str[i]); + //rpi.printf("V%0.3f",in_0.read()); + count_ADC = 0; + } +} + +void init() { + d_out = false; + flag_for_d = false; + + count_DAC = 0; + count_ADC = 0; + sel_freq_DAC = 0; + on_DAC = true; + led_r = true; + //led_g = false; +} + +void logichigh() { + led_r=false; + rpi.putc('H'); +} + +void logiclow() { + led_r=true; + rpi.putc('L'); +} + +int num_expire = 0; +void TPM0_handler() { + unsigned int overflow = TPM0_SC_read() & 0x000000C0; + if(overflow == 0xC0) { + TPM0_clear_overflow(); + flag++; + if(state==0){ + if(pps_state == 0){ + if( sync_flag==0 && sync_tpm==0 ){ + pps = 1; + pps_state = 1; + if(dbg) pc.printf("pulse high!\n"); + TPM0_init(modulo_val); + TPM0_start(); + //num_expire = 0; + } else if ( sync_flag==0 ){ + //if(dbg) pc.printf("I shouldn't be here\n"); + TPM0_init(sync_tpm); + TPM0_start(); + sync_tpm = 0; + } else { + sync_flag--; + } + } + else { + if( pulse_flag==0 && pulse_tpm==0 ){ + pps = 0; + pps_state = 0; + if(dbg) pc.printf("pulse low!\n"); + TPM0_init(modulo_val); + //TPM0_start(); + state = 1; + } else if ( pulse_flag==0 ){ + //if(dbg) pc.printf("I shouldn't be here\n"); + TPM0_init(pulse_tpm); + TPM0_start(); + pulse_tpm = 0; + } else { + pulse_flag--; + } + } + } else if (state == 1){ + } + //if(dbg) pc.printf("flag = %d\n", flag); + + NVIC_ClearPendingIRQ(TPM0_IRQn); + } +} main() { + init(); + //pc.printf("Welcome\r\na:on/off (default: on) s:1Hz d:10Hz f:100Hz g:1kHz\r\nq:digital on w:digital off\r\np:print values\r\n"); + tick_DAC.attach_us(&sine_gen, (double)1000000/num_samp_per_sec); + //tick_test.attach(&print_in, (double)1.0/sampling_freq); + + d_IRQ.rise(&logichigh); + d_IRQ.fall(&logiclow); + slcd.All_Segments(1); - wait(2); + wait(1); slcd.All_Segments(0); wait(1); - led1 = 1;led2 = 1; - - sprintf(message, " rtc clock s3 sets the hours s1 sets the minutes"); - -// scrolling message - scroll.start(); - while (i<58) { + led1 = 1; led2 = 1; pps = 1; + + sprintf(message, "1234"); + slcd.printf(message); + if(dbg) pc.printf("Hello World!\n"); + //pc.putc('1'); + NVIC_SetVector(TPM0_IRQn, (uint32_t) TPM0_handler); + NVIC_SetPriority(TPM0_IRQn, 0); + NVIC_EnableIRQ(TPM0_IRQn); + //TPM0_init(modulo_val); - while (i<58) { - scroll_message(); - } + if(dbg) pc.printf("Setting up UART interrupts!\n"); +// Setup a serial interrupt function to receive data + rpi.attach(&Rx_interrupt, Serial::RxIrq); +// Setup a serial interrupt function to transmit data + //rpi.attach(&Tx_interrupt, Serial::TxIrq); + + //char temp[4]; + while(1){ } - wait(1); - - setmin.rise(setminIRQ); // start set Minutes IRQ - sethour.rise(sethourIRQ); // start set Hours IRQ - -// rtc clock function + //wait(3); + //pulse_flag = 100; + //pulse_tpm = 5; + //TPM0_init(modulo_val); + //TPM0_start(); + //if(dbg) pc.printf("Timer started!\n"); +/* while(1) { - - time_t seconds = time(NULL); - - if(display_timer>6) { - strftime(buffer, 4, "%H%M", localtime(&seconds));// display Hours,Minutes for 2 seconds - slcd.Colon(1);led2=0; - slcd.DP2(0);led1=1; - } else { - strftime(buffer, 4, "%M%S", localtime(&seconds));// display Minutes,Seconds for 8 seconds - slcd.Colon(0);led2=1; - slcd.DP2(1);led1=0; - } - slcd.printf(buffer); - wait(.5); - slcd.DP2(0);led1=1; - display_timer++; - if (display_timer>9)display_timer=0; - wait(.5); + flag = 0; + TPM0_start(); + //slcd.putc(pc.getc()); + //led1 = 0; + wait(0.5); + if(dbg) pc.printf("flag = %d, TPM = %x\n", flag, TPM0_read()); + //pc.putc('1'); + //led1 = 1; } +*/ } -void scroll_message() -{ - if (scroll.read_ms() > lastscroll + 350) { - scroll.reset(); - if (i > 58) { - i=0; +unsigned int rx_state = 0; +unsigned int num_sync = 0; +unsigned int num_sec = 0; +// Interupt Routine to read in data from serial port +void Rx_interrupt() { + char c = rpi.getc(); + //led1=0; +// Loop just in case more than one character is in UART's receive FIFO buffer +// Stop if buffer full + if( c == 't'){ + state = 0; + rx_state = 0; + num_sec++; + if(num_sec==4) num_sec =0; + if( pulse_flag==0 && pulse_tpm==0){ + pulse_flag = old_pulse_flag; + pulse_tpm = old_pulse_tpm; + } + if( arrival_flag==0 && arrival_tpm==0){ + sync_flag = old_sync_flag; + sync_tpm = old_sync_tpm; } - int j, k = i; - for (j = 0; j < 4; j++) { - if (message[k+j]) { - slcd.putc(message[k+j]); + TPM0_init(modulo_val); + TPM0_start(); + arrival_flag= 0; + arrival_tpm = 0; + } else if ( c == 'n'){ + on_DAC = true; + } else if ( c == 'o'){ + on_DAC = false; + } else if ( c == 'x'){ + sel_freq_DAC = 0; + } else if ( c == 'y'){ + sel_freq_DAC = 1; + } else if ( c == 'z'){ + sel_freq_DAC = 2; + } else if ( c == 'u'){ + sel_freq_DAC = 3; + } else if ( c == 'q'){ + d_out = true; + } else if ( c == 'w'){ + d_out = false; + } else if ( c == 'p'){ + if(num_sync > 0){ + temp_pulse_flag[num_sync-1] = flag; + temp_pulse_tpm[num_sync-1] = TPM0_read(); + if(dbg) pc.printf("temp_pulse_flag[%d] = %d, temp_pulse_tpm[%d] = %d\n", num_sync-1, temp_pulse_flag[num_sync-1], num_sync-1, temp_pulse_tpm[num_sync-1]); + } + flag = 0; + TPM0_init(modulo_val); + if(num_sync < TOTAL_SYNC){ + TPM0_start(); + num_sync++; } else { - slcd.putc(' '); - k--; + pulse_flag = 0; + pulse_tpm = 0; + for(i=0; i<TOTAL_SYNC; i++){ + pulse_flag += temp_pulse_flag[i]; + pulse_tpm += temp_pulse_tpm[i]; + } + pulse_flag /= TOTAL_SYNC; + pulse_tpm /= TOTAL_SYNC; + if(pulse_flag<50 || pulse_flag>150){ + pulse_flag = 0; + pulse_tpm = 0; + } else { + old_pulse_flag = pulse_flag; + old_pulse_tpm = pulse_tpm; + } + flag = 0; + TPM0_init(modulo_val); + if(dbg) pc.printf("pulse_flag = %d, pulse_tpm = %x\n", pulse_flag, pulse_tpm); + if(num_sec==0){ + rpi.putc('S'); + TPM0_start(); + num_sync=1; + } else { + num_sync=0; + } } - } - i++; - lastscroll=scroll.read_ms(); + } else if ( c == 's'){ + temp_sync_flag[num_sync-1] = flag; + temp_sync_tpm[num_sync-1] = TPM0_read(); + if(dbg) pc.printf("temp_sync_flag[%d] = %d, temp_sync_tpm[%d] = %d\n", num_sync-1, temp_sync_flag[num_sync-1], num_sync-1, temp_sync_tpm[num_sync-1]); + flag = 0; + TPM0_init(modulo_val); + if(num_sync < TOTAL_SYNC){ + rpi.putc('S'); + TPM0_start(); + num_sync++; + } else { + arrival_flag = 0; + arrival_tpm = 0; + for(i=0; i<TOTAL_SYNC; i++){ + arrival_flag += temp_sync_flag[i]; + arrival_tpm += temp_sync_tpm[i]; + } + arrival_flag /= (2*TOTAL_SYNC); + arrival_tpm /= (2*TOTAL_SYNC); + old_arrival_flag = arrival_flag; + old_arrival_tpm = arrival_tpm; + num_sync=0; + if(dbg) pc.printf("arrival_flag = %d, arrival_tpm = %x\n", arrival_flag, arrival_tpm); + rpi.putc('M'); + sprintf(str, "%02d", arrival_flag); + rpi.putc(str[0]); + rpi.putc(str[1]); + sprintf(str, "%04x", arrival_tpm); + rpi.putc(str[0]); + rpi.putc(str[1]); + rpi.putc(str[2]); + rpi.putc(str[3]); + } + } else if( c == 'm' ){ + rx_state = 1; + } else { + //while ((rpi.readable()) && (((rx_in + 1) % buffer_size) != rx_out)) { + if(rx_state == 0){ + //if(dbg) pc.printf("t_rx_in = %d\n", rx_in); + rx_buffer[rx_in] = c; + rx_in = (rx_in + 1) % buffer_size; + if(rx_in == 4){ + slcd.Home(); + slcd.printf(rx_buffer); + slcd.Colon(1); + rx_in = 0; + //rpi.printf("l%0.3f",lightSensor.read()); + //rpi.printf("V%0.3f",in_0.read()); + sprintf(str, "l%0.3f",lightSensor.read()); + for(i=0; i<6; i++) rpi.putc(str[i]); + sprintf(str, "v%0.3f",in_0.read()); + for(i=0; i<6; i++) rpi.putc(str[i]); + } + } else if(rx_state == 1){ + //if(dbg) pc.printf("m_rx_in = %d\n", rx_in); + rx_buffer[rx_in] = c; + rx_in = (rx_in + 1) % buffer_size; + if(rx_in >= 6){ + sync_flag = (10*(rx_buffer[0]-'0') + (rx_buffer[1]-'0')); + if(sync_flag >= arrival_flag){ + sync_flag -= arrival_flag; + for(i=0; i<6; i++){ + if( i<4 ) {rx_buffer[i] = rx_buffer[i+2];} else { rx_buffer[i]=0; } + } + sync_tpm = (int)strtol(rx_buffer, NULL, 16); + if(sync_tpm >= arrival_tpm){ + sync_tpm -= arrival_tpm; + } else { + sync_tpm = 0x10000 + sync_tpm - arrival_tpm; + sync_flag--; + } + } else { sync_flag =0; sync_tpm = 0; } + if(dbg) pc.printf("sync_flag = %d, sync_tpm = %x\n", sync_flag, sync_tpm); + rx_in = 0; + } + } } -} - -void setminIRQ(void) // set Minutes ISR -{ - display_timer=7; - time_t seconds = time(NULL); - char buffer[2]; - strftime(buffer, 2,"%H", localtime(&seconds)); - hour = atoi(buffer); // get Hour integer - strftime(buffer, 2,"%M", localtime(&seconds)); - minute = atoi(buffer); // get Minutes integer - minute++; - if(minute>59) minute=0; - t.tm_sec = 0; // Seconds reset to zero - t.tm_min = minute; - t.tm_hour = hour; - t.tm_mday = 1; - t.tm_mon = 2; - t.tm_year = 114; - set_time (mktime(&t)); - -} - -void sethourIRQ(void) // set Hours ISR -{ - display_timer=7; - time_t seconds = time(NULL); - char buffer[2]; - strftime(buffer, 2,"%H", localtime(&seconds)); - hour = atoi(buffer); // get Hour integer - strftime(buffer, 2,"%M", localtime(&seconds)); - minute = atoi(buffer); // get Minutes integer - hour++; - if(hour>23) hour=0; - t.tm_sec = 0; // Seconds reset to zero - t.tm_min = minute; - t.tm_hour = hour; - t.tm_mday = 1; - t.tm_mon = 2; - t.tm_year = 114; - set_time (mktime(&t)); - -} - - - - + //led1=1; + return; +} \ No newline at end of file
diff -r 34f0bfc62803 -r 1c12897871e5 mbed-src.lib --- a/mbed-src.lib Mon Jan 27 21:58:45 2014 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -https://mbed.org/users/mbed_official/code/mbed-src/#847f030b50ee
diff -r 34f0bfc62803 -r 1c12897871e5 mbed.bld --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Thu Dec 18 21:47:44 2014 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed/builds/4fc01daae5a5 \ No newline at end of file