6 timers

36 129 0
6 timers

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Microcontrollers PIC16 C Hardware Timers PIC16 C Hardware Timers The microcontroller PIC16F877 has different timers: Microcontrollers • PIC Timer0 • PIC Timer1 • PIC Timer2 Microcontrollers PIC Timer0 The Timer0 module timer/counter has the following features: • 8-bit timer/counter • Readable and writable • 8-bit software programmable prescaler • Internal (FOSC/4) or external clock select • Interrupt on overflow from FFh to 00h • Edge select (rising or falling) for external clock Microcontrollers BLOCK DIAGRAM OF THE TIMER0/WDT PRESCALER T0SE: TMR0 Source Edge Select bit = Increment on high-to-low transition on T0CKI pin = Increment on low-to-high transition on T0CKI pin T0CS: TMR0 Clock Source Select bit = Transition on T0CKI pin = Internal instruction cycle clock (CLKO) PSA: Prescaler Assignment bit = Prescaler is assigned to the WDT = Prescaler is assigned to the Timer0 module Calculating Count, Fout, and TMR0 values Microcontrollers • If using INTERNAL clock, the division is performed as follow: Fout The output frequency after the division Tout The Cycle Time after the division The division of the original clock by Count A numeric value to be placed to obtain the desired output frequency - Fout (256 - TMR0) The number of times in the timer will count based on the register TMR0 An example of INTERNAL clock Microcontrollers • Suppose we want to create a delay of 0.5 second in the our program using Timer0 What is the value of Count? Calculation: • First, let’s assume that the frequency division by the Prescaler will be 1:256 and fclk=4MHz Second, let’s set TMR0=0 Thus: An example of EXTERNAL clock source Microcontrollers What is the output frequency - Fout, when the external oscillator is 100kHz and Count=8? Calculation: First, let’s assume that the frequency division by the Prescaler will be 1:256 Second, let’s set TMR0=0 Thus: Microcontrollers Test circuit Microcontrollers RTCC (timer0) and interrupts #include #fuses HS,NOLVP,NOWDT,PUT #use delay(clock=20000000) #use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7) #define high start 76 unsigned int8 seconds, high count; #INT_RTCC //Interrupt procedure clock_isr() { //called every time RTCC high_count -= 1; //flips from 255 to if(high_count==0) { ++seconds; high_count=high_start; //Inc SECONDS counter every } //76 times to keep time } Microcontrollers RTCC (timer0) and interrupts void main() { //a simple stopwatch program unsigned int8 start, time; high_count = high_start; setup_timer_0( RTCC_INTERNAL | RTCC_DIV_256 ); set_timer0(0); enable_interrupts(INT_RTCC); enable_interrupts(GLOBAL); { printf("Press any key to begin.\n\r"); getc(); start = seconds; printf("Press any key to stop.\r\n"); getc(); time = seconds start; printf("%U seconds.\n\r", time); } while (TRUE); } 10 22 Microcontrollers Microcontrollers Timer1-Counter #include #use delay(clock=4000000) #use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7) void main() { unsigned int16 count; set_timer1(3600); setup_timer_1(t1_external | T1_DIV_BY_1); delay_ms(500); count=get_timer1(); { if (count !=get_timer1()){ count=get_timer1(); printf("%LU times.\n\r", count); } } while (TRUE); } 23 Microcontrollers Timer1-Counter 24 Microcontrollers Sleep mode 25 Microcontrollers Sleep mode 26 Microcontrollers Sleep mode 27 Timer2 Microcontrollers The Timer2 module, timer/counter, has the following features: • • • • • Two 8-bit registers (TMR2 and PR2) Readable and writable A prescaler and a postscaler Connected only to an internal clock Interrupt on overflow 28 Microcontrollers TIMER2 BLOCK DIAGRAM 29 Microcontrollers TIMER2 BLOCK DIAGRAM • Timer2 has count registers 8-bits: TMR2 and PR2 PR2 is a readable and writable register and initialized to FFh upon Reset • Register TMR2 is used to store the "initial" count value (the value from which it begins to count) Register PR2 is used to store the "ending" count value (the maximum value we need/want to reach) ie: using Timer2 we can determine the started count value, the final count value, and the count will be between these two values The Timer2 increments from 00h until it matches PR2 and then resets to 00h on the next increment cycle 30 Microcontrollers TIMER2 BLOCK DIAGRAM • Prescaler and Postscaler - Timer2 is an 8-bit timer with a prescaler and a postscaler Each allows to make additional division of the frequency clock source • Prescaler divides the frequency clock source BEFORE the counting take place at the register TMR2, thus the counting inside the TMR2 register is performed based on the divided frequency clock source by the Prescaler • The match output of TMR2 goes through a 4-bit postscaler (which gives a 1:1 to 1:16 scaling inclusive) to generate a TMR2 interrupt (latched in flag bit, TMR2IF (PIR1)) • Postscaler divides the frequency that comes out of the 31 Comparator again for the last time Microcontrollers Calculate the required values of the TIMER2: • Fout – The output frequency after the division • Tout – The Cycle Time after the division • - The division of the original clock (4 MHz) by 4, when using internal crystal as clock (and not external oscillator) • Count - A numeric value to be placed to obtain the desired output frequency - fout • (PR2 – TMR2) - The number of times the counter will count 32 Microcontrollers Example and calculation of how to use TIMER2 • Suppose we want to create a delay of second in the our program using Timer2 What is the value of Count? • Calculation: • First, let's assume that the frequency division by the Prescaler will be 1:1 and Postscaler will be 1:16 Second, let's set TMR1=0 and PR2=255 Thus: 33 Timer2 and interrupts #include #fuses HS,NOLVP,NOWDT,PUT #use delay(clock=20000000) #use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7) Microcontrollers #define high_start 125 unsigned int8 seconds, high_count; #INT_TIMER2 clock_isr() { high_count -= 1; //Interrupt procedure //called every time Timer2 //flips from 156 to if(high_count==0) { ++seconds; high_count=high_start; //Inc SECONDS counter every } //125 times to keep time } 34 Timer2 and interrupts Microcontrollers void main() { //a simple stopwatch program unsigned int8 start, time; high_count = high_start; setup_timer_2(T2_DIV_BY_16,0x9c,16); //PR2=0x9C=156, Postscaler=16 set_timer2(0); enable_interrupts(INT_TIMER2); enable_interrupts(GLOBAL); { printf("Press any key to begin.\n\r"); printf("Press any key to stop.\r\n"); printf("%U seconds.\n\r", time); } while (TRUE); } getc(); getc(); start = seconds; time = seconds - start; 35 36 Microcontrollers ... Microcontrollers Timer1-Counter #include #use delay(clock=4000000) #use rs232(baud= 960 0,xmit=PIN_C6,rcv=PIN_C7) void main() { unsigned int 16 count; set_timer1( 360 0); setup_timer_1(t1_external...PIC 16 C Hardware Timers The microcontroller PIC16F877 has different timers: Microcontrollers • PIC Timer0 • PIC Timer1 • PIC Timer2... 11 Microcontrollers Timer0-Counter Microcontrollers #include #use delay(clock=4000000) #use rs232(baud= 960 0,xmit=PIN_C6,rcv=PIN_C7) void main() { unsigned int8 count;; setup_counters

Ngày đăng: 06/11/2017, 20:54

Tài liệu cùng người dùng

Tài liệu liên quan