| 
	
	|  |  |  
	
		| View previous topic :: View next topic |  
		| Author | Message |  
		| tipoldo 
 
 
 Joined: 01 Feb 2006
 Posts: 14
 Location: Palma Mallorca
 
 
			    
 
 | 
			
				| wrong dispatcher code |  
				|  Posted: Wed Feb 27, 2008 10:21 am |   |  
				| 
 |  
				| Hi, I'm using the CCS PCM C Compiler Version 3.236 on a PIC 16F690. I have to use the  comp2_isr in my code to implement a project. I get crazy because sometimes the program had really strange behaviour. Analyzing and tracing the assembler code, I found that the compiler doesn't restore the W register well on interrupt return. Here is the interrupt dispatcher code that the CCS generates in my code:
 
 0003:  NOP
 0004:  MOVWF  7F
 0005:  SWAPF  03,W
 0006:  CLRF   03
 0007:  MOVWF  26
 0008:  MOVF   7F,W
 0009:  MOVWF  25
 000A:  MOVF   0A,W
 000B:  MOVWF  2D
 000C:  CLRF   0A
 000D:  SWAPF  25,F
 000E:  MOVF   04,W
 000F:  MOVWF  27
 0010:  MOVF   20,W
 0011:  MOVWF  28
 0012:  MOVF   21,W
 0013:  MOVWF  29
 0014:  MOVF   22,W
 0015:  MOVWF  2A
 0016:  MOVF   23,W
 0017:  MOVWF  2B
 0018:  MOVF   24,W
 0019:  MOVWF  2C
 001A:  BCF    03.7
 001B:  BCF    03.5
 001C:  MOVLW  8D
 001D:  MOVWF  04
 001E:  BTFSS  00.6
 001F:  GOTO   022
 0020:  BTFSC  0D.6
 0021:  GOTO   035
 0022:  MOVF   27,W
 0023:  MOVWF  04
 0024:  MOVF   28,W
 0025:  MOVWF  20
 0026:  MOVF   29,W
 0027:  MOVWF  21
 0028:  MOVF   2A,W
 0029:  MOVWF  22
 002A:  MOVF   2B,W
 002B:  MOVWF  23
 002C:  MOVF   2C,W
 002D:  MOVWF  24
 002E:  MOVF   2D,W
 002F:  MOVWF  0A
 0030:  SWAPF  26,W
 0031:  MOVWF  03
 0032:  SWAPF  7F,F
 0033:  SWAPF  7F,W
 0034:  RETFIE
 
 Highlighted in red is the code where the compiler save the W register, watching it, it saves the W register in the 0x25 register and swaps it. To do it, the compiler use a temporal register (0x7F). But when the compiler wanted to restore the W register, it is restored with the value of the 0x7F register (highlighted in blue color) instead of the 0x25 register. Unfortunately the compiler uses the temporal 0x7F register into my interrupt function as a register for temporal variable, and therefore the code doesn't restore right the W register when I come back from the interrupt function.
 
 To continue with my project, as a workaround, I have written the following assembler code at the end of the interrupt function comp2_isr():
 
 #ASM
 SWAPF 0x25,W
 MOVWF 0x7F
 #ENDASM
 
 But I don't like it. How can I resolve it?
 |  |  
		|  |  
		| SherpaDoug 
 
 
 Joined: 07 Sep 2003
 Posts: 1640
 Location: Cape Cod Mass USA
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Wed Feb 27, 2008 10:29 am |   |  
				| 
 |  
				| What compiler version are you using, and have you informed CCS about this?  They don't always monitor this BBS. _________________
 The search for better is endless.  Instead simply find very good and get the job done.
 |  |  
		|  |  
		| tipoldo 
 
 
 Joined: 01 Feb 2006
 Posts: 14
 Location: Palma Mallorca
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Wed Feb 27, 2008 10:39 am |   |  
				| 
 |  
				| I'm using the PCM Version 3.236, and I haven't informed about this to CCS yet. Where should I do that? |  |  
		|  |  
		| SherpaDoug 
 
 
 Joined: 07 Sep 2003
 Posts: 1640
 Location: Cape Cod Mass USA
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Wed Feb 27, 2008 12:25 pm |   |  
				| 
 |  
				| At the top of this page near the CCS logo is a link to "Official CCS Support" Then at the right under Quick Links they tell you how to get official support.
 _________________
 The search for better is endless.  Instead simply find very good and get the job done.
 |  |  
		|  |  
		|  |  
  
	| 
 
 | 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
 
 |