This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

C51 - Using Timer 5 on C8051F138X (ISR not firing)

Hi all,

I'm having a problem with something that should be simple: getting a Timer5 ISR to fire on a C8051F1380 MCU.

This being my first time using 8051 (I normally use PICs or Cypress PSoC5 controllers) I'm not sure what I'm doing wrong.

The Timer SFRs are set up as follows:

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#define SFR_TMR5CN 0xC8
SFR (TMR5CN, 0xC8); // Timer/Counter 5 Control
// TMR5CN 0xC8 (Page F)
SBIT (TF5H, SFR_TMR5CN, 7); // Timer5 high byte overflow flag
SBIT (TF5L, SFR_TMR5CN, 6); // Timer5 low byte overflow flag
SBIT (TF5LEN, SFR_TMR5CN, 5); // Timer5 low byte interrupt enable
SBIT (T5CE, SFR_TMR5CN, 4); // Timer5 capture enable
SBIT (T5SPLIT, SFR_TMR5CN, 3); // Timer5 split mode enable
SBIT (TR5, SFR_TMR5CN, 2); // Timer5 on/off control
SBIT (T5CSS, SFR_TMR5CN, 1); // Timer 5 Capture Source select
SBIT (T5XCLK, SFR_TMR5CN, 0); // Timer5 external clock select
#define INTERRUPT_TIMER5 20 // Timer5 Overflow
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

I'm setting up the timer as follows for a 48MHz SYSCLK (divided by 12) in a Timer_Init() function:

Fullscreen
1
2
3
4
5
6
7
8
9
10
//Timer5 - 10ms
//Clock = SYSCLK/12
//65536-40000 = 45536 -> 0xB1E0
T5XCLK = 0; //SYSCLK/12
TR5 = 0;
TMR5RLH = 0xB1;
TMR5RLL = 0xE0;
TMR5H = 0xB1;
TMR5L = 0xE0;
EIE2 |= 0x20; //Enable Timer5 Interrupt
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX


I am enabling the timer on a button press and can confirm the button press code is firing correctly:

Fullscreen
1
TR5 = 1;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

The ISR itself is meant to count 5 seconds to set a flag for for an OSD timeout before disabling the timer:

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void Timer5_ISR(void) interrupt INTERRUPT_TIMER5
{
static WORD osd_5s_counter = 0;
TF5H = 0; //Timer 5 OF Flag is NOT cleared by hardware
if (++osd_5s_counter >= OSD_5S_COUNT){
osd_5s_counter = 0;
TR5 = 0;
OSD_Display = 0;
TMR5RLH = 0xB1;
TMR5RLL = 0xE0;
TMR5H = 0xB1;
TMR5L = 0xE0;
} else {
TR5 = 1;
}
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Any thoughts/advice is greatly appreciated.  Not sure what I'm getting wrong here.

Thanks in advance!

0