t2d board

Dependencies:   DebounceIn PinDetect SI570 Si5351A mbed

Fork of mbed_blinky by Mbed

Committer:
davcordova
Date:
Thu Feb 01 12:26:02 2018 +0000
Revision:
19:7f10a8469c31
Parent:
4:81cea7a352b0
v1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
davcordova 19:7f10a8469c31 1
dan 0:7dec7e9ac085 2 #include "mbed.h"
davcordova 19:7f10a8469c31 3 #include "si5351a.h"
davcordova 19:7f10a8469c31 4
davcordova 19:7f10a8469c31 5 InterruptIn button(p18); // Interrupt on digital pushbutton input p18
davcordova 19:7f10a8469c31 6 Timer debounce; // define debounce timer
davcordova 19:7f10a8469c31 7 Ticker data_out; // periodic interrupt routines
davcordova 19:7f10a8469c31 8 Ticker clock_out;
davcordova 19:7f10a8469c31 9 DigitalOut data(p16);
davcordova 19:7f10a8469c31 10 DigitalOut clk(p17);
davcordova 19:7f10a8469c31 11 DigitalOut swon(p21);
davcordova 19:7f10a8469c31 12 DigitalOut swled(LED1);
davcordova 19:7f10a8469c31 13
davcordova 19:7f10a8469c31 14 uint16_t divider, mode;
davcordova 19:7f10a8469c31 15 uint32_t ref0,ref1,ref2;
davcordova 19:7f10a8469c31 16 uint16_t *div_bin; // pointer
davcordova 19:7f10a8469c31 17 int count_data,count_clk;
dan 0:7dec7e9ac085 18
davcordova 19:7f10a8469c31 19 I2C i2c(p28, p27); // communication with Si5351A I2C_SDA=p28 & I2C_SCL=p27
davcordova 19:7f10a8469c31 20 SI5351A ckref(i2c, 25000000UL); // Base clock = 25MHz
davcordova 19:7f10a8469c31 21 Serial pc(USBTX,USBRX); // setup terminal link
davcordova 19:7f10a8469c31 22 LocalFileSystem local("local"); // define local file system
davcordova 19:7f10a8469c31 23
davcordova 19:7f10a8469c31 24 uint16_t read_data (int );
davcordova 19:7f10a8469c31 25 uint16_t * set_dec2bin (uint16_t);
davcordova 19:7f10a8469c31 26 void send_data (void);
davcordova 19:7f10a8469c31 27 void send_clk (void);
davcordova 19:7f10a8469c31 28 void toggle(void); // function prototype
davcordova 19:7f10a8469c31 29
davcordova 19:7f10a8469c31 30 uint16_t read_data (int mode)
davcordova 19:7f10a8469c31 31 {
davcordova 19:7f10a8469c31 32 // char bitmode[10];
davcordova 19:7f10a8469c31 33 // char div[10];
davcordova 19:7f10a8469c31 34 // char reads[10], readc[10];
davcordova 19:7f10a8469c31 35 // char writes[10];
davcordova 19:7f10a8469c31 36 // char writec[10];
davcordova 19:7f10a8469c31 37 uint16_t value;
davcordova 19:7f10a8469c31 38 int i,j;
davcordova 19:7f10a8469c31 39 char text[10][10]; // when the file exist and have data
davcordova 19:7f10a8469c31 40 char line[10]; // it reads line by line
dan 0:7dec7e9ac085 41
davcordova 19:7f10a8469c31 42 for(i=0; i<10; i++)
davcordova 19:7f10a8469c31 43 for(j=0; j<10; j++)
davcordova 19:7f10a8469c31 44 text[i][j] = '\0'; // initializing the vector with null
davcordova 19:7f10a8469c31 45 for(i=0; i<10; i++)
davcordova 19:7f10a8469c31 46 line[i] = '\0';
davcordova 19:7f10a8469c31 47
davcordova 19:7f10a8469c31 48 FILE* fp = fopen ("/local/div_prog.txt","r"); // open file for reading
davcordova 19:7f10a8469c31 49 if (fp!=NULL)
davcordova 19:7f10a8469c31 50 {
davcordova 19:7f10a8469c31 51 fseek (fp, 0, SEEK_END);
davcordova 19:7f10a8469c31 52 int size = ftell(fp);
davcordova 19:7f10a8469c31 53 if (size==0)
davcordova 19:7f10a8469c31 54 {
davcordova 19:7f10a8469c31 55 pc.printf("File is empty\n");
davcordova 19:7f10a8469c31 56 }
davcordova 19:7f10a8469c31 57 else
davcordova 19:7f10a8469c31 58 {
davcordova 19:7f10a8469c31 59 rewind (fp); // restore pointer to the begin of the file
davcordova 19:7f10a8469c31 60 i=0;
davcordova 19:7f10a8469c31 61 while ( fgets ( line, sizeof line, fp ) != NULL ) /* read a line */
davcordova 19:7f10a8469c31 62 {
davcordova 19:7f10a8469c31 63 strcpy(text[i], line);
davcordova 19:7f10a8469c31 64 printf("array ----> %s ", text[i]);
davcordova 19:7f10a8469c31 65 i++;
davcordova 19:7f10a8469c31 66 }
davcordova 19:7f10a8469c31 67 fclose(fp); // close file
davcordova 19:7f10a8469c31 68
davcordova 19:7f10a8469c31 69 if(mode==0)
davcordova 19:7f10a8469c31 70 {
davcordova 19:7f10a8469c31 71 value=atoi(text[mode]);
davcordova 19:7f10a8469c31 72 pc.printf("Divider value = %d \n",value); // display read data value
davcordova 19:7f10a8469c31 73 }
davcordova 19:7f10a8469c31 74 if(mode==1)
davcordova 19:7f10a8469c31 75 {
davcordova 19:7f10a8469c31 76 value=atoi(text[mode]);
davcordova 19:7f10a8469c31 77 if (value==0)
davcordova 19:7f10a8469c31 78 pc.printf("LSB Mode \n"); //
davcordova 19:7f10a8469c31 79 if (value==1)
davcordova 19:7f10a8469c31 80 pc.printf("MSB Mode \n"); //
davcordova 19:7f10a8469c31 81 }
davcordova 19:7f10a8469c31 82 }
davcordova 19:7f10a8469c31 83 }
davcordova 19:7f10a8469c31 84
davcordova 19:7f10a8469c31 85 else
davcordova 19:7f10a8469c31 86 {
davcordova 19:7f10a8469c31 87 int num;
davcordova 19:7f10a8469c31 88 pc.printf("File does no exist \n");
davcordova 19:7f10a8469c31 89 pc.printf("Enter the divider value \n: ");
davcordova 19:7f10a8469c31 90 pc.printf("Byte to send LSB(0) or MSB(1)\n: ");
davcordova 19:7f10a8469c31 91
davcordova 19:7f10a8469c31 92 for(i=0; i<2; i++) //just read to save to lines
davcordova 19:7f10a8469c31 93 {
davcordova 19:7f10a8469c31 94 pc.scanf("%s", text[i]);
davcordova 19:7f10a8469c31 95 while (!(sscanf(text[i], "%d", &num)))
davcordova 19:7f10a8469c31 96 {
davcordova 19:7f10a8469c31 97 printf("Invalid input '%s'\n", text[i]);
davcordova 19:7f10a8469c31 98 pc.scanf("%s", text[i]);
davcordova 19:7f10a8469c31 99 }
davcordova 19:7f10a8469c31 100 }
davcordova 19:7f10a8469c31 101
davcordova 19:7f10a8469c31 102
davcordova 19:7f10a8469c31 103 }
davcordova 19:7f10a8469c31 104
davcordova 19:7f10a8469c31 105 // FILE* fp2 = fopen("/local/div_prog.txt","w"); // open file
davcordova 19:7f10a8469c31 106 // memcpy(writes, div, sizeof writes);
davcordova 19:7f10a8469c31 107 // fputs(writes, fp2); // put char (data value) into file
davcordova 19:7f10a8469c31 108 // fclose(fp2); // close file
davcordova 19:7f10a8469c31 109 // value=atoi(writes);
davcordova 19:7f10a8469c31 110 // pc.printf("Divider valuec = %d \n",value); // display read data value
davcordova 19:7f10a8469c31 111
davcordova 19:7f10a8469c31 112 return value;
davcordova 19:7f10a8469c31 113 }
davcordova 19:7f10a8469c31 114
davcordova 19:7f10a8469c31 115 uint16_t * set_dec2bin (uint16_t read_div) {
davcordova 19:7f10a8469c31 116 int i;
davcordova 19:7f10a8469c31 117 static uint16_t r[12];
davcordova 19:7f10a8469c31 118 /* for loop execution */
davcordova 19:7f10a8469c31 119 for( i = 0; i < 12; i++ ){
davcordova 19:7f10a8469c31 120 r[i]= read_div >> i & 1;
davcordova 19:7f10a8469c31 121 pc.printf("%d",r[i]); // display read data value
davcordova 19:7f10a8469c31 122 }
davcordova 19:7f10a8469c31 123 pc.printf("\n");
davcordova 19:7f10a8469c31 124 return r;
stevep 4:81cea7a352b0 125 }
davcordova 19:7f10a8469c31 126
davcordova 19:7f10a8469c31 127
davcordova 19:7f10a8469c31 128 void send_data (void) {
davcordova 19:7f10a8469c31 129 if(count_data<12) {
davcordova 19:7f10a8469c31 130 if(mode==0){
davcordova 19:7f10a8469c31 131 data= *(div_bin+count_data);
davcordova 19:7f10a8469c31 132 pc.printf("%d",*(div_bin+count_data));
davcordova 19:7f10a8469c31 133 count_data=count_data+1;
davcordova 19:7f10a8469c31 134 }
davcordova 19:7f10a8469c31 135 if(mode==1) {
davcordova 19:7f10a8469c31 136 data= *(div_bin+11-count_data);
davcordova 19:7f10a8469c31 137 pc.printf("%d",*(div_bin+11-count_data));
davcordova 19:7f10a8469c31 138 count_data=count_data+1;
davcordova 19:7f10a8469c31 139 }
davcordova 19:7f10a8469c31 140
davcordova 19:7f10a8469c31 141 }
davcordova 19:7f10a8469c31 142 else {
davcordova 19:7f10a8469c31 143 data=0;
davcordova 19:7f10a8469c31 144 // count_data=0;
davcordova 19:7f10a8469c31 145 // pc.printf("\n");
davcordova 19:7f10a8469c31 146 }
davcordova 19:7f10a8469c31 147
davcordova 19:7f10a8469c31 148 }
davcordova 19:7f10a8469c31 149
davcordova 19:7f10a8469c31 150 void send_clk (void){
davcordova 19:7f10a8469c31 151 if(count_clk<24) {
davcordova 19:7f10a8469c31 152 clk=!clk;
davcordova 19:7f10a8469c31 153 // pc.printf("d%d",clk);
davcordova 19:7f10a8469c31 154 count_clk=count_clk+1;
davcordova 19:7f10a8469c31 155 }
davcordova 19:7f10a8469c31 156 else {
davcordova 19:7f10a8469c31 157 clk=0;
davcordova 19:7f10a8469c31 158 // count_clk=0;
davcordova 19:7f10a8469c31 159 // pc.printf("\n");
davcordova 19:7f10a8469c31 160 }
davcordova 19:7f10a8469c31 161
davcordova 19:7f10a8469c31 162 }
davcordova 19:7f10a8469c31 163
davcordova 19:7f10a8469c31 164 int main ()
davcordova 19:7f10a8469c31 165 {
davcordova 19:7f10a8469c31 166 ref0=read_data(2);
davcordova 19:7f10a8469c31 167 ref1=read_data(3);
davcordova 19:7f10a8469c31 168 ref2=read_data(4);
davcordova 19:7f10a8469c31 169 //ckref.set_frequency(SI5351_CLK0, ref0*1000000); // CLK0=48MHz
davcordova 19:7f10a8469c31 170 //ckref.set_frequency(SI5351_CLK1, ref1*1000000); // CLK0=50MHz
davcordova 19:7f10a8469c31 171 //ckref.set_frequency(SI5351_CLK2, ref2*1000000); // CLK0=45MHz
davcordova 19:7f10a8469c31 172 // ckref.set_frequency(SI5351_CLK0, 40000000); // CLK0=48MHz
davcordova 19:7f10a8469c31 173 ckref.set_frequency(SI5351_CLK1, 4800000); // CLK0=50MHz
davcordova 19:7f10a8469c31 174 // ckref.set_frequency(SI5351_CLK2, 49000000); // CLK0=45MHz
davcordova 19:7f10a8469c31 175
davcordova 19:7f10a8469c31 176 data=0;
davcordova 19:7f10a8469c31 177 clk=0;
davcordova 19:7f10a8469c31 178 divider= read_data(0);
davcordova 19:7f10a8469c31 179 div_bin= set_dec2bin(divider);
davcordova 19:7f10a8469c31 180 mode= read_data(1);
davcordova 19:7f10a8469c31 181
davcordova 19:7f10a8469c31 182 debounce.start();
davcordova 19:7f10a8469c31 183 button.rise(&toggle); // attach the address of the toggle
davcordova 19:7f10a8469c31 184 swon=1;
davcordova 19:7f10a8469c31 185 swled=1;
davcordova 19:7f10a8469c31 186 wait(1);
davcordova 19:7f10a8469c31 187 swon=0;
davcordova 19:7f10a8469c31 188 swled=0;
davcordova 19:7f10a8469c31 189 while(1) { //begin while
davcordova 19:7f10a8469c31 190 wait(1);
davcordova 19:7f10a8469c31 191 } // end while
davcordova 19:7f10a8469c31 192
davcordova 19:7f10a8469c31 193 }
davcordova 19:7f10a8469c31 194
davcordova 19:7f10a8469c31 195 void toggle() {
davcordova 19:7f10a8469c31 196 if (debounce.read_ms()>200) // only allow toggle if debounce timer
davcordova 19:7f10a8469c31 197 data_out.attach(&send_data, 0.01);
davcordova 19:7f10a8469c31 198 wait(0.005);
davcordova 19:7f10a8469c31 199 clock_out.attach(&send_clk, 0.005);
davcordova 19:7f10a8469c31 200 debounce.reset(); // restart timer when the toggle is performed
davcordova 19:7f10a8469c31 201 count_data=0;
davcordova 19:7f10a8469c31 202 count_clk=0;
davcordova 19:7f10a8469c31 203 swon=1;
davcordova 19:7f10a8469c31 204 swled=1;
davcordova 19:7f10a8469c31 205 wait(1);
davcordova 19:7f10a8469c31 206 swon=0;
davcordova 19:7f10a8469c31 207 swled=0;
davcordova 19:7f10a8469c31 208 }
davcordova 19:7f10a8469c31 209