HI!
I am using MC9S08AW60A with DEMO9S08AW60E Board. I have studied about the timers given with the MCU. I wish to know how exactly to Implement timers by code as i have tried using PROCESSOR EXPERT but no effect. I have uploaded a pic of the PE settings that i had implemented. I have also uploaded the pdf of the chip and the Board.
The idea of the code is to sequentially blink the LED's without using a "Delay Function", rather by modifying the TIMER functionality.
the code is as follows( very basic, works if i use a delay function):
------------CODE BEGINS------------
PTFDD = 0xFF;
for (i=1;i<=8;i++)
{
if (i==8) i = 1;
if (i==1) PTFD = 0x01;
if (i==2) PTFD = 0x02;
if (i==3) PTFD = 0x04;
if (i==4) PTFD = 0x08;
if (i==5) PTFD = 0x10;
if (i==6) PTFD = 0x20;
if (i==7) PTFD = 0x40;
}
----------CODE ENDS-----------------
for the sake of clarity, in the PE1 pic, the black dots mean 1 and white dots mean 0. And yes, i am using virtual PC. before this the codes i tried to excecute, worked perfectly fine.
Concurrently, According to the architecture, the TPM are on PORTF pins, as are the LED's does this affect the outocme. I guess No, but i just want to confirm. Does it?
then, if i have initialized with PE, does it mean i should also mannually code the same??
Thanks in advance!
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
Thank you BigMac. i just wanted to let you know, i had also asked this question on Stackoverflow(electrical engineering), where i posted your answer to close the question. If that is in any way, a problem for you please do let me know.
You have been a great help.