Thursday, January 14, 2016

BÀI 25 : COUNTER CỦA TIMER 1 PIC16F877A CCS

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.

counter timer 1 pic16f877a ccs

- Đâ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 comments:

  1. Cho mình hỏi chân C0 nối với cái gì á ?? Và dùng nó để làm gì ??

    ReplyDelete
    Replies
    1. Nố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.

      Delete
  2. Nối với cái máy tạo xung ? chế độ couter nó đếm xung vào chân C0 ak !

    ReplyDelete
    Replies
    1. Đú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
      SETUP_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

      Delete