Hello,
The timing associated with the blinking of LEDs is usually of a relatively lengthy duration, but does not require critical timing. The hardware output(s) from the TPM channel would generally not be directly used since this would require a large prescale setting, and may not even be feasible for high bus frequencies.
The usual method is to generate a periodic "tick" at a specific interval, with the flash period for each LED corresponding to an integral number of tick intervals. A TPM channel might be utilised to generate the tick period, making use of the "software" compare mode. A suitable tick period for this example might be 10 milliseconds. The tick timing would be handled using the TPM channel interrupt, but the LED flashing would probably use polling to test for the completion of each flash period.
The following code snippet demonstrates the process using a LED flash interval of 500 ms. I have not shown the initialisation required for the bus frequency, the TPM, and other modules. You could make use of the PE initialisation tool for this purpose. although my personal preference is to write my own initialisation code, including more meaningful documentation than provided by PE.
// Assumed bus frequency: 8.0 MHz
// TPM prescale divisor: 4
// Global variables:
byte tic_cnt; // Timer tick counter
byte ch_nbr; // LED channel number
// LED mask values:
#define mLED0 0x01
#define mLED1 0x02
#define mLED2 0x04
#define mLED3 0x08
#define mLED4 0x10
#define mLED5 0x20
#define mLED6 0x40
#define mLED7 0x80
#define TIC_INCR 20000 // 10 ms tick period, with prescale 4
//***************************************************************
// LED blink polling function
void LED_poll( void)
{
if (!tic_cnt) { // Timeout occurred
tic_cnt = 50; // Start new 500ms timing interval
ch_nbr++;
if (ch_nbr == 8) ch_nbr = 0;
if (ch_nbr == 0) PTFD = mLED0; // Turn LED0 on, other LEDs off
if (ch_nbr == 1) PTFD = mLED1; // Turn LED1 on, other LEDs off
if (ch_nbr == 2) PTFD = mLED2; // Turn LED2 on, other LEDs off
if (ch_nbr == 3) PTFD = mLED3; // Turn LED3 on, other LEDs off
if (ch_nbr == 4) PTFD = mLED4; // Turn LED4 on, other LEDs off
if (ch_nbr == 5) PTFD = mLED5; // Turn LED5 on, other LEDs off
if (ch_nbr == 6) PTFD = mLED6; // Turn LED6 on, other LEDs off
if (ch_nbr == 7) PTFD = mLED7; // Turn LED7 on, other LEDs off
}
}
//***************************************************************
__interrupt VectorNumber_Vtpm1ch0 void ISR_TPM1_ch0( void)
{
TPM1C0_CH0F = 0; // Clear TPM channel flag
TPM1C0V += TIC_INCR; // Set next software compare
if (tic_cnt) tic_cnt--;
}
Regards,
Mac