t2d board
Dependencies: DebounceIn PinDetect SI570 Si5351A mbed
Fork of mbed_blinky by
main.cpp@19:7f10a8469c31, 2018-02-01 (annotated)
- Committer:
- davcordova
- Date:
- Thu Feb 01 12:26:02 2018 +0000
- Revision:
- 19:7f10a8469c31
- Parent:
- 4:81cea7a352b0
v1
Who changed what in which revision?
User | Revision | Line number | New 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 |