|
|
View previous topic :: View next topic |
Author |
Message |
Richard Guest
|
PIC18F6520 "Fast" Fast interrupt |
Posted: Wed Oct 20, 2004 7:19 am |
|
|
Folk,
I have been writing code using CCS 3.207 and was wondering if there was a way to reduce the interrupt latency of the external interrupt.
My interrupt routine is a trivial response to an external trigger, (clear a variable, clear timer1).
The code is short enough to actually fit in the memory at 0x0008-0x0018 although the compiler insists on locating it elsewhere and jumping there.
Is there any way I can encourage the compiler to squeze my ISR into this gap?
Org 0x0008, 0x0018 is apparently not a valid range.
On a related note, is there any method of optimizing out the majority of the completely unnecessary context saving that the compiler uses on a normal interrupt? (Other than a global interrupt handler)
Thanks for any assistance,
Richard, UK |
|
|
Guest
|
|
Posted: Wed Oct 20, 2004 7:47 am |
|
|
Quote: | Is there any way I can encourage the compiler to squeze my ISR into this gap?
Org 0x0008, 0x0018 is apparently not a valid range. |
Yes. You can fool the compiler into thinking the vectors will be elsewhere and then you have control of the original vectors
Code: | #build(interrupt=0x028)
#org 0x0020, 0x002f {}
/* Map the high priority interrupt vector */
#org 0x0008, 0x000f
void my_hp_intr (void)
{
#asm ASIS
// ... do your stuff here
retfie 1 //; fast return from interrupt
#endasm
}
/* Map the low priority interrupt vector */
#org 0x0018, 0x001f
void my_lp_intr (void)
{
#asm
goto 0x0200
#endasm
}
#org 0x0200, 0x5fff // or wherever
void LPIntrHdlr(void) {
// etc etc etc |
|
|
|
Richard Guest
|
Faster interrupt |
Posted: Wed Oct 20, 2004 9:11 am |
|
|
Thanks for your suggestion I carried out the following:
Code: |
#org 0x0008, 0x0014
void Fake_ISR() {
// This is really the fast interrupt
// External interrupt
#asm
CLRF 0xFCF // clear Timer1H
CLRF 0xFCE // clear Timer1L
CLRF 0x39 // clear CounterH
CLRF 0x38 // clear CounterL
BCF 0xFF2.1 //clear interrupt flag
RETFIE 1
#endasm
}
#org default
|
This carried out the ISR as expected. I also need to map my Counter variable so that it doesn't move about if I change my variables ;-)
This produced the following list snipppet
Code: |
org 0x0008, 0x0014
....................
.................... void Fake_ISR() {
.................... // This is really the fast interrupt
.................... // External interrupt
....................
.................... #asm
.................... CLRF 0xFCF // clear CounterH
*
0008: CLRF FCF
.................... CLRF 0xFCE // clear CounterL
000A: CLRF FCE
.................... CLRF 0x39 // clear CounterH
000C: CLRF 39
.................... CLRF 0x38 // clear CounterL
000E: CLRF 38
.................... BCF 0xFF2.1 //clear interrupt flag
0010: BCF FF2.1
.................... RETFIE 1
0012: RETFIE 1
.................... #endasm
....................
.................... }
0014: RETLW 00
.................... #org default |
ie It did exactly what was wanted (except for the spare RETLW 00 from the closing brace of the void function, which never gets called).
My original mistake was to try and #ORG the CCS #int_ext ISR.
Thanks for your help!
Richard |
|
|
asmallri
Joined: 12 Aug 2004 Posts: 1634 Location: Perth, Australia
|
|
Posted: Wed Oct 20, 2004 10:49 am |
|
|
No problem.
Don't forget you can use your C labels in assembler
Code: |
byte CounterH; #locate Rx_HeadL = 0x40
byte CounterL; #locate Rx_HeadL = 0x41 |
then your code becomes..
Code: | #org 0x0008, 0x0014
void Fake_ISR() {
// This is really the fast interrupt
// External interrupt
#asm
CLRF 0xFCF // clear Timer1H
CLRF 0xFCE // clear Timer1L
CLRF CounterH // clear CounterH
CLRF CounterL // clear CounterL
BCF 0xFF2.1 //clear interrupt flag
RETFIE 1
#endasm
} |
Remember to keep you variables below 0x80 to save having to use the BSR
[/code] |
|
|
|
|
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
|