Laboratory Short Course The Timer - Output Compare www.freescale.com/universityprograms Freescale™ and the Freescale logo are trademarks of Freescale Semiconductor, Inc. All other product or service names are the property of their respective owners © Freescale Semiconductor, Inc. 2006. Document Number: LABS12CINTRO19 /REV 1 Reading this Document Answers provided to the Instructor assume that the reader is using Freescale HCS12C Family Student Learning Kit, and CodeWarrior development software. This short course has been created using an adapted version of the Process Oriented Guided Inquiry Learning (POGIL) method. For more information visit www.pogil.org Freescale Semiconductor LABS12CINTRO19, Rev 1 1 Overview The timer overflow timing resolution is somewhat coarse for many timing applications. The Output Compare hardware allows much better timing resolution and can generate time intervals to within one clock cycle. This allows us to generate waveforms and to perform other timing tasks with great precision. Learning Objectives In this module you will extend your knowledge of the timer by investigating the output compare features. You will see the hardware that is used and will understand what has to be initialized to use this device. You will also learn about its interrupt capabilities. Success Criteria At the conclusion of this module you will be able to write a program using the output compare interrupts to generate a precise waveform. Prerequisites Before undertaking this module you should be able to start the timer and to generate a time delay using interrupts generated by the timer overflow flag. You must also understand the operation of the interrupt system. More Resources and Further Information Cady, Fredrick M., Software and Hardware Engineering: Assembly and C Programming for the Freescale HCS12 Microcontroller, 2nd edition. (New York: Oxford University Press, Inc., 2008), Chapter 12 HCS12 Interrupts and Chapter 14 HCS12 Timer CPU12 Reference Manual, S12CPUV2.PDF, Freescale Semiconductor, Inc. TIM_16B8C Block User Guide, S12TIM16B8CV1/D.PDF, Freescale Semiconductor, Inc., October 2001. MC9S12C Family, MC9S12GC Family Reference Manual HCS12 Microcontrollers, Freescale Semiconductor, Austin, Texas, December 2006 (mc9s12c128v1.pdf) Timer Output Compare Basics Teach: Figure 1 shows the hardware added to the basic timer counter. As before, the 16-bit TCNT counter is the heart of the system. The hardware added for the output compare are eight 16-bit comparators and eight 16-bit Timer Input Capture/Output Compare registers labeled TCn. (In the following, n = 0 through 7 to denote one of the eight timer channels.) The students should be able to inspect the figure and see what bits in which registers are needed to control the various features. They will be required to find in their documentation details such as register addresses and the operation of control bits. Remember that the TCNT counter is always counting (when TEN = 1). When the current value of TNCT equals the value in a TCn register, the 16-bit comparator sets the CnF flag in the TFLG1 register. This is similar to the operation of the timer overflow flag but can occur at any TCNT value, not just when the counter overflows. We can use this feature to generate accurate timing intervals. In Figure 1 we see that CnF is ANDed with two other bits that must be asserted to allow the Output Compare Interrupt Request to be generated. The CnI bit is the Timer Interrupt Enable bit and is in the TIE register. It must be set to enable the output compare interrupt. The I bit in the Condition Code Register (CCR) is a mask bit and must be reset (= 0) to unmask the interrupt request. The CnI bit enables only this interrupt while the I bit operates globally, affecting all interrupting subsystems. Further inspection of Figure 1 shows a Timer Input Capture/Output Compare Select Register – TIOS. Freescale Semiconductor LABS12CINTRO19, Rev 1 2 Any of the eight timer channels may be chosen to be an output compare function by setting the associated bit in the TIOS register. The CnF flag may also affect the associated Port T output bit through the Output Bit Control. This allows us to automatically change an output bit each time the output compare occurs. 'TSCR2' TCRE 'TSCR1' Bus Clock TEN Clear Counter 'TSCR2' Channel 7 Output Compare PR2 PR1 PR0 'TSCR2' TOI 00 PACLK PACLK/256 PACLK/65536 01 TCNT Clock 10 MUX 'TCNT' 'TFLG2' 16-bit Counter TOF Timer Overflow Interrupt Request 'CCR' 11 I CLK1 CLK2 Output Compare Interrupt Request 'TIE' 'PACTL' CnI 'TFLG1' 16-Bit Comparator TCn Register TO 7 More Timer Channels CnF Port Pin 'CFORC' PTn FOCn 'TCTL1 or TCTL2' 'TIOS' 7 6 5 4 3 2 1 0 Set IOSn Bit to 1 for Output Compare OMn OLn Output Bit Control 'OC7M:OC7D' OC7Mn OC7Dn OUTPUT COMPARE SUBSYSTEM Figure 1. Timer Output Compare (reprinted with permission Oxford University Press Inc.). Answers: Explore 1. 1. 2. Give the addresses of the following registers: a. TIE b. TIOS c. TC0 1a) TIE = $004C 1b) TIOS = $0040 1c) TCO = $0050 2) Bit 0, reset Which bit in the TIE register is the C0I bit and what is its state when the microcontroller is reset? Stimulate 1. Answers: 1. 1) bset TIOS,BIT0 2. Write a small section of code, either in assembly or C, that will enable timer channel 0 as an output compare. Write a small section of code, either in assembly or C, that will enable an interrupt on timer channel 0 and then unmasks interrupts. Freescale Semiconductor LABS12CINTRO19, Rev 1 2) bset TIE,BIT0 cli 3 Generating Precise Time Intervals All time intervals are relative to some starting time and in the case of the output compare system, the starting "time" is the current value of the TCNT register. Thus, if you wish to generate an event at some time in the future, you must know two things. First, the present time is whatever value is currently in the TCNT register. You may read that with a 16-bit load instructions such as ldd TCNT. Second, you must convert your desired time interval to the number of TCNT clock cycles spent during this interval. When this is known, you can add this to the "present" value of the TCNT, which is in Accumulator D, with the following instruction addd #DELAY_COUNT and then save this future TCNT value in one of the TCn registers with std TCn. After making sure the CnF is reset by storing a one to the flag (just like resetting the TOF), you now have the output compare subsystem ready to set the CnF flag after the required number of TCNT clock cycles have passed. Explore 2. Answers: Assume the TCNT clock is 8 MHz. 1) 8.192 ms 1. What is the maximum delay one can achieve with one occurrence of an output compare? 2) 48,000; 8,000 2. How many clock cycles must elapse to achieve a delay of 6 milliseconds? For 1 millisecond? Stimulate 2. Answers: 1. 1) The TCNT counter continues to count while the ldaa instruction is executing so the ldab value will not represent the true count that existed at the first load instruction. The proper way to read the current value of TNCT is with a 16-bit load such as ldd TNCT. What happens if you read TCNT with two 8-bit load instructions such as ldaa TNCT ldab TNCT+1? 2. What is the worst case scenario? 2) The worst case scenario is when the low byte of TCNT overflows during the first ldaa instruction. Repeating Precise Time Intervals Rarely would we want to delay just one time interval. Often, say when generating a square wave of some frequency, we would like repeating time delays equal to one-half the period of the square wave. After each output compare occurs, load Accumulator D from the TCn register, add the required number of clock cycles for the delay, and store that value back into the TCn. You must also reset the CnF flag by writing a one to it. At each output compare you toggle the output bit. Freescale Semiconductor LABS12CINTRO19, Rev 1 Common Errors: When students are asked to generate a specific frequency they calculate the period and use that for the time delay. That gives them one-half the required frequency. 4 Stimulate 3. Answers: Assume you are generating a square wave of some frequency and assume the TCNT clock is 8 MHz. 1) Each delay will be extended by the number of clock cycles that have elapsed since the output compare. You end up with a lower frequency than expected. 1. What happens if instead of loading D from TCn after each output compare you load D from TCNT? 2. What is the lowest frequency square wave assuming the output toggles after each output compare? 3. What other timer feature could be used to produce the lowest frequency square wave? 4. What factors influence achieving the highest frequency square wave? 2) 61.04 Hz 3) You could use the timer overflow. 4) The number of clock cycles needed to set up for the next output compare. Output Compare Interrupts Output compare interrupts are very similar to the timer overflow interrupts. By inspecting Figure 1 we see that the CnI bit must be set to enable the channel's interrupt and the I bit must be reset to unmask it. Providing the interrupt vector for this channel is initialized, the interrupt service routine will be entered when the output compare occurs. Remember to reset the CnF flag in the interrupt service routine. Each timer channel interrupting source has a specific vector location that must be initialized with the interrupt service routine's address. In CodeWarrior this is done by the linker with the following line in the linker parameter file: VECTOR ADDRESS 0x???? CnF_isr or VECTOR ?? CnF_isr where CnF_isr is the label on your interrupt service routine and that has been XDEFed in the module where it has been defined. 0x???? is the address of the vector for the timer channel in use and ?? is its priority number. Explore 3. Answers: 1. In the section above, VECTOR ADDRESS 0x???? CnF_isr is the vector address for a timer interrupt. Where, in your documentation, do you find these addresses? 2. What is the vector address of Timer Channel 0? 3. In the section above, VECTOR ?? CnF_isr is another way of specifying that the label CnF_isr is the starting address of the timer overflow interrupt. Where, in your documentation, do you find these vector numbers? 4. What is the vector number of Timer Channel 0? 1) MC9S12C Family, MC9S12GC Family Reference Manual. 2) $FFEE:FFEF 3) MC9S12C Family, MC9S12GC Family Reference Manual. 4) 8 Freescale Semiconductor LABS12CINTRO19, Rev 1 5 Stimulate 4. 1. Answers: Inspect Figure 1 and discuss what would happen in your program if your interrupt service routine did not reset the CnF? 1) If the flag is set when returning from the interrupt service routine, an interrupt will be immediately generated and the program will return to the interrupt service routine. Generating Long Time Intervals A simple strategy can be followed to generate a time interval longer than the overflow time of the TCNT register. Any arbitrary time interval can be broken into a number of sub-intervals less than the TCNT overflow time. Your program can simply be set up to interrupt at these shorter times, then to count the required number in the interrupt service routine, and then change the output (or do what has to be done) when the right number of interrupts have occurred. Output Bit Control Look back at Figure 1. Each of the eight Port T bits may be connected to the associated timer channel to automatically change the bit each time the CnF flag is set. The bits that control this action are the OMn:OLn bits in TCTL1 and TCTL2. These bits operate in pairs to control the action on the Port T output bit (PTn). Explore 4. Answers: 1. What are the addresses of TCTL1 and TCTL2? 2. Complete the truth table showing the action on the output bit for each of the four values of OMn:OLn. Output Compare Result Output Action OMn OLn 0 0 0 1 1 0 1 1 1) TCTL1 = $0048 TCTL2 = $0049 2)00 = Bit disconnected 01 = Toggle the bit 10 = Clear the bit 11 = Set the bit Bit-n Action Skill Exercise 1 1. Using the resources in your student learning kit or laboratory hardware, demonstrate to your laboratory instructor that you can use the output compare interrupts to generate a square wave with a frequency of your choice. Freescale Semiconductor LABS12CINTRO19, Rev 1 6 Communication – Inter-Group Join another laboratory group and compare your solutions to Skill Exercise 1. Now, jointly work out changes to the design of each of your programs to produce a pulse waveform with a 25% duty cycle. Reflection on Learning How does your group's solution to Skill Exercise 1 compare with another group? Can you see improvements to make to your program to make it more efficient or more easily understood by somebody else? Communication – Reporting Demonstrate the 25% duty cycle pulse waveform. Freescale Semiconductor LABS12CINTRO19, Rev 1 7 Instructor's Notes Output compare interrupt example Freescale HC12-Assembler (c) Copyright Freescale 1987-2006 Abs. Rel. Loc Obj. code Source line ---- ---- ------ --------- ----------- 1 1 ; This program demonstrates the 2 2 ; Timer Output Compare Interrupts. 3 3 ; The program uses the WAI instruction 4 4 ; while waiting for an interrupt. 5 5 ; The program will alternately flash LED1 6 6 ; and LED2 on a CSM-12C32 7 7 ; microcontroller module at approximately 8 8 ; 2 Hz. 9 9 ;******************************** 10 10 11 11 XDEF Entry, main 12 12 XDEF oc0_isr 13 13 XREF __SEG_END_SSTACK 14 14 15 15 0000 0044 TCNT: EQU $0044 ; Timer Counter Register 16 16 0000 0046 TSCR1: EQU $0046 ; Timer System Control Register 1 17 17 0000 004D TSCR2: EQU $004d ; Timer System Control Register 2 18 0000 0040 TIOS: EQU $0040 ; Timer Input Capture/Output Compare 19 19 0000 0050 TC0: EQU $0050 ; Register 0 20 20 0000 004C TIE: EQU $004C ; Timer Interrupt Enable Register 21 21 0000 004E TFLG1: EQU $004E ; Timer Interrupt Flag Register 1 22 22 0000 0080 TEN: EQU %10000000 ; Timer enable 23 23 0000 0080 TOF: EQU %10000000 ; Timer overflow flag 24 24 0000 0000 PTA: EQU $0000 ; Port A 25 25 0000 0002 DDRA: EQU $0002 ; Data Direction 18 Select Freescale Semiconductor ; Define the entry point for the main program ; Register equates LABS12CINTRO19, Rev 1 8 26 26 0000 0001 PTB: EQU $0001 ; Port B 27 27 0000 0003 DDRB: EQU $0003 ; Data Direction 28 28 0000 0001 BIT0: EQU %00000001 ; Bit 0 29 29 ;******************************** 30 30 ; Constants 31 31 0000 0001 LED1: EQU %00000001 ; LED1 on Port A-0 32 32 0000 0010 LED2: EQU %00010000 ; LED2 on Port B-4 33 33 0000 C350 DELAY: EQU 50000 ; Clocks for each interrupt 34 34 0000 0028 COUNT: EQU 40 ; Interrupts per 1/4 sec 35 35 ; Code Section 36 36 MyCode: SECTION 37 37 Entry: 38 38 main: 39 39 40 40 ; DO Initialize the I/O 41 41 ; 42 42 000003 4C02 01 bset DDRA,LED1 ; Make PA-0 output 43 43 000006 4C03 10 bset DDRB,LED2 ; Make PB-4 output 44 44 45 45 000009 4C00 01 bset PTA,LED1 ; LED1 off 46 46 00000C 4D01 10 bclr PTB,LED2 ; LED2 on 47 47 48 48 49 49 50 50 51 51 52 52 000015 DC44 ldd TCNT 53 53 000017 5C50 std TC0 54 54 55 55 000019 8601 ldaa #BIT0 56 56 00001B 5A4E staa TFLG1 57 57 58 58 59 59 60 60 000000 CFxx xx lds ; ; 00000F 4C46 80 000012 4C40 01 Initialize the LEDs (LEDs are active low) Enable the Timer ; ; 00001D 4C4C 01 ; Enable the timer TIOS,BIT0 Grab the value of the TCNT register Set up the interrupts ; Clear C0F Enable OC0 interrupts bset ; TSCR1,TEN Enable Output Compare Channel 0 bset ; 000020 180B 28xx Set the initial LED states bset ; #__SEG_END_SSTACK TIE,BIT0 Initialize the 1/4 sec counter movb #COUNT,delay_count 000024 xx Freescale Semiconductor LABS12CINTRO19, Rev 1 9 61 61 ; Unmask interrupts 62 62 63 63 ; ENDO Initialize the I/O 64 64 ; DO 65 65 main_loop: 66 66 67 67 68 68 000025 10EF cli 000027 3E wai ; ; Wait for interrupt IF the toggle flag is set 000028 1Fxx xx01 brclr toggle_flag,BIT0,end_if 00002C 15 69 69 ; 70 70 00002D 9600 ldaa PTA 71 71 00002F 8801 eora #LED1 72 72 000031 5A00 staa PTA 73 73 000033 9601 ldaa PTB 74 74 000035 8810 eora #LED2 75 75 000037 5A01 staa PTB 76 76 77 77 ; THEN toggle the LEDs, clear the flag and reset counter ; Toggle the bit Re-initialize the delay counter 000039 180B 28xx movb #COUNT,delay_count bclr toggle_flag,BIT0 ; Clear flag 00003D xx 78 78 00003E 1Dxx xx01 79 79 80 80 81 81 ; FOREVER 82 82 ;******************************** 83 83 ; Output Compare ISR 84 84 ; Decerements a "delay_counter" in memory 85 85 ; When the counter reaches zero, set a 86 86 ; toggle flag. 87 87 ;******************************** 88 88 oc0_isr: 89 89 ; Decrement the counter 90 90 91 91 92 92 93 93 94 94 end_if: 000042 20E3 000044 73xx xx bra dec main_loop delay_count ; IF the counter is zero 000047 2604 bne endif ; THEN set the flag to toggle the LED 000049 1Cxx xx01 Freescale Semiconductor bset toggle_flag,BIT0 LABS12CINTRO19, Rev 1 10 95 95 ; ENDIF counter is zero 96 96 endif: 97 97 ; Set up TC0 for the next time 98 98 00004D DC50 ldd TC0 99 99 00004F C3C3 50 addd #DELAY 100 100 000052 5C50 std TC0 101 101 102 102 000054 8601 ldaa #BIT0 103 103 000056 5A4E staa TFLG1 104 104 000058 0B rti 105 105 ;******************************** 106 106 ; 107 107 Data: 108 108 000000 delay_count: DS.B 109 109 000001 toggle_flag: ; Clear the flag Freescale Semiconductor ; Clear C0F SECTION 1 DS.B LABS12CINTRO19, Rev 1 1 11 Revision History Revision Comments Author 0 Initial Release Fred Cady 1 Changed program example Fred Cady Freescale Semiconductor LABS12CINTRO19, Rev 1 12 How to Reach Us: Home Page: www.freescale.com Information in this document is provided solely to enable system and software implementers to use Freescale Semiconductor products. There are no express or implied copyright license granted hereunder to design or fabricate any integrated circuits or integrated circuits based on the information in this document. Web Support: http://www.freescale.com/support Freescale Semiconductor reserves the right to make changes without further notice to any products herein. Freescale Semiconductor makes no warranty, representation or guarantee regarding the suitability of its products for any particular purpose, nor does Freescale Semiconductor assume any liability arising out of the application or use of any product or circuit, and specifically disclaims any and all liability, including without limitation consequential or incidental damages. “Typical” parameters which may be provided in Freescale Semiconductor data sheets and/or specifications can and do vary in different applications and actual performance may vary over time. All operating parameters, including “Typicals” must be validated for each customer application by customer’s technical experts. Freescale Semiconductor does not convey any license under its patent rights nor the rights of others. Freescale Semiconductor products are not designed, intended, or authorized for use as components in systems intended for surgical implant into the body, or other applications intended to support or sustain life, or for any other application in which the failure of the Freescale Semiconductor product could create a situation where personal injury or death may occur. Should Buyer purchase or use Freescale Semiconductor products for any such unintended or unauthorized application, Buyer shall indemnify and hold Freescale Semiconductor and its officers, employees, subsidiaries, affiliates, and distributors harmless against all claims, costs, damages, and expenses, and reasonable attorney fees arising out of, directly or indirectly, any claim of personal injury or death associated with such unintended or unauthorized use, even if such claim alleges that Freescale Semiconductor was negligent regarding the design or manufacture of the part. USA/Europe or Locations Not Listed: Freescale Semiconductor, Inc. Technical Information Center, EL516 2100 East Elliot Road Tempe, Arizona 85284 +1-800-521-6274 or +1-480-768-2130 www.freescale.com/support Europe, Middle East, and Africa: Freescale Halbleiter Deutschland GmbH Technical Information Center Schatzbogen 7 81829 Muenchen, Germany +44 1296 380 456 (English) +46 8 52200080 (English) +49 89 92103 559 (German) +33 1 69 35 48 48 (French) www.freescale.com/support Japan: Freescale Semiconductor Japan Ltd. Headquarters ARCO Tower 15F 1-8-1, Shimo-Meguro, Meguro-ku, Tokyo 153-0064 Japan 0120 191014 or +81 3 5437 9125 support.japan@freescale.com Asia/Pacific: Freescale Semiconductor Hong Kong Ltd. Technical Information Center 2 Dai King Street Tai Po Industrial Estate Tai Po, N.T., Hong Kong +800 2666 8080 support.asia@freescale.com For Literature Requests Only: Freescale Semiconductor Literature Distribution Center P.O. Box 5405 Denver, Colorado 80217 1-800-441-2447 or 303-675-2140 Fax: 303-675-2150 LDCForFreescaleSemiconductor@hibbertgroup.com Freescale™ and the Freescale logo are trademarks of Freescale Semiconductor, Inc. All other product or service names are the property of their respective owners. ARM is the registered trademark of ARM Limited. ARM9, ARM11, and ARML210™ are the trademarks of ARM Limited. Java and all other Java-based marks are trademarks or registered trademarks of Sun Microsystems, Inc. in the U.S. and other countries. The “PowerPC” name is a trademark of IBM Corp. and used under license. © Freescale Semiconductor, Inc. 2006. Document Number: LABS12CINTRO19 /REV 1