5 Replies Latest reply on Sep 17, 2015 6:27 AM by elias.hernndez

    Using ReadStatusRegister to know which interruption is triggered

    elias.hernndez

           Hi, I'm developing a project that uses a Timer, and I want to set an interrupt when I receive an input on the capture input of the timer, or when the counter value of the timer is equal to zero (TC interrupt).

         

          The problem is that if I check both interruptions ("On TC" and "On Capture [1-4]"), in the main.c I don't know which interrupt is triggered.

         

          In the API said that ReadStatusRegister returns a uint8 with the value of the register, but I don't know which value use to compare it to know which kind of interruption has been triggered.

         

       

         

      ## CODE ##

         

      CY_ISR(theres_an_interruption){

         

          if(Timer_ReadStatusRegister() == value_when_theres_a_TC_interruption){

         

              // TC interruption

         

          } else {

         

              //  Capture interruption

         

          }

         

      }

        • 1. Re: Using ReadStatusRegister to know which interruption is triggered
          user_1377889

          You do not state quite clear which timer component you use.

             

          For the TCPWM you will have to use the GetInterruptSource() function. For the Timer (v 2.70) open the datasheet, go to the Timer_ReadStatusRegister() and click on the "Status Register" link which will bring you to the bit definitions for TC and Capture. Keep in mind that the bits are cleared on read, namely Timer_STATUS_TC and Timer_STATUS_TC (#defined in your Timer.h)

             

           

             

          Bob

          • 2. Re: Using ReadStatusRegister to know which interruption is triggered
            elias.hernndez

            Thank you Bob, I'm using the Timer (v 2.70), and you are right, I should check for the Timer_STATUS_TC and the Timer_STATUS_CAPTURE.

               

            My doubt is what value should i use to compare the Timer_ReadStatusRegister(). I mean, if the bit "Timer_STATUS_TC" it's located at position 0 in the status register, and I want to check if the interruption is caused by the TC interruption, I must use something like this?

               

            if(Timer_ReadStatusRegister() == 00000001){

               

              // TC interruption here

               

            }

               

             

               

            Or maybe as Timer_ReadStatusRegister() returns a uint8, I just may compare the return value to:

               
                  
            • When TC bit is set in the Status Register it looks like this 00000001, so I must check if Timer_ReadStatusRegister() == 1
            •     
            • When Capture bit is set in the Status Register it looks like this 00000010, so I must check if Timer_ReadStatusRegister() == 2
            •    
            • 3. Re: Using ReadStatusRegister to know which interruption is triggered
              user_14586677

              More like this -

                 

               

                 

              if(Timer_ReadStatusRegister() & 00000001)                 // If that bit is true virtue of using mask off upper 7 bits

                 

               

                 

              Regards, Dana.

              • 4. Re: Using ReadStatusRegister to know which interruption is triggered
                user_1377889

                C-language was designed to write that request as short as even possible, long before optimizing compilers were invented.

                   

                A logical "false" is defined in C as zero (0, NULL), logical "true" is then the boolean opposite wihich is != zero.

                   

                To question your above flag you never should make a comparison to be equal to the bit you want to test because there might another bit set, too. Better is -as Dana suggested- to perform a logical AND and compare the result to non zero. With the above in mind you may write

                   

                if(Timer_ReadStatusRegister() & Timer_STATUS_TC)

                   

                for the case that both of your flags may be active you should remember thar the flags get reset by a ReadStatusRegister() and you will have to save the value for a second quest.

                   

                 

                   

                Bob

                • 5. Re: Using ReadStatusRegister to know which interruption is triggered
                  elias.hernndez

                  Thank you Bob and Dana, tomorrow when I come back to my college lab I will compile it and tell you if it works.