Things2Do

Dependencies:   DebounceIn PinDetect SI570 Si5351A mbed

Fork of t2d by David Cordova

Files at this revision

API Documentation at this revision

Comitter:
aaitihda
Date:
Mon Mar 12 15:39:04 2018 +0000
Parent:
19:7f10a8469c31
Commit message:
PCB progamming code;

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
diff -r 7f10a8469c31 -r e498fd789660 main.cpp
--- a/main.cpp	Thu Feb 01 12:26:02 2018 +0000
+++ b/main.cpp	Mon Mar 12 15:39:04 2018 +0000
@@ -1,209 +1,346 @@
-
 #include "mbed.h"
 #include "si5351a.h"
+#include "PinDetect.h"
+#include "DebounceIn.h"
+
+#define MIN_FREQ 20000000
+#define MAX_FREQ 120000000
+#define STEP_FREQ 100000
+#define RESET_FREQ 35000000
+   
+// Interrupt on digital pushbutton
+PinDetect buttonReset(p13);
+PinDetect buttonData(p11);
+PinDetect buttonIref(p12);
+PinDetect buttonStep(p23);
+
     
-    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);
+// periodic interrupt routines
+Ticker data_out;            
+Ticker clock_out;
     
-    uint16_t divider, mode;
-    uint32_t ref0,ref1,ref2;
-    uint16_t *div_bin; // pointer
-    int count_data,count_clk;
+// data, clk, iref switch output
+DigitalOut data(p15);
+DigitalOut clk(p14);    
+DigitalOut iref_sw(p16);
+
+//Encoder
+DigitalIn A(p22);
+DigitalIn B(p21);
+
+
+// Leds
+DigitalOut led1(LED1);
+DigitalOut led2(LED2);
+DigitalOut led3(LED3);
+DigitalOut led4(LED4);
+ 
 
-    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
+// setup terminal link
+Serial pc(USBTX,USBRX); 
+    
+// Comparateur Threshold
+AnalogOut Vth(p18);
+    
+// communication with Si5351A I2C_SDA=p9 & I2C_SCL=p10
+I2C i2c(p9, p10);       
     
-     uint16_t read_data (int );   
-     uint16_t * set_dec2bin (uint16_t);
-     void send_data (void);
-     void send_clk (void);
-     void toggle(void); // function prototype
+// Base clock = 25MHz
+SI5351A ckref(i2c, 25000000UL,SI5351_CRYSTAL_LOAD_8PF,SI5351_CLK_DRIVE_STRENGTH_8MA);
+    
+// define local file system
+LocalFileSystem local("local"); 
+
+//Interruption function
+void toggle(void);
+void initialisation(void);
+void stepChange(void);
+void reset(void);
+
 
-        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
+//read the data from the .txt file
+uint16_t read_data (int);
+
+//convert decemal to binary
+uint16_t * set_dec2bin (uint16_t);
+
+//send the data to programm the divider
+void send_data (void);
+
+//send the clock to programm the divider
+void send_clk (void);
+
+// turn all the leds  off
+void allLedsOff(void);
+
+// turn all the leds  on
+void allLedsOn(void);
+
+//Variabeles
+int divider, mode, resetFreq(RESET_FREQ), stepFreq(STEP_FREQ);
+uint16_t *div_bin; // pointer
+int count_data,count_clk,counter(0),stepCount(0),thresholdVoltage(0);
+int aLastState(0);
 
-        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;
-        }
+int main (){
+    
+    //Config the interrupt button with the debouncing
+    buttonReset.mode(PullUp);
+    wait(0.01);
+    buttonReset.attach_asserted(&reset);
+    
+    buttonStep.mode(PullUp);
+    wait(0.01);
+    buttonStep.attach_asserted(&stepChange);
+    
+    buttonData.mode(PullUp);
+    wait(0.01);
+    buttonData.attach_asserted(&toggle);
+    
+    buttonIref.mode(PullUp);
+    wait(0.01);
+    buttonIref.attach_asserted(&initialisation);
+    
+    buttonReset.setSampleFrequency();
+    buttonIref.setSampleFrequency();
+    buttonData.setSampleFrequency();
+    buttonStep.setSampleFrequency();
+    
+    //Init the variables
+    ckref.set_frequency(SI5351_CLK0, RESET_FREQ);   // CLK0=48MHz
+    data       = 0;
+    clk        = 0;
+    aLastState = A;
     
-    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;
+    //Getting the data from the file
+    divider          = read_data(0);
+    div_bin          = set_dec2bin(divider);
+    mode             = read_data(1);
+    resetFreq        = read_data(2)*1000000;
+    stepFreq         = read_data(3);
+    counter          = resetFreq;
+    thresholdVoltage = read_data(4);
+    Vth              = ((double)thresholdVoltage/1000) * 0.3f;
+    // Loop
+    while(1){
+        if (A != aLastState){
+            if(B != A)
+                counter = counter + stepFreq;
+            else
+                counter = counter - stepFreq;
         }
-        if(mode==1) {
-        data= *(div_bin+11-count_data);
-        pc.printf("%d",*(div_bin+11-count_data));
-        count_data=count_data+1;
+        aLastState = A;
+        if(stepCount == 0){
+            allLedsOff();
+            led1 = 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 if (stepCount == 1){
+            allLedsOff();
+            led2 = 1;
+        }
+        else if (stepCount == 2){
+            allLedsOff();
+            led3 = 1;
         }
-          else {
-    clk=0;
-  //  count_clk=0;
-  //  pc.printf("\n");
-    }
-        
-        }
+        else if (stepCount == 3){
+            allLedsOff();
+            led4 = 1;
+        }        
+        ckref.set_frequency(SI5351_CLK0, counter);
+        wait(0.2);
+        printf("frequence : %d threshold voltage: %1.2f volts\n\r", counter, Vth.read() * 3.3f);        
+    }     
+}
 
-    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
+void allLedsOff(){
+    led1      = 0;
+    led2      = 0;
+    led3      = 0;
+    led4      = 0;
+}
 
-    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 allLedsOn(){
+    led1      = 1;
+    led2      = 1;
+    led3      = 1;
+    led4      = 1;
+}
+
+//Interrupt fonction
+void reset(){
+    counter  = resetFreq;
+    allLedsOn();
+    wait(0.5);
+    allLedsOff();
+    wait(0.2);
+    allLedsOn();
+    wait(0.5);
+    allLedsOff();    
+}
+
+void initialisation(){
+    iref_sw   = 1;
+    allLedsOn();
+    wait(5);
+    iref_sw   = 0;
+    allLedsOff();
+}
     
-    void toggle() {
-    if (debounce.read_ms()>200) // only allow toggle if debounce timer
+void toggle() {
     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;
+    count_data  = 0;
+    count_clk   = 0;
+    allLedsOff();
+    led1        = 1;
+    wait(0.2);
+    led1        = 0;
+    led2        = 1;
+    wait(0.2);
+    led2        = 0;
+    led3        = 1;
+    wait(0.2);
+    led3        = 0;
+    led4        = 1;
+    wait(0.2);
+    led4        = 0;
 }   
-   
\ No newline at end of file
+
+void stepChange(){
+    if(stepCount == 3)
+        stepCount = 0;
+    else
+        stepCount++;
+    if(stepCount == 0){
+        allLedsOff();
+        stepFreq = stepFreq*1000;
+        led1 = 1;
+    }
+    else if (stepCount == 1){
+        allLedsOff();
+        stepFreq = stepFreq*10000;
+        led2 = 1;
+    }
+    else if (stepCount == 2){
+        allLedsOff();
+        stepFreq = stepFreq*100000;
+        led3 = 1;
+    }
+    else{
+        allLedsOff();
+        stepFreq = stepFreq*1000000;
+        led4 = 1;
+    }      
+}
+
+
+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;
+}
+    
+void send_clk (void){
+    if(count_clk<24) {
+        clk=!clk;
+        count_clk=count_clk+1;
+    }
+    else {
+        clk=0;;
+    }        
+}  
+
+uint16_t read_data (int  mode) 
+{              
+    int value;
+    int i,j;
+    char text[10][10]; // when the file exist and have data
+    char line[10];     // it reads line by line
+
+    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\r");
+            }
+            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){// Get the divider value
+                    value=atoi(text[mode]);
+                        pc.printf("Divider value = %d \n\r",value); // display read data value
+                }
+                if(mode==1){// Get the Mode (LSB/MSB)
+                    value=atoi(text[mode]);
+                    if (value==0)
+                        pc.printf("LSB Mode \n"); //
+                    if (value==1)
+                        pc.printf("MSB Mode \n"); //        
+                }
+                if(mode==2){// Get the Reset frequency in MHz
+                    value=atoi(text[mode]);
+                    pc.printf("Reset Frequency = %d \n\r", value);    
+                }
+                if(mode==3){// Get the frequency step
+                    value=atoi(text[mode]);
+                    pc.printf("Frequency Step = %d \n\r", value);    
+                }
+                if(mode==4){
+                    value=atoi(text[mode]);
+                    pc.printf("Threshold voltage = %d \n\r",value);   
+                }                             
+            }
+        }
+                
+        else{
+            int num;    
+            pc.printf("File does no exist \n\r");
+            pc.printf("Enter the divider value \n: \r");
+            pc.printf("Byte to send LSB(0) or MSB(1)\n: \r");
+            for(i=0; i<2; i++){   //just read to save to lines
+                pc.scanf("%s\r", text[i]);
+                while (!(sscanf(text[i], "%d\r", &num))){
+                    printf("Invalid input '%s'\n\r", text[i]);
+                    pc.scanf("%s\r", text[i]);
+                }     
+            }                
+                   
+        }
+        return value;
+}
+    
+uint16_t * set_dec2bin (uint16_t read_div) {
+    int i;
+    static uint16_t  r[12];
+    for( i = 0; i < 12; i++ ){
+        r[i]= read_div >> i & 1;
+        pc.printf("%d",r[i]); // display read data value
+   }
+     pc.printf("\n\r"); 
+     return r;
+}
diff -r 7f10a8469c31 -r e498fd789660 mbed.bld
--- a/mbed.bld	Thu Feb 01 12:26:02 2018 +0000
+++ b/mbed.bld	Mon Mar 12 15:39:04 2018 +0000
@@ -1,1 +1,1 @@
-http://mbed.org/users/mbed_official/code/mbed/builds/b484a57bc302
\ No newline at end of file
+https://os.mbed.com/users/mbed_official/code/mbed/builds/7130f322cb7e
\ No newline at end of file