Chào các bạn trong bài đăng này mình sẽ giới thiệu với các bạn về chế độ Counter của TIMER 1 PIC16F877A. Chúng ta sẽ đi tìm các lệnh để cấu hình cho TIMER 1 như sau :
1. CÁC LỆNH CỦA TIMER – COUNTER TRONG NGÔN NGỮ
PIC-C
Các lệnh của
ngôn ngữ lập trình C liên quan đến timer/counter bao gồm:
- Lệnh SETUP_TIMER_X()
- Lệnh SET_TIMER_X()
- Lệnh SETUP_COUNTERS()
- Lệnh SETUP_WDT()
- Lệnh RESTART_WDT()
- Lệnh GET_TIMER_X()
2. LỆNH SETUP_TIMER_1(MODE)
- Cú pháp: setup_timer_1(mode)
- Thông số: mode có thể là 1 hoặc 2 hằng số định nghĩa
trong file device.h. Các thông số gồm
T1_DISABLED,
T1_INTERNAL, T1_EXTERNAL, T1_EXTERNAL_SYNC
TC_CLK_OUT,
T1_DIV_BY_1, T1_DIV_BY_2, T1_DIV_BY_4, T1_DIV_BY_8.
Các hằng số từ
nhiều nhóm khác nhau thì có thể or với nhau.
- Chức
năng:
- Khởi tạo cho TIMER1.
- Với tần số thạch anh là 20MHz và khởi tạo T1_DIV_BY_8 thì timer sẽ tăng giá trị sau
mỗi khoảng thời
gian 1.6µs. Timer sẽ tràn sau 104.8576 ms.
- Có hiệu lực: cho tất cả các vi điều khiển PIC có timer 1.
3. LỆNH SET_TIMERx(value)
- Cú pháp: set_timerX(value) ; x là 0, 1, 2
- Thông số: value
là hằng số nguyên 8 hoặc 16 bit dùng để thiết lập giá trị mới cho timer.
- Chức
năng: thiết lập giá trị bắt đầu cho
TIMER.
- Có hiệu lực: cho tất cả các vi điều khiển PIC có timer.
4. LỆNH GET_TIMERx()
- Cú pháp: value = get_timerX() ; x là 0, 1, 2
- Thông số: không có.
- Chức
năng: đọc giá trị của TIMER/COUNTER.
- Có hiệu lực: cho tất cả các vi điều khiển PIC có timer.
- Đây là ảnh mô phỏng protues.
- Đây là code chương trình.
#INCLUDE <16F877a.H>
#FUSES NOWDT,PUT,HS,NOPROTECT,NOLVP
#USE DELAY(CLOCK=16000000)
CONST UNSIGNED CHAR MA7SEG[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80, 0x90};
INT16 DEM;
UNSIGNED CHAR DONVI,CHUC, TRAM, NGHIN;
VOID TACHSO (INT16 COUNT)
{
NGHIN = COUNT/1000;
TRAM = (COUNT - NGHIN*1000)/100;
CHUC = (COUNT - NGHIN*1000 - TRAM*100)/10;
DONVI = COUNT - NGHIN*1000 - TRAM*100 - CHUC*10;
}
VOID DISPLAY ()
{
OUTPUT_B(MA7SEG[NGHIN]);
OUTPUT_HIGH(PIN_D0);
DELAY_MS(5);
OUTPUT_LOW(PIN_D0);
OUTPUT_B(MA7SEG[TRAM]);
OUTPUT_HIGH(PIN_D1);
DELAY_MS(5);
OUTPUT_LOW(PIN_D1);
OUTPUT_B(MA7SEG[CHUC]);
OUTPUT_HIGH(PIN_D2);
DELAY_MS(5);
OUTPUT_LOW(PIN_D2);
OUTPUT_B(MA7SEG[DONVI]);
OUTPUT_HIGH(PIN_D3);
DELAY_MS(5);
OUTPUT_LOW(PIN_D3);
}
VOID MAIN()
{
SET_TRIS_B(0x00);
SET_TRIS_D(0x00);
OUTPUT_B(0);
OUTPUT_D(0);
SETUP_TIMER_1(T1_EXTERNAL | T1_DIV_BY_1);
SET_TIMER1(0);
WHILE(1)
{
DEM = GET_TIMER1();
TACHSO(DEM);
DISPLAY();
IF(DEM==1500)
{
SET_TIMER1(0);
DEM=0;
}
}
}
- Link download project Click here
Cho mình hỏi chân C0 nối với cái gì á ?? Và dùng nó để làm gì ??
ReplyDeleteNối với máy tạo xung, nhờ đó mà liên tục thay đổi điện áp từ VDD xuống 0, tạo ra sự thay đổi mức 0 và 1, cạnh lên (L to H) và cạnh xuống (H to L). Chân C0 là chế độ đếm counter của timer1, tương tự chân A4 cho timer0.
DeleteNối với cái máy tạo xung ? chế độ couter nó đếm xung vào chân C0 ak !
ReplyDeleteĐúng rồi bạn, ở bài này tác giả viết code: cứ 1 xung là counter đếm lên 1, với xung vuông như thế này, 1 chu kì có 2 xung, lên và xuống, nó đếm hết, trong 1 chu kì counter timer1 đếm lên 2, ta có thể để 1 chu kì đếm lên 1 bằng cách thay
DeleteSETUP_TIMER_1(T1_EXTERNAL | T1_DIV_BY_1);
bằng SETUP_TIMER_1(T1_EXTERNAL | T1_DIV_BY_2); // 2 xung đếm lên 1, tương tự cho 4 và 8