Documents

34 views

Chapter 8 HCS12 Timer Functions

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
of 114
All materials on our website are shared by users. If you have any questions about copyright issues, please report us to resolve them. We are always happy to assist you.
Share
Transcript
Chapter 8HCS12 Timer FunctionsWhy 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
  • Arrival time comparison
  • Time-of-day tracking
  • Periodic interrupt generation
  • Waveform 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 A
  • 16-bit timer counter
  • The 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 module
  • One 16-bit buffer register for each of the input capture channels
  • Four 8-bit pulse accumulator
  • A 16-bit Modulus Down Counter with 4-bit prescaler
  • Four user selectable delay counters for increasing input noise immunity
  • The TIM (of course ECT also) shares the eight Port T pins (IOC0…IOC7).
  • The HCS12 Timer System (2 of 2)Timer Counter Register (TCNT)
  • Required for input capture and output compare functions
  • Must be accessed in one 16-bit operation in order to obtain the correct value
  • Three 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 3…0:
  • movb #$F0,TIOSTimer 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 4
  • The 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 Bit
  • In normal mode, write a 1 to the flag bit to be cleared.
  • Method 1
  • Use 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 2
  • Use the movb instruction with a 1 at the bit position (s) corresponding to the flag (s) to be cleared. For example,
  • movb #$01,TFLG1 will clear the C0F flag.
  • When fast timer flag clear function is enabled, see Figure 8.1.
  • Applications of Input Capture Function
  • Event arrival time recording
  • Period 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 edgesInput Capture
  • Interrupt 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 functionDuty Cycle MeasurementPhase Difference MeasurementPeriod 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 $1000 edge1 ds.b 2 ; memory to hold the first edgeperiod ds.b 2 ; memory to store the period org $1500 movb #$90,TSCR1 ; enable timer counter and enable fast timer flags clear bclr TIOS,IOS0 ; enable input-capture 0 movb #$06,TSCR2 ; disable TCNT overflow interrupt, set prescaler to 64 movb #$01,TCTL4 ; capture the rising edge of PT0 signal movb #C0F,TFLG1 ; clear the C0F flag brclr TFLG1,C0F,* ; wait for the arrival of the first rising edge ldd TC0 ; save the first edge and clear the C0F flag std edge1 brclr TFLG1,C0F,* ; wait for the arrival of the second edge ldd TC0 subd edge1 ; compute the period std period swi endC 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. Let
  • ovcnt = TCNT counter overflow count
  • diff = the difference of two consecutive edges
  • edge1 = the captured time of the first edge
  • edge2 = the captured time of the second edge
  • The pulse width can be calculated by the following equations:
  • Case 1 edge2  edge1 pulse width = ovcnt × 216 + diffCase 2 edge2 < edge 1 pulse width = (ovcnt – 1) × 216 + diff#include "c:\miniide\hcs12.inc" org $1000edge1 ds.b 2overflow ds.b 2pulse_width ds.b 2 org $1500 movw #tov_isr,UserTimerOvf ; set up TCNT overflow interrupt vector lds #$1500 ; set up stack pointer movw #0,overflow movb #$90,TSCR1 ; enable TCNT and fast timer flag clear movb #$05,TSCR2 ; disable TCNT interrupt, set prescaler to 32 bclr TIOS,IOS0 ; select IC0 movb #$01,TCTL4 ; capture rising edge movb #C0F,TFLG1 ; clear C0F flagwait1 brclr TFLG1,C0F,wait1 ; wait for the first rising edge movw TC0,edge1 ; save the first edge & clear the C0F flag movb #TOF,TFLG2 ; clear TOF flag bset TSCR2,$80 ; enable TCNT overflow interrupt cli ; " movb #$02,TCTL4 ; capture the falling edge on PT0 pinwait2 brclr TFLG1,C0F,wait2 ; wait for the arrival of the falling edge ldd TC0 subd edge1 std pulse_width bcc next ; is the second edge smaller? ldx overflow ; second edge is smaller, so decrement dex ; overflow count by 1 stx overflow ; "next switov_isr movb #TOF,TFLG2 ; clear TOF flag ldx overflow inx stx overflow rti endC Program for Pulse Width Measurement#include <hcs12.h>#include <vectors12.h>#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 edge */ TCTL4 = 0x02; /* prepare to capture the falling edge */ while (!(TFLG1 & C0F)); /* wait for the arrival of the falling edge */ diff = TC0 - edge1; if (TC0 < edge1) overflow -= 1; pulse_width = overflow * 65536u + diff; asm ("swi");}void INTERRUPT tovisr(void){ TFLG2 = TOF; /* clear TOF flag */ overflow = overflow + 1;}Output Compare Function
  • The HCS12 has eight output compare functions.
  • Each output compare channel consists of
  • A 16-bit comparator
  • A 16-bit compare register TCx (also used as inout capture register)
  • An output action pin (PTx, can be pulled high, pulled low, or toggled)
  • An interrupt request circuit
  • A forced-compare function (CFOCx)
  • Control logic
  • Operation of the Output-Compare Function (1 of 4)
  • One of the applications of the output-compare function is to trigger an action at a specific time in the future.
  • To use an output-compare function, the user
  • Makes a copy of the current contents of the TCNT register
  • Adds to this copy a value equal to the desired delay
  • Stores the sum into an output-compare register (TCx, x = 0..7)
  • Operation of the Output-Compare Function (2 of 4)
  • The actions that can be activated on an output compare pin include
  • Pull up to high
  • Pull down to low
  • Toggle
  • The action is determined by the Timer Control Register 1 & 2 (TCTL1 & TCTL2):
  • Operation of the Output-Compare Function (3 of 4)
  • A successful compare will set the corresponding flag bit in the TFLG1 register.
  • An interrupt may be optionally requested if the associated interrupt enable bit in the TIE register is set.
  • Example 8.4 Generate an active high 1 KHz digital waveform with 30 percent duty cycle from the PT0 pin. Use the polling method to check the success of the output compare operation. The frequency of the E clock is 24 MHz.
  • Solution: An active high 1 KHz waveform with 30 percent duty cycle is shown in Figure 8.19. The logic flow of this problem is illustrated in Figure 8.20.
  • Setting the prescaler to the TCNT to 8, then the period of the clock signal to the TCNT will be 1/3 ms. The numbers of clock cycles that the signal is high and low are 900 and 2100, respectively.
  • Operation of the Output-Compare Function (4 of 4)#include "c:\miniide\hcs12.inc"hi_time equ 900lo_time equ 2100 org $1500 movb #$90,TSCR1 ; enable TCNT with fast timer flag clear movb #$03,TSCR2 ; disable TCNT interrupt, set prescaler to 8 bset TIOS,OC0 ; enable OC0 movb #$03,TCTL2 ; select pull high as pin action ldd TCNT ; start an OC0 operation with 700 us as delayrepeat addd #lo_time ; " std TC0 ; "low brclr TFLG1,C0F,low ; wait until OC0 pin go high movb #$02,TCTL2 ; select pull low as pin action ldd TC0 ; start an OC operation with 300 us as delay addd #hi_time ; " std TC0 ; "high brclr TFLG1,C0F,high ; wait until OC0 pin go low movb #$03,TCTL2 ; select pull high as pin action ldd TC0 bra repeat endC Program for Generating 1 KHz Digital Waveform#include "c:\egnu091\include\hcs12.h"#define hi_time 900#define lo_time 2100void main (void){ TSCR1 = 0x90; /* enable TCNT and fast timer flag clear */ TIOS |= OC0; /* enable OC0 function */ TSCR2 = 0x03; /* disable TCNT interrupt, set prescaler to 8 */ TCTL2 = 0x03; /* set OC0 action to be pull high */ TC0 = TCNT + lo_time; /* start an OC0 operation */ while(1) { while(!(TFLG1 & C0F)); /* wait for PT0 to go high */ TCTL2 = 0x02; /* set OC0 pin action to pull low */ TC0 += hi_time; /* start a new OC0 operation */ while(!(TFLG1 & C0F)); /* wait for PT0 pin to go low */ TCTL2 = 0x03; /* set OC0 pin action to pull high */ TC0 += lo_time; /* start a new OC0 operation */ }}Example 8.5 Write a function to generate a time delay which is a multiple of 1 ms.
  • Assume that the E clock frequency is 24 MHz. The number of milliseconds is passed in Y. Also write an instruction sequence to test this function.
  • Solution: One method to create 1 ms delay is as follows:
  • Set the prescaler to TCNT to 64
  • Perform the number of output-compare operations (given in Y) with each operation creating a 1-ms time delay.
  • The number to be added to the copy of TCNT is 375. (375  64  24000000 = 1 ms)
  • delayby1ms pshd movb #$90,TSCR1 ; enable TCNT & fast flags clear movb #$06,TSCR2 ; configure prescaler to 64 bset TIOS,OC0 ; enable OC0 ldd TCNTagain0 addd #375 ; start an output-compare operation std TC0 ; with 1 ms time delaywait_lp0 brclr TFLG1,OC0,wait_lp0 ldd TC0 dbne y,again0 puld rtsvoid delayby1ms(int k){ int ix; TSCR1 = 0x90; /* enable TCNT and fast timer flag clear */ TSCR2 = 0x06; /* disable timer interrupt, set prescaler to 64 */ TIOS |= OC0; /* enable OC0 */ TC0 = TCNT + 375; for (ix = 0; ix < k; ix++) { while(!(TFLG1 & C0F)); TC0 += 375; } TIOS &= ~OC0; /* disable OC0 */}Example 8.6 Use an input-capture and an output-compare functions to measure the frequency of the signal connected to the PT0 pin.
  • Solution: To measure the frequency, we will
  • Use one of the output-compare function to create a one-second time base.
  • Keep track of the number of rising (or falling) edges that arrived at the PT0 pin within one second.
  • #include "c:\MiniIDE\hcs12.inc"CR equ $0DLF equ $0A org $1000oc_cnt rmb 1frequency rmb 2 org $1500 movb #$90,TSCR1 ; enable TCNT and fast timer flags clear movb #$02,TSCR2 ; set prescale factor to 4 movb #$02,TIOS ; enable OC1 and IC0 movb #100,oc_cnt ; prepare to perform 100 OC1 operation, each ; creates 10 ms delay and total 1 second movw #0,frequency ; initialize frequency count to 0 movb #$01,TCTL4 ; prepare to capture the rising edges of PT0 movb #C0F,TFLG1 ; clear the C0F flag bset TIE,IC0 ; enable IC0 interrupt cli ; " ldd TCNT ; start an OC1 operation with 10 ms delaycontinue addd #60000 ; " std TC1 ; "w_lp brclr TFLG1,C1F,w_lp ; wait for 10 ms ldd TC1 dec oc_cnt bne continue ldd frequency pshd ldd #msg jsr [printf,PCR] leas 2,sp swimsg db CR,LF,"The frequency is %d",CR,LF,0TC0_isr ldd TC0 ; clear C0F flag ldx frequency ; increment frequency count by 1 inx ; " stx frequency ; rtiorg $3E6E ; set up interrupt vector number fdb TC0_isr ; for TC0 endC Program for Frequency Measurement Using IC0#include <hcs12.h>#include <vectors12.h>#include <convert.c>#include <stdio.c>#define INTERRUPT __attribute__((interrupt))unsigned int frequency;void INTERRUPT TC0_isr(void);void main(void){ char arr[7]; char *msg = "Signal frequency is "; int i, oc_cnt; unsigned frequency; UserTimerCh0 = (unsigned short)&TC0_isr; TSCR1 = 0x90; /* enable TCNT and fast flag clear */ TSCR2 = 0x02; /* set prescale factor to 4 */ TIOS = 0x02; /* select OC1 and IC0 */ oc_cnt = 100; /* prepare to perform 100 OC1 operations */ frequency = 0; TCTL4 = 0x01; /* prepare to capture PT0 rising edge */ TFLG1 = C0F; /* clear C0F flag */ TIE |= IC0; /* enable IC0 interrupt */ asm("cli"); TC1 = TCNT + 60000; while (oc_cnt) { while(!(TFLG1 & C1F)); TC1 = TC1 + 60000; oc_cnt = oc_cnt - 1; } int2alpha(frequency, arr); puts(msg); puts(&arr[0]); asm("swi");}void INTERRUPT TC0_isr(void){ TFLG1 = C0F; /* clear C0F flag */ frequency ++;}Making Sound Using the Output-Compare Function
  • A sound can be generated by creating a digital waveform with appropriate frequency and using it to drive a speaker or a buzzer.
  • The circuit connection for a buzzer is shown in Figure 8.21.
  • The simplest song is a two-tone siren.
  • Algorithm for Generating a Siren
  • Step 1
  • Enable an output compare channel to drive the buzzer (or speaker).
  • Step 2
  • Start an output compare operation with a delay count equal to half the period of the siren and enable the OC interrupt.
  • Step 3
  • Wait for the duration of the siren tone (say half a second). During the waiting period, interrupts will be requested many times by the output compare function. The interrupt service routine simply restart the output compare operation.
  • Step 4
  • At the end of the siren tone duration, choose a different delay count for the output compare operation so that the siren sound may have a different frequency.
  • Step 5
  • Wait for the same duration as in Step 3. During this period, many interrupts will be requested by the output compare operation.
  • Step 6
  • Go to Step 2.
  • Example 8.7 Write a program to generate a two-tone siren that oscillates between 300 Hz and 1200 Hz.
  • Solution:
  • Set the prescaler to TCNT to 1:8.
  • The delay count for the low frequency tone is (24000000  8)  300  2 = 5000.
  • The delay count for the high frequency tone is (24000000  8)  1200  2 = 1250.
  • #include "c:\miniide\hcs12.inc"hi_freq equ 1250 ; delay count for 1200 Hz (with 1:8 prescaler)lo_freq equ 5000 ; delay count for 300 Hz (with 1:8 prescaler)toggle equ $04 ; value to toggle the TC5 pin org $1000delay ds.w 1 ; store the delay for output-compare operation org $1500 lds #$1500 movw #oc5_isr,UserTimerCh5 ; initialize the interrupt vector entry movb #$90,TSCR1 ; enable TCNT, fast timer flag clear movb #$03,TSCR2 ; set main timer prescaler to 8 bset TIOS,OC5 ; enable OC5 movb #toggle,TCTL1 ; select toggle for OC5 pin action movw #hi_freq,delay ; use high frequency delay count first ldd TCNT ; start the low frequency sound addd delay ; " std TC5 ; " bset TIE,OC5 ; enable OC5 interrupt cli ; "forever ldy #5 ; wait for half a second jsr delayby100ms ;
    We Need Your Support
    Thank you for visiting our website and your interest in our free products and services. We are nonprofit website to share and download documents. To the running of this website, we need your help to support us.

    Thanks to everyone for your continued support.

    No, Thanks