Wednesday 28 November 2018

Bài 3. Bộ Timer/Counter (T/C)

Giới thiệu

8051 vi điều khiển có hai bộ đếm thời gian / bộ đếm làm việc trên tần số đồng hồ. Bộ đếm thời gian / bộ đếm có thể được sử dụng để tạo thời gian trễ, tính các sự kiện bên ngoài, v.v.

Đồng hồ 

Mỗi Timer cần một đồng hồ để làm việc, và 8051 cung cấp nó từ một tinh thể bên ngoài là nguồn đồng hồ chính cho Timer. Mạch nội bộ trong bộ vi điều khiển 8051 cung cấp nguồn đồng hồ cho bộ đếm thời gian là 1/12 tần số của tinh thể gắn với vi điều khiển, còn được gọi là tần số chu trình máy.

Đồng hồ hẹn giờ 8051
Ví dụ, giả sử chúng ta có tần số tinh thể là 11,0592 MHz thì vi điều khiển sẽ cung cấp 1/12
Tần số đồng hồ hẹn giờ = (Xtal Osc.frequency) / 12 = (11,0592 MHz) / 12 = 921,6 KHz
 thời gian T = 1 / (921,6 KHz) = 1,085 μS

Bộ hẹn giờ

8051 có hai bộ hẹn giờ Timer0 (T0) và Timer1 (T1), cả hai đều rộng 16 bit. Vì 8051 có kiến ​​trúc 8 bit, mỗi kiến ​​trúc này được truy cập bởi hai thanh ghi 8 bit riêng biệt như trong hình bên dưới. Các thanh ghi này được sử dụng để tải số đếm thời gian.
8051 Đăng ký hẹn giờ

8051 có Timer Mode Register và Timer Control Register để chọn một chế độ hoạt động và mục đích điều khiển.
Hãy xem những thanh ghi này,
Đăng ký TMOD
TMOD là thanh ghi 8 bit được sử dụng để đặt chế độ hẹn giờ của timer0 và timer1.
Đăng ký TMOD 8051
4 bit thấp hơn của nó được sử dụng cho Timer0 và 4 bit trên được sử dụng cho Timer1
Bit 7,3 - GATE:
          1 = Chỉ bật hẹn giờ / bộ đếm khi pin INT0 / INT1 cao và TR0 / TR1 được đặt.
          0 = Kích hoạt Timer / Counter khi TR0 / TR1 được thiết lập.
Bit 6,2 - C / \ bar {T}(Counter / Timer): Bộ chọn Timer hoặc Counter bit
           1 = Sử dụng làm bộ đếm
           0 = Sử dụng làm Bộ hẹn giờ
Bit 5: 4 & 1: 0 - M1: M0: Chọn chế độ hẹn giờ / bộ đếm bit
Đây là bit lựa chọn chế độ Timer / Counter theo bảng bên dưới
M1
M0
Chế độ
Hoạt động
0
0
0 (chế độ hẹn giờ 13 bit)
Bộ đếm thời gian / bộ đếm 13 bit, 8 bit của THx và 5 bit của TLx
0
1
1 (chế độ hẹn giờ 16 bit)
Bộ đếm thời gian / bộ đếm 16 bit, THx xếp chồng với TLx
1
0
2 (chế độ tải lại tự động 8 bit)
Bộ đếm thời gian / bộ đếm 8 bit (chế độ tải lại tự động), tải lại TLx với giá trị được giữ bởi THx mỗi lần tràn TLx
1
1
3 (chế độ hẹn giờ tách)
Tách bộ đếm thời gian 16 bit thành hai bộ đếm thời gian 8 bit, tức là THx và TLx như hai bộ hẹn giờ 8 bit

Đăng ký TCON
8051 TCON Đăng ký
TCON là thanh ghi điều khiển 8 bit và chứa cờ hẹn giờ và cờ ngắt.
Bit 7 - TF1: Cờ tràn Timer1
        1 = tràn Timer1 xảy ra (tức là Timer1 đi tới mức tối đa của nó và cuộn ngược về 0).
        0 = tràn Timer1 không xảy ra.
Nó được xóa thông qua phần mềm. Trong thói quen dịch vụ ngắt tràn Timer1, bit này sẽ tự động xóa khi thoát khỏi ISR.
Bit 6 - TR1: Timer1 Chạy Bit điều khiển
         1 = Timer1 bắt đầu.
         0 = Dừng Timer1.
Nó được thiết lập và xóa bởi phần mềm.
Bit 5 - TF0: Cờ tràn Timer0
          1 = tràn Timer0 xảy ra (tức là Timer0 đi tới mức tối đa của nó và cuộn ngược về 0).
          0 = tràn Timer0 không xảy ra.
Nó được xóa thông qua phần mềm. Trong thói quen dịch vụ ngắt tràn Timer0, bit này sẽ tự động xóa khi thoát khỏi ISR.
Bit 4 - TR0: Timer0 Chạy Bit điều khiển
           1 = Timer0 bắt đầu.
           0 = Dừng Timer0.
Nó được thiết lập và xóa bởi phần mềm.
Bit 3 - IE1: External Interrupt1 Cạnh cờ
            1 = Ngắt bên ngoài1 xảy ra.
            0 = External interrupt1 Đã xử lý.
Nó được thiết lập và xóa bằng phần cứng.
Bit 2 - IT1: External Interrupt1 Loại trình kích hoạt Chọn bit
            1 = Ngắt xảy ra trên cạnh rơi tại chân INT1.
            0 = Ngắt xảy ra ở mức thấp ở chân INT1.
Bit 1 - IE0: External Interrupt0 Cạnh cờ
            1 = Đã xảy ra ngắt ngoài.
            0 = External interrupt0 Đã xử lý.
Nó được thiết lập và xóa bằng phần cứng.
Bit 0 - IT0: Ngắt ngoài 0 Loại trình kích hoạt Chọn bit
            1 = Ngắt xảy ra trên cạnh rơi tại chân INT0.
            0 = Ngắt xảy ra ở mức thấp ở chân INT0.

Hãy xem các chế độ hẹn giờ
Chế độ hẹn giờ
Bộ hẹn giờ có chế độ hoạt động của chúng được chọn trong thanh ghi TMOD bằng cách sử dụng các kết hợp bit M0 & M1.

Chế độ 0 (chế độ hẹn giờ 13 bit)

Chế độ 0 là chế độ hẹn giờ 13 bit, trong đó 8 bit của THx và 5-bit của TLx (như là bộ đếm chuẩn) được sử dụng. Nó được sử dụng chủ yếu cho interfacing có thể với MCS-48 gia đình vi điều khiển cũ.
8051 Chế độ hẹn giờ0

Như thể hiện trong hình trên, 8-bit của THx và thấp hơn 5-bit của TLx được sử dụng để tạo thành một bộ đếm thời gian tổng cộng 13-bit. Cao hơn 3 bit của TLx nên được viết bằng không khi sử dụng chế độ hẹn giờ0, hoặc nó sẽ ảnh hưởng đến kết quả.

Thí dụ
Hãy tạo ra một làn sóng vuông của khoảng thời gian 2mSec bằng cách sử dụng một vi điều khiển AT89C51 với timer0 trong mode0 trên pin P1.0 của port1. Giả sử tần số dao động xtal là 11.0592 MHz.
8051 Mode0 Ví dụ sóng

Khi tần số dao động Xtal là 11.0592 MHz, chúng ta có chu kỳ máy là 1.085uSec. Do đó, yêu cầu tính để tạo ra sự chậm trễ của 1mSec. Là,
                                        Đếm = (1 × 10 ^ -3) / (1,085 × 10 ^ -6) ≈ 921
Số lượng tối đa của Mode0 là 2 ^ 13 (0 - 8191) và số đếm Timer0 sẽ tăng từ 0 - 8191. Vì vậy, chúng tôi cần tải giá trị nhỏ hơn 921 so với số tối đa tức là 8191. Ngoài ra, ở đây trong chương trình dưới đây, chúng ta cần thêm 13 MC (chu trình máy) từ cuộc gọi đến hàm trả về trễ. Do đó giá trị cần thiết để được tải là,
                                 Giá trị = (8191-Count) + Function_MCycles + 1 = 7284 = 0x1C74
Vì vậy, chúng ta cần tải giá trị 0x1C74 trong Timer0.
1C74 = 000 1 1100 0111 0100 b, bây giờ tải thấp hơn 5-bit trong TL0 và tiếp theo 8-bit trong TH0
ở đây chúng tôi nhận được,
TL0 = 000 1 0100 = 0x14 và TH0 = 1110 0011 = 0xE3

Các bước lập trình cho chức năng trì hoãn

  1. Tải giá trị đăng ký Tmod tức là TMOD = 0x00 cho Timer0 / 1 mode0 (chế độ hẹn giờ 13 bit).
  2. Tải giá trị THx được tính toán tức là ở đây TH0 = 0xE3.
  3. Tải giá trị TLx được tính toán ở đây TL0 = 0x14.
  4. Bắt đầu hẹn giờ bằng cách đặt bit TRx. tức là ở đây TR0 = 1.
  5. Phiếu thăm dò ý kiến ​​TFx cờ cho đến khi nó không được thiết lập.
  6. Dừng hẹn giờ bằng cách xóa bit TRx. tức là ở đây TR0 = 0.
  7. Xóa cờ hẹn giờ TFx bit tức là ở đây TF0 = 0.
  8. Lặp lại từ bước 1 đến bước 7 để hoãn lại.

Chương trình cho chế độ hẹn giờ0


#include <reg51.h>   /* Include x51 header file */
sbit test = P1^0;   /* set test pin 0 of port1 */ 

void timer_delay()   /* Timer0 delay function */
{
 TH0 = 0xE3;   /* Load 8-bit in TH0 (here Timer0 used) */
 TL0 = 0x14;   /* Load 5-bit in TL0 */
 TR0 = 1;   /* Start timer0 */
 while(TF0 == 0);  /* Wait until timer0 flag set */
 TR0 = 0;   /* Stop timer0 */
 TF0 = 0;   /* Clear timer0 flag */
}
void main()
{
 TMOD = 0x00;   /* Timer0/1 mode0 (13-bit timer mode) */
 while(1)
 {
  test = ~test;  /* Toggle test pin */
  timer_delay();  /* Call timer0 delay */
 }
}

Mode1 (chế độ hẹn giờ 16 bit)

Chế độ 1 là chế độ hẹn giờ 16 bit được sử dụng để tạo ra độ trễ, nó sử dụng 8 bit bit THx và 8 bit của TLx để tạo thành thanh ghi 16 bit tổng.
Chế độ hẹn giờ 801

Thí dụ
Hãy tạo ra một làn sóng vuông của khoảng thời gian 2mSec bằng cách sử dụng một vi điều khiển AT89C51 với timer0 trong mode1 trên pin P1.0 của port1. Giả sử tần số dao động Xtal là 11.0592 MHz.
  
Làn sóng ví dụ Mode1 8051
Vì Xtal là 11.0592 MHz, chúng ta có chu kỳ máy là 1.085uSec.
Do đó, yêu cầu tính để tạo ra sự chậm trễ của 1mSec. Là,
                                              Đếm = (1 × 10 ^ (- 3)) / (1,085 × 10 ^ (- 6)) ≈ 921 
Và mode1 có số lượng tối đa là 2 ^ 16 (0 - 65535) và nó tăng từ 0 lên 65535 vì vậy chúng tôi cần tải giá trị nhỏ hơn 921 so với giá trị tối đa của nó. đếm tức là 65535. Ngoài ra, ở đây trong chương trình dưới đây, chúng ta cần thêm 13 MC (chu trình máy) từ cuộc gọi đến trả về chức năng trễ. Do đó giá trị cần thiết để được tải là,
                              Giá trị = (65535-Count) + Function_MCycles + 1 = 64615 = (FC74) Hex
Vì vậy, chúng tôi cần tải FC74 giá trị Hex cao hơn byte trong TH0 và byte thấp hơn trong TL0 như,
TH0 = 0xFC & TL0 = 0x74

Các bước lập trình cho chức năng trì hoãn

  1. Tải giá trị đăng ký Tmod tức là TMOD = 0x01 cho Timer0 mode1 (chế độ hẹn giờ 16 bit).
  2. Tải giá trị THx được tính toán tức là ở đây TH0 = 0xFC.
  3. Tải giá trị TLx tính toán tức là ở đây TL0 = 0x74.
  4. Bắt đầu hẹn giờ bằng cách đặt bit TRx. tức là ở đây TR0 = 1.
  5. Phiếu thăm dò ý kiến ​​TFx cờ cho đến khi nó không được thiết lập.
  6. Dừng hẹn giờ bằng cách xóa bit TRx. tức là ở đây TR0 = 0.
  7. Xóa cờ hẹn giờ TFx bit tức là ở đây TF0 = 0.
  8. Lặp lại từ bước 1 đến bước 7 để hoãn lại.

Chương trình cho chế độ hẹn giờ1


#include <reg51.h>  /* Include x51 header file */
sbit test = P1^0;  /* set test pin0 of port1 */ 

void timer_delay()  /* Timer0 delay function */
{
 TH0 = 0xFC;  /* Load higher 8-bit in TH0 */
 TL0 = 0x74;  /* Load lower 8-bit in TL0 */
 TR0 = 1;  /* Start timer0 */
 while(TF0 == 0); /* Wait until timer0 flag set */
 TR0 = 0;  /* Stop timer0 */
 TF0 = 0;  /* Clear timer0 flag */
}
void main()
{
 TMOD = 0x01;  /* Timer0 mode1 (16-bit timer mode) */
 while(1)
 {
  test = ~test; /* Toggle test pin */
  timer_delay(); /* Call timer0 delay */
 }
}

Mode2 (chế độ hẹn giờ tự động tải lại 8 bit)

Chế độ 2 là chế độ hẹn giờ tự động tải lại 8 bit. Trong chế độ này, chúng tôi chỉ tải giá trị bit THx-8. khi Timer được bắt đầu, giá trị THx được tự động mã hóa vào TLx và TLx bắt đầu đếm từ giá trị đó. Sau khi giá trị của TLX tràn từ 0xFF đến 0x0, cờ TFx được thiết lập và một lần nữa giá trị từ THx được tự động nạp vào thanh ghi TLx. Đó là lý do tại sao điều này được gọi là chế độ tải lại tự động.
                                           
8051 Timer Mode2 Tự động Nạp lại

Thí dụ
Ở đây chúng tôi đang tạo ra một làn sóng vuông trên PORT1.0 với 200uSec. khoảng thời gian sử dụng Timer1 ở chế độ 2. Chúng tôi sẽ sử dụng tần số dao động Xtal 11.0592 MHz.
Làn sóng ví dụ Mode2 8051
Vì Xtal là 11.0592 MHz, chúng ta có chu kỳ máy là 1.085uSec. Do đó, yêu cầu tính để tạo ra sự chậm trễ của 1mSec. Là,
                                         Đếm = (100 × 10 ^ (- 6)) / (1,085 × 10 ^ (- 6)) ≈92 
Và chế độ 2 có số lượng tối đa là 2 ^ 8 (0 - 255) và nó tăng từ 0 - 255 vì vậy chúng tôi cần tải giá trị nhỏ hơn 92 so với giá trị tối đa của nó. đếm tức là 255. Do đó giá trị cần phải được tải là,
                                          Giá trị = (255-Count) +1 = 164 = 0xA4
Vì vậy, chúng tôi cần tải giá trị Hex A4 ở byte cao hơn,
TH1 = 0xA4

Các bước lập trình cho chức năng trì hoãn

  1. Tải giá trị đăng ký Tmod tức là TMOD = 0x20 cho Timer1 mode2 (chế độ tải lại tự động hẹn giờ 8 bit).
  2. Tải giá trị THx được tính toán ở đây TH1 = 0xA4.
  3. Tải cùng một giá trị cho TLx tức là ở đây TL1 = 0xA4.
  4. Bắt đầu hẹn giờ bằng cách đặt bit TRx. tức là ở đây TR1 = 1.
  5. Phiếu thăm dò ý kiến ​​TFx cờ cho đến khi nó không được thiết lập.
  6. Xóa cờ hẹn giờ TFx bit tức là ở đây TF1 = 0.
  7. Lặp lại từ bước 5 và 6 để hoãn lại.

Chương trình cho chế độ hẹn giờ 2


#include <reg51.h>   /* Include x51 header file */
sbit test = P1^0;   /* set test pin0 of port1 */ 

void main()
{
 TMOD = 0x20;   /* Timer1 mode2 (8-bit auto reload timer mode) */
 TH1 = 0xA4;   /* Load 8-bit in TH1 */
 TL1 = 0xA4;   /* Load 8-bit in TL1 once */
 TR1 = 1;   /* Start timer1 */
 while(1)
 {
  test = ~test;  /* Toggle test pin */
  while(TF1 == 0); /* Wait until timer1 flag set */
  TF1 = 0;  /* Clear timer1 flag */
 }
}

Hẹn giờ ngắt trong 8051

8051 có hai ngắt thời gian được gán với địa chỉ vector khác nhau. Khi bộ đếm thời gian cuộn lên từ giá trị tối đa của nó đến 0, nó đặt bộ đếm thời gian cờ TFx. Điều này sẽ làm gián đoạn vi điều khiển 8051 để phục vụ ISR (thường xuyên dịch vụ ngắt) nếu ngắt toàn cầu và hẹn giờ được bật.
Nguồn ngắt
Địa chỉ vector
Tràn bộ đếm thời gian 0 (TF0)
000BH
Tràn bộ đếm thời gian 1 (TF1)
001BH

Ngắt tràn bộ đếm thời gian được gán với địa chỉ vectơ được hiển thị trong bảng. Bộ vi điều khiển 8051 nhảy trực tiếp đến địa chỉ vectơ khi xảy ra sự gián đoạn corrosponding.

Ngắt hẹn giờ 8051

Thí dụ
Ở đây chúng ta sẽ tạo ra một làn sóng vuông 10Hz trên PORT1.0 sử dụng ngắt Timer0. Chúng ta sẽ sử dụng Timer0 trong mode1 với tần số dao động 11.0592 MHz.
                                                      
Làn sóng ví dụ gián đoạn 8051
Vì Xtal là 11.0592 MHz, chúng ta có chu kỳ máy là 1.085uSec. Do đó, yêu cầu tính để tạo ra một sự chậm trễ 50mSec. Là,
                                        Đếm = (50 × 10 ^ (- 3)) / (1,085 × 10 ^ (- 6)) ≈ 46080 
Và mode1 có số lượng tối đa là 2 ^ 16 (0 - 65535) và nó tăng từ 0 - 65535 vì vậy chúng tôi cần tải giá trị nhỏ hơn 46080 so với giá trị tối đa của nó. đếm tức là 65535. Do đó giá trị cần phải được tải là,
                                         Giá trị = (65535-Count) +1 = 19456 = (4C00) Hex
Vì vậy, chúng tôi cần tải giá trị Hex 4C00 ở byte cao hơn và byte dưới càng cao,
TH0 = 0x4C & TL0 = 0x00
Lưu ý rằng cờ TF0 không cần phải xóa bằng phần mềm vì vi điều khiển sẽ xóa nó sau khi hoàn thành thường trình ISR.
  Chương trình gián đoạn hẹn giờ

#include<reg51.h>  /* Include x51 header file */
sbit test = P1^0;  /* set test pin0 of port1 */

void Timer_init()
{
 TMOD = 0x01;  /* Timer0 mode1 */
 TH0 = 0x4C;  /* 50ms timer value */
 TL0 = 0x00;      
 TR0 = 1;          /* Start timer0 */
}


void Timer0_ISR() interrupt 1 /* Timer0 interrupt service routine (ISR) */
{
 test = ~test;    /* Toggle port pin */
 TH0 = 0x4C;       /* 50ms timer value */
 TL0 = 0x00;      
}

int main(void)
{
 EA  = 1;          /* Enable global interrupt */
 ET0 = 1;          /* Enable timer0 interrupt */
 Timer_init();
   while(1);
}

No comments:

Post a Comment