1 Reply Latest reply on Jan 8, 2019 5:45 PM by LinglingG_46

    Cap touch code enter critical section

    LiFi_1601451

      Below is my firmware, and it has watchdog and ADC interrupt. I have to add enter and exit critical section function so that the cap touch process will not be interrupted. Please tell me where can I insert at below code the enter and exit critical section function

       

          while(1u)
          {
              ADCHandler();
              CySysWdtResetCounters(CY_SYS_WDT_COUNTER1_RESET);
             
              if(BatteryOutOfRange==0)
              {
                  /* Do this only when a scan is done */
                  if(CapSense_NOT_BUSY == CapSense_IsBusy())
                  {
                      CapSense_ProcessAllWidgets(); /* Process all widgets */
                      #ifdef USER_CAP_SENSE_TUNE_ENABLE
                            CapSense_RunTuner(); /* To sync with Tuner application */
                      #endif // cap sense tune enable
                      CapSense_CheckState();
                      CapSense_ScanAllWidgets(); /* Start next scan */
                  }

                  /* Display CapSense state using LEDs */
                        

              }
              else CapTouchOutput_Write(0u);
                 
          }

       

      void CapSense_CheckState(void)
      {

       

          static uint16_t guardReleaseCount = 0, SensorTouchCount = 0,guardState = 1, sensorState=0;
          static uint8_t press_print = 0;
         
          if (CapSense_IsWidgetActive(CapSense_GUARD_WDGT_ID))
          {
              guardState=1;
              guardReleaseCount = 0;

       


          }
          else
          {
              if(++guardReleaseCount >= GUARD_RELEASE_COUNT_TH)
              {
                  guardState=0;
                  guardReleaseCount = 0;
              }
          }
          if (CapSense_IsWidgetActive(CapSense_BUTTON0_WDGT_ID))
          {
              if(++SensorTouchCount>=SENSOR_TOUCH_COUNT_TH)
              {
                  sensorState=1;
                  SensorTouchCount=0;
              }
             
          }
          else
          {
              sensorState=0;
              SensorTouchCount = 0;
          }
        
         
          if(guardState ==0 && sensorState==1)
          {
              if(press_print==0)
              {
                  User_UART_UartPutString("Button Pressed\r\n");
                  press_print = 1;
              }
              CapTouchOutput_Write(1u);

       

          }
          else
          {

       

              CapTouchOutput_Write(0u);
              press_print = 0;
          }
      }

       


      void ADCHandler(void)
      {
          uint8 channel = CHANNEL_1;
          int16 adcVal;
          int32 mVolts;
          int32 BatteryVolt;
          static uint8 FirstBoot=1;

       

       

          Vbat_EN_Write(1u);

          if(ADCdataReady != 0u)
          {

              adcVal = ADC_GetResult16(CHANNEL_1);
             

             
            /* Check for ADC window limit interrupt */
              if(ADCwindowFlag != 0u)
              {

                 BatteryOutOfRange = 1;

       

        
              }
              else
              {

                  /* Convert the ADC counts of active channel to mVolts */
                  mVolts = (int32)ADC_CountsTo_mVolts(channel, adcVal);
                  BatteryVolt = mVolts * BATTERY_VOLTAGE_GAIN + BATTERY_OFFSET;

                  if(FirstBoot)
                  {
                      if(BatteryVolt>=BATTERY_VOLTAGE_LOWER_LIMIT && BatteryVolt <=BATTERY_VOLTAGE_UPPER_LIMIT)
                          BatteryOutOfRange = 0;
                  }
                          
                  if(BatteryOutOfRange)
                  {
                      if(BatteryVolt>=BATTERY_VOLTAGE_LOWER_HYSTERESIS && BatteryVolt <=BATTERY_VOLTAGE_HIGHER_HYSTERESIS)
                          BatteryOutOfRange = 0;
                  }
                  else
                  {
                      if(BatteryVolt>=BATTERY_VOLTAGE_UPPER_LIMIT || BatteryVolt<=BATTERY_VOLTAGE_LOWER_LIMIT)
                          BatteryOutOfRange = 1;
                  }
                 

              }
              FirstBoot = 0;
              ADCdataReady = 0u;

       

       

          
          }
      }

        • 1. Re: Cap touch code enter critical section
          LinglingG_46

          please refer to the below codes:

          You can't disable the interrupt while scanning, because we should use the CSD ISR to report that scanning is done.

          We only need to disable the interrupts while checking the capsense scan status.

          If you want to avoid that the CSD scan is disturbed by other interrupts, you only to set the CSD ISR as the highest priority in your system.

           

          uint8 interruptState;

            if(BatteryOutOfRange==0)

                  {

           

          /* Disable interrupts, so that ISR is not serviced while

                          *  checking for CapSense scan status.

                          */

                interruptState = CyEnterCriticalSection();

                      /* Do this only when a scan is done */

                      if(CapSense_NOT_BUSY == CapSense_IsBusy())

                      {

                 /* Enable interrupts for servicing ISR */

                 CyExitCriticalSection(interruptState);

                          CapSense_ProcessAllWidgets(); /* Process all widgets */

                          #ifdef USER_CAP_SENSE_TUNE_ENABLE

                                CapSense_RunTuner(); /* To sync with Tuner application */

                          #endif // cap sense tune enable

                          CapSense_CheckState();

                          CapSense_ScanAllWidgets(); /* Start next scan */

                      }

                 /* Enable interrupts for servicing ISR */

                     CyExitCriticalSection(interruptState);

                      /* Display CapSense state using LEDs */
                          

                  }
                  else CapTouchOutput_Write(0u);