View previous topic :: View next topic |
Author |
Message |
alan
Joined: 12 Nov 2012 Posts: 357 Location: South Africa
|
18f45K40 Timer2 interrupt not firing [SOLVED] |
Posted: Fri Jul 28, 2017 9:01 am |
|
|
Hi All,
PIC18F45K40
CCS 5.073
I have the following problem, TIMER 2 interrupt service routine not working, if I test the TIMER2 interrupt flag it is set and the program are working.
TIMER 0 works by polling and calling.
If I want to jump to the interrupt service routine it does not work.
Any idea why.
Code: | #include <18F45K40.h>
#FUSES NOEXTOSC //External Oscillator not enabled
#FUSES NOCKS //Clock Switching Disabled
#FUSES NOFCMEN //Fail-safe clock monitor disabled
#FUSES NOMCLR //Master Clear pin used for I/O
#use delay(internal=16MHz)
int1 Tick;
#INT_TIMER2
void TIMER2_isr(void) {
Tick = TRUE;
}
void main() {
unsigned int8 Counter=0;
setup_timer_2(T2_DIV_BY_64|T2_CLK_INTERNAL,124,1); //125 us overflow, 125 us interrupt, 16MHz
// enable_interrupts(INT_TIMER2);
enable_interrupts(GLOBAL);
while(TRUE){
if (Tick) {
// if (interrupt_active(INT_TIMER2)) {
// clear_interrupt(INT_TIMER2);
if (Counter++ > 20) {
output_toggle(PIN_A1);
Counter = 0;
}
}
}
} |
Regards
Last edited by alan on Sat Jul 29, 2017 7:42 am; edited 1 time in total |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9243 Location: Greensville,Ontario
|
|
Posted: Fri Jul 28, 2017 9:09 am |
|
|
this..
// enable_interrupts(INT_TIMER2);
would explain it.
You need to uncomment it !!
Jay |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Fri Jul 28, 2017 9:19 am |
|
|
I wish you would show us the actual program that shows the problem,
without the debug code that you have added. Get rid of the test code
and just post the first program you tried that doesn't work. |
|
|
alan
Joined: 12 Nov 2012 Posts: 357 Location: South Africa
|
|
Posted: Fri Jul 28, 2017 10:03 am |
|
|
Sorry about the confusion.
This code works.
Code: | #include <18F45K40.h>
#FUSES NOEXTOSC //External Oscillator not enabled
#FUSES NOCKS //Clock Switching Disabled
#FUSES NOFCMEN //Fail-safe clock monitor disabled
#FUSES NOMCLR //Master Clear pin used for I/O
#use delay(internal=16MHz)
void main() {
setup_timer_2(T2_DIV_BY_64|T2_CLK_INTERNAL,124,1); //125 us overflow, 125 us interrupt, 16MHz
while(TRUE){
if (interrupt_active(INT_TIMER2)) {
clear_interrupt(INT_TIMER2);
output_toggle(PIN_A1);
}
}
} |
This does not work :
Code: | #include <18F45K40.h>
#FUSES NOEXTOSC //External Oscillator not enabled
#FUSES NOCKS //Clock Switching Disabled
#FUSES NOFCMEN //Fail-safe clock monitor disabled
#FUSES NOMCLR //Master Clear pin used for I/O
#use delay(internal=16MHz)
int1 Tick;
#INT_TIMER2
void TIMER2_isr(void) {
Tick = TRUE;
}
void main() {
setup_timer_2(T2_DIV_BY_64|T2_CLK_INTERNAL,124,1); //125 us overflow, 125 us interrupt, 16MHz
enable_interrupts(INT_TIMER2);
enable_interrupts(GLOBAL);
while(TRUE){
if (Tick) {
output_toggle(PIN_A1);
Tick = FALSE;
}
}
} |
|
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19539
|
|
Posted: Fri Jul 28, 2017 11:35 am |
|
|
Given your earlier problem on Timer1. What happens if you set it to ASYNC?.
It does look as if that chip has some significant undocumented oddities.... |
|
|
alan
Joined: 12 Nov 2012 Posts: 357 Location: South Africa
|
|
Posted: Fri Jul 28, 2017 12:23 pm |
|
|
There are no ASYNC bit for this timer, already checked.
Also TIMER 0 didn't fire at all, not even polling the interrupt worked without setting ASYNC.
Closest I get to a similar bit for TIMER2 are:
bit 7 PSYNC: Timerx Prescaler Synchronization Enable bit(1, 2)
1 = TMRx Prescaler Output is synchronized to Fosc/4
0 = TMRx Prescaler Output is not synchronized to Fosc/4
and that is set to 0.
Regards |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19539
|
|
Posted: Fri Jul 28, 2017 1:01 pm |
|
|
That is the synchronisation bit. What happens if you try with it synchronised instead?. |
|
|
alan
Joined: 12 Nov 2012 Posts: 357 Location: South Africa
|
|
Posted: Fri Jul 28, 2017 1:37 pm |
|
|
No change, still does not work when enabling the interrupt.
Regards |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19539
|
|
Posted: Fri Jul 28, 2017 1:40 pm |
|
|
OK.
Very odd, since if the interrupt flag is being set, the interrupt should be called.
If you have a debugger, I'd dump the interrupt enable registers. I'd be suspecting that the enable for the interrupt is not being correctly set by the compiler, or the wrong bit is being checked in the handler.
Will try to have a look at what the compiler generates later. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19539
|
|
Posted: Fri Jul 28, 2017 2:17 pm |
|
|
Even odder.
The compiler seems to be setting and accessing the correct bits. |
|
|
alan
Joined: 12 Nov 2012 Posts: 357 Location: South Africa
|
|
Posted: Sat Jul 29, 2017 7:43 am |
|
|
Sorry for all who tried to help and it were me being an idiot, must have been late and I were using the wrong HEX file.
I confirm that INT_TIMER2 does indeed work. No wonder I couldn't find any mention of a problem there. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19539
|
|
Posted: Sat Jul 29, 2017 8:24 am |
|
|
Scream gently...
We have all been there sometime. I have just been having an oddity, where a particular machine insists on changing it's network mapping sometimes. Found I had saved loads of work to a different drive from the one I thought it was on. No wonder it was not giving the results I expected....
Whimper. |
|
|
|