Timer 1 with XC8

8:19:00 PM
KHẢO SÁT TIMER TIMER1 CỦA PIC 16F887A 

Là bộ định thời/đếm 16 bit gồm 2 thanh ghi 8 bit (TMR1H và TMR1L) – có thể đọc và ghi. Hai thanh ghi này tăng từ 0000h đến FFFFh và quay trở lại 0000h. Khi bị tràn thì Timer1 sẽ phát sinh ngắt, cờ báo ngắt TMR1IF (PIR1<0>) lên mức 1. Timer1 có bit cho phép/cấm là TMR1 IE (PIE1<0>).

Cấu trúc của Timer1:

cấu túc timer 1 pic16f877a


Hình 6-6: Cấu trúc timer T1.


Khảo sát thanh ghi điều khiển Timer1:


Bit 7 
Bit 6
Bit 5-4 T1CKPS1:T1CKPS0: các bit lựa chọn bộ chia - Timer1 input Clock Prescale Select bits
11=1:8 giá trị chia.
10=1:4 giá trị chia. 01=1:2 giá trị chia.
00=1:1 giá trị chia. 
Bit 3 T1OSCEN: bit ĐK cho phép bộ dao động Timer1 - Timer1 Oscillator Enable Control bit
1= bộ dao động được phép.
0= Tắt bộ dao động. 
Bit 2 T1SYNC: bit ĐK đồng bộ ngõ vào xung clock bên ngoài của timer1
Khi TMR1CS = 1:
1= không thể đồng bộ ngõ vào clock ở từ bên ngoài.
0= đồng bộ ngõ vào clock ở từ bên ngoài.
Khi TMR1CS = 0:
Bit này bị bỏ qua. Timer1 dùng xung clock bên trong khi TMR1CS = 0. 
Bit 1 TMR1CS: bit lựa chọn nguồn xung clock của timer11= Chọn nguồn xung clock từ bên ngoài ở chân RC0/T1OSO/T1CKI (cạnh lên).
0= Chọn xung nội bên trong (FOSC/4). Bit 0 TMR1ON: bit điều khiển Timer14
1= Cho phép Timer1 đếm.
0= Timer1 ngừng đếm.
a. Timer1 ở chế độ định thời
Nếu bit TMR1CS bằng 0 thì T1 hoạt động định thời đếm xung nội có tần số bằng FOSC/4. Bit
T1SYNC điều khiển đồng bộ không bị ảnh hưởng do xung clock bên trong luôn đồng bộ.
b. Timer1 ở chế độ đếm xung ngoại
Nếu bit TMR1CS bằng 1 thì T1 hoạt động đếm xung ngoại. Xung ngoại có 2 nguồn xung phụ
thuộc vào bit T1OSCEN:
Nếu bit T1OSCEN bằng 1 thì T1 đếm xung ngoại từ mạch dao động của T1 - xem hình 6-9.
Nếu bit T1OSCEN bằng 0 thì T1 đếm xung ngoại đưa đến ngõ vào T1CKI - xem hình 6-10.




Hình 6-9: T1 hoạt động đếm xung ngoại từ mạch dao động T1.



Timer1 tăng giá trị khi có xung cạnh lên. Counter chỉ tăng giá trị đếm sau khi nhận 1 xung cạnh

xuống được minh hoạ hình 6-11.



Hình trên thì ngõ vào đang ở mức 1, counter sẽ đếm khi có xung cạnh lên.
Hình dưới thì ngõ vào đang ở mức thấp, xung cạnh lên thứ nhất thì mạch vẫn chưa đếm, xung xuống mức thấp và khi có cạnh lên thứ 2 thì counter bắt đầu đếm. 


c. Hoạt động của Timer1 ở chế độ Counter đồng bộ
Khi bit TMR1CS bằng 1 thì T1 hoạt động ở chế độ Counter:

Nếu bit T1OSCEN bằng 1 thì đếm xung từ mạch dao động của T1.
Nếu bit T1OSCEN bằng 1 thì đếm xung cạnh lên đưa đến ngõ vào RC0/T1OSO/T1CKI.

Nếu bit bằng 0 thì ngõ vào xung ngoại được đồng bộ với xung bên trong. Ở chế độ
đồng bộ, nếu CPU ở chế độ ngủ thì Timer1 sẽ không đếm vì mạch đồng bộ ngừng hoạt động.
Nếu bit T1SYNC  bằng 0 thì ngõ vào xung ngoại được đồng bộ với xung bên trong. Ở chế độ
đồng bộ, nếu CPU ở chế độ ngủ thì Timer1 sẽ không đếm vì mạch đồng bộ ngừng hoạt động.

d. Hoạt động của Timer1 ở chế độ Counter bất đồng bộ
T1SYNC Nếu bit bằng 1 thì xung ngõ vào từ bên ngoài không được đồng bộ. Bộ đếm tiếp tục
tăng bất đồng bộ với xung bên trong. Bộ đếm vẫn đếm khi CPU ở trong chế độ ngủ và khi tràn sẽ phát
sinh ngắt và đánh thức CPU. Ngắt T1 có thể ngăn được.


e. Đọc và ghi Timer1 trong chế độ đếm không đồng bộ
Timer T1 cho phép đọc giá trị các thanh ghi TMR1H hoặc TMR1L khi timer đang đếm xung bất
đồng bộ bên ngoài.
Khi ghi thì nên ngừng timer lại rồi mới ghi giá trị mong muốn vào các thanh ghi. Nếu ghi mà
timer đang đếm vẫn được nhưng có thể tạo ra một giá trị đếm không dự đoán được hay không chính
xác.

f. Bộ dao động của Timer1
Mạch dao động được tích hợp bên trong và tụ thạch anh nối giữa 2 chân T1OSI và T1OSO để
tạo dao động - xem hình 6-12. Bộ dao động được phép hoạt động khi bit T1OSCEN bằng 1.

Bộ dao động là dao động công suất thấp, tốc độ 200 kHz. Bộ dao động vẫn tiếp tục chạy khi
CPU ở chế độ ngủ. Bộ dao động chỉ dùng với tụ thạch anh 32 kHz. Bảng sau trình bày cách lựa chọn
tụ cho bộ dao động Timer1.




g. Reset Timer1 sử dụng ngõ ra CCP Trigger
Nếu khối CCP1 và CCP2 được định cấu hình ở chế độ so sánh để tạo ra “xung kích”
(CCP1M3:CCP1M0 = 1011), tín hiệu này sẽ reset Timer1.
Chú ý: “xung kích” từ khối CCP1 và CCP2 sẽ không làm cờ ngắt TMR1IF (PIR1<0>) bằng 1.
Timer1 phải định cấu hình ở chế độ định thời hoặc bộ đếm đồng bộ để tạo tiện ích cho cấu trúc
này. Nếu Timer1 đang hoạt động ở chế độ đếm bất đồng bộ thì hoạt động Reset không thể thực hiện
được.


h. Reset cặp thanh ghi TMR1H, TMR1L của Timer1
Hoạt động reset lúc cấp nguồn POR (Power On Reset) hoặc bất kì reset nào khác không ảnh
hưởng đến hai thanh ghi TMR1H và TMR1L, ngoại trừ khi xảy ra “xung kích” của CCP1 và CCP2 thì
xóa hai thanh ghi về 00H.
Thanh ghi T1CON được reset về 00h Reset lúc cấp nguồn POR hoặc khi Brown-out Reset sẽ xóa thanh ghi T1CON và timer T1 ở
trạng thái ngừng (OFF) và hệ số chia trước là 1:1. Các reset khác thì thanh ghi không bị ảnh hưởng.


Đây là code.


#include <stdio.h>
#include <stdlib.h>
#include <xc.h>
#include <pic16f877a.h>
#define _XTAL_FREQ 4000000
// CONFIG
#pragma config FOSC = XT        // Oscillator Selection bits (XT oscillator)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = OFF      // Brown-out Reset Enable bit (BOR disabled)
#pragma config LVP = OFF        // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF        // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF        // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF         // Flash Program Memory Code Protection bit (Code protection off)

unsigned int Count = 0;

void main(void) {
    TRISCbits.TRISC0 = 0;
    TMR1 = 15535;
    T1CONbits.TMR1CS = 0;
    T1CONbits.T1CKPS1 = 1;
    T1CONbits.T1CKPS0 = 0;
    T1CONbits.T1SYNC = 1;
    T1CONbits.TMR1ON = 1;
    while (1){
        if(PIR1bits.TMR1IF == 1){
            PIR1bits.TMR1IF = 0;
            TMR1 = 15535;
            Count++;
            if(Count==5)
            {
                Count =0;
                PORTCbits.RC0 ^= 1;   //toggle the LED
            }
          }
        }
    }

- Ảnh mô phỏng protues.

timer 1 pic16f877a xc8


- Link download project.

Share this

Related Posts

Previous
Next Post »