| 
	
	|  |  |  
	
		| View previous topic :: View next topic |  
		| Author | Message |  
		| hhoebel Guest
 
 
 
 
 
 
 
			
			
			
			
			
			
			
			
			
 
 | 
			
				| Interrupt routine with priority? |  
				|  Posted: Thu Jul 10, 2003 9:07 am |   |  
				| 
 |  
				| Hi there, 
 anyone out there who uses a custom interrupt-routine with the hardware-priority of the 18F?
 Any example how to do this and what should be saved/restored inside the #int_global? I know the CCS-example, but it's a really short one. I'm using 3.167
 
 regards,
 
 Heiko
 ___________________________
 This message was ported from CCS's old forum
 Original Post ID: 144515846
 |  |  
		|  |  
		| R.J.Hamlett Guest
 
 
 
 
 
 
 
			
			
			
			
			
			
			
			
			
 
 | 
			
				| Re: Interruptroutine with priority? |  
				|  Posted: Thu Jul 10, 2003 10:07 am |   |  
				| 
 |  
				| :=Hi there, :=
 :=anyone out there who uses a custom interrupt-routine with the hardware-priority of the 18F?
 :=Any example how to do this and what should be saved/restored inside the #int_global? I know the CCS-example, but it's a really short one. I'm using 3.167
 :=
 :=regards,
 :=
 :=Heiko
 Yes, I do this. I originally had to write my own int handler, back in the days when the CCS compiler was giving problems, and then tweaked it to do this, when I needed a fast interrupt.
 I also 'moaned' to MicroChip, since for the fastest response, it would be nice to be able to specify which interrupt vectored to the 004 address, and which to 008 (the way the fast interrupt currently goes to 004, requires an extra jump instruction to it's handler, whereas the 'low priority' interrupt going to 008, can have it's handler directly starting at this address...).
 The 'core' stuff, that I save, is:
 W
 Status
 BSR
 FSR0L/H
 FSR1L/H
 FSR2L/H
 TBLPTRL/H/U
 and the five 'scratch' memory locations (addresses 0..4 by default).
 The 'fast' interrupt in my case, then saves nothing, using RETFIE 1. This is in assembler, and only uses a couple of storage locations, with no use of CCS code at all.
 The 'MOVFF' instruction on the 18F family, make saving the registers a very different operation, from that used onthe older chips:
 
 #ifndef INTSTD
 #INT_GLOBAL
 dum() {
 //This is my interrupt handler
 static int INT_scratch[18];
 #ASM
 MOVFF W,INT_scratch+15
 MOVFF STATUS,INT_scratch+16
 MOVFF BSR,INT_scratch+17
 MOVFF	FSR0L,INT_scratch
 MOVFF	FSR0H,INT_scratch+1
 MOVFF	FSR1L,INT_scratch+2
 MOVFF	FSR1H,INT_scratch+3
 MOVFF	FSR2L,INT_scratch+4
 MOVFF	FSR2H,INT_scratch+5
 MOVFF	scratch1,INT_scratch+7
 MOVFF	scratch2,INT_scratch+8
 MOVFF	scratch3,INT_scratch+9
 MOVFF TBLPTRL,INT_scratch+10
 MOVFF TBLPTRH,INT_scratch+11
 MOVFF TBLPTRU,INT_scratch+12
 MOVFF scratch,INT_scratch+13
 MOVFF scratch0,INT_scratch+14
 
 I have defines for all the registers (and the 'scratch' memory area).
 
 The reverse is done at the other end. Since the fast interrupt can interrupt the slow handler, I also make my interrupt 'test' code, loop back and retest the interrupts before exiting, which reduces the latency if a second 'normal' interrupt has occured (since the registers don't all have to be saved/restored...).
 
 Best Wishes
 ___________________________
 This message was ported from CCS's old forum
 Original Post ID: 144515849
 |  |  
		|  |  
		| hhoebel Guest
 
 
 
 
 
 
 
			
			
			
			
			
			
			
			
			
 
 | 
			
				| Interruptroutine with priority? |  
				|  Posted: Fri Jul 11, 2003 2:03 am |   |  
				| 
 |  
				| Many thanks for your posting. I've got a answer from CCS too.
 They mentioned that i simply can change the #int_xxxx to #int_xxxx fast.
 I've tested this and, yes, the compiler enables IPEN, sets the interrupt to high-priority, moves the interrupt-handler from 0x0008 to 0x0018, inserts a jump to the interrupt-routine to 0x0008 and places a retfie 1 at the end of the routine instead of the normal retfie 0.
 The interrupt-handler saves all what you've mentioned and the high-priority interrupt uses the automatic context-saving to the fast stack. Due to that i'm only modifying some global variables and two port-pins inside of this interrupt, it seems to that i don't have to add any save/restore-lines in addition to that.
 
 Very nice :-)
 
 regards,
 
 Heiko
 
 B.T.W.: Do you know why microchip always mentions the bank switching when talking about ram-usage (in the 18F1320-datasheet)? IMHO this chip only has 256 Byte ram and therefore the whole ram would be one bank and IMHO i don't need any bank switching for accesing that 256 bytes. Am i wrong?
 ___________________________
 This message was ported from CCS's old forum
 Original Post ID: 144515864
 |  |  
		|  |  
		| R.J.Hamlett Guest
 
 
 
 
 
 
 
			
			
			
			
			
			
			
			
			
 
 | 
			
				| Re: Interruptroutine with priority? |  
				|  Posted: Fri Jul 11, 2003 2:30 am |   |  
				| 
 |  
				| :=Many thanks for your posting. :=I've got a answer from CCS too.
 :=They mentioned that i simply can change the #int_xxxx to #int_xxxx fast.
 :=I've tested this and, yes, the compiler enables IPEN, sets the interrupt to high-priority, moves the interrupt-handler from 0x0008 to 0x0018, inserts a jump to the interrupt-routine to 0x0008 and places a retfie 1 at the end of the routine instead of the normal retfie 0.
 :=The interrupt-handler saves all what you've mentioned and the high-priority interrupt uses the automatic context-saving to the fast stack. Due to that i'm only modifying some global variables and two port-pins inside of this interrupt, it seems to that i don't have to add any save/restore-lines in addition to that.
 :=
 :=Very nice :-)
 :=
 :=regards,
 :=
 :=Heiko
 Yes. As I said, I generated this code, when the CCS compiler was still having problems with the interrupt handler. In fact the full code has an 'if' test, which allowed me to switch straight back to using the standard handler once it worked.
 :-)
 I still use this on one piece of equipment, because of the other change made (retesting the interrupt status bits before exiting), which massively reduces the latency with multiple low-priority interrupts.
 
 :=B.T.W.: Do you know why microchip always mentions the bank switching when talking about ram-usage (in the 18F1320-datasheet)? IMHO this chip only has 256 Byte ram and therefore the whole ram would be one bank and IMHO i don't need any bank switching for accesing that 256 bytes. Am i wrong?
 
 Remember the 'special function registers' are mapped into the RAM address space, up at the top of the memory area. Hence you could need to bank switch to access these. However (furtunately), the 18F family, support the long 'direct access' instructions (like the MOVFF one I used), which largely obviate the need to bank switch.
 
 Best Wishes
 ___________________________
 This message was ported from CCS's old forum
 Original Post ID: 144515866
 |  |  
		|  |  
		| Gerrit 
 
 
 Joined: 15 Sep 2003
 Posts: 58
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Mon Dec 22, 2003 6:35 pm |   |  
				| 
 |  
				| I like to get the folowing working: 
 1. I want to have controle over the low interupts (make my own global interupt)
 
 2. I want to use a fast interupt for one timer.
 
 
 when I start with:
 
 #int_ad fast
 void int_ad_isr(void)
 {
 char c;
 
 c = 0x55;
 
 }
 
 the next list is availible
 
 0008 EF5F F000      00002 GOTO   00BE
 000C 0000           00003 NOP
 000E 0000           00004 NOP
 0010 0000           00005 NOP
 0012 0000           00006 NOP
 0014 0000           00007 NOP
 0016 0000           00008 NOP
 0018 6E05           00009 MOVWF  05
 001A CFD8 F006      00010 MOVFF  FD8,06
 001E 50E9           00011 MOVF   FE9,W
 0020 6E07           00012 MOVWF  07
 0022 50EA           00013 MOVF   FEA,W
 ......
 
 0092 5005           00069 MOVF   05,W
 0094 C006 FFD8      00070 MOVFF  06,FD8
 0098 0010           00071 RETFIE 0
 
 0000                00418 .................... #int_ad fast
 0000                00419 .................... void int_ad_isr(void)
 0000                00420 .................... {
 0000                00421 .................... char c;
 0000                00422 ....................
 0000                00423 .................... c = 0x55;
 00BE 0E55           00424 MOVLW  55
 00C0 0101           00425 MOVLB  1
 00C2 6F82           00426 MOVWF  x82
 0000                00427 ....................
 0000                00428 .................... }
 0000                00429 ....................
 0000                00430 ....................
 0000                00431 ....................
 0000                00432 ....................
 00C4 9C9E           00433 BCF    F9E.6
 00C6 0011           00434 RETFIE 1
 
 
 
 
 
 Why is the low priority interupt handler used ?
 
 
 
 
 
 If is use :
 
 #INT_GLOBAL
 void isr()  {
 #asm
 //store current state of processor
 MOVWF save_w
 SWAPF status,W
 BCF   status,5
 BCF   status,6
 MOVWF save_status
 // Save anything else your code may change
 // You need to do something with PCLATH if you have GOTOs
 // remember to check to see what interrupt fired if using more than one!!
 
 // code for isr
 BCF   t0if
 INCF  counter,F
 BTFSC zero_flag
 INCF  (&counter+1),F
 
 // restore processor and return from interrupt
 SWAPF save_status,W
 MOVWF status
 SWAPF save_w,F
 SWAPF save_w,W
 #endasm
 }
 
 #int_ad fast
 void int_ad_isr(void)
 {
 char c;
 c = 0x55;
 }
 
 I get an error
 
 Error 92 "C:\Data\Project\LLD-098\Pic\LLD-098.c" Line 115(0,1): Duplicate Interrupt function
 
 
 
 
 How do I setup this interupt interupr handling.
 
 
 
 Gerrit
 |  |  
		|  |  
		| Gerrit 
 
 
 Joined: 15 Sep 2003
 Posts: 58
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Tue Dec 23, 2003 7:10 pm |   |  
				| 
 |  
				| Hello, 
 Can some one point me out how to setup the software
 so that I can use a self controled lowlevel interrupt and
 use a high priority level interupt via CCS software.
 
 I'm using verion 3.180 of ccs PCHW
 
 
 Kind regards,
 
 Gerrit
 |  |  
		|  |  
		|  |  
  
	| 
 
 | 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
 
 |