chapter 8 hcs12 timer functions

Download Chapter 8 HCS12 Timer Functions

Post on 01-Feb-2016

52 views

Category:

Documents

0 download

Embed Size (px)

DESCRIPTION

Chapter 8 HCS12 Timer Functions. Why are Timer Functions Important?. It is very difficult and impossible to implement the following applications without a timer function: Time delay creation and measurement Period and pulse width measurement Frequency measurement Event counting - PowerPoint PPT Presentation

TRANSCRIPT

  • Chapter 8

    HCS12 Timer Functions

  • Why are Timer Functions Important?It is very difficult and impossible to implement the following applications without a timer function:Time delay creation and measurementPeriod and pulse width measurementFrequency measurementEvent countingArrival time comparisonTime-of-day trackingPeriodic interrupt generationWaveform generation

  • The HCS12 Timer System (1 of 2)The HCS12 has a standard timer module (TIM) that consists of: Eight channels of multiplexed input capture and output compare functions.16-bit pulse accumulator A16-bit timer counterThe TIM block diagram is shown in Figure 8.1.The HCS12 devices in the automotive family have implemented an Enhanced Capture Timer module (ECT). The ECT module contains:All the features contained in the TIM moduleOne 16-bit buffer register for each of the input capture channelsFour 8-bit pulse accumulatorA 16-bit Modulus Down Counter with 4-bit prescalerFour user selectable delay counters for increasing input noise immunityThe TIM (of course ECT also) shares the eight Port T pins (IOC0IOC7).

  • The HCS12 Timer System (2 of 2)

  • Timer Counter Register (TCNT)Required for input capture and output compare functionsMust be accessed in one 16-bit operation in order to obtain the correct valueThree other registers related to the operation of the TCNT: TSCR1, TSCR2, TFLG2.

  • Timer System Control Register 1 (TSCR1)The contents of TSCR1 are shown in Figure 8.2.Setting and clearing the bit 7 of TSCR1 will start and stop the counting of the TCNT.Setting the bit 4 will enable fast timer flag clear function. If this bit is clear, then the user must write a one to a timer flag in order to clear it.

  • Timer System Control Register 2 (TSCR2) Bit 7 is the TCNT overflow interrupt enable bit.TCNT can be reset to 0 when TCNT equals TC7 by setting bit 3 of TSCR2.The clock input to TCNT can be prescaled by a factor selecting by bits 2 to 0 of TSCR2.The contents of TSCR2 are shown in Figure 8.2.

  • Timer Interrupt Flag 2 Register (TFLG2)Only bit 7 (TOF) is implemented. Bit 7 will be set whenever TCNT overflows.

  • Input Capture Functions (1 of 2)Physical time is often represented by the contents of the main timer.The occurrence of an event is represented by a signal edge (rising or falling edge).The time when an event occurs can be recorded by latching the count of the main timer when a signal edge arrives as illustrated in Figure 8.4.The HCS12 has eight input capture channels. Each channel has a 16-bit capture register, an input pin, edge-detection logic, and interrupt generation logic.Input capture channels share most of the circuit with output compare functions. For this reason, they cannot be enabled simultaneously.

  • Input Capture Functions (2 of 2)The selection of input capture and output compare is done by programming the TIOS register. The contents of the TIOS register are shown in Figure 8.5. Setting a bit select the output compare function. Otherwise, the input capture function is selected.

    The following instruction will enable the output compare channels 7...4 and input capture channel 30:

    movb#$F0,TIOS

  • Timer Port Pins Each port pin can be used as a general I/O pin when timer function is not selected.Pin 7 can be used as input capture 7, output compare 7 action, and pulse accumulator input.When a timer port pin is used as a general I/O pin, its direction is configured by the DDRT register.

  • Timer Control Register 3 and 4The signal edge to be captured is selected by TCTL3 and TCTL4.The edge to be captured is selected by two bits. The user can choose to capture the rising edge, falling edge, or both edges.

  • Timer Interrupt Enable Register (TIE)The arrival of a signal edge may optionally generate an interrupt to the CPU. The enabling of the interrupt is controlled by the Timer Interrupt Enable Register.

  • Timer Interrupt Flag 1 Register (TFLG1)Whenever a signal edge arrives, the associated timer interrupt flag will be set to 1.

  • How to Clear a Timer Flag BitIn normal mode, write a 1 to the flag bit to be cleared.Method 1Use the BCLR instruction with a 0 at the bit position (s) corresponding to the flag (s) to be cleared. For example,

    BCLR TFLG1, $FE

    will clear the C0F flag. Method 2Use the movb instruction with a 1 at the bit position (s) corresponding to the flag (s) to be cleared. For example,

    movb#$01,TFLG1will clear the C0F flag.When fast timer flag clear function is enabled, see Figure 8.1.

  • Applications of Input Capture FunctionEvent arrival time recordingPeriod measurement: need to capture the main timer values corresponding to two consecutive rising or falling edges-Pulse width measurement: need to capture the rising and falling edges

  • Input CaptureInterrupt generation: Each input capture function can be used as an edge-sensitive interrupt source.Event counting: count the number of signal edges arrived during a period-Time reference: often used in conjunction with an output compare function

  • Duty Cycle Measurement

  • Phase Difference Measurement

  • Period Measurement (1 of 2)Example 8.2 Use the IC0 to measure the period of an unknown signal. The period is known to be shorter than 128 ms. Assume that the E clock frequency is 24 MHz. Use the number of clock cycles as the unit of the period. Solution: Since the input-capture register is 16-bit, the longest period of the signal that can be measured with the prescaler to TCNT set to 1 is: 216 24 MHz = 2.73 ms.To measure a period that is equal to 128 ms, we have two options: Set the prescale factor to 1 and keep track of the number of times the timer counter overflows.Set the prescale factor to 64 and do not keep track of the number of times the timer counter overflows. We will set the prescale factor to TCNT to 64. The logic flow for measuring the signal period is shown in Figure 8.16.

  • Period Measurement (2 of 2)

  • Assembly Program for Period Measurement#include "c:\miniide\hcs12.inc"org$1000edge1ds.b2; memory to hold the first edgeperiodds.b2; memory to store the periodorg$1500movb#$90,TSCR1; enable timer counter and enable fast timer flags clearbclrTIOS,IOS0; enable input-capture 0movb#$06,TSCR2; disable TCNT overflow interrupt, set prescaler to 64movb#$01,TCTL4; capture the rising edge of PT0 signalmovb#C0F,TFLG1; clear the C0F flagbrclrTFLG1,C0F,*; wait for the arrival of the first rising edgelddTC0; save the first edge and clear the C0F flagstdedge1brclrTFLG1,C0F,*; wait for the arrival of the second edgelddTC0subdedge1; compute the periodstdperiodswiend

  • C Program for Period Measurement#include "c:\egnu091\include\hcs12.h"void main(void){ unsigned int edge1, period; TSCR1 = 0x90; /* enable timer counter, enable fast flag clear*/ TIOS &= ~IOS0; /* enable input-capture 0 / TSCR2 = 0x06; /* disable TCNT overflow interrupt, set prescaler to 64 */ TCTL4 = 0x01; /* capture the rising edge of the PT0 pin */ TFLG1 = C0F;/* clear the C0F flag */ while (!(TFLG1 & C0F));/* wait for the arrival of the first rising edge */ edge1 = TC0; /* save the first captured edge and clear C0F flag */ while (!(TFLG1 & C0F));/* wait for the arrival of the second rising edge */ period = TC0 - edge1; asm ("swi");}

  • Example 8.3 Write a program to measure the pulse width of a signal connected to the PT0 pin. The E clock frequency is 24 MHz. Solution:Set the prescale factor to TCNT to 32. Use clock cycle as the unit of measurement.The pulse width may be longer than 216 clock cycles. We need to keep track of the number of times that the TCNT timer overflows. Letovcnt= TCNT counter overflow countdiff= the difference of two consecutive edgesedge1= the captured time of the first edgeedge2 = the captured time of the second edgeThe pulse width can be calculated by the following equations:Case 1edge2 edge1pulse width = ovcnt 216 + diffCase 2edge2 < edge 1pulse width = (ovcnt 1) 216 + diff

  • #include "c:\miniide\hcs12.inc"org $1000edge1ds.b2overflowds.b2pulse_width ds.b2org$1500movw#tov_isr,UserTimerOvf ; set up TCNT overflow interrupt vectorlds#$1500; set up stack pointermovw#0,overflowmovb#$90,TSCR1; enable TCNT and fast timer flag clearmovb#$05,TSCR2; disable TCNT interrupt, set prescaler to 32bclrTIOS,IOS0; select IC0movb#$01,TCTL4; capture rising edgemovb#C0F,TFLG1; clear C0F flagwait1brclrTFLG1,C0F,wait1; wait for the first rising edgemovwTC0,edge1; save the first edge & clear the C0F flagmovb#TOF,TFLG2; clear TOF flagbsetTSCR2,$80; enable TCNT overflow interruptcli ; "movb#$02,TCTL4; capture the falling edge on PT0 pinwait2brclrTFLG1,C0F,wait2; wait for the arrival of the falling edgelddTC0subdedge1

  • stdpulse_widthbccnext; is the second edge smaller?ldxoverflow ; second edge is smaller, so decrementdex ; overflow count by 1stxoverflow ; "nextswi

    tov_isrmovb#TOF,TFLG2; clear TOF flagldxoverflowinxstxoverflowrtiend

  • C Program for Pulse Width Measurement#include #include #define INTERRUPT __attribute__((interrupt)) unsigned diff, edge1, overflow;unsigned long pulse_width;void INTERRUPT tovisr(void);void main(void){ UserTimerOvf = (unsigned short)&tovisr;overflow = 0;TSCR1 = 0x90;/* enable timer and fast flag clear */TSCR2 = 0x05;/* set prescaler to 32, no timer overflow interrupt */TIOS &= ~IOS0;/* select input-capture 0 */TCTL4 = 0x01;/* prepare to capture the rising edge */TFLG1 = C0F;/* clear C0F flag */while(!(TFLG1 & C0F));/* wait for the arrival of the rising edge */TFLG2 = TOF;/* clear TOF flag */

  • TSCR2 |= 0x80; /* enable TCNT overflow interrupt */asm("cli");edge1 = TC0;/* save the first

Recommended

View more >