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
4 nhận xét
Write nhận xétCho mình hỏi chân C0 nối với cái gì á ?? Và dùng nó để làm gì ??
ReplyNối với cái máy tạo xung ? chế độ couter nó đếm xung vào chân C0 ak !
ReplyNố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.
ReplyĐú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
ReplySETUP_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
EmoticonEmoticon