
154
CHAPTER 6
16-BIT TIMER/EVENT COUNTER 0
User’s Manual U12790EJ2V0UD
6.5.4 Pulse width measurement by restart
/**************************************************************************/
/*
*/
/*
Timer 0 operation sample
*/
/*
Pulse width measurement example by restart
*/
/*
Measurement results up to 16 bits, not to be checked for errors
*/
/*
data[0]: End flag
*/
/*
data[1]: Measurement results (pulse width)
*/
/*
data[2]: Previous read value
*/
/*
*/
/**************************************************************************/
#pragma sfr
#pragma EI
#pragma DI
#pragma interrupt INTTM01 intervalint rb2
unsigned int data[3];
/* Data area */
void main(void)
{
unsigned int length;
PCC = 0x0;
/* Set high-speed operation mode */
data[0] = 0;
data[1] = 0;
data[2] = 0;
/* Set port */
PM3.2 = 1;
/* Set P32 as input */
/* Set interrupt */
TMMK01 = 0;
/* Cancel INTTM01 interrupt mask */
/* Set timer 0 */
PRM0 = 0b00110010;
/* Both rising and falling edges
*/
/* Count clock is fx/2^6
*/
CRC0 = 0b00000100;
/* Set CR01 to capture register
*/
TMC0 = 0b00001000;
/* Clear & start at TI00 valid edge */
EI();
while(1){
/* Dummy loop */
if(data[0] != 0)
/* Wait for TI00 measurement completion */
{
TMMK01 = 1;
/* Prohibit INTTM01 for exclusive
operation */
length = data[1]+data[2];
/* Cycle calculation based on
measurement results */
data[0] = 0;
/* Clear end flag */
TMMK01 = 0;
/* Exclusive operation completed */
}
/* Timer 0 interrupt function */
void intervalint()
{
/******************************************************/
/*
*/
/* Define variables required for interrupt here
*/
/*
*/
/******************************************************/
data[2] = data[1];
/* Update old data */
data[1] = CR01;
/* Update read value */
data[0] = 0xffff;
/* Set measurement completion flag*/
/********************************************************/
/*
*/
/* Define variables required for interrupt below
*/
/*
*/
/********************************************************/
}