CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to CCS Technical Support

Multi-Interrupt

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
Guest








Multi-Interrupt
PostPosted: Wed May 18, 2005 12:58 pm     Reply with quote

Hi all, I need help.

I am new to PIC and microcontroller and I need some help from you all.
My question is: Can I use more than 1 interrupt in the same PIC? For
example: I want to use the interrupt in order as follow,


use the #INT_EXT to monitor pin RB0 -- >tied to light sensor,
use the #INT_RB to monitor pin RB4-7 -- > tied to 4 switches
use the #INT_TIMER0 to set time delay for alarm piezo.
use the #INT_USART to detect any incoming characters - to remote reseting purpose.

Can I use same PIC to do all those at the sametime?
Any body have a example code (layout format)to use multiple interrupt subroutines.

I did multiple interrupt search in this forum and found nothing relate.

Please Help......
valemike
Guest







PostPosted: Wed May 18, 2005 1:43 pm     Reply with quote

Yes, you can have multiple interrupts.

Use the #priority directive, e.g.

#priority INT_EXT, INT_SSP

to determine which ISRs will be serviced first if there are more than one pending interrupts.

If you need to let certain interrupts interrupt other interrupts, then you'll need to devise your own isr using the fast interrupt directive.
dyeatman



Joined: 06 Sep 2003
Posts: 1933
Location: Norman, OK

View user's profile Send private message

PostPosted: Wed May 18, 2005 1:43 pm     Reply with quote

Sorry Valemike, you got in just before I did and covered much of what I said...:-)

Since you failed to mention what PIC and CCS version you are using you may have a High Priority interrupt to use.

Otherwise you have to determine what the highest priority is going to be then use the #priority pre-processor directive to set the order. I would recommend setting the USART interrupt at the highest priority.

In the case of the RB4-7, in the interrupt routine I would store the entire port into a byte, set a flag and exit. After you exit the interrupt, mask off and test the upper four bits in the input byte to determine which switche(s) where activated. You can also save the port byte and use it as a mask the next time to see which ones changed from the previous.

Just be sure to get out of any interrupt routine as quickly as possible!!


Last edited by dyeatman on Wed May 18, 2005 1:44 pm; edited 1 time in total
DragonPIC



Joined: 11 Nov 2003
Posts: 118

View user's profile Send private message

PostPosted: Wed May 18, 2005 1:44 pm     Reply with quote

I have used multiple interrupts before with no problem. The interrupt handler used in compiler will take care of all the register saves and and flag clearing as needed. They will execute in the order listed in code (I beleive).
_________________
-Matt
Guest








PostPosted: Wed May 18, 2005 1:54 pm     Reply with quote

Yes, you can have multiple interrupts enabled.
No, nothing _ever_ happens at the 'same time'. A second interrupt will not be serviced, till the handler for the first interrupt finishes. This is one part of the reason, why keeping interrupt handlers _short_ is vital.
#Priority (or the order in which you define the interrupt routines), determined the order in which the handler will be tested when the interrupt occurs).
You can simply combine a code example, like the 'SISR' one, which is a generic serial handler, with one of the other examples, to see how multiple interrupts work.
The problem is that there is no such thing as a 'simple' example of this, and most will be dependant on the hardware involved. However this is part of a fairly generic serial handler using both receive and transmit interrupts. This requires defines for the UART registers and interrupt bits:
Code:

//Buffer tests and handling
#define isempty(buff,free,in,out,size) (free>=size)
#define isfull(buff,free,in,out,size) (free<2)
#define tobuff(buff,free,in,out,size,chr) {buff[in++]=chr;\
   --free;\
   in=(in & (size-1));}

/* Sizes and numbers for the buffers */
/* sizes of the individual buffers */
#define   SRBUFF   (32)
#define         STBUFF   (32)

/* Each buffer uses a character array. Size is in the 'S' defines, and
   the init_buff routine will have to be amended to add extra buffers if required */
int RSRcount,RSRin,RSRout;
int RSTcount,RSTin,RSTout;
unsigned int RSRbuff[SLBUFF+1],RSTbuff[STBUFF+1];

unsigned int RSTfrom()
{
   /* Get character from the RS232 TX buffer */
   static unsigned int temp;
   temp=RSTout;
   RSTout=(++RSTout) & (STBUFF-1);
   temp=(RSTbuff[temp]);
   RSTcount++;
   return(temp);
}

#INT_TBE /* Transmit buffer empty interrupt */
void TXINT(void)
{
       /* If characters are waiting in the buffer, the next one is transferred to the UART otherwise the interrupt is disabled, waiting for the next transmission. */
   if (!isempty(RSTbuff,RSTcount,RSTin,RSTout,STBUFF))
   {
      putc(RSTfrom());
   }
   else
      DISABLE_INTERRUPTS(INT_TBE);   /* RS232 TX */
}

void tchar(unsigned int chr)
{
   /* routine to send one character on the RS232.
   This puts the specified character into the software transmit buffer
   (if data is allready
   being transmitted), or else sends the single character to the
   RS232 UART. */
   /* First check if the interrupt is enabled, and if not, write directly */
   if (TXIE==0) && (isempty  (RSTbuff,RSTcount,RSTin,RSTout,STBUFF)))
   {
      /* Wait if the TX buffer has not cleared */
      while (TXIF==0) ;
      /* send character */
     TXREG=chr;
   }
   else
   {
      /* Hold transmission if the buffer is full */
      while (isfull(RSTbuff,RSTcount,RSTin,RSTout,STBUFF)) {
          if (TXIF==1) {
            /* Here the transmit hardware buffer is empty */
            TXREG=RSTfrom();
          }
      }
      /* put character into the output buffer */
      tobuff(RSTbuff,RSTcount,RSTin,RSTout,STBUFF,chr);
    }
    /* Enable interrupts */
    enable_interrupts(INT_TBE);
}

#INT_RDA
void RDA_isr(void) {
   //Here a character has been received.
   tobuff(RSRbuff,RSRcount,RSRin,RSRout,SRBUFF,getc());
}


Best Wishes
Guest








PostPosted: Wed May 18, 2005 2:35 pm     Reply with quote

What is the main() routine will look like. The manual does not show any example for #PRIORITY.

Does it look like this?

Code:

void main()
{
   enable_interrupts(global);
   enable_interrupts(int_priority);

   while(1)
    {

    }

}
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Wed May 18, 2005 2:40 pm     Reply with quote

http://www.ccsinfo.com/forum/viewtopic.php?t=8271&highlight=priority
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group