t2d board
Dependencies: DebounceIn PinDetect SI570 Si5351A mbed
Fork of mbed_blinky by
Diff: main.cpp
- Revision:
- 19:7f10a8469c31
- Parent:
- 4:81cea7a352b0
--- a/main.cpp Thu Oct 12 04:41:05 2017 +0000
+++ b/main.cpp Thu Feb 01 12:26:02 2018 +0000
@@ -1,12 +1,209 @@
+
#include "mbed.h"
+#include "si5351a.h"
+
+ InterruptIn button(p18); // Interrupt on digital pushbutton input p18
+ Timer debounce; // define debounce timer
+ Ticker data_out; // periodic interrupt routines
+ Ticker clock_out;
+ DigitalOut data(p16);
+ DigitalOut clk(p17);
+ DigitalOut swon(p21);
+ DigitalOut swled(LED1);
+
+ uint16_t divider, mode;
+ uint32_t ref0,ref1,ref2;
+ uint16_t *div_bin; // pointer
+ int count_data,count_clk;
-DigitalOut myled(LED1);
+ I2C i2c(p28, p27); // communication with Si5351A I2C_SDA=p28 & I2C_SCL=p27
+ SI5351A ckref(i2c, 25000000UL); // Base clock = 25MHz
+ Serial pc(USBTX,USBRX); // setup terminal link
+ LocalFileSystem local("local"); // define local file system
+
+ uint16_t read_data (int );
+ uint16_t * set_dec2bin (uint16_t);
+ void send_data (void);
+ void send_clk (void);
+ void toggle(void); // function prototype
+
+ uint16_t read_data (int mode)
+ {
+ // char bitmode[10];
+ // char div[10];
+ // char reads[10], readc[10];
+ // char writes[10];
+ // char writec[10];
+ uint16_t value;
+ int i,j;
+ char text[10][10]; // when the file exist and have data
+ char line[10]; // it reads line by line
-int main() {
- while(1) {
- myled = 1;
- wait(0.2);
- myled = 0;
- wait(0.2);
+ for(i=0; i<10; i++)
+ for(j=0; j<10; j++)
+ text[i][j] = '\0'; // initializing the vector with null
+ for(i=0; i<10; i++)
+ line[i] = '\0';
+
+ FILE* fp = fopen ("/local/div_prog.txt","r"); // open file for reading
+ if (fp!=NULL)
+ {
+ fseek (fp, 0, SEEK_END);
+ int size = ftell(fp);
+ if (size==0)
+ {
+ pc.printf("File is empty\n");
+ }
+ else
+ {
+ rewind (fp); // restore pointer to the begin of the file
+ i=0;
+ while ( fgets ( line, sizeof line, fp ) != NULL ) /* read a line */
+ {
+ strcpy(text[i], line);
+ printf("array ----> %s ", text[i]);
+ i++;
+ }
+ fclose(fp); // close file
+
+ if(mode==0)
+ {
+ value=atoi(text[mode]);
+ pc.printf("Divider value = %d \n",value); // display read data value
+ }
+ if(mode==1)
+ {
+ value=atoi(text[mode]);
+ if (value==0)
+ pc.printf("LSB Mode \n"); //
+ if (value==1)
+ pc.printf("MSB Mode \n"); //
+ }
+ }
+ }
+
+ else
+ {
+ int num;
+ pc.printf("File does no exist \n");
+ pc.printf("Enter the divider value \n: ");
+ pc.printf("Byte to send LSB(0) or MSB(1)\n: ");
+
+ for(i=0; i<2; i++) //just read to save to lines
+ {
+ pc.scanf("%s", text[i]);
+ while (!(sscanf(text[i], "%d", &num)))
+ {
+ printf("Invalid input '%s'\n", text[i]);
+ pc.scanf("%s", text[i]);
+ }
+ }
+
+
+ }
+
+ // FILE* fp2 = fopen("/local/div_prog.txt","w"); // open file
+ // memcpy(writes, div, sizeof writes);
+ // fputs(writes, fp2); // put char (data value) into file
+ // fclose(fp2); // close file
+ // value=atoi(writes);
+ // pc.printf("Divider valuec = %d \n",value); // display read data value
+
+ return value;
+ }
+
+ uint16_t * set_dec2bin (uint16_t read_div) {
+ int i;
+ static uint16_t r[12];
+ /* for loop execution */
+ for( i = 0; i < 12; i++ ){
+ r[i]= read_div >> i & 1;
+ pc.printf("%d",r[i]); // display read data value
+ }
+ pc.printf("\n");
+ return r;
}
-}
+
+
+ void send_data (void) {
+ if(count_data<12) {
+ if(mode==0){
+ data= *(div_bin+count_data);
+ pc.printf("%d",*(div_bin+count_data));
+ count_data=count_data+1;
+ }
+ if(mode==1) {
+ data= *(div_bin+11-count_data);
+ pc.printf("%d",*(div_bin+11-count_data));
+ count_data=count_data+1;
+ }
+
+ }
+ else {
+ data=0;
+ // count_data=0;
+ // pc.printf("\n");
+ }
+
+ }
+
+ void send_clk (void){
+ if(count_clk<24) {
+ clk=!clk;
+ // pc.printf("d%d",clk);
+ count_clk=count_clk+1;
+ }
+ else {
+ clk=0;
+ // count_clk=0;
+ // pc.printf("\n");
+ }
+
+ }
+
+ int main ()
+ {
+ ref0=read_data(2);
+ ref1=read_data(3);
+ ref2=read_data(4);
+ //ckref.set_frequency(SI5351_CLK0, ref0*1000000); // CLK0=48MHz
+ //ckref.set_frequency(SI5351_CLK1, ref1*1000000); // CLK0=50MHz
+ //ckref.set_frequency(SI5351_CLK2, ref2*1000000); // CLK0=45MHz
+ // ckref.set_frequency(SI5351_CLK0, 40000000); // CLK0=48MHz
+ ckref.set_frequency(SI5351_CLK1, 4800000); // CLK0=50MHz
+ // ckref.set_frequency(SI5351_CLK2, 49000000); // CLK0=45MHz
+
+ data=0;
+ clk=0;
+ divider= read_data(0);
+ div_bin= set_dec2bin(divider);
+ mode= read_data(1);
+
+ debounce.start();
+ button.rise(&toggle); // attach the address of the toggle
+ swon=1;
+ swled=1;
+ wait(1);
+ swon=0;
+ swled=0;
+ while(1) { //begin while
+ wait(1);
+ } // end while
+
+ }
+
+ void toggle() {
+ if (debounce.read_ms()>200) // only allow toggle if debounce timer
+ data_out.attach(&send_data, 0.01);
+ wait(0.005);
+ clock_out.attach(&send_clk, 0.005);
+ debounce.reset(); // restart timer when the toggle is performed
+ count_data=0;
+ count_clk=0;
+ swon=1;
+ swled=1;
+ wait(1);
+ swon=0;
+ swled=0;
+}
+
\ No newline at end of file
