⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 freescale

📁 Freescale 系列单片机常用模块与综合系统设计
💻
字号:
/** ###################################################################
**     THIS COMPONENT MODULE IS GENERATED BY THE TOOL. DO NOT MODIFY IT.
**     Filename  : Timer_Variable.C
**     Project   : Smoke_Detector
**     Processor : MC9S08JM60CLHE
**     Component : PPG
**     Version   : Component 02.180, Driver 01.24, CPU db: 3.00.046
**     Compiler  : CodeWarrior HCS08 C Compiler
**     Date/Time : 2010-1-25, 17:10
**     Abstract  :
**         This bean "PPG" implements a programmable
**         pulse generator that generates signal with variable
**         duty and variable cycle (period).
**     Settings  :
**         Used output pin             : 
**             ----------------------------------------------------
**                Number (on package)  |    Name
**             ----------------------------------------------------
**                       15            |  PTE2_TPM1CH0
**             ----------------------------------------------------
**
**         Timer name                  : TPM1_PPG [16-bit]
**         Counter                     : TPM1CNT   [$0021]
**         Mode register               : TPM1SC    [$0020]
**         Run register                : TPM1SC    [$0020]
**         Prescaler                   : TPM1SC    [$0020]
**         Compare 1 register          : TPM1MOD   [$0023]
**         Compare 2 register          : TPM1C0V   [$0026]
**         Flip-flop 1 register        : TPM1SC    [$0020]
**         Flip-flop 2 register        : TPM1C0SC  [$0025]
**
**         Interrupt 1 name            : Vtpm1ch0
**         Interrupt enable reg.       : TPM1C0SC  [$0025]
**         Priority                    : 
**         Interrupt 2 name            : Vtpm1ovf
**         Interrupt enable reg.       : TPM1SC    [$0020]
**         Priority                    : 
**         User handling procedure     : Timer_Variable_OnEnd
**         This event is called when the 1 of cycles is generated
**
**         Output pin
**
**         Port name                   : PTE
**         Bit number (in port)        : 2
**         Bit mask of the port        : $0004
**         Port data register          : PTED      [$0008]
**         Port control register       : PTEDD     [$0009]
**
**         Runtime setting period      : none
**         Runtime setting ratio       : calculated
**         Initialization:
**              Output level           : low
**              Timer                  : Enabled
**              Event                  : Enabled
**         High speed mode
**             Prescaler               : divide-by-8
**             Clock                   : 5859 Hz
**           Initial value of            period        pulse width (ratio 100%)
**             Xtal ticks              : 96000000      96000000
**             microseconds            : 8000000       8000000
**             milliseconds            : 8000          8000
**             seconds                 : 8             8
**             seconds (real)          : 8.0           8.0
**
**     Contents  :
**         SetRatio16 - byte Timer_Variable_SetRatio16(word Ratio);
**         SetDutyUS  - byte Timer_Variable_SetDutyUS(word Time);
**         SetDutyMS  - byte Timer_Variable_SetDutyMS(word Time);
**
**     Copyright : 1997 - 2009 Freescale Semiconductor, Inc. All Rights Reserved.
**     
**     http      : www.freescale.com
**     mail      : support@freescale.com
** ###################################################################*/


/* MODULE Timer_Variable. */

#include "Events.h"
#include "PE_Error.h"
#include "Timer_Variable.h"

#pragma MESSAGE DISABLE C5703          /* WARNING C5703: Parameter _ declared in function _ but not referenced */
#pragma MESSAGE DISABLE C2705          /* WARNING C2705: Possible loss of data */
#pragma MESSAGE DISABLE C5919          /* WARNING C5919: Conversion of floating to unsigned integral */
#pragma MESSAGE DISABLE C4002          /* Disable warning C4002 "Result not used" */


static word RatioStore;                /* Ratio of L-level to H-level */

/* Internal method prototypes */

/*
** ===================================================================
**     Method      :  SetPV (component PPG)
**
**     Description :
**         The method sets prescaler of the device.
**         This method is internal. It is used by Processor Expert only.
** ===================================================================
*/
static void SetPV(byte Val);
/*
** ===================================================================
**     Method      :  SetRatio (component PPG)
**
**     Description :
**         The method stores duty value to compare register(s) and sets 
**         necessary bits or (in List mode) call SetRegCMT method for 
**         duty value storing.
**         This method is internal. It is used by Processor Expert only.
** ===================================================================
*/
static void SetRatio(void);

/* End of Internal methods declarations */

/*
** ===================================================================
**     Method      :  SetPV (component PPG)
**
**     Description :
**         The method sets prescaler of the device.
**         This method is internal. It is used by Processor Expert only.
** ===================================================================
*/
static void SetPV(byte Val)
{
  TPM1SC = (byte)0x00;                 /* Stop counter */
  TPM1CNTH = 0x00;                     /* Reset HW Counter */
  TPM1SC |= Val;                       /* Store given value to the prescaler and run counter */
}

#define ratio_get_hi(A) ((*(TRatioValue *)(&A)).BB.Hi)
#define ratio_get_lo(A) ((*(TRatioValue *)(&A)).BB.Frac)
    
typedef union {
  uint16_t Value;
  struct {
    uint8_t Hi;
    uint8_t Frac;
  } BB;
} TRatioValue;
    
/*
** ===================================================================
**     Method      :  SetRatio (component PPG)
**
**     Description :
**         The method stores duty value to compare register(s) and sets 
**         necessary bits or (in List mode) call SetRegCMT method for 
**         duty value storing.
**         This method is internal. It is used by Processor Expert only.
** ===================================================================
*/
static void SetRatio(void)
{
  if (RatioStore == 0xFFFF) {          /* Duty = 100%? */
    TPM1C0V = 0xFFFF;                  /* Store new value to the compare reg. */
  } else {
    TRatioValue Tmp1, Tmp2;
    uint16_t Result;
    uint16_t Period = (uint16_t)(TPM1MOD + 0x01);
  Result = (uint16_t)(ratio_get_hi(RatioStore) * ratio_get_hi(Period)); /* HI * HI */
  Tmp1.Value = (uint16_t)(ratio_get_hi(RatioStore) * ratio_get_lo(Period)); /* HI * LO */
  Result += Tmp1.BB.Hi;
  Tmp2.Value = (uint16_t)(ratio_get_lo(RatioStore) * ratio_get_hi(Period)); /* LO * HI */
  Result += Tmp2.BB.Hi;
  if ((Tmp2.BB.Frac += Tmp1.BB.Frac) < Tmp1.BB.Frac) {
    ++Result; /* carry to result */
  }
  Tmp1.Value = (uint16_t)(ratio_get_lo(RatioStore) * ratio_get_lo(Period)); /* LO * LO */
  if ((Tmp1.BB.Hi += Tmp2.BB.Frac) < Tmp2.BB.Frac) {
    ++Result; /* carry to result */
  }
  if (Tmp1.BB.Hi >= 0x80) {
    ++Result; /* round */
  }
  TPM1C0V = Result;
  }
}

/*
** ===================================================================
**     Method      :  Timer_Variable_SetRatio16 (component PPG)
**
**     Description :
**         This method sets a new duty-cycle ratio.
**     Parameters  :
**         NAME       - DESCRIPTION
**         Ratio      - Ratio is expressed as an 16-bit unsigned integer
**                      number. 0 - 0xFFFF value is proportional
**                      to ratio 0 - 100%
**         Note: Calculated duty depends on the timer possibilities
**               and on the selected period.
**     Returns     :
**         ---        - Error code, possible codes:
**                           ERR_OK - OK
**                           ERR_SPEED - This device does not work in
**                           the active speed mode
** ===================================================================
*/
byte Timer_Variable_SetRatio16(word Ratio)
{
  RatioStore = Ratio;                  /* Store new value of the ratio */
  SetRatio();                          /* Calculate and set up new appropriate values of the compare and modulo registers */
  return ERR_OK;                       /* OK */
}

/*
** ===================================================================
**     Method      :  Timer_Variable_SetDutyUS (component PPG)
**
**     Description :
**         This method sets the new duty value of the output signal. The
**         duty is expressed in microseconds as a 16-bit unsigned integer
**         number.
**     Parameters  :
**         NAME       - DESCRIPTION
**         Time       - Duty to set [in microseconds]
**                      (0 to 65535 us in high speed mode)
**     Returns     :
**         ---        - Error code, possible codes:
**                           ERR_OK - OK
**                           ERR_SPEED - This device does not work in
**                           the active speed mode
**                           ERR_MATH - Overflow during evaluation
**                           ERR_RANGE - Parameter out of range
** ===================================================================
*/
byte Timer_Variable_SetDutyUS(word Time)
{
  dlong rtval;                         /* Result of two 32-bit numbers multiplication */

  PE_Timer_LngMul((dword)Time, 0x0218DEF4LU, &rtval); /* Multiply given value and High speed CPU mode coefficient */
  if (PE_Timer_LngHi4(rtval[0], rtval[1], &RatioStore)) { /* Is the result greater or equal than 65536 ? */
    RatioStore = 0xFFFF;               /* If yes then use maximal possible value */
  }
  SetRatio();                          /* Calculate and set up new appropriate values of the compare and modulo registers */
  return ERR_OK;                       /* OK */
}

/*
** ===================================================================
**     Method      :  Timer_Variable_SetDutyMS (component PPG)
**
**     Description :
**         This method sets the new duty value of the output signal. The
**         duty is expressed in milliseconds as a 16-bit unsigned integer
**         number.
**     Parameters  :
**         NAME       - DESCRIPTION
**         Time       - Duty to set [in milliseconds]
**                      (0 to 8000 ms in high speed mode)
**     Returns     :
**         ---        - Error code, possible codes:
**                           ERR_OK - OK
**                           ERR_SPEED - This device does not work in
**                           the active speed mode
**                           ERR_MATH - Overflow during evaluation
**                           ERR_RANGE - Parameter out of range
** ===================================================================
*/
byte Timer_Variable_SetDutyMS(word Time)
{
  dlong rtval;                         /* Result of two 32-bit numbers multiplication */

  if (Time > 0x1F40) {                 /* Is the given value out of range? */
    return ERR_RANGE;                  /* If yes then error */
  }
  PE_Timer_LngMul((dword)Time, 0x083126E9LU, &rtval); /* Multiply given value and High speed CPU mode coefficient */
  if (PE_Timer_LngHi3(rtval[0], rtval[1], &RatioStore)) { /* Is the result greater or equal than 65536 ? */
    RatioStore = 0xFFFF;               /* If yes then use maximal possible value */
  }
  SetRatio();                          /* Calculate and set up new appropriate values of the compare and modulo registers */
  return ERR_OK;                       /* OK */
}

/*
** ===================================================================
**     Method      :  Timer_Variable_Init (component PPG)
**
**     Description :
**         Initializes the associated peripheral(s) and the beans 
**         internal variables. The method is called automatically as a 
**         part of the application initialization code.
**         This method is internal. It is used by Processor Expert only.
** ===================================================================
*/
void Timer_Variable_Init(void)
{
  /* TPM1SC: TOF=0,TOIE=1,CPWMS=0,CLKSB=0,CLKSA=0,PS2=0,PS1=0,PS0=0 */
  setReg8(TPM1SC, 0x40);               /* Disable device and enable interrupt */ 
  /* TPM1C0SC: CH0F=0,CH0IE=0,MS0B=1,MS0A=1,ELS0B=1,ELS0A=1,??=0,??=0 */
  setReg8(TPM1C0SC, 0x3C);             /* Set up PWM mode with output signal level low */ 
  RatioStore = 0xFFFF;                 /* Store initial value of the ratio */
  SetPV((byte)0x03);                   /* Set prescaler register according to the selected High speed CPU mode */
  /* TPM1C0V: BIT15=1,BIT14=0,BIT13=1,BIT12=1,BIT11=0,BIT10=1,BIT9=1,BIT8=1,BIT7=0,BIT6=0,BIT5=0,BIT4=1,BIT3=1,BIT2=0,BIT1=1,BIT0=1 */
  setReg16(TPM1C0V, 0xB71BU);           
  /* TPM1MOD: BIT15=1,BIT14=0,BIT13=1,BIT12=1,BIT11=0,BIT10=1,BIT9=1,BIT8=1,BIT7=0,BIT6=0,BIT5=0,BIT4=1,BIT3=1,BIT2=0,BIT1=1,BIT0=0 */
  setReg16(TPM1MOD, 0xB71AU);           
  /* TPM1SC: TOIE=1,CLKSB=1 */
  setReg8Bits(TPM1SC, 0x50);           /* Run the counter (set CLKSB:CLKSA) */ 
}


/*
** ===================================================================
**     Method      :  Timer_Variable_Interrupt (component PPG)
**
**     Description :
**         The method services the interrupt of the selected peripheral(s)
**         and eventually invokes the beans event(s).
**         This method is internal. It is used by Processor Expert only.
** ===================================================================
*/
ISR(Timer_Variable_Interrupt)
{
  (void)TPM1SC;
  TPM1SC_TOF = 0;                      /* Reset interrupt request flag */
  Timer_Variable_OnEnd();              /* Invoke user event */
}


/* END Timer_Variable. */

/*
** ###################################################################
**
**     This file was created by Processor Expert 3.07 [04.34]
**     for the Freescale HCS08 series of microcontrollers.
**
** ###################################################################
*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -