|
|
View previous topic :: View next topic |
Author |
Message |
ElectronPIC
Joined: 26 Dec 2016 Posts: 9
|
Error compilation when trying write an interrupt handler |
Posted: Sun Dec 03, 2017 9:20 am |
|
|
Hi everyone!
I want to write my own interrupt dispatcher. To start I've just copied the dispatcher generated automatically by CCS:
Code: |
#INT_GLOBAL
void InterruptDispatcher(void)
{
#ASM
MOVWF 04
MOVFF STATUS,05
MOVFF BSR,06
MOVLB 0
MOVFF FSR0L,0C
MOVFF FSR0H,07
MOVFF FSR1L,08
MOVFF FSR1H,09
MOVFF FSR2L,0A
MOVFF FSR2H,0B
MOVFF PRODL,12
MOVFF PRODH,13
MOVFF PCLATH,14
MOVFF TABLAT,15
MOVFF TBLPTRL,16
MOVFF TBLPTRH,17
MOVFF 00,0E
MOVFF 01,0F
MOVFF 02,10
MOVFF 03,11
BTFSS PIE1.RCIE
GOTO 0060
BTFSC PIR1.RCIF
GOTO 0394
BTFSS PIE1.TXIE
GOTO 006C
BTFSC PIR1.TXIF
GOTO 0412
BTFSS PIE1.CCP1IE
GOTO 0078
BTFSC PIR1.CCP1IF
GOTO 0476
MOVFF 0E,00
MOVFF 0F,01
MOVFF 10,02
MOVFF 11,03
MOVFF 0C,FSR0L
MOVFF 07,FSR0H
BSF 07.7
MOVFF 08,FSR1L
MOVFF 09,FSR1H
MOVFF 0A,FSR2L
MOVFF 0B,FSR2H
MOVFF 12,PRODL
MOVFF 13,PRODH
MOVFF 14,PCLATH
MOVFF 15,TABLAT
MOVFF 16,TBLPTRL
MOVFF 17,TBLPTRH
MOVF 04,W
MOVFF 06,BSR
MOVFF 05,STATUS
RETFIE 0
#ENDASM
}
|
But I get this error when compiling: "Invalid interrupt directive Can not mix GLOBAL with non-global"
I'm using: PIC18F2550, CCS 5.061.
Is it right what I'm trying to do? Am I missing something? |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Sun Dec 03, 2017 9:43 am |
|
|
It means you can't have #int_global and #int_rda (for example) at the
same time. If you use #int_global, ALL interrupt handling must be done
by you in the #int_global routine.
Do a forum search for #int_global to find examples of how to do this.
Also look at the CCS example file ex_glint.c in your compiler examples
folder on your PC. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19499
|
|
Posted: Sun Dec 03, 2017 10:23 am |
|
|
and (important to understand), the only reason to do this, is if you have a handler that must be handled really quickly. In this case you only save the registers that are used in this handler, and get in an out of this ASAP.
If you call multiple handlers, your global has to save every register used in all the handlers, which then means you end up duplicating the CCS handler and gain nothing.....
Your handler is potentially handling INT_RDA, INT_TBE, and INT_CCP.
If you want one of these handled quickly, leave CCS to handle the rest, and declare just the interrupt you want dealt with quickly as a high priority interrupt. If you declare is as 'FAST', then it'll be called like the INT_GLOBAL, but as a high priority interrupt (you need to have HIGH_INTS=TRUE as well). You will be responsible only for saving the registers it uses, and things will be as fast as possible. |
|
|
ElectronPIC
Joined: 26 Dec 2016 Posts: 9
|
|
Posted: Sun Dec 03, 2017 2:56 pm |
|
|
PCM programmer wrote: | It means you can't have #int_global and #int_rda (for example) at the
same time. If you use #int_global, ALL interrupt handling must be done
by you in the #int_global routine.
Do a forum search for #int_global to find examples of how to do this.
Also look at the CCS example file ex_glint.c in your compiler examples
folder on your PC. |
PCM programmer, thanks for your reply.
That means that I should delete #int_rda and make sure that that isr is in the direction invoked by GOTO instruction, in the interrupt handler? |
|
|
ElectronPIC
Joined: 26 Dec 2016 Posts: 9
|
|
Posted: Sun Dec 03, 2017 3:03 pm |
|
|
Ttelmah wrote: | and (important to understand), the only reason to do this, is if you have a handler that must be handled really quickly. In this case you only save the registers that are used in this handler, and get in an out of this ASAP.
If you call multiple handlers, your global has to save every register used in all the handlers, which then means you end up duplicating the CCS handler and gain nothing.....
Your handler is potentially handling INT_RDA, INT_TBE, and INT_CCP.
If you want one of these handled quickly, leave CCS to handle the rest, and declare just the interrupt you want dealt with quickly as a high priority interrupt. If you declare is as 'FAST', then it'll be called like the INT_GLOBAL, but as a high priority interrupt (you need to have HIGH_INTS=TRUE as well). You will be responsible only for saving the registers it uses, and things will be as fast as possible. |
Ttelmah, thanks for your reply.
What I wanted was to make sure that all registers modified by all isrs are being saved.
Is the compiler generated interrupt handler already doing this? |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19499
|
|
Posted: Sun Dec 03, 2017 3:17 pm |
|
|
Yes.
In fact the one complaint about it, is that if you do something very minor in your interrupts (so no array accesses, but just increment a simple counter for example), it still saves everything, including the index registers. |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Sun Dec 03, 2017 8:44 pm |
|
|
ElectronPIC wrote: |
That means that I should delete #int_rda |
Yes, delete your existing #int_rda function.
ElectronPIC wrote: |
and make sure that that isr is in the direction invoked by GOTO instruction,
in the interrupt handler?
|
Ttelmah has posted sample code of how to do this in the following thread:
http://www.ccsinfo.com/forum/viewtopic.php?t=44031 |
|
|
|
|
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
|