PSoC Pins Component Interrupt

Tip / Sign in to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
Anonymous
Not applicable

How does the pins component interrupt generation function when the number of pins is set > 1 and mulptiple pins are set to generate interrupts?

0 Likes
9 Replies
TeHe_281121
Level 3
Level 3

You can use the interrupt component (Systems Tab), and connect one to each pin requiring an interrupt.

   

Then you can use the interrupt API, and the Design Wide Resources tab, to change interrupt priorities etc.

0 Likes
Anonymous
Not applicable

I was really trying to find out how does the hardware side deal with multiple sources of interrupts if more than one were active at the same time? Does the API resolve this some how? If an interrupt is being serviced, but has not yet released the request at the pin and another request is activated, is the newer request recognized? Is there a detailed description of this somewhere?

0 Likes
TeHe_281121
Level 3
Level 3

Interrupts are handled in hardware by the Interrupt Controller. It can handle 32 interrupts and allows the user to assign eight levels of interrupt priority, 0 to 7.

Priority 0 is the highest and 7 the lowest. Priorities can be set at design time and changed/set dynamically at runtime.

If two interrupts occur at the same time the interrupt with the highest priority (lowest number) is serviced first.

If an interrupt is being serviced and a higher priority interrupt occurs, then the current interrupt service is suspended and the higher priority interrupt gets serviced, and when done the lower level one will resume.

   
   

For more detail of the interrupt hardware, see chapter 8 (Interrupt Controller) of the TRM here http://www.cypress.com/?docID=18266 www.cypress.com/

0 Likes
Anonymous
Not applicable

I must not be wording the question properly...

   

If I place a pins component on a schematic sheet and set the number of pins to a value greater than 1 and set each pin to generate interrupts, I only have a single interrupt which connects to the interrupt controller. How does the hardware/API deal with multiple sources connected to this single interrupt source? How do I know which pin generated the interrupt? What happens when the interrupt for one of the lines is generated and is being serviced and another line connected to the same pins component should cause an interrupt? Will it happen? Creator will not permit multiple pins components for the same group of port pins to have individual interrupts. So my question is...How does the port/pins component deal with multiple pins attached to a single pins component that can generate interrupts? I looked through the documentation and cannot find this topic dealt with...I understand the priorities and the interrupt controller, but this occurs before that point in the hardware.

   

Thanks.

0 Likes
TeHe_281121
Level 3
Level 3

Hi smurask,

   

I think you may be missing a step. This is how to do it.

   


Place the pins component, and configure for the number of pins required.
Then, as you have done before, configure the pins component, for the interrupts on each pin.
Now, place the Interrupt component, as many times as you have pins, and wire one to each pin.

   

Now you can configure the interrupt priorities on the Interrupts Tab of DWR.
Hope this works for you.
 

   


 

0 Likes
Anonymous
Not applicable

I tried implementing something in this way and it wouldn't work for me.

0 Likes

There is only one interrupt line used for a port. You will need to read all pins in the handler to determine which pin(s) were causing the interrupt.

Bob

0 Likes
Anonymous
Not applicable

OK...I guess I thought that the pins component was able to multiplex the interrupt requests somehow and that was the purpose of the interrupt output from the pins component??? I guess that is only for a single pin interrupt application. Thanks.

0 Likes
odissey1
Level 9
Level 9
First comment on KBA 1000 replies posted 750 replies posted

steve.murasky,

interrupts sources within the port are OR-ed together. That is when you instantiate several grouped pins within the port and enable the interrupt, you will get a single ISR for all pins in the group. When ISR fires you have to find which of the pins caused the interrupt. To do that, inside ISR routine use API PinName_ClearInterrupt(), which returns all sources for interrupt event (while also clearing interrupt source): bit 0 - pin0, bit1 - pin1, etc.

#define MASK2  0x4 // pin: 2

CY_ISR(myPinInt)

{      

    uint8 intSource = `$INSTANCE_NAME`_ClearInterrupt(); // must clear

 

    if ((intSource & MASK2)==1)

    {

         //your code ....

    }

}

0 Likes