Hello every one. i need some help regarding timer of 8 bit freescale microcontroller

取消
显示结果 
显示  仅  | 搜索替代 
您的意思是: 
已解决

Hello every one. i need some help regarding timer of 8 bit freescale microcontroller

跳至解决方案
973 次查看
gauravgarg
Contributor I

hello everyone,

i am using freescale MC9S08GT16A microcontroller. i am beginner of using this microcontroller. could any one explain me how to give 30 sec delay in this microcontroller. during device initilization i have given delay of 2 sec. but i am confusing about delay of 30 sec. i am using code warrior software. my values for during device initilization is ..

 

prescaler   128

clk            4 mhz

modulo value  31249...

 

TPM1SC = 0x00;                       /* Stop and reset counter */

  TPM1MOD = 0x7A11;                    /* Period value setting */

  (void)(TPM1SC == 0);                 /* Overflow int. flag clearing (first part) */

  /* TPM1SC: TOF=0,TOIE=1,CPWMS=0,CLKSB=0,CLKSA=1,PS2=1,PS1=1,PS0=1 */

  TPM1SC = 0x4F;                       /* Int. flag clearing (2nd part) and timer control register setting */

  /* ### Init_GPIO init code */

  /* PTCDD: PTCDD1=1,PTCDD0=1 */

  PTCDD |= (unsigned char)0x03;

 

__interrupt void TIMER_OVF(void)

{

  /* Write your interrupt code here ... */

  PTCD_PTCD0=~PTCD_PTCD0;

  PTCD_PTCD1=~PTCD_PTCD1;

  PTCD_PTCD2=~PTCD_PTCD2;

 

 

 

 

 

  for (temp=0;temp<15;temp++) {

   

  TPM1SC; /* Clear the TOF flag */

  TPM1SC_TOF = 0;

  }

 

Thank you....

标签 (1)
标记 (1)
0 项奖励
回复
1 解答
568 次查看
weapon
Senior Contributor I

Hi Grag,

You can try to count the TPM interrupt in the ISR, for example, the TPM overflow time is 3s, then you can define a global variables to count the overflow interrupt, when the counter reach 10, that means 30s is passed.

unsigned int tpm_overflow_count = 0;

unsigned char flag_30s = 0;

__interrupt void TIMER_OVF(void)

{

  /* Write your interrupt code here ... */

TPM1SC_TOF = 0;

  PTCD_PTCD0=~PTCD_PTCD0;

  PTCD_PTCD1=~PTCD_PTCD1;

  PTCD_PTCD2=~PTCD_PTCD2;

tpm_overflow_count++;

  if( tpm_overflow_count ==10)

  {

      tpm_overflow_count = 0;

      flag_30s = 1; // reach 30s

  }

}

Hope it is helpful.

B.R

XWP

在原帖中查看解决方案

0 项奖励
回复
4 回复数
568 次查看
bigmac
Specialist III

Hello,

I would further suggest that the TPM module remains free-running with TPM1MOD = 0 (or 65535), and that the prescale division be reduced from 128 to 1.  This will greatly improve the timing resolution, and also the delay uncertainty when the delay period commences.  The period resolution would become 16.384 ms instead of 2097.2 ms.  For a 30 second delay, the count value would be 1831, rather than 15.

Additionally, by decrementing the counter variable within the ISR, until zero is reached, an additional flag variable is unnecessary - simply test for zero counter value.

unsigned int counter;

__interrupt void TPM1_OVF(void)

{

   TPM1SC_TOF = 0;  // Clear TPM overflow flag

   if (counter)  counter--;

}

...

void wait_delay( unsigned int delay)  // Multiples of 16.384 ms

{

   counter = delay;

   while (counter);  // Wait for timeout

   PTCD_PTCD0 = ~PTCD_PTCD0;

   PTCD_PTCD1 = ~PTCD_PTCD1;

   PTCD_PTCD2 = ~PTCD_PTCD2;

}

Regards,

Mac

0 项奖励
回复
568 次查看
gauravgarg
Contributor I

Than you mac.... i got result....

0 项奖励
回复
569 次查看
weapon
Senior Contributor I

Hi Grag,

You can try to count the TPM interrupt in the ISR, for example, the TPM overflow time is 3s, then you can define a global variables to count the overflow interrupt, when the counter reach 10, that means 30s is passed.

unsigned int tpm_overflow_count = 0;

unsigned char flag_30s = 0;

__interrupt void TIMER_OVF(void)

{

  /* Write your interrupt code here ... */

TPM1SC_TOF = 0;

  PTCD_PTCD0=~PTCD_PTCD0;

  PTCD_PTCD1=~PTCD_PTCD1;

  PTCD_PTCD2=~PTCD_PTCD2;

tpm_overflow_count++;

  if( tpm_overflow_count ==10)

  {

      tpm_overflow_count = 0;

      flag_30s = 1; // reach 30s

  }

}

Hope it is helpful.

B.R

XWP

0 项奖励
回复
568 次查看
gauravgarg
Contributor I

Thank you  ,

problem had solved.

~Garg

0 项奖励
回复