Cách sử dụng Counter Timer

Timer vs Counter

Theo dõi các con số và đếm là một trong những suy nghĩ cơ bản của nền văn minh con người. Nó thường được coi là nguồn gốc của toán học. Khi nền văn minh tiến bộ, các phương pháp đếm cũng tiên tiến. Tuy nhiên, nó đã vượt quá khả năng của con người và các phương pháp đã được phát minh để làm cho quá trình tự động.

Với cuộc cách mạng công nghiệp, các bộ đếm cơ học đã được phát triển để được tích hợp vào các máy mới. Từ thế kỷ 20, khi máy móc được phát triển bằng điện tử, máy đếm thời gian và bộ đếm cũng được thực hiện dễ dàng bằng điện tử.

Một mạch logic được thiết kế để đếm số lượng của một sự kiện cụ thể liên quan đến một tín hiệu đồng hồ được gọi là một bộ đếm kỹ thuật số. Bộ đếm là các mạch logic tuần tự sử dụng flip-flops như các khối xây dựng.

Loại quầy đơn giản nhất là các quầy không đồng bộ được thực hiện bằng cách sử dụng flip-flops JK. Chúng sử dụng đầu ra từ một flip-flop JK như là đồng hồ của flip-flop tiếp theo, và điều này tạo ra một hiệu ứng gợn sóng, nơi mà mỗi flip-flop được kích hoạt tại số lượng ngày càng tăng của xung. Điều này cho phép bộ đếm giữ số lượng đếm khi tín hiệu đồng hồ tiếp tục. Theses quầy cũng được gọi là gợn quầy vì chức năng này, và kể từ flip flops được thiết lập hoặc thiết lập lại [các bit dữ liệu thay đổi] tại các vị trí khác nhau họ còn được gọi là quầy không đồng bộ.

Bộ đếm có thể được thiết kế để hoạt động với các bit dữ liệu thay đổi tại cùng một thời điểm trong mỗi flip flop của truy cập. Bộ đếm như vậy được biết đến như là bộ đếm đồng bộ và chúng dùng chung đồng hồ để đạt được chức năng này. Các bộ đếm thập phân là sự điều chỉnh từ hai bộ đếm ở trên, nơi mà các flip-flops hoặc số đếm đăng ký được đặt lại khi cấu hình bit cho 9 có trong các thanh ghi. Trong các quầy lên / xuống, đếm tiến theo thứ tự tăng dần hoặc giảm dần. Các bộ đếm vòng bao gồm một thanh ghi chuyển đổi tròn nơi đầu ra của thanh ghi cuối cùng được đưa trở lại làm đầu vào của thanh ghi đầu tiên.

Thông tin thêm về Timer

Một bộ đếm có thể được thiết lập để đếm khoảng thời gian, chẳng hạn như đồng hồ pulse. Ví dụ, một xung đồng hồ với một chu kỳ nhiệm vụ của 500ms sẽ tính 1s mỗi chu kỳ. Ý tưởng này có thể được mở rộng thành các khoảng thời gian nhỏ hơn hoặc lớn hơn.

Theo dõi thời gian là quan trọng trong mỗi thiết bị; như vậy, hầu như tất cả các thiết bị điện tử có một bộ đếm thời gian phần cứng. Trong máy tính, một bộ đếm thời gian phần cứng được xây dựng sẵn, và cho các mục đích bổ sung, giờ phần mềm được duy trì dựa trên bộ đếm thời gian phần cứng cơ bản.

Một bộ đếm thời gian đặc biệt khác là bộ đếm thời gian theo dõi, đó là bộ đếm thời gian để đặt lại hệ thống tương ứng bất cứ khi nào xảy ra lỗi, sự cố hoặc treo hệ thống.

Sự khác nhau giữa Timer và Counter là gì?

• Một bộ đếm là một thiết bị ghi số lần xuất hiện của một sự kiện cụ thể. Trong các ứng dụng hiện đại, các quầy tính toán dựa trên các thiết bị điện tử và các bộ đếm là mạch logic tuần tự được thiết kế để ghi lại số xung điện được đưa vào bộ đếm.

• Một bộ đếm thời gian là một ứng dụng của các quầy nơi một tín hiệu nhất định với một tần số cố định [do đó giai đoạn] được đếm để ghi lại thời gian.

Chào các bạn trong bài sẽ hướng dẫn về timer của PIC16F877A. Các bạn chú ý đây là 1 trong các module của PIC16F877A và nó cũng rất quan trọng và được sử dụng rất nhiều nên các bạn phải chú  ý để nắm rõ về nó.

Về phần lý thuyết các bạn đọc Datasheet về PIC16F877A 

Các bạn xem clip bên dưới xem cách tính thời gian để khởi tạo timer.

1. Lý thuyết

Bộ timer0/counter0 có những đặc điểm sau:  Là timer/counter 8 bit.

- Có thể đọc và ghi giá trị đếm của timer/counter.

- Có bộ chia trước 8 bit cho phép lập trình lựa chọn hệ số chia bằng phần mềm.

- Cho phép lựa chọn nguồn xung clock bên trong hoặc bên ngoài.

- Phát sinh ngắt khi bị tràn từ FFH về 00H.


- Cho phép lựa chọn tác động xung CK cạnh lên hoặc cạnh xuống.

Sơ đồ khối của timer0 và bộ chia trước với WDT như hình 6-1:

Để sử dụng timer0 thì phải khảo sát chức năng của thanh ghi điều khiển timer là OPTION_REG. 

Cấu hình thanh ghi và chức năng các bit như sau:

Bit 7 RBPU : bit điều khiển điện trở treo của portb.

Bit 6  INTEDG

Bit 5  T0CS: bit lựa chọn nguồn xung cho TMR0 - TMR0 Clock Source Select bit.
1= sẽ đếm xung ngoại đưa đến chân T0CKI.
0= sẽ đếm xung clock nội bên trong.

Bit 4  T0SE: bit lựa chọn cạnh tích cực T0SE - TMR0 Source Edge Select bit.
0= tích cực cạnh lên ở chân T0CKI.
1= tích cực cạnh xuống ở chân T0CKI.

Bit 3  PSA: bit gán bộ chia trước - prescaler assigment.
1= gán bộ chia cho WDT.
0= gán bộ chia Timer0.

Bit 2-0  PS2:PS0: các bit lựa chọn tỉ lệ bộ chia trước - prescaler rate select bits:

PS2PS1PS0TMR0WDT
0001:21:1
0011:41:2
0101:81:4
0111:161:8
1001:321:16
1011:641:32
1101:1281:64
1111:256

1:128

Nếu bit T0CS bằng 1 thì chọn chế độ đếm xung  ngoài Counter. Trong chế độ  đếm xung ngoài thì  xung  đếm  đưa  đến  chân  RA4/T0CKI.  Bit  T0SE  =  0  thì  chọn  cạnh  lên, ngược  lại  thì chọn  cạnh xuống.

Bộ chia trước không thể đọc/ghi có mối quan hệ với Timer0 và Watchdog Timer. 

a.  Ngắt của Timer0

Khi  giá  trị  đếm  trong  thanh  ghi  TMR0  tràn  từ  FFh  về  00h  thì  phát  sinh  ngắt,  cờ  báo  ngắt 

TMR0IF lên 1. Ngắt có thể ngăn bằng bit cho phép ngắt TMR0IE. 

Trong  chương trình con phục vụ ngắt Timer0  phải xóa  cờ báo ngắt  TMR0IF. Ngắt của TMR0 

không thể kích CPU thoát khỏi chế độ ngủ vì bộ định thời sẽ ngừng khi CPU ở chế độ ngủ.

b.  Timer0 đếm xung ngoại

Muốn đếm xung ngoại thì xung được đưa đến ngõ vào T0CKI, việc đồng bộ  tín hiệu xung ngõ vào T0CKI với xung clock bên trong được thực hiện bằng cách lấy mẫu ngõ ra bộ chia ở những chu kì Q2 và Q4 của xung clock bên trong. Điều này  rất cần thiết cho T0CKI ở trạng thái mức cao ít nhất 2 TOSC  và ở trạng thái mức thấp ít nhất 2 TOSC

c.  Bộ chia trước

Bộ chia trước có thể gán cho Timer0 hoặc gán cho Watchdog Timer. Các bit PSA và PS2:PS0 chọn đối tượng gán và tỉ lệ chia. 

Khi được gán cho Timer0 thì tất cả các lệnh ghi cho thanh ghi TMR0 [ví dụ CLRF 1, MOVWF 1, BSF 1, …] sẽ xoá bộ chia trước. 

Khi được gán cho WDT thì lệnh CLRWDT sẽ xoá bộ chia trước cùng với Watchdog Timer. 


Fig. 4-3 The function of the PSA bit 0


2. Timer0


Chúng ta sẽ có công thức tính thời gian để cài đặt cho Timer 0 như sau:

[8bit] 256 = giá trị nạp + [giá trị mong muốn/[tỉ lệ * chu kì lệnh]]

Chu kì lệnh = 4 * chu kì máy

Chu kì máy = 1/ tần số của vdk

VD: Thạch anh 8MHz ~ F=8MHz

B1.

F = 8MHz = 8*10^6 Hz suy ra T = 1/F = 1/8*10^-6 [s]=1/8us

Suy ra: chu kì lệnh = 4*1/OSC = 4*1/8 = 0.5 us

B2. áp dụng công thức trên

256 = giá trị nạp + [giá trị mong muốn/[tỉ lệ chia*chu kì lệnh]]  [us]

với: 

- tỉ lệ chia: 8

- chu kì lệnh: 0.5 us

từ công thức suy ra 

[256 - giá trị nạp] * 8*0.5 = giá trị mong muốn [us]

Chọn giá trị nạp sao cho giá trị mong muốn lớn nhất và là số chia hết cho 1.000.000 us [~1s]

giá trị nạp

giá trị mong muốn 

số lần tràn để được 1 giây

Chọn 6 

1.000 us

1.000.000/1000=1000 lần

Chọn 56

800 us

1000000/800=1250 lần

2. Timer1








Chúng ta sẽ tính toán các thông số để cài đặt cho Timer 1 theo công thức sau : Ví dụ muốn định thời 50ms = 50000us sử dụng prescaler 1:8, Fosc = 4 Mhz thì ta có công thức tính như sau :

GT = 65536 - Tdelay.Fosc/[4.Kprescaler]

Từ công thức trên thay số vào ta được như sau :

GT = 65536 - 50.10^-3.4.10^6.[4/8] = 59286

3. Counter

Hướng dẫn về Counter của Timer 0 của Vi Điều Khiển PIC16F877A dử dụng trình biên dịch PIC C Compiler để viết và biện dịch code.

A.  CÁC LỆNH CỦA TIMER – COUNTER TRONG CCS

Các lệnh của ngôn ngữ lập trình C liên quan đến timer/counter bao gồm

SETUP_TIMER_X[]SET_TIMER_X[]SETUP_COUNTERS[]SETUP_WDT[]RESTART_WDT[] GET_TIMER_X[]

B.  LỆNH SETUP_TIMER_0[MODE] 

Cú pháp:    

setup_timer_0[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 :

RTCC_INTERNAL, RTCC_EXT_H_TO_LRTCC_EXT_L_TO_H
RTCC_DIV_2,  
RTCC_DIV_4,  
RTCC_DIV_8,  
RTCC_DIV_16,  
RTCC_DIV_32, 
RTCC_DIV_64, 
RTCC_DIV_128, 
RTCC_DIV_256.

Các hằng số từ nhiều nhóm khác nhau thì có thể or với nhau.

Chức năng:  Định cấu hình cho TIMER0. 

Có hiệu lực:  cho tất cả các vi điều khiển PIC.

C.  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à code chương trình.


int dem=0;void main[]{ setup_timer_0[RTCC_EXT_L_TO_H|RTCC_DIV_1|RTCC_8_bit];    set_tris_b[0x00];   set_timer0[0];

   lcd_init[];

   while[TRUE]   {      //TODO: User Code      dem = get_timer0[];      lcd_gotoxy[1,1];      lcd_putc[dem/100 + 48];      lcd_putc[[dem%100]/10 + 48];      lcd_putc[[dem%100]%10 + 48];

   }

}


Link download project 
bên dưới phần mô tả video 

Video liên quan

Chủ Đề