| 
	
	|  |  |  
	
		| View previous topic :: View next topic |  
		| Author | Message |  
		| art30fc 
 
 
 Joined: 16 Jul 2021
 Posts: 1
 
 
 
			    
 
 | 
			
				| how to enable and disable interrupt (INT_RDA) |  
				|  Posted: Fri Jul 16, 2021 12:47 pm |   |  
				| 
 |  
				| I am working with various interruptions. To start I need to enable an INT_TIMER0 interrupt, but to be able to enable this interrupt I disable the interrupt (INT_RDA), at the end of the interrupt (INT_TIMER0). I don't know how to enable the interrupt (INT_RDA) correctly. The code is something like that:
 
  	  | Code: |  	  | #int_timer0
 VOID timer_0()
 {
 //instructions (some time)
 //t=1;
 // disable_interrupts(int_timer0);
 }
 
 #INT_RDA
 void RDA()
 {
 read_string();
 }
 
 void main()
 {
 while(true)
 {
 disable_interrupts(int_timer0);
 if(s1==1)
 {
 disable_interrupts(int_RDA);
 enable_interrupts(int_timer0);
 }
 if(t==1) enable_interrupts(int_RDA);
 }
 }
 | 
 |  |  
		|  |  
		| PCM programmer 
 
 
 Joined: 06 Sep 2003
 Posts: 21708
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Fri Jul 16, 2021 2:34 pm |   |  
				| 
 |  
				| I don't see where  you enable global interrupts.  You need to. Add the line shown below in bold:
 
  	  | Quote: |  	  | void main() {
 enable_interrupts(GLOBAL);
 .
 .
 .
 
 
 | 
 |  |  
		|  |  
		| temtronic 
 
 
 Joined: 01 Jul 2010
 Posts: 9588
 Location: Greensville,Ontario
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Fri Jul 16, 2021 2:41 pm |   |  
				| 
 |  
				| Hopefully your 'read_string()' function is a timed event, otherwise if (when..) you don't get a complete string from the outside, the PIC will sit in the ISR forever..... 
 CCS does supply info about this, I believe it's in the FAQ section of the manual.
 |  |  
		|  |  
		| Ttelmah 
 
 
 Joined: 11 Mar 2010
 Posts: 19966
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Sun Jul 18, 2021 12:34 am |   |  
				| 
 |  
				| Also understand, the 'INT_RDA' says that _one_ character has been received, not a 'string'. To read a sequence of characters you really need
 to be using something like the get_string function from input.c, modified to
 fetch it's characters from the circular buffer routine in ex_sisr.c
 |  |  
		|  |  
		| Ttelmah 
 
 
 Joined: 11 Mar 2010
 Posts: 19966
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Sun Jul 18, 2021 11:36 pm |   |  
				| 
 |  
				| Also, another 'key' point. If you are disabling INT_RDA anywhere, it is absolutely 'vital', that you have ERRORS in your RS232 declaration.
 This should always be there (unless you add your own error handling), but
 if a character can be missed (which disabling makes likely), becomes
 'essential', otherwise the UART can become hung.
   
 There are several more things to say. Unless you are using the hardware
 interrupt priority feature (which means you have an interrupt flagged
 as 'FAST', or 'HIGH'), when you are inside an interrupt handler, _all_
 other interrupts are disabled. In general interrupts cannot interrupt other
 interrupts. So the 'disabling' of INT_RDA, is pointless. If you are staying
 for a significant time inside an interrupt handler, you are preventing all
 the other interrupts from doing the jobs they are meant to do. In general,
 the old 'rule of thumb', is you should always get out of interrupts as quickly
 as possible. If you want a task that takes significant time to be triggered
 by a timer, then set a flag, and handle this in the main code, when the
 flag happens. If you want to disable serial reception while this is happening,
 then have a flag, which is set when this happens and have the serial receive
 routine simply read characters when this is set, and not store them. This
 avoids triggering hardware errors because the characters are not handled.
 
 Your approach at the moment is fundamentally flawed, which may explain
 why you are having problems...
  |  |  
		|  |  
		|  |  
  
	| 
 
 | 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
 
 |