PCA là một cải tiến đáng kể đối với những vi điều khiển họ 8051. Dải đếm này bao gồm một timer 16-bit và 5 module hỗ trợ. Các ngõ ra của module được ký hiệu lần lượt là CEX0 đến CEX4 tương ứng với các chân P1.3 đến P1.7. Các module này cĩ thể được lập trình để hoạt động ở 1 trong 4 chức năng: Capture 16-bit, Timer 16-bit, High-speed output 16-bit, PWM 8-bit. Riêng module 4 cĩ thêm chức năng Watchdog timer.
Hình 2.15: PCA Modules
Để hỗ trợ PCA, các vi điều khiển họ 8051 được bổ sung thêm một số thanh ghi sau:
Thanh ghi CH và CL (địa chỉ lần lượt là F9H và E9H): hai thanh ghi
chứa byte cao, byte thấp của timer 16-bit PCA (tương tự như thanh ghi TH0, TL0 của timer 0 và TH1, TL1 của timer 1.
(n=0..4)(địa chỉ từ EAH và EEH):thanh ghi chứa byte cao, byte thấp của giá trị cần nạp cho mỗi module.
Thanh ghi CMOD:(địa chỉ D9H, khơng định địa chỉ bit, giá trị reset: 00H)
Bit 7 6 5 4 3 2 1 0
Ký hiệu CIDL WDTE - - - CPS1 CPS0 ECF
Bảng 2.3Thanh ghi CMOD
BIT Ký hiệu Chức năng
7 CIDL Counter Idle Control. CIDL = 1 sẽ cho phép PCA dừng khi
8051 vào chế độ Idle, ngược lại CIDL = 0 buộc PCA vẫn tiếp tục hoạt động.
6 WDTE Watchdog timer enable. Set bit này lên 1 để enable chức năng Watchdog timer của module 4. Ngược lại sẽ disable.
5 ÷ 3 - Bit dự trữ
2 CPS1 Count Pulse Select 1. Bit cao chọn nguồn xung nhịp cho PCA
1 CPS0 Count Pulse Select 0. Bit thấp chọn nguồn xung nhịp cho PCA
0 ECF PCA Enable Counter Overflow Interrupt. Nếu set bit này lên 1
Bảng 2.4: Tĩm tắt chức năng các bit của thanh ghi CMOD
CPS1 CPS0 Nguồn xung cho PCA
0 0 1 1 0 1 0 1
0, Xung nhịp bên trong, fOSC/6 1, Xung nhịp bên trong, fOSC/2 2, Tốc độ tràn Timer 0
3, Xung nhịp ngồi được cấp tại chân ECI/P1.2 (tối đa là fOSC/4)
Bảng 2.5: Chọn nguồn xung nhịp cho PCA
Thanh ghi CCON:(địa chỉ D8H, cĩ định địa chỉ bit, giá trị reset: 00H)
Bit 7 6 5 4 3 2 1 0
Ký hiệu CF CR - CCF4 CCF3 CCF2 CCF1 CCF0
BIT Ký hiệu Chức năng 7 6 5 4 3 2 1 0 CF CR - CCF4 CCF3 CCF2 CCF1 CCF0
PCA counter overflow flag. Khi bộ đếm bị tràn, CF tự động được set lên 1. Nếu bit ECF của thanh ghi CMOD đã được set trước đĩ, CF =1 sẽ tạo ra ngắt.
PCA counter run control. Bật tắt PCA counter. Bit dự trữ Cờ ngắt module 4. Cờ ngắt module 3. Cờ ngắt module 2. Cờ ngắt module 1. Cờ ngắt module 0.
Bảng 2.7: Tĩm tắt chức năng các bit của thanh ghi CCON Lưu ý:các cờ ngắt trong thanh ghi CCON cần phải được xĩa bằng phần mềm.
Thanh ghi CCAPMn (n=0..4):(địa chỉ lần lượt từ DAH đến DEH, khơng định
địa chỉ bit, giá trị reset: 00H)
Bit 7 6 5 4 3 2 1 0
Ký hiệu - ECOMn CAPPn CAPNn MATn TOGn PWMn ECCFn
Bảng 2.8Thanh ghi CCAPM
Đây là thanh ghi điều khiển hoạt động của các module. Chế độ hoạt động của mỗi module sẽ được xác định bằng cách tác động vào các bit thuộc các thanh ghi này. Chức năng của các bit thuộc thanh ghi CCAPMn được mơ tả trong bảng sau:
BIT Ký hiệu Mơ tả
7 6
- ECOMn
Bit dự trữ
Enable Comparator. ECOMn = 1 sẽ kích hoạt chức năng so sánh 5 CAPPn Capture Positive. CAPPn = 1 sẽ cho phép capture khi cĩ cạnh lên
tại chân CEXn.
4 CAPNn Capture Negative. CAPNn = 1 sẽ cho phép capture khi cĩ cạnh xuống tại chân CEXn.
3 MATn Match. Nếu MATn = 1, khi giá trị bộ đếm PCA (CH,CL) bằng giá trị nạp trong thanh ghi (CCAPnH,CCAPnL) sẽ làm cho bit CCFn trong thanh ghi CCON lên 1, nhờ đĩ tạo ra ngắt.
2 TOGn Toggle. Nếu TOGn = 1, khi giá trị bộ đếm PCA (CH,CL) bằng giá trị nạp trong thanh ghi (CCAPnH,CCAPnL) sẽ làm cho ngõ ra của module CEXn đổi trạng thái.
1 PWMn Pulse Width Modulation. PWMn = 1 sẽ làm cho CEXn là một ngõ ra điều xung.
0 ECCFn Enable CCFn Interrupt. ECCFn = 1, mỗi khi CCFn trong thanh ghi CCON =1 sẽ tạo ra ngắt.
Bảng 2.9: Tĩm tắt chức năng các bit của thanh ghi CCAPMn
Sử dụng các ngắt PCA
Các bit cờ ngắt PCA tập trung hồn tồn trong thanh ghi CCON. Bit CF = 1 khi bộ đếm tràn, CCFn = 1 khi cĩ capture/match tại CEXn. Muốn sử dụng được ngắt cần phải set bit cho phép ngắt tồn bộ (IE.7, ký hiệu EA), cho phép ngắt PCA (IE.6, kí hiệu EC) và set các bit cho phép từng module tạo ngắt (ECF, ECCFn).
Các chế độ hoạt động của module PCA
PCA 16-bit Capture
Để cĩ thể sử dụng chức năng Capture, một trong hai bit hoặc cả hai bit CAPPn và CAPNn trong thanh ghi CCAPMn phải được set lên 1. Các chân CEXn, được lấy mẫu và khi cĩ cạnh lên/ cạnh xuống tại chân CEXn, 8051 sẽ nạp giá trị (CH,CL) vào cặp thanh ghi (CCAPnH,CCAPnL), đồng thời nĩ cũng làm cho bit CCFn lên 1.
Hình 2.17: PCA hoạt động ở chế độ 16-bit Capture
Trong trường hợp bit cho phép ngắt ECCFn trong thanh ghi CCAPMn được set lên 1, mỗi lần capture sẽ tạo ra ngắt.
PCA 16-bit timer
Các module PCA cũng cĩ thể được sử dụng như những timer bằng cách set hai bit ECOMn và MATn thuộc thanh ghi CCAPMn lên 1. Giá trị của timer PCA (CH,CL) được so sánh với giá trị cặp thanh ghi của module (CCAPnH,CCAPnL). Khi
2 giá trị này bằng nhau sẽ làm cho các bit CCFn lên 1. Nếu bit ECCFn = 1 sẽ tạo ra ngắt ở module tương ứng.
Hình 2.18: PCA hoạt động ở chế độ 16-bit timer
High-speed output
Ở chế độ này, ngõ ra CEXn được điều khiển bởi PCA. Khi giá trị (CH,CL) bằng giá trị (CCAPnH,CCAPnL) sẽ làm cho chân CEXn đổi trạng thái. Chế độ này được kích hoạt bằng cách set các bit ECOMn, MATn, TOGn lên 1. Cách tạo ngắt tương tự chế độ PCA 16-bit timer.
Pulse Width Modulator
Tất cả các module đều cĩ tần số ra như nhau do chỉ cĩ một timer PCA. Duty cycle của chuỗi xung ra phụ thuộc giá trị nạp cho thanh ghi CCAPnL. Khi giá trị của thanh ghi CL nhỏ hơn giá trị lưu trong CCAPnL, ngõ ra CEXn sẽ ở mức thấp. Ngược lại, nếu lớn hơn hay bằng, ngõ ra CEXn sẽ ở mức cao. Khi CL bị tràn từ FF sang 00, CCAPnL được nạp lại giá trị từ CCAPnH. Để dùng được chức năng PWM, bit ECOM và bit PWM của thanh ghi CCAPMn phải được set lên 1.
Hình 2.20: PCA hoạt động ở chế độ Pulse Width Modulator
Ví dụ:Điều khiển động cơ chạy trong 10s, cĩ điều xung với duty cycle là 50%
/*---*- This program is to creat a modulated pulse with duty cycle 50%.
The modulated pusle is used to control a motor in 10 seconds, then stop the motor. Use module 1 from the PCA.
-*---*/ #include <reg51f.h> //Define new registers for P89V51RD2 microcontroller void PCA_Init();
void Delay(unsigned char);
sfr Motor = 0xFB; // Name the CCAP1H register as Motor // CCAP1H has the address 0xFB
void main(void) {
Delay(10); Motor = 0; } /*---*/ void PCA_Init(void) { CMOD = 0;
CCON &= 0x40; CCAPM1 = 0x42; CR = 1; }
void Delay(unsigned char sec) {
unsigned char x; unsigned int y; for(x=0;x<=sec;x++) {
for(y=0;y<=18000;y++); // This loop remains appr 1s }
}
Watchdog timer (chỉ cĩ ở module 4):
Bộ định thời watchdog trên chip cĩ sẵn trong PCA giúp cải thiện độ tin cậy của hệ thống mà khơng cần thêm chip đếm. Các bộ định thời watchdog trở nên hữu ích đối với các hệ thống dễ bị ảnh hưởng bởi nhiễu, các gai xung khi cấp điện hoặc do sự phĩng tĩnh điện. Module 4 của PCA là module duy nhất cĩ thể được lập trình thành một watchdog. Tuy nhiên module này cũng cĩ thể được sử dụng cho các chế độ khác nếu ta khơng cần đến watchdog.
Hình sau đây trình bày cách thức hoạt động của watchdog. Người sử dụng nạp trước một giá trị 16-bit vào các thanh ghi so sánh (CCAPnH,CCAPnL). Giống như các chế độ so sánh khác, giá trị 16-bit này được so sánh với giá trị bộ định thời PCA (CH,CL). Khi hai giá trị này bằng nhau, reset bên trong sẽ được tạo ra. Điều này khơng làm chân RST nhảy lên mức cao.
Hình 2.21: PCA Watchdog Timer
Để khơng tiến đến trạng thái RESET, người sử dụng cĩ 3 tùy chọn:
1. Thay đổi cĩ định kỳ giá trị so sánh để sẽ khơng bao giờ trùng với giá trị bộ định thời PCA.
2. Thay đổi cĩ định kỳ giá trị bộ định thời PCA để khơng bao giờ trùng với giá trị so sánh.
3. Khơng cho phép watchdog bằng cách xĩa bit WDTE trước khi hai giá trị trùng nhau một lần nữa và sau đĩ sẽ được kích hoạt lại.
Hai tùy chọn đầu tiên đáng tin cậy hơn do bộ định thời watchdog khơng bao giờ bị disable hồn tồn trong lựa chọn 3. Khi đĩ, nếu bộ đếm chương trình bị lỗi, sau cùng, một tương thich sẽ xảy ra và gây reset bên trong.
Lựa chọn thứ hai cũng khơng được khuyến khích nếu các module PCA khác đang được sử dụng. Do bộ định thời PCA được dùng chung cho các module, việc thay đổi giá trị bộ định thời sẽ làm ảnh hưởng đến hoạt động của các module khác. Như vậy, lựa chọn đầu tiên là lựa chọn tốt nhất.