Facebook
From Ungracious Leopard, 3 Years ago, written in C.
Embed
Download Paste or View Raw
Hits: 51
  1. /* --COPYRIGHT--,BSD
  2.  * Copyright (c) 2017, Texas Instruments Incorporated
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  *
  9.  * *  Redistributions of source code must retain the above copyright
  10.  *    notice, this list of conditions and the following disclaimer.
  11.  *
  12.  * *  Redistributions in binary form must reproduce the above copyright
  13.  *    notice, this list of conditions and the following disclaimer in the
  14.  *    documentation and/or other materials provided with the distribution.
  15.  *
  16.  * *  Neither the name of Texas Instruments Incorporated nor the names of
  17.  *    its contributors may be used to endorse or promote products derived
  18.  *    from this software without specific prior written permission.
  19.  *
  20.  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  21.  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
  22.  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
  23.  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
  24.  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
  25.  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  26.  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
  27.  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
  28.  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
  29.  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
  30.  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  31.  * --/COPYRIGHT--*/
  32. /******************************************************************************
  33.  * MSP432 Empty Project
  34.  *
  35.  * Description: An empty project that uses DriverLib
  36.  *
  37.  *                MSP432P401
  38.  *             ------------------
  39.  *         /|\|                  |
  40.  *          | |                  |
  41.  *          --|RST               |
  42.  *            |                  |
  43.  *            |                  |
  44.  *            |                  |
  45.  *            |                  |
  46.  *            |                  |
  47.  * Author:
  48. *******************************************************************************/
  49. /* DriverLib Includes */
  50. #include <ti/devices/msp432p4xx/driverlib/driverlib.h>
  51.  
  52. /* Standard Includes */
  53. #include <stdint.h>
  54. #include <stdbool.h>
  55. #include <string.h>
  56.  
  57. //8 7 6 5 4 3 2 1 0
  58. #define sens8 GPIO_PORT_P7,GPIO_PIN7
  59. #define sens7 GPIO_PORT_P7,GPIO_PIN6
  60. #define sens6 GPIO_PORT_P7,GPIO_PIN5
  61. #define sens5 GPIO_PORT_P7,GPIO_PIN4
  62. #define sens4 GPIO_PORT_P7,GPIO_PIN3
  63. #define sens3 GPIO_PORT_P7,GPIO_PIN2
  64. #define sens2 GPIO_PORT_P7,GPIO_PIN1
  65. #define sens1 GPIO_PORT_P7,GPIO_PIN0
  66.  
  67. #define sensODD GPIO_PORT_P9,GPIO_PIN2
  68. #define sensEVEN GPIO_PORT_P5,GPIO_PIN3
  69.  
  70. #define RLED GPIO_PORT_P1,GPIO_PIN0
  71.  
  72. //5 4 3 2 1 0
  73. #define bump5 GPIO_PORT_P4,GPIO_PIN7
  74. #define bump4 GPIO_PORT_P4,GPIO_PIN6
  75. #define bump3 GPIO_PORT_P4,GPIO_PIN5
  76. #define bump2 GPIO_PORT_P4,GPIO_PIN3
  77. #define bump1 GPIO_PORT_P4,GPIO_PIN2
  78. #define bump0 GPIO_PORT_P4,GPIO_PIN0
  79.  
  80. #define lMotorDrive GPIO_PORT_P3,GPIO_PIN7
  81. #define lMotorDir GPIO_PORT_P5,GPIO_PIN4
  82. #define lMotorPWM GPIO_PORT_P2,GPIO_PIN7
  83.  
  84. #define RGBRED GPIO_PORT_P2,GPIO_PIN0
  85. #define RGBGREEN GPIO_PORT_P2,GPIO_PIN1
  86. #define RGBBLUE GPIO_PORT_P2,GPIO_PIN2
  87.  
  88. #define rMotorDrive GPIO_PORT_P3,GPIO_PIN6
  89. #define rMotorPWM GPIO_PORT_P2,GPIO_PIN6
  90. #define rMotorDir GPIO_PORT_P5,GPIO_PIN5
  91.  
  92. #define frontBlinker GPIO_PORT_P8,GPIO_PIN5
  93. #define frontBlinkerLeft GPIO_PORT_P8,GPIO_PIN0
  94. #define backBlinkerLeft GPIO_PORT_P8,GPIO_PIN7
  95. #define backBlinkerRight GPIO_PORT_P8,GPIO_PIN6
  96. #define DUTY_NOMINAL 12000
  97. #define PERIOD 15000
  98.  
  99. #define MAX 13000
  100. #define kp 27
  101. #define ki .4
  102. #define kd 30
  103.  
  104. //Timer Declarations
  105. Timer_A_PWMConfig myPWM;
  106. Timer_A_PWMConfig myPWMr;
  107. Timer_A_UpModeConfig myTimer;
  108. Timer_A_UpModeConfig myTimerInterrupt;
  109.  
  110. //PI Controller Declarations
  111. int32_t P = 0, I = 0, U, D;
  112. int32_t last_prop = 0;
  113. int32_t change = 0;
  114. int32_t swing = 2500;
  115. uint8_t sensArr[8] = {0,0,0,0,0,0,0,0};
  116. uint8_t sensList = 0x00;
  117. uint8_t countRand = 0;
  118. uint8_t init =0 ;
  119.  
  120. //Timer Functions
  121. void (*TimerA1Task)(void);
  122. void configTimerA(uint16_t delayValue, uint16_t clockDivider);
  123. void myTimerADelay(uint16_t delayValue, uint16_t clockDivider);
  124. void TimerA1_Init(void(*task)(void), uint16_t period);
  125. void TA1_0_IRQHandler(void);
  126. void wait1us(uint16_t num);
  127.  
  128. //Sensor Functions
  129. void initPin(void);
  130. void checkLine(uint8_t sensArr[8]);
  131. void sensorOutput();
  132. void turnLeft(int32_t U);
  133. void turnRight(int32_t U);
  134.  
  135. int main(void)
  136. {
  137.     /* Stop Watchdog  */
  138.     MAP_WDT_A_holdTimer();
  139.  
  140.     volatile uint16_t i, ii;
  141.     uint8_t bumpArr[6], pushFLG[6] = {0,0,0,0,0,0}, startFLG = 0;
  142.  
  143.     initPin();
  144.  
  145.     while(1)
  146.     {
  147.  
  148.         bumpArr[5] = GPIO_getInputPinValue(bump5);
  149.         bumpArr[4] = GPIO_getInputPinValue(bump4);
  150.         bumpArr[3] = GPIO_getInputPinValue(bump3);
  151.         bumpArr[2] = GPIO_getInputPinValue(bump2);
  152.         bumpArr[1] = GPIO_getInputPinValue(bump1);
  153.         bumpArr[0] = GPIO_getInputPinValue(bump0);
  154.  
  155.         if(startFLG == 0)
  156.         {
  157.             for(i = 0; i < 6; i++)
  158.             {
  159.                 if(bumpArr[i] == GPIO_INPUT_PIN_LOW)
  160.                 {
  161.                     for(ii = 0; ii < 10000; ii++){};
  162.                     pushFLG[i] =1;
  163.                 }
  164.             }
  165.             for(i = 0; i < 6; i++)
  166.             {
  167.                 if(bumpArr[i] == GPIO_INPUT_PIN_HIGH && pushFLG[i] == 1)
  168.                 {
  169.                     GPIO_setOutputHighOnPin(lMotorDrive);
  170.                     GPIO_setOutputHighOnPin(rMotorDrive);
  171.                     GPIO_setOutputHighOnPin(frontBlinker);
  172.                     GPIO_setOutputHighOnPin(frontBlinkerLeft);
  173.                     Timer_A_startCounter(TIMER_A0_BASE, TIMER_A_UP_MODE);
  174.                     pushFLG[i] = 0;
  175.                     startFLG = 1;
  176.                     TimerA1_Init(&TA1_0_IRQHandler, 734);
  177.                 }
  178.             }
  179.  
  180.         }
  181.         else
  182.         {
  183.             //Stop the bot if it hits something
  184.             for(i = 0; i < 6; i++)
  185.             {
  186.                 if(bumpArr[i] == GPIO_INPUT_PIN_LOW)
  187.                 {
  188.                     __disable_irq();
  189.  
  190.                     GPIO_setOutputLowOnPin(frontBlinker);
  191.                     GPIO_setOutputLowOnPin(frontBlinkerLeft);
  192.                     GPIO_setOutputHighOnPin(backBlinkerLeft);
  193.                     GPIO_setOutputHighOnPin(backBlinkerRight);
  194.                     GPIO_setOutputHighOnPin(lMotorDir);
  195.                     GPIO_setOutputHighOnPin(rMotorDir);
  196.  
  197.                     Timer_A_stop(TIMER_A0_BASE);
  198.                     myPWM.dutyCycle = 14000;
  199.                     myPWMr.dutyCycle = 14000;
  200.                     Timer_A_outputPWM(TIMER_A0_BASE, &myPWM);
  201.                     Timer_A_outputPWM(TIMER_A0_BASE, &myPWMr);
  202.                     Timer_A_startCounter(TIMER_A0_BASE, TIMER_A_UP_MODE);
  203.  
  204.                     pushFLG[i] = 1;
  205.                 }
  206.             }
  207.  
  208.             for (i = 0; i < 6; i++)
  209.             {
  210.                 if(bumpArr[i] == GPIO_INPUT_PIN_HIGH && pushFLG[i] == 1)
  211.                 {
  212.                     pushFLG[i] = 0;
  213.                 }
  214.             }
  215.  
  216.             countRand++;
  217.             countRand%= 3;
  218.         }
  219.     }
  220. }
  221.  
  222. void TA1_0_IRQHandler(void)
  223. {
  224.     TIMER_A1->CCTL[0] &= ~0x0001;
  225.     checkLine(sensArr);
  226.     sensorOutput();
  227.     GPIO_toggleOutputOnPin(backBlinkerLeft);
  228. }
  229.  
  230. void turnRight(int32_t U)
  231. {
  232.     //Slow down and Turn wheel back wards
  233.     if(DUTY_NOMINAL + U > MAX)
  234.     {
  235.         GPIO_setOutputHighOnPin(lMotorDir);
  236.         myPWM.dutyCycle = MAX-((DUTY_NOMINAL + U) -MAX);
  237.     }
  238.     else if (DUTY_NOMINAL + U < 0) //Fastest Speed
  239.     {
  240.         GPIO_setOutputLowOnPin(lMotorDir);
  241.         myPWM.dutyCycle = 0;
  242.     }
  243.     else//Not backward or fastest
  244.     {
  245.         GPIO_setOutputLowOnPin(lMotorDir);
  246.         myPWM.dutyCycle = (DUTY_NOMINAL + U);
  247.     }
  248.     //ONce past the slowest speed go backwards
  249.     if(DUTY_NOMINAL - U > MAX){
  250.  
  251.         GPIO_setOutputHighOnPin(rMotorDir);
  252.         myPWMr.dutyCycle = MAX-((DUTY_NOMINAL - U) -MAX);
  253.     }
  254.     else if(DUTY_NOMINAL - U < 0)//Fastst speed
  255.     {
  256.         GPIO_setOutputLowOnPin(rMotorDir);
  257.         myPWMr.dutyCycle = 0;
  258.     }
  259.     else
  260.     {
  261.         GPIO_setOutputLowOnPin(rMotorDir);
  262.         myPWMr.dutyCycle = DUTY_NOMINAL - U;
  263.     }
  264.  
  265.     Timer_A_outputPWM(TIMER_A0_BASE, &myPWM);
  266.     Timer_A_outputPWM(TIMER_A0_BASE, &myPWMr);
  267.     Timer_A_startCounter(TIMER_A0_BASE, TIMER_A_UP_MODE);
  268. }
  269.  
  270. void sensorOutput()
  271. {
  272.     int32_t v = 0;
  273.     int16_t count = -300;
  274.     int8_t rand = 4;
  275.     rand = 4;
  276.     volatile uint8_t i;
  277.     if (sensList == 11111111 && init == 1)
  278.     {
  279.         rand = countRand;
  280.     }
  281.     //go Left
  282.     if(rand == 0)
  283.     {
  284.        for(i = 0; i < 8; i++)
  285.        {
  286.            if(i < 4)
  287.                sensArr[i] = 1;
  288.            else
  289.                sensArr[i] = 0;
  290.        }
  291.  
  292.     }
  293.     //go Right
  294.     else if(rand == 1)
  295.     {
  296.         for(i = 0; i < 8; i++)
  297.         {
  298.             if(i < 4)
  299.                 sensArr[i] = 0;
  300.             else
  301.                 sensArr[i] = 1;
  302.         }
  303.     }
  304.     //go Striaght
  305.     else if (rand == 2)
  306.     {
  307.         for(i = 0; i < 8; i++)
  308.         {
  309.             if(i == 3 || i == 4)
  310.                 sensArr[i] = 1;
  311.             else
  312.                 sensArr[i] = 0;
  313.         }
  314.     }
  315.     init = 1;
  316.     for( i =0 ; i < 8 ; i++)
  317.     {
  318.         switch(i)
  319.         {
  320.         case 0: count = -300; break;
  321.         case 1: count = -200; break;
  322.         case 2: count = -50; break;
  323.         case 3: count = -25; break;
  324.         case 4: count = 25; break;
  325.         case 5: count = 50; break;
  326.         case 6: count = 200;break;
  327.         case 7: count = 300; break;
  328.         }
  329.         if(sensArr[i] == 1)
  330.         {
  331.             v += count;
  332.         }
  333.     }
  334.     P = v;
  335.     I = I + P;
  336.     D = P - last_prop;
  337.  
  338.     last_prop = P;
  339.  
  340.     U = P*kp + I*ki + D*kd;
  341.  
  342.     if (U > MAX) U = MAX;
  343.     if (U < (-1*MAX)) U = -1*MAX;
  344.     if (sensList == 00011000)
  345.     {
  346.         myPWM.dutyCycle = DUTY_NOMINAL;
  347.         myPWMr.dutyCycle = DUTY_NOMINAL;
  348.         Timer_A_outputPWM(TIMER_A0_BASE, &myPWM);
  349.         Timer_A_outputPWM(TIMER_A0_BASE, &myPWMr);
  350.         Timer_A_startCounter(TIMER_A0_BASE, TIMER_A_UP_MODE);
  351.     }
  352.     else if (sensList == 00000000)
  353.     {
  354.         GPIO_setOutputHighOnPin(lMotorDir);
  355.         GPIO_setOutputHighOnPin(rMotorDir);
  356.     }
  357.     else
  358.         turnRight(U);
  359.  
  360. //    myPWM.dutyCycle = (DUTY_NOMINAL + U);
  361. //    myPWMr.dutyCycle = (DUTY_NOMINAL - U);
  362. //    Timer_A_outputPWM(TIMER_A0_BASE, &myPWM);
  363. //    Timer_A_outputPWM(TIMER_A0_BASE, &myPWMr);
  364. //    Timer_A_startCounter(TIMER_A0_BASE, TIMER_A_UP_MODE);
  365. }
  366.  
  367. void TimerA1_Init(void(*task)(void), uint16_t period){
  368.  
  369.   TimerA1Task = task;             // user function
  370.   TIMER_A1->CTL = 0x02C0;
  371.   TIMER_A1->CCTL[0] = 0x0010;
  372.   TIMER_A1->CCR[0] = (period - 1);   // compare match value
  373.   TIMER_A1->EX0 = 0x0007;    // configure for input clock divider /6
  374. // interrupts enabled in the main program after all devices initialized
  375.  
  376.   NVIC->IP[2] = (NVIC->IP[2]&0xFF00FFFF)|0x00400000; // priority 2
  377.   NVIC->ISER[0] = 0x00000400;   // enable interrupt 10 in NVIC
  378.   TIMER_A1->CTL |= 0x0014;      // reset and start Timer A1 in up mode
  379.   __enable_irq();
  380. }
  381.  
  382. void initPin()
  383. {
  384.     GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P2, GPIO_PIN6, GPIO_PRIMARY_MODULE_FUNCTION);
  385.     GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P2, GPIO_PIN7, GPIO_PRIMARY_MODULE_FUNCTION);
  386.  
  387.     myPWM.clockSource = TIMER_A_CLOCKSOURCE_SMCLK;
  388.     myPWM.clockSourceDivider = TIMER_A_CLOCKSOURCE_DIVIDER_1;
  389.     myPWM.compareOutputMode = TIMER_A_OUTPUTMODE_SET_RESET;
  390.     myPWM.compareRegister = TIMER_A_CAPTURECOMPARE_REGISTER_4;
  391.     myPWM.timerPeriod = PERIOD;
  392.     myPWM.dutyCycle = DUTY_NOMINAL;
  393.     Timer_A_outputPWM(TIMER_A0_BASE, &myPWM);
  394.  
  395.  
  396.     myPWMr.clockSource = TIMER_A_CLOCKSOURCE_SMCLK;
  397.     myPWMr.clockSourceDivider = TIMER_A_CLOCKSOURCE_DIVIDER_1;
  398.     myPWMr.compareOutputMode = TIMER_A_OUTPUTMODE_SET_RESET;
  399.     myPWMr.compareRegister = TIMER_A_CAPTURECOMPARE_REGISTER_3;
  400.     myPWMr.timerPeriod = PERIOD;
  401.     myPWMr.dutyCycle = DUTY_NOMINAL;
  402.     Timer_A_outputPWM(TIMER_A0_BASE, &myPWMr);
  403.  
  404.     GPIO_setAsInputPinWithPullUpResistor(bump5);
  405.     GPIO_setAsInputPinWithPullUpResistor(bump4);
  406.     GPIO_setAsInputPinWithPullUpResistor(bump3);
  407.     GPIO_setAsInputPinWithPullUpResistor(bump2);
  408.     GPIO_setAsInputPinWithPullUpResistor(bump1);
  409.     GPIO_setAsInputPinWithPullUpResistor(bump0);
  410.  
  411.     GPIO_setAsOutputPin(sensODD);
  412.     GPIO_setAsOutputPin(sensEVEN);
  413.  
  414.     GPIO_setAsOutputPin(RGBRED);
  415.     GPIO_setAsOutputPin(RGBBLUE);
  416.     GPIO_setAsOutputPin(RGBGREEN);
  417.  
  418.     GPIO_setAsOutputPin(frontBlinker);
  419.     GPIO_setAsOutputPin(frontBlinkerLeft);
  420.     GPIO_setAsOutputPin(backBlinkerLeft);
  421.     GPIO_setAsOutputPin(backBlinkerRight);
  422.     GPIO_setOutputLowOnPin(RGBRED);
  423.     GPIO_setOutputLowOnPin(RGBBLUE);
  424.     GPIO_setOutputLowOnPin(RGBGREEN);
  425.  
  426.     GPIO_setOutputLowOnPin(frontBlinker);
  427.     GPIO_setOutputLowOnPin(frontBlinkerLeft);
  428.     GPIO_setOutputLowOnPin(backBlinkerLeft);
  429.     GPIO_setOutputLowOnPin(backBlinkerRight);
  430.  
  431.     GPIO_setAsOutputPin(lMotorDrive);
  432.     GPIO_setAsOutputPin(rMotorDrive);
  433.     GPIO_setAsOutputPin(lMotorDir);
  434.     GPIO_setAsOutputPin(rMotorDir);
  435.  
  436.     GPIO_setOutputLowOnPin(lMotorDir);
  437.     GPIO_setOutputHighOnPin(lMotorDrive);
  438.     GPIO_setOutputHighOnPin(rMotorDrive);
  439.     GPIO_setOutputLowOnPin(rMotorDir);
  440.  
  441.     Timer_A_stop(TIMER_A0_BASE);
  442.  
  443.  
  444. }
  445.  
  446. void configTimerA(uint16_t delayValue, uint16_t clockDivider)
  447. {
  448.     myTimer.clockSource = TIMER_A_CLOCKSOURCE_SMCLK;
  449.     myTimer.clockSourceDivider = clockDivider;
  450.     myTimer.timerPeriod = delayValue;
  451.     myTimer.timerClear = TIMER_A_DO_CLEAR;
  452. }
  453.  
  454. void myTimerADelay(uint16_t delayValue, uint16_t clockDivider)
  455. {
  456.     configTimerA(delayValue, clockDivider);
  457.     Timer_A_initUpMode(TIMER_A2_BASE, &myTimer);
  458.     Timer_A_startCounter(TIMER_A2_BASE, TIMER_A_UP_MODE);
  459.     while(TA2CTL&TAIFG == 0);
  460.     Timer_A_stop(TIMER_A2_BASE);
  461.     Timer_A_clearInterruptFlag(TIMER_A2_BASE);
  462. }
  463.  
  464. void wait1us(uint16_t num)
  465. {
  466.     volatile uint16_t i;
  467.     for(i = 0; i < num; i++)
  468.         myTimerADelay(1, TIMER_A_CLOCKSOURCE_DIVIDER_1);
  469. }
  470.  
  471.  
  472.  
  473. void checkLine(uint8_t sensArr[8])
  474. {
  475.     volatile uint16_t ii;
  476.     //Turn on IR LED
  477.     GPIO_setOutputHighOnPin(sensEVEN);
  478.     GPIO_setOutputHighOnPin(sensODD);
  479.     //Set Reflectence to Output
  480.     GPIO_setAsOutputPin(sens8);
  481.     GPIO_setAsOutputPin(sens7);
  482.     GPIO_setAsOutputPin(sens6);
  483.     GPIO_setAsOutputPin(sens5);
  484.     GPIO_setAsOutputPin(sens4);
  485.     GPIO_setAsOutputPin(sens3);
  486.     GPIO_setAsOutputPin(sens2);
  487.     GPIO_setAsOutputPin(sens1);
  488.     //Flash them
  489.     GPIO_setOutputHighOnPin(sens8);
  490.     GPIO_setOutputHighOnPin(sens7);
  491.     GPIO_setOutputHighOnPin(sens6);
  492.     GPIO_setOutputHighOnPin(sens5);
  493.     GPIO_setOutputHighOnPin(sens4);
  494.     GPIO_setOutputHighOnPin(sens3);
  495.     GPIO_setOutputHighOnPin(sens2);
  496.     GPIO_setOutputHighOnPin(sens1);
  497.  
  498.     wait1us(10);
  499.  
  500.     GPIO_setAsInputPin(sens8);
  501.     GPIO_setAsInputPin(sens7);
  502.     GPIO_setAsInputPin(sens6);
  503.     GPIO_setAsInputPin(sens5);
  504.     GPIO_setAsInputPin(sens4);
  505.     GPIO_setAsInputPin(sens3);
  506.     GPIO_setAsInputPin(sens2);
  507.     GPIO_setAsInputPin(sens1);
  508.  
  509.  
  510.     //1.5 ms
  511.     wait1us(12);
  512.  
  513.     sensArr[7] = GPIO_getInputPinValue(sens8);
  514.     sensArr[6] = GPIO_getInputPinValue(sens7);
  515.     sensArr[5] = GPIO_getInputPinValue(sens6);
  516.     sensArr[4] = GPIO_getInputPinValue(sens5);
  517.     sensArr[3] = GPIO_getInputPinValue(sens4);
  518.     sensArr[2] = GPIO_getInputPinValue(sens3);
  519.     sensArr[1] = GPIO_getInputPinValue(sens2);
  520.     sensArr[0] = GPIO_getInputPinValue(sens1);
  521.  
  522.     sensList = 0x00;
  523.     for (ii =0 ; ii < 8; ii++)
  524.     {
  525.         if(sensArr[ii] == 1)
  526.         {
  527.             switch(ii)
  528.             {
  529.             case 0: sensList += BIT7; break;
  530.             case 1: sensList += BIT6; break;
  531.             case 2: sensList += BIT5; break;
  532.             case 3: sensList += BIT4; break;
  533.             case 4: sensList += BIT3; break;
  534.             case 5: sensList += BIT2; break;
  535.             case 6: sensList += BIT1; break;
  536.             case 7: sensList += BIT0; break;
  537.             }
  538.         }
  539.     }
  540.  
  541.     GPIO_setOutputLowOnPin(sensEVEN);
  542.     GPIO_setOutputLowOnPin(sensODD);
  543. }
  544.