PAS EGSE HVPS for Nucleo F746ZG

Dependencies:   SDFileSystem TextLCD mbed

Revision:
0:f24491e13cb3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pas_hv_mbed.cpp	Mon Jul 25 09:48:24 2016 +0000
@@ -0,0 +1,625 @@
+#include "mbed.h"
+//#include "TextLCD.h"
+//#include "SDFileSystem.h"
+
+#define GAIN_TOPDEF 6
+#define SIGN_TOPDEF 5
+#define GAIN_BOTDEF 4
+#define SIGN_BOTDEF 3
+#define GAIN_TOPPLATE 2
+#define SIGN_TOPPLATE 1
+#define GAIN_ANL 0
+
+//#define LPC1768
+//#define K64F
+//#define KL25Z
+#define F746ZG
+
+Serial pc(USBTX, USBRX);
+#ifdef LPC1768
+DigitalOut led1(LED1),led2(LED2);
+TextLCD lcd(p15, p16, p17, p18, p19, p20, TextLCD::LCD16x2); // rs, e, d4-d7
+SDFileSystem sd(p5, p6, p7, p8, "sd"); // the pinout on the mbed Cool Components workshop board
+SPI spi(p11, p12, p13); // MOSI (Din DAC), MISO (Dout ADC), SCLK
+DigitalOut on_off_mhv(p21), cs_adc(p22), sign_top_def(p25), gain_top_def(p26), cs_top_def(p23), cs_mhv(p24);
+#endif
+#ifdef K64F
+SPI spi(D11, D12, D13); // MOSI (Din DAC), MISO (Dout ADC), SCLK
+DigitalOut on_off_mhv(PTB18), cs_adc(PTC17), sign_top_def(PTC1), gain_top_def(PTC8), cs_top_def(PTC9), cs_mhv(D9);
+DigitalOut gain_anl(D0), cs_anl(PTB19), sign_top_plate(D2), gain_top_plate(D3), cs_top_plate(D4);
+DigitalOut sign_bot_def(D5), gain_bot_def(D6), cs_bot_def(D7), hv_limit(D10);
+DigitalOut led_green(LED2); //  GREEN
+DigitalOut led_red(LED1); //  RED
+DigitalOut led_blue(LED3); //  BLUE
+#endif
+#ifdef F746ZG
+SPI spi(D11, D12, D13); // MOSI (Din DAC), MISO (Dout ADC), SCLK
+DigitalOut on_off_mhv(PB_2), cs_adc(D1), sign_top_def(PF_4), gain_top_def(PC_2), cs_top_def(PB_1), cs_mhv(D9);
+DigitalOut gain_anl(D0), cs_anl(PB_6), sign_top_plate(D2), gain_top_plate(D3), cs_top_plate(D4);
+DigitalOut sign_bot_def(D5), gain_bot_def(D6), cs_bot_def(D7), hv_limit(D10);
+DigitalOut led_green(LED2); //  GREEN
+DigitalOut led_red(LED1); //  RED
+DigitalOut led_blue(LED3); //  BLUE
+#endif
+#ifdef KL25Z
+SPI spi(PTD2, PTD3, PTD1); // MOSI (Din DAC), MISO (Dout ADC), SCLK
+DigitalOut on_off_mhv(PTC7), cs_adc(PTA1), sign_top_def(PTC3), gain_top_def(PTC4), cs_top_def(PTC5), cs_mhv(PTC6);
+DigitalOut gain_anl(PTA2), cs_anl(PTC0), sign_top_plate(PTD4), gain_top_plate(PTA12), cs_top_plate(PTA4);
+DigitalOut sign_bot_def(PTA5), gain_bot_def(PTC8), cs_bot_def(PTC9), hv_limit(PTC11);
+DigitalOut led_green(LED2); //  GREEN
+DigitalOut led_red(LED1); //  RED
+DigitalOut led_blue(LED3); //  BLUE
+#endif
+
+struct hv {
+    short top_def, bot_def, top_plate, anl;
+    char gain_sign;
+    struct hv *next;
+} *head, *tail, *node, *temp;
+typedef struct hv element;
+
+Ticker sweeper;
+
+void sweep(void);
+void load_dac_gain_sign(element *tail);
+void libere_memoire();
+
+int main()
+{
+    char c, on, byte[4] = {0};
+    short mhv = 0, dac = 0;
+    int dwell = 1000000;    // interval between steps in microsec
+//    short adc = 0, gbot_def, sbot_def, gtop_plate, stop_plate, ganl;
+    short nb_elts = 0;
+    int adc = 0;
+    short adc0 = 0, adc1 = 0;
+    bool clean = false;
+    unsigned int checksum = 0;
+    short ok = 0xcc;
+//    char texte[128];
+
+#ifdef LPC1768
+    led1 = 0;
+    led2 = 0;
+#endif
+
+#ifdef K64F
+    led_red = true;
+    led_green = true;
+    led_blue = true;
+#endif
+
+//    int step = 10;    // increment pour les DACs
+    // initialisations
+    on_off_mhv = 0;   // mhv off
+    cs_adc = 1;   // adc not selected
+    cs_anl = 1;
+    cs_bot_def = 1;
+    cs_top_plate = 1;
+    cs_top_def = 1;   // dac anl not selected
+    cs_mhv = 1;   // dac mhv not selected
+    gain_anl = 0;   // low gain
+    gain_top_def = 0;  // low gain
+    gain_bot_def = 0;
+    gain_top_plate = 0;
+    sign_top_def = 1;  // positif
+    sign_bot_def = 0;  // negatif
+    sign_top_plate = 1;  // positif
+
+    spi.format(16,1);   //  setup for SPI DAC, 16 bit data, high steady state clock, second edge capture
+//    spi.frequency(1000000);   // 1 MHz SPI clock
+    spi.frequency(100000);   // 100 kHz SPI clock
+
+//   pc.baud(9600);    // set baud rate for RS232
+    pc.baud(115200);
+    pc.format(8, SerialBase::None, 1);    // 8 bits data, no parity bit, 1 stop bit
+
+
+#ifdef LPC1768
+    if (sign_top_def == 1) s = '+';
+    else s = '-';
+    if (gain_top_def == 1) g = 'H';
+    else g = 'L';
+    if (on_off_mhv == 0) on = 'A';
+    else on = 'M';
+    lcd.cls();          // clear the LCD screen
+    lcd.locate(13,0);   // locate to column 13, row 0
+    lcd.printf("%c%c%c", g, s, on);
+    lcd.locate(0,1);   // locate to column 0, row 1
+    lcd.printf("MHV %4d AN %4d", mhv, anl);
+#endif
+    while (1) {
+        c = pc.getc();
+        if (c == 0x01) {
+            pc.puts("Connexion OK\r\n");
+#ifdef LPC1768
+            led1 = 1;
+#endif
+        }
+        if (c == 0x02) {        // load DAC, gain and sign values
+#ifdef K64F
+//            led_green = false;    // allume la LED verte
+#endif
+            if (clean) {
+                nb_elts = 0;
+                ok = 0xcc;
+                libere_memoire();
+                clean = false;
+#ifdef K64F
+                led_green = false;    // allume la LED verte
+#endif
+            }
+
+#ifdef LPC1768
+            led2 =!led2;
+#endif
+#ifdef K64F
+//            led_green = !led_green;    // LED verte clignote
+#endif
+            // renvoie la commande pour signaler qu'on est prêt à recevoir les données
+            pc.putc(0x02);
+            checksum = 0;
+            if (nb_elts == 0) {
+                byte[0] = pc.getc();   // MSB
+                byte[1] = pc.getc();   // LSB
+                if (ok == 0xcc) head = (element*)malloc(sizeof(element));
+                head->top_def = (byte[0] << 8) | byte[1];
+                checksum += head->top_def;
+                byte[0] = pc.getc();    // MSB
+                byte[1] = pc.getc();    // LSB
+                head->bot_def = (byte[0] << 8) | byte[1];
+                checksum += head->bot_def;
+                byte[0] = pc.getc();     // MSB
+                byte[1] = pc.getc();     // LSB
+                head->top_plate = (byte[0] << 8) | byte[1];
+                checksum += head->top_plate;
+                byte[0] = pc.getc();     // MSB
+                byte[1] = pc.getc();     // LSB
+                head->anl = (byte[0] << 8) | byte[1];
+                checksum += head->anl;
+#ifdef LPC1768
+                lcd.cls();
+                lcd.locate(0, 1);
+                lcd.printf("%4x%4x%4x%4x",head->top_def,head->bot_def,head->top_plate,head->anl);
+#endif
+                byte[0] = pc.getc();
+                checksum += byte[0];
+                head->gain_sign = byte[0];
+#ifdef LPC1768
+                lcd.locate(0, 0);    // columb 0, row 0
+                lcd.printf("%04x",head->gain_sign);
+#endif
+                tail = head;
+                // renvoyer le checksum
+                byte[0] = checksum & 0xff;    // LSB
+                pc.putc(byte[0]);
+                byte[1] = (checksum >> 8) & 0xff;    // MSB
+                pc.putc(byte[1]);
+                byte[0] = (checksum >> 16) & 0xff;
+                pc.putc(byte[0]);
+                byte[1] = (checksum >> 24) & 0xff;
+                pc.putc(byte[1]);
+                // attendre la réponse: si Ok attendre 0xcc, si Nok attendre 0x33
+                ok = pc.getc();
+                if (ok == 0xcc) nb_elts = 1;
+            } else {
+                if (ok == 0xcc) {
+                    tail->next = (element*)malloc(sizeof(element));
+                    tail = tail->next;    // avance d'un pas
+                }
+                byte[0] = pc.getc();
+                byte[1] = pc.getc();
+                tail->top_def = (byte[0] << 8) | byte[1];
+                checksum += tail->top_def;
+                byte[0] = pc.getc();
+                byte[1] = pc.getc();
+                tail->bot_def = (byte[0] << 8) | byte[1];
+                checksum += tail->bot_def;
+                byte[0] = pc.getc();
+                byte[1] = pc.getc();
+                tail->top_plate = (byte[0] << 8) | byte[1];
+                checksum += tail->top_plate;
+                byte[0] = pc.getc();
+                byte[1] = pc.getc();
+                tail->anl = (byte[0] << 8) | byte[1];
+                checksum += tail->anl;
+                byte[0] = pc.getc();
+                checksum += byte[0];
+                tail->gain_sign = byte[0];
+#ifdef LPC1768
+                lcd.cls();
+                lcd.locate(0, 1);
+                lcd.printf("%4x%4x%4x%4x",tail->top_def,tail->bot_def,tail->top_plate,tail->anl);
+                lcd.locate(15, 0);    // columb 15, row 0
+                lcd.printf("%2x",tail->gain_sign);
+#endif
+
+                // renvoyer le checksum
+                byte[0] = checksum & 0xff;    // LSB
+                pc.putc(byte[0]);
+                byte[1] = (checksum >> 8) & 0xff;    // MSB
+                pc.putc(byte[1]);
+                byte[0] = (checksum >> 16) & 0xff;
+                pc.putc(byte[0]);
+                byte[1] = (checksum >> 24) & 0xff;
+                pc.putc(byte[1]);
+                // attendre la réponse: si Ok attendre 0xcc, si Nok attendre 0x33
+                ok = pc.getc();
+                if (ok == 0xcc) nb_elts++;
+                tail->next = NULL;
+            }
+#ifdef K64F
+//            led_green = true;    // éteint la LED verte
+#endif
+        }
+        if ( c == 0x03) {    // send the number of elements loaded in memory
+#ifdef LPC1768
+            lcd.locate(0, 0);
+            lcd.printf("Nb of elts: %4d",nb_elts);
+#endif
+            byte[0] = nb_elts & 0xff;    // LSB
+            pc.putc(byte[0]);
+            byte[1] = nb_elts >> 8;    // MSB
+            pc.putc(byte[1]);
+            // positionne en début de liste
+            tail = head;
+            // Set DACs gain & sign
+            spi.format(16,1);
+            load_dac_gain_sign(tail);
+            clean = true;
+#ifdef K64F
+            led_green = true;    // éteint la LED verte
+#endif
+
+        }
+        if ( c == 0x04) {    // receive the DAC MHV and returns it
+            byte[1] = pc.getc();     // LSB received
+            byte[0] = pc.getc();     // MSB received
+            mhv = (byte[0] << 8) | byte[1];
+#ifdef LPC1768
+            lcd.locate(0, 0);
+            lcd.printf("MHV : %04d  %02x  ",mhv,tail->gain_sign);
+#endif
+            pc.putc(byte[1]);     // LSB sent
+            pc.putc(byte[0]);     // MSB sent
+
+            spi.format(16,1);    // format to write into DAC
+            cs_mhv = 0;
+            spi.write(mhv);    // send value to DAC MHV
+            cs_mhv = 1;
+        }
+        if ( c == 0x05) {    // avance d'un pas
+#ifdef K64F
+//            led_blue = false;    // allume la LED
+#endif
+            tail = tail->next;
+#ifdef LPC1768
+            lcd.locate(0, 1);
+            lcd.printf("%4x%4x%4x%4x",tail->top_def,tail->bot_def,tail->top_plate,tail->anl);
+#endif
+            // configure DAC with top_def value, gain and sign
+            spi.format(16,1);
+            load_dac_gain_sign(tail);
+#ifdef K64F
+//            led_blue = true;    // éteint la LED
+#endif
+        }
+        if ( c == 0x06) {    // recule d'un pas
+#ifdef K64F
+//            led_red = false;    // allume la LED
+#endif
+            node = head;
+            if (tail != head) {
+                while (node->next != tail)   node = node ->next;
+                tail = node;    // recule d'un pas dans la liste
+            }
+#ifdef LPC1768
+            lcd.locate(0, 1);
+            lcd.printf("%4x%4x%4x%4x",tail->top_def,tail->bot_def,tail->top_plate,tail->anl);
+#endif
+            // configure DAC with top_def value, gain and sign
+            spi.format(16,1);
+            load_dac_gain_sign(tail);
+#ifdef K64F
+//            led_red = true;    // éteint la LED
+#endif
+        }
+        if ( c == 0x07) {    // set DAC values, gain & sign
+            spi.format(16,1);
+            load_dac_gain_sign(tail);
+#ifdef LPC1768
+            lcd.locate(0, 1);
+            lcd.printf("%4x%4x%4x%4x",tail->top_def,tail->bot_def,tail->top_plate,tail->anl);
+            lcd.locate(14, 0);
+            lcd.printf("%02x",tail->gain_sign);
+#endif
+        }
+        if ( c == 0x08) {     // receive DAC top def value and reloads top def DAC
+            byte[1] = pc.getc();    // LSB received
+            byte[0] = pc.getc();    // MSB received
+            dac = (byte[0] << 8) | byte[1];
+            spi.format(16,1);
+            cs_top_def = 0;
+            spi.write(dac);   // send value to DAC
+            cs_top_def = 1;
+        }
+        if ( c == 0x09) {
+            tail = head;      // set pointer to beginning of list
+#ifdef LPC1768
+            lcd.locate(0, 1);
+            lcd.printf("%4x%4x%4x%4x",tail->top_def,tail->bot_def,tail->top_plate,tail->anl);
+#endif
+            spi.format(16,1);
+            load_dac_gain_sign(tail);
+        }
+        if ( c == 0x0a) {
+            tail->gain_sign = pc.getc();    // gain & sign received
+            gain_top_def = ((tail->gain_sign) >> GAIN_TOPDEF) & 0x01;
+            sign_top_def = ((tail->gain_sign) >> SIGN_TOPDEF) & 0x01;
+            gain_bot_def = ((tail->gain_sign) >> GAIN_BOTDEF) & 0x01;
+            sign_bot_def = ((tail->gain_sign) >> SIGN_BOTDEF) & 0x01;
+            gain_top_plate = ((tail->gain_sign) >> GAIN_TOPPLATE) & 0x01;
+            sign_top_plate = ((tail->gain_sign) >> SIGN_TOPPLATE) & 0x01;
+            gain_anl = ((tail->gain_sign) >> GAIN_ANL) & 0x01;
+            //lcd.locate(14, 0);    // column 15, row 0
+            //lcd.printf("%2x",tail->gain_sign);
+        }
+        if ( c == 0x0b) {    // receive On/Off value and set it
+            on = pc.getc();
+            on_off_mhv = on;    // set on(1) / off(0) MHV
+        }
+        if ( c == 0x0c) {  // send ADC values
+#ifdef F746ZG
+            spi.format(16,3);    // format pour l'ADC
+//            spi.format(8,3);
+
+            // faire une lecture bidon sans sélectionner l'ADC
+            spi.write(0);
+            cs_adc = 0;
+
+//            adc = spi.write(0);
+
+            adc = spi.write(0x0800);  // lecture adc in0    (HK_TEMP_HVPS)
+            adc1 = adc >> 8;     // MSB part
+            adc0 = adc & 0xff;   // LSB part
+ //           adc1 = spi.write(0x8);    // lecture adc in0    (HK_TEMP_HVPS)          
+ //           adc0 = spi.write(0);
+            pc.putc(adc1);     // send MSB  in0
+            pc.putc(adc0);     // send LSB  in0   
+
+            adc = spi.write(0x1000);  // lecture adc in1
+            adc1 = adc >> 8;     // MSB part
+            adc0 = adc & 0xff;   // LSB part
+ //           adc1 = spi.write(0x10);   // lecture adc in1   (HK_TEMP_EA)  
+ //           adc0 = spi.write(0);
+            pc.putc(adc1);     // send MSB adc
+            pc.putc(adc0);      // send LSB adc
+            
+            adc = spi.write(0x1800);  // lecture adc in2    (HK_TEMP_HVPS)
+            adc1 = adc >> 8;     // MSB part
+            adc0 = adc & 0xff;   // LSB part
+//            adc1 = spi.write(0x18);    // lecture adc in2   (HK_MHV_POS)
+//            adc0 = spi.write(0); 
+            pc.putc(adc1);     // send MSB adc
+            pc.putc(adc0);      // send LSB adc
+            
+            adc = spi.write(0x2000);  // lecture adc in3    (HK_TEMP_HVPS)
+            adc1 = adc >> 8;     // MSB part
+            adc0 = adc & 0xff;   // LSB part
+//            adc1 = spi.write(0x20);   // lecture adc in3   (HK_MHV_NEG)
+//            adc0 = spi.write(0);
+            pc.putc(adc1);     // send MSB adc
+            pc.putc(adc0);      // send LSB adc
+            
+            adc = spi.write(0x2800);  // lecture adc in4    (HK_TEMP_HVPS)
+            adc1 = adc >> 8;     // MSB part
+            adc0 = adc & 0xff;   // LSB part
+//            adc1 = spi.write(0x28);    // lecture adc in4   (HK_ANL)
+//            adc0 = spi.write(0); 
+            pc.putc(adc1);     // send MSB adc
+            pc.putc(adc0);      // send LSB adc
+            
+            adc = spi.write(0x3000);  // lecture adc in5    (HK_TEMP_HVPS)
+            adc1 = adc >> 8;     // MSB part
+            adc0 = adc & 0xff;   // LSB part
+ //           adc1 = spi.write(0x30);    // lecture adc in5   (HK_TOP_DEF)           
+ //           adc0 = spi.write(0);
+            pc.putc(adc1);     // send MSB adc
+            pc.putc(adc0);      // send LSB adc
+            
+            adc = spi.write(0x3800);  // lecture adc in6    (HK_TEMP_HVPS)
+            adc1 = adc >> 8;     // MSB part
+            adc0 = adc & 0xff;   // LSB part
+ //           adc1 = spi.write(0x38);    // lecture adc in6   (HK_BOT_DEF)           
+ //           adc0 = spi.write(0);  
+            pc.putc(adc1);     // send MSB adc
+            pc.putc(adc0);      // send LSB adc
+            
+            adc = spi.write(0x0);  // lecture adc in7    (HK_TEMP_HVPS)
+            adc1 = adc >> 8;     // MSB part
+            adc0 = adc & 0xff;   // LSB part
+ //           adc1 = spi.write(0);     // lecture adc in7  (HK_TOP_PLT)  finit sur 0 pour démarrer par in0
+ //           adc0 = spi.write(0); 
+            pc.putc(adc1);     // send MSB adc
+            pc.putc(adc0);      // send LSB adc
+            cs_adc = 1;
+#endif
+#ifdef K64F
+//            spi.format(16,3);    // format pour l'ADC
+            spi.format(8,3);
+
+            // faire une lecture bidon sans sélectionner l'ADC
+            spi.write(0);
+            cs_adc = 0;
+
+            adc = spi.write(0);
+
+//            adc = spi.write(0x0800);  // lecture adc in0    (HK_TEMP_HVPS)
+//            adc1 = adc >> 8;     // MSB part
+//            adc0 = adc & 0xff;   // LSB part
+            adc1 = spi.write(0x8);    // lecture adc in0    (HK_TEMP_HVPS)          
+            adc0 = spi.write(0);
+            pc.putc(adc1);     // send MSB  in0
+            pc.putc(adc0);     // send LSB  in0   
+
+//            adc = spi.write(0x1000);  // lecture adc in1
+//            adc1 = adc >> 8;     // MSB part
+//            adc0 = adc & 0xff;   // LSB part
+            adc1 = spi.write(0x10);   // lecture adc in1   (HK_TEMP_EA)  
+            adc0 = spi.write(0);
+            pc.putc(adc1);     // send MSB adc
+            pc.putc(adc0);      // send LSB adc
+            
+//            adc = spi.write(0x1800);  // lecture adc in2    (HK_TEMP_HVPS)
+//            adc1 = adc >> 8;     // MSB part
+//            adc0 = adc & 0xff;   // LSB part
+            adc1 = spi.write(0x18);    // lecture adc in2   (HK_MHV_POS)
+            adc0 = spi.write(0); 
+            pc.putc(adc1);     // send MSB adc
+            pc.putc(adc0);      // send LSB adc
+            
+//            adc = spi.write(0x2000);  // lecture adc in3    (HK_TEMP_HVPS)
+//            adc1 = adc >> 8;     // MSB part
+//            adc0 = adc & 0xff;   // LSB part
+            adc1 = spi.write(0x20);   // lecture adc in3   (HK_MHV_NEG)
+            adc0 = spi.write(0);
+            pc.putc(adc1);     // send MSB adc
+            pc.putc(adc0);      // send LSB adc
+            
+//            adc = spi.write(0x2800);  // lecture adc in4    (HK_TEMP_HVPS)
+//            adc1 = adc >> 8;     // MSB part
+//            adc0 = adc & 0xff;   // LSB part
+            adc1 = spi.write(0x28);    // lecture adc in4   (HK_ANL)
+            adc0 = spi.write(0); 
+            pc.putc(adc1);     // send MSB adc
+            pc.putc(adc0);      // send LSB adc
+            
+//            adc = spi.write(0x3000);  // lecture adc in5    (HK_TEMP_HVPS)
+//            adc1 = adc >> 8;     // MSB part
+//            adc0 = adc & 0xff;   // LSB part
+            adc1 = spi.write(0x30);    // lecture adc in5   (HK_TOP_DEF)           
+            adc0 = spi.write(0);
+            pc.putc(adc1);     // send MSB adc
+            pc.putc(adc0);      // send LSB adc
+            
+//            adc = spi.write(0x3800);  // lecture adc in6    (HK_TEMP_HVPS)
+//            adc1 = adc >> 8;     // MSB part
+//            adc0 = adc & 0xff;   // LSB part
+            adc1 = spi.write(0x38);    // lecture adc in6   (HK_BOT_DEF)           
+            adc0 = spi.write(0);  
+            pc.putc(adc1);     // send MSB adc
+            pc.putc(adc0);      // send LSB adc
+            
+//            adc = spi.write(0x0);  // lecture adc in7    (HK_TEMP_HVPS)
+//            adc1 = adc >> 8;     // MSB part
+//            adc0 = adc & 0xff;   // LSB part
+            adc1 = spi.write(0);     // lecture adc in7  (HK_TOP_PLT)  finit sur 0 pour démarrer par in0
+            adc0 = spi.write(0); 
+            pc.putc(adc1);     // send MSB adc
+            pc.putc(adc0);      // send LSB adc
+            cs_adc = 1;
+#endif
+            spi.format(16,1);    // format to write into DAC
+            // faire une lecture bidon sans sélectionner l'ADC
+            spi.write(0);
+        }
+        if ( c == 0x0d) {  // load the dwell time in us
+            byte[1] = pc.getc();     // LSB received
+            byte[0] = pc.getc();     // MSB received
+            byte[3] = pc.getc();     // LSB
+            byte[2] = pc.getc();     // MSB
+            dwell = (((byte[2] << 24) | byte[3]) << 16) | ((byte[0] << 8) | byte[1]);
+#ifdef LPC1768
+            lcd.locate(0, 0);
+            lcd.printf("Dwell : %8d",dwell);
+#endif
+            pc.putc(byte[1]);     // LSB sent
+            pc.putc(byte[0]);     // MSB sent
+            pc.putc(byte[3]);     // LSB sent
+            pc.putc(byte[2]);     // MSB sent
+        }
+        if ( c == 0x0e) {   // start sweeping
+            spi.format(16,1);    // ecrire dans les DACs
+            sweeper.attach_us(&sweep,dwell);
+        }
+        if ( c == 0x0f) {   // stop sweeping
+            sweeper.detach();
+        }
+        if ( c == 0x10) {     // receive DAC analyzer value and reloads analyzer DAC
+            byte[1] = pc.getc();    // LSB received
+            byte[0] = pc.getc();    // MSB received
+            dac = (byte[0] << 8) | byte[1];
+            spi.format(16,1);
+            cs_anl = 0;
+            spi.write(dac);   // send value to DAC
+            cs_anl = 1;
+        }
+        if ( c == 0x11) {     // receive DAC bot def value and reloads bot def DAC
+            byte[1] = pc.getc();    // LSB received
+            byte[0] = pc.getc();    // MSB received
+            dac = (byte[0] << 8) | byte[1];
+            spi.format(16,1);
+            cs_bot_def = 0;
+            spi.write(dac);   // send value to DAC
+            cs_bot_def = 1;
+        }
+        if ( c == 0x12) {     // receive DAC top plate value and reloads top plate DAC
+            byte[1] = pc.getc();    // LSB received
+            byte[0] = pc.getc();    // MSB received
+            dac = (byte[0] << 8) | byte[1];
+            spi.format(16,1);
+            cs_top_plate = 0;
+            spi.write(dac);   // send value to DAC
+            cs_top_plate = 1;
+        }
+    }    // end while (1)
+
+}   // end main
+
+void sweep()
+{
+    if (tail->next != NULL) {
+        tail = tail->next;      // avance d'un pas
+    } else tail = head;     // revient au début
+    load_dac_gain_sign(tail);
+}    // end sweep()
+
+void load_dac_gain_sign(element *tail)
+{
+    gain_top_def = ((tail->gain_sign) >> GAIN_TOPDEF) & 0x01;
+    sign_top_def = ((tail->gain_sign) >> SIGN_TOPDEF) & 0x01;
+    cs_top_def = 0;
+    spi.write(tail->top_def);   // send value to DAC
+    cs_top_def = 1;
+    gain_bot_def = ((tail->gain_sign) >> GAIN_BOTDEF) & 0x01;
+    sign_bot_def = ((tail->gain_sign) >> SIGN_BOTDEF) & 0x01;
+    cs_bot_def = 0;
+    spi.write(tail->bot_def);   // send value DAC bot def
+    cs_bot_def = 1;
+    gain_top_plate = ((tail->gain_sign) >> GAIN_TOPPLATE) & 0x01;
+    sign_top_plate = ((tail->gain_sign) >> SIGN_TOPPLATE) & 0x01;
+    cs_top_plate = 0;
+    spi.write(tail->top_plate);   // send value DAC top plate
+    cs_top_plate = 1;
+    gain_anl = ((tail->gain_sign) >> GAIN_ANL) & 0x01;
+    cs_anl = 0;
+    spi.write(tail->anl);   // send value DAC top plate
+    cs_anl = 1;
+}
+
+void libere_memoire()
+{
+    element *node,*temp;
+
+    node = head;
+    temp = node;
+
+    while (node != NULL) {
+        temp = node;
+        node = node->next;
+        free(temp);
+    }
+    head = NULL;
+//    free(head);
+}
+