2 .GIỚI THIỆU TỔNG QUÁT VỀ PIC16F877A
2.7 HOẠT ĐỘNG ĐỊNH THỜI TIMER
2.7.1 Bộ định thời TIMER0
Bộ định thời/bộ đếm Timer0 có các đặc tính sau : - Bộ định thời / bộ đếm 8 bit .
- Cho phép đọc và ghi .
- Bộ chia 8 bit lập trình được bằng phần mềm . - Chọn xung clock nội hoặc ngoại .
- Chọn cạnh cho xung clock ngoài
Bên dưới là sơ đồ khối của bộ định thời Timer 0 và bộ chia dùng chung với WDT. Chế độ định thời (Timer) được chọn bằng cách xóa bit T0CS ( OPTION_REG<5> ) Trong chế độ định thời , bộ định thời Timer 0 sẽ tăng dần sau mỗi chu kỳ lệnh ( khơng có bộ chia ) . Nếu thanh ghi TMR0 được ghi thì sự tăng sẽ bị ngăn lại sau hai chu kỳ lệnh .
Chế độ đếm(Counter) được chọn bằng cách set bit T0SC ( OPTION_REG<5> ). Trong chế độ đếm , Timer0 sẽ tăng dần ở mỗi cạnh lên hoặc cạnh xuống của chân RA4/T0CKI . Sự tăng cạnh được xác định bởi bit Timer0 Source Edge Select , T0SE (OPTION_REG<4> ) . Bộ chia chỉ được dùng chung qua lại giữa bộ định thời Timer0 và bộ định thời Watchdog . Bộ chia không cho phép đọc hoặc ghi .
Ngắt TMR0 được phát ra khi thanh ghi TMR0 tràn từ FFh đến 00h đối với 8 bit. Sự tràn này sẽ set bit TMR0IF(INTCON<2>). Ngắt này có thể được giấu đi bằng cách xóa đi bit TMR0IE (INTCON<5>) . Bit TMR0IF cần phải được xóa trong chương trình bởi thủ tục phục vụ ngắt của bộ định thời Timer0 trước khi ngắt này được cho phép lại.
Sơ đồ khối của Timer 0 như sau:
Hình 2.18 sơ đồ khối bộ định thời Timer0
Muốn Tmer 0 hoạt động ở chế độ Timer ta clear bit T0SC (OPTION_REG<5>), khi đó giá trị thanh ghi TMR0 sẽ tăng theo từng chu kỳ xung đồng hồ (tần số vào
Timer 0 bằng 1/4 tần số oscillator). Khi giá trị thanh ghi TMR0 từ FFh trở về 00h, ngắt Timer 0 sẽ xuất hiện.
Thanh ghi TMR0 cho phép ghi va xoa được giúp ta ấn định thời điểm ngắt Timer 0 xuất hiện một cách linh động . Muốn Timer 0 hoạt đọng o chế độ counter ta set bit T0CS (OPTION_REG<5>). Khi đó xung tác động lên bộ đếm được lấy từ chân RA4/T0CKI. Bit T0SE (OPTIN_REG<4>) cho phép lựa chọn cạnh tác động vào bộ đếm. Cạnh tác động sẽ là cạnh lên nếu T0SE = 0 và cạnh tác động sẽ là cạnh xuống nếu T0SE = 1.
Khi thanh ghi TMR0 bị tràn, bit TMR0IF (INTCON<2>) sẽ được set. Đây chính là cờ ngắt của Timer 0. Cờ ngắt này phải được xóa bằng chương trình trước khi bộ đếm bắt đầu thực hiện lại quá trình đếm .NGắt Timer 0 khơng thể đánh thức vi điều khiển từ chế độ sleep
Bộ chia tần số (prescaler) được chia sẻ giữa Timer 0 và WDT (Watchdog Timer). Điều đó có nghĩa là nếu bộ chia tần số được sử dụng cho timer 0 thì WDT sẽ khơng có hỗ trợ của bộ chia tần số và ngược lại. Bộ chia tần số được điềi khiển bởi thanh ghi OPTION_REG. Bit PSA (OPTION_REG<3>) xác định đối tượng tác động của bộ chia tần số. Các bit PS2:PS0 (OPTION_REG<2:0>) xác định tỉ số của bộ chia tần số. Các lệnh tác động lên giá trị thanh ghi TMR0 sẽ xóa chế độ hoạt động của bộ chia tần số.
Các thanh ghi điều khiển liên quan đến Timer 0 bao gồm : TMR0 (địa chỉ 01h,101h) : chứa giá trị đếm của Timer 0. INTCON (địa chỉ 0Bh,8Bh,10Bh,18Bh)):cho phép ngắt hoạt . OPTION_REG (địa chỉ 81h,181h) : điều khiển bộ chia tần số.
Hình 2.19 Các thanh ghi liên quan đến bộ định thời Timer0
2.7.2 Bộ định thời TIMER1
Bộ định thời Timer1 là một bộ định thời/bộ đếm 16 bit gồm hai thanh ghi TMR1H ( byte cao ) và TMR1L ( byte thấp ) mà có thể đọc hoặc ghi . Cặp thanh ghi
này tăng số đếm từ 0000h đến FFFFh và một tràn sẽ xuất hiện khi có sự chuyển số đếm từ FFFFh xuống 0000h . Ngắt, nếu được phép có thể phát ra khi có số đếm tràn và được đặt ở bit cờ ngắt TMR1IF. Ngắt có thể được phép hoặc cấm bằng cách đặt hoặc xóa bit cho phép ngắt TMR1IE.
Bộ định thời Timer1 có thể được cấu hình để hoạt động một trong hai chế độ sau: - Định thời một khoảng thời gian ( Timer )
- Đếm sự kiện ( Counter )
Việc lựa chọn một trong hai chế độ được xác định bằng cách đặt hoặc xóa bit chọn clock TMR1CS. Trong chế độ định một khoảng thời gian, bộ định thời tăng số đếm lên sau mỗi chu kỳ lệnh. Trong chế độ đếm sự kiện, bộ định thời tăng sau mỗi cạnh lên của clock ngoài đặt vào. Bộ định thời 1 có thể được phép hoặc cấm bằng cách đặt hoặc xóa bit điều khiển TMR1ON.
Hình 2.20 T1CON: Thanh ghi điều khiển Timer1
Hình 2.21 Sơ đồ khối Timer1
Ngồi ra Timer 1 cịn có chức năng reset input bên trong được điều khiển bởi một trong hai khối CCP (Capture/Compare/PWM).Khi set bit T1OSCEN thì Timer 1 sẽ lấy xung clock từ hai chân RC/T1OSI/CCP2 và RC0/T1OSO/T1CKI làm xung đếm. Timer 1 sẽ bắt đầu đếm sau cạnh xuống đầu tiên của xung ngõ vào. Khi đó PORTC sẽ bỏ qua sự tác động của hai bit TRISC<1:0> và PORTC<2:1> được gán giá trị 0 . Khi
clear bit T1OSCEN Timer 1 sẽ lấy xung đếm từ oscillator hoặc từ chân RC0/T1OSO/T1CKI.
Timer 1 có hai chế độ đếm là đồng bộ (Synchronous) và bất đồng bộ (Asynchronous). Chế độ đếm được quyết định bởi bit điều khiển T1SYNC (T1CON<2>).
Khi T1SYNC = 1 xung đếm lấy từ bên ngoài sẽ khơng được đồng bọ hóa với xung clock bên trong, Timer 1 sẽ tiếp tục quá trình đếm vi điều khiển đang ở chế độ sleep và ngắt do Timer tạo ra khi bi tràn có khả năng đánh thức vi điều khiển. Ở chế độ đếm bất địng bộ, Timer 1 khơng thể được sử dụng để làm nguồn xung clock cho khói CCP (Capture/Compare/Pulse width modulation).
Khi T1SYNC = 0 xung đếm vào Timer 1 sẽ được đồng bộ hóa với xung clock bên trong. Ở chế độ này Timer 1 sẽ không hoat động khi vi điều khiẻn đang ở chế độ sleep.
Các thanh ghi liên quan đến Timer 1 bao gồm:
INTCON (địa chỉ 0Bh, 8Bh,10Bh, 18Bh) : cho phép ngắt hoạt động. PIR1 (địa chỉ 0Ch): chứa cờ ngắt Timer 1 (TMR1IF).
PIE1 (địa chỉ 8Ch): cho phép ngắt Timer 1 (TMR1IE).
TMR1L (địa chỉ 0Eh): chứa giá trị 8 bít thấp của bộ đếm Timer 1. TMR1H (địa chỉ 0Fh): chứa giá trị 8 bít cao của bộ đếm Timer 1. T1CON (địa chỉ 10h): xác lập các thông số cho Timer 1.
Hình 2.22 Các thanh ghi liên quan đến bộ định thời Timer1
2.7.3 Bộ định thời TIMER2
Bộ định thời Timer2 là bộ định thời 8 bit với một bộ chia và một bộ Postscaler. Nó thường được dùng chung với bộ CCP trong chế độ PWM ( sẽ được đề cập ở phần
sau ). Thanh ghi TMR2 có thể đọc hoặc ghi và được xóa khi có bất kỳ tín hiệu reset nào của thiết bị.
Bộ định thời Timer2 có một thanh ghi chu kỳ 8 bit. Bộ định thời tăng số đếm lên từ 00h đến giá trị được ghi trong thanh ghi TR2 và sau đó reset lại giá trị 00h trong chu kỳ kế tiếp. PR2 là thanh ghi có thể đọc hoặc ghi.Giá trị trùng hợp trong thanh ghi TMR2 được đi qua bộ postscaler 4 bit để phát ra một ngắt TMR2(được đặt ở bit cờ ngắt TMR2IF). Bộ định thời 2 có thể được tắt ( không hoạt động ) bằng cách xóa bit điều khiển TMR2ON để giảm thiểu cơng suất tiêu tán nguồn.
Hình 2.23 T2CON: Thanh ghi điều khiển Timer2
Hình 2.24 Sơ đồ khối của bộ định thời Timer2
Hình 2.25 Các thanh ghi liên quan đến bộ định thời Timer2