5 - Một bộ định thời 16 bits Timer 1 có thể hoạt động trong chế độ tiếtkiệm năng lượng SLEEP MODE với nguồn xung Clock ngoài.. Khi đónếu được cho phép hoạt động, bộ đếm của WDT sẽ bị xóa
Trang 1Đo Và Điều Khiển Nhiệt Độ Phòng GVHD: Tô Hoàng Lộc
11.1 Sơ lược về vi điều khiển PIC16F877A:
PIC 16F877A là dòng PIC phổ biến nhất hiện nay (đủ mạnh về tínhnăng, 40 chân, bộ nhớ đủ cho hầu hết các ứng dụng thông thường) Cấu trúctổng quát của PIC 16F877A như sau:
0 - 8 K Flash ROM
1 - 368 Bytes RAM
2 - 256 Bytes EEPROM
3 - 5 ports (A, B, C, D, E) vào ra với tín hiệu điều khiển độc lập
4 - 2 bộ định thời 8 bits (Timer 0 và Timer 2)
5 - Một bộ định thời 16 bits (Timer 1) có thể hoạt động trong chế độ tiếtkiệm năng lượng (SLEEP MODE) với nguồn xung Clock ngoài
6 - 2 bô CCP( Capture / Compare / PWM)
7 - 1 bộ biến đổi AD 10 bits, 8 ngõ vào
8 - 2 bộ so sánh tương tự (Compartor)
9 - 1 bộ định thời giám sát (WatchDog Timer)
10 - Một cổng song song 8 bits với các tín hiệu điều khiển
11 - Một cổng nối tiếp
12 - 15 nguồn ngắt
13 - Có chế độ tiết kiệm năng lượng
14 - Nạp chương trình bằng cổng nối tiếp ICSP(In-Circuit Serial
Trang 2Đo Và Điều Khiển Nhiệt Độ Phòng GVHD: Tô Hoàng Lộc
18
Sơ đồ chân PIC 16f877A
Trang 3Đo Và Điều Khiển Nhiệt Độ Phòng GVHD: Tô Hoàng Lộc
PIC16F877A là họ vi điều khiển có 40 chân, mỗi chân có một chứcnăng khác nhau.Trong đó có một số chân đa công dụng: mỗi chân có thể hoạtđộng như một đường xuất nhập hoặc là một chân chức năng đặc biệt dùng đểgiao tiếp với các thiết bị ngoại vi
Sơ Đồ Khối PIC
Trang 4Đo Và Điều Khiển Nhiệt Độ Phòng GVHD: Tô Hoàng Lộc
1.2 Một số điểm đặc biệt của CPU:
1.2.1 Dao động:
PIC16F877A có thể hoạt động trong bốn chế độ dao động khác nhau:
Trong các chế độ LP, XT và
HS chúng ta sửdụng thạch anh dao động nốivào các chân OSC1 và OSC2
để tạo dao động
Việc lựa chọn tụ trong dao động thạch anh dựa vào bảng sau:
Lưu ý: Tụ có giá trị lớn sẽtăng tính ổn định của daođộng nhưng cũng làm tăngthời gian khởi động
Chế độ dao động RC được sửdụng như một giải pháp tiết kiệmtrong các ứng dụng không cần sựchính xác về thời gian
* Cách tính chu kì máy:
Ví dụ ta sử dụng thạch anh 10Mhz Khi đó:
Trang 5Đo Và Điều Khiển Nhiệt Độ Phòng GVHD: Tô Hoàng Lộc
Tần số dao động của thạch anh là Fosc = 10Mhz
PIC16F877A có một bộ lọc nhiễu ở phần Bộ lọc nhiễu này sẽ phát hiện và
bỏ qua các tín hiệu nhiễu
Ngõ vào trên chân 4 của PIC16F877A Khi đưa chân này xuống thấp thìcác thanh ghi bên trong VĐK sẽ được tải những giá trị thích hợp để khởi độnglại hệ thống
(Lưu ý: Reset do WDT không làm chân xuống mức thấp)
Trang 6Đo Và Điều Khiển Nhiệt Độ Phòng GVHD: Tô Hoàng Lộc
Trang 81.2.4 Chế độ nguồn thấp Sleep (Power down Mode) :
Đây là chế độ hoạt động của VĐK khi lệnh sleep được thực thi Khi đónếu được cho phép hoạt động, bộ đếm của WDT sẽ bị xóa nhưng WDT vẫntiếp tục hoạt động bit PD (STATUS <3>) được reset về không, bit TO được set,oscillator ngưng hoạt động và các PORT giữ nguyên trạng thái như trước khilệnh sleep được thực thi
Do khi chế độ sleep dòng cung cấp cho VĐK là rất nhỏ nên ta cần thựchiện các bước sau trước khi VĐK thực thi lệnh sleep
1• Đưa tất cả các chân về trạng thái VDD hoặc VSS
2• Cần đảm bảo rằng không có mạch ngoại vi nào được điều khiển bởidòng điện của VĐK vì dòng điện nhỏ không đủ khả năng cung cấpcho các mạch ngoại vi hoạt động
3• Tạm ngưng hoạt động của khối A/D và không cho phép các xungclock bên ngoài tác dụng vào VĐK
4• Để ý chức năng điện trở kéo lên của PORTB
5• Pin phải ở mức logic cao
Trang 91.2.5 Bộ định thời giám sát (Watch Dog Timer -WDT):
Giả sử bạn viết một chương trình, bạn mong đợi chương trình này sẽ chạynếu không có gì trục trặc xảy ra thì nó sẽ không bao giờ dừng lại, như vậy bạnphải làm một vòng lặp để khi chương trình chạy đến điểm cuối thì nó lại quaytrở về điểm bắt đầu Nhưng mà hãy xem một trường hợp: Giả sử chương trìnhkiểm tra một chân input, nếu nó lên mức cao thì con Pic sẽ tiếp tục kiểm tramột chân input thứ hai có lên mức cao hay không, nếu chân input thứ haikhông lên mức cao, con Pic sẽ ngồi đó chờ và nó sẽ chỉ thoát ra khỏi chỗ ngồicủa nó nếu chân input thứ hai lên mức cao
Bây giờ hãy xem một trường hợp khác, giả sử như bạn viết một chươngtrình, bạn compiled nó thành công, và ngay cả bạn đã cho chạy mô phỏng từngbước, từng bước một trên máy tính, bằng MPLAB chẳng hạn, có vẻ như mọichuyện đều tốt, bạn đem nạp vào con Pic Sau một thời gian chạy thử, con Picthình lình bị kẹt vào nơi nào đó trong chương trình mà không thể thoát ra đượctrạng thái hiện tại Điều gì là cần thiết để giải quyết hai trường hợp trên, resetlại hay vẫn để cho nó bị kẹt không thoát ra được, đó là mục đích của mạchWatchdog
Mạch Watchdog thì không phải là mới mẽ gì, có rất nhiềumicroprocessors và microcontrollers đã có mạch Watchdog, nhưng mà nó làmviệc ra sao ?
Bên trong con Pic có một mạch RC, mạch này cung cấp 1 xung Clock độclập với bất kỳ xung Clock nào cung cấp cho Pic Khi Watchdog Timer (viết tắt
là WDT) được cho phép (enabled), nó sẽ đếm bắt đầu từ 00 và tăng lên 1 chođến FFh, khi nó tăng từ FFh đến 00 ( FFh+1) thì con Pic sẽ bị Reset bất kểđang làm gì, chỉ có 1 cách là ngăn không cho WDT đếm tới 00
Khi con Pic bị kẹt không thể thoát ra khỏi tình trạng hiện tại thì WDT vẫntiếp tục đếm mà không bị bất kỳ điều gì ngăn cấm nó đếm tới FF và đến FF+1,
vì vậy nó sẽ reset con Pic làm cho chương trình phải khởi động lại từ đầu
Để sử dụng WDT chúng ta cần làm 3 việc
Trang 101• Thứ nhất, cần thời gian bao lâu để reset WDT ?
2• Thứ hai, làm sao xoá WDT ?
3• Cuối cùng, chúng ta phải nói cho con Pic biết chương trình cho phépWDT hoạt động
trình dài 13 bits có thể định địa chỉ cho
khoảng không gian nhớ 8K x 14bits
Không gian bộ nhớ này được chia làm 8
trang, có địa chỉ từ 0005h đến 1FFFh
Mọi sự truy cập ngoài vùng không
gian nhớ này sẽ không có tác dụng
Ngoài ra, bộ nhớ chương trình còn
bao gồm một ngăn xếp (Stack) 8 mức
Vector Reset được đặt tại địa chỉ 0000h
và vector ngắt được đặt tại địa chỉ 0004h
Trang 12Các Bank này được lựa chọn bằng 2 bit ở thanh ghi STATUS làRP0(Status<5>) và RP1(Status<6>)
1.2.6.3 Vùng Ram đa mục đích:
Vùng RAM đa mục đích có chiều rộng 8 bit và có thể được truy nhập trựctiếp hoặc gián tiếp thông qua thanh ghi FSR Vùng RAM đa mục đích đượcphân phối ở các Bank như sau:
1- Bank 0: 96 Bytes từ địa chỉ 20h đến địa chỉ 7Fh
2- Bank 1: 80 Bytes từ địa chỉ A0h đến địa chỉ EFh
3- Bank 2: 96 Bytes từ địa chỉ 110h đến địa chỉ 16Fh
4- Bank 3: 96 Bytes từ địa chỉ 190h đến địa chỉ 1EFh
1.2.6.4 Vùng thanh ghi chức năng đặc biệt:
Các thanh ghi chức năng đặc biệt được sử dụng bởi bộ xử lý trung tâmCPU hoặc các module ngoại vi để điều khiển hoạt động của VĐK Các thanhghi chức năng đặc biệt này được chia làm 2 loại: loại thứ nhất dùng cho cácchức năng của CPU, loại thứ 2 dùng cho các chức năng ngoại vi
1.2.6.4.1 Thanh ghi trạng thái ( Status Register):
Thanh ghi trạng thái chứa các trạng thái số học của bộ ALU, trạng tháiReset và các bit chọn Bank của bộ nhớ dữ liệu
Bit 7 IRP: Bit lựa chọn bank thanh ghi (Sử dụng cho định địa chỉ gián
Each bank is 128 bytes
Bit 4 TO: Bit báo hiệu hoạt động của WDT
1: Lệnh xóa WDT hoặc Sleep xảy ra
0: WDT hoạt động
Trang 13Bit 3 PD: Bit báo công suất thấp ( Power down bit)
1: Sau khi nguồn tăng hoặc có lệnh xóa WDT
0: Thực thi lệnh Sleep
Bit 2 Z: bit Zero
1: Khi kết quả của một phép toán bằng 0
0: Khi kết quả của một phép toán khác 0
Bit 1 DC: Digit Carry
1: Có một số nhớ được sinh ra bởi phép cộng hoặc phép trừ 4 bit thấp
0: Không có số nhớ sinh ra
Bit 0 C: cờ nhớ (Carry Flag)
1: Có một số nhớ sinh ra bởi phép cộng hoặc phép trừ
0: Không có số nhớ sinh ra
1 2.6.4.2 Thanh ghi tùy chọn (Option _Reg Register):
Thanh ghi tùy chọn chứa các bit điều khiển để cấu hình cho các chứa năngnhư: ngắt ngoài, Timer 0 chức năng kéo lên Vdd của các chân Port B, và thờigian chờ của WDT
Bit 7 : Bit cho phép PORTB được kéo lên nguồn
1: Không cho phép PORTB kéo lên nguồn
0:ChophépPORTBkéolênnguồn
Bit 6 INTEDG: Bit lựa chọn cạnh tác động ngắt (INTERRUPT EDGE)
1: Ngắt sẽ được tác động bởi cạnh lên của chân RB0/INT
0: Ngắt sẽ được tác động bởi cạnh xuống của chân RB0/INT
Bit 5 T0CS: Bit lựa chọn nguồn xung Clock cho Timer 0
1: Xung Clock cung cấp bởi nguồn ngoài qua chân RA4/T0CKI
0: Xung Clock cung cấp bởi nguồn dao động nội
Bit 4 T0SE: Bit lựa chọn cạnh nào của xung clock tác động lên timer 0
1: Cạnh xuống
0: Cạnh lên
Bit 3 PSA: Bit quyết định tốc độ đếm PS2:PS0 sẽ tác động lên Timer 0 hay
WDT 1: Tốc độ đếm PS2:PS0 sẽ tác động lên WDT
0: Tốc độ đếm PS2:PS0 sẽ tác động lên Timer 0
Trang 14Bit 2-0 PS2:PS0: Dùng để lựa chọn tốc độ đếm của timer hay WDT
1.2.6.4.3 Thanh ghi điều khiển ngắt INTCON (Interrupt Control Register):
Bit 7 GIE: Bit cho phép ngắt toàn cục
1: Cho phép ngắt toàn cục
0: Không cho phép ngắt
Bit 6 PEIE: Bit cho phép ngắt khi ghi vào EEPROM hoàn tất
1: Cho phép ngắt ghi vào EEPROM hoạt động
0:KhôngchophépngắtghivàoEEPROMhoạtđộng
Bit 5 TMR0IE: Bit cho phép ngắt khi timer 0 tràn
1: Cho phép ngắt khi timer 0 tràn
0: Không cho phép ngắt khi timer 0 tràn
Bit 4 INTE: Bit cho phép ngắt ngoại vi trên chân RB0/INT
1: Cho phép ngắt ngoại vi
0: Không cho phép ngắt ngoại vi
Bit 3 RBIE: Cho phép ngắt khi trạng thái PORTB thay đổi
Trang 15Bit 1 INTF: Cờ báo ngắt ngoài RB0/INT
1: Có ngắt
0: Không xảy ra ngắt
Bit 0 RBIF: Cờ báo ngắt khi có thay đổi trạng thái PORTB
1: Có thay đổi
0: Không có thay đổi xảy ra trên PORTB
1.2.6.4.4 Thanh ghi cho phép ngắt ngoại vi 1(PIE1 Register):
Chú ý: Bit PEIE (INTCON<6>) phải được set để cho phép bất kì ngắt
ngọai vi nào xảy ra
Bit 7 PSPIE: Bit cho phép ngắt đọc/ ghi Port song song
Trang 161: Cho phép
0: Không cho phép
1.2.6.4.5 Thanh ghi cờ của các ngắt ngoại vi 1:
Bit 7 PSPIF: Cờ ngắt đọc/ ghi của Port song song
1: Một hoạt động đọc/ghi đã diễn ra (phải xóa bằng phần mềm)
0: Không có hoạt động đọc/ghi
Bit 6 ADIF: Cờ báo ngắt chuyển đổi A/D
1: Một quá trình chuyển đổi A/D đã hoàn thành
0: Chuyển đổi A/D chưa hoàn tất
Bit 5 RCIF: Cờ báo ngắt nhận USART
1: Buffer nhận USART đầy
0: Buffer nhận USART trống
Bit 4 TXIF: Cờ báo ngắt phát USART
1: Buffer truyền USART trống
0: Buffer truyền USART đầy
Bit 3 SSPIF: Cờ báo ngắt port nối tiếp đồng bộ (ngắt SSP)
1: Ngắt SSP xảy ra và phải được xóa bằng phần mềm trước khi trở lại chươngtrình chính từ chương trình phục vụ ngắt
0: Khi các giá trị so sánh trong thanh ghi TMR1 không được thỏa
Chế độ PWM: Không sử dụng trong chế độ này
Bit 1 TMR2IF: Cờ báo ngắt xảy ra khi giá trị trong thanh ghi TMR2 bằng
trong thanh ghi PR2 1: Giá trị trong thanh ghi TMR2 bằng thanh ghi PR2 (phải được xóa bằng phầnmềm)
0: Giá trị trong thanh ghi TMR2 chưa bằng thanh ghi PR2
Bit 0 TMR1IF: Cờ báo tràn thanh ghi TMR1
Trang 171: Thanh ghi TMR1 tràn (phải được xóa bắng phần mềm)
0: Thanh ghi TMR1 chưa tràn
1.2.6.4.6 Thanh ghi cho phép ngắt ngoại vi 2:
Chú ý: Bit PEIE (INTCON<6>) phải được set để cho phép bất kì ngắt ngọai vinào xảy ra
Bit 7,5,2,1 Unimplemented : read as ‘0’
Bit 6 CMIE: Bit cho phép ngắt do bộ so sánh điện thế
1.2.6.4.7 Thanh ghi cờ của các ngắt ngoại vi 2:
Bit 7,5,2,1 Unimplemented : read as ‘0’
Bit 6 CMIF: Cờ báo ngắt do bộ so sánh
1: Ngõ vào bộ so sánh đã thay đổi (phải được xóa bằng phần mềm)
0: Ngõ vào bộ so sánh không thay đổi
Bit 4 EEIF: Cờ báo ngắt ghi EEPROM
1: Ghi EEPROM hoàn tất (phải được xóa bằng phần mềm)
0: Ghi EEPROM chưa hoàn tất
Trang 18
Bit 3 BCLIF: Cờ báo ngắt do xung đột bus
1: Xung đột bus đã xuất hiện trong chế độ SSP
0: Không có xung đột bus xảy ra
Bit 0 CCP2IF: Cờ báo ngắt CPP2
Bộ đếm chương trình PC (program counter) có độ dài 13 bit, được dùng
để chứa địa chỉ của lệnh được thực thi
kế tiếp Byte thấp chứa trong thanh ghi
PCL có thể đọc/ghi một cách trực tiếp
Các bit cao (bit 12:8) chứa trong thanh
ghi PCLATH, không thể đọc nhưng có
thể ghi gián tiếp bằng cách sử dụng
thanh ghi PCLATH Khi có bất kỳ sự
Reset nào xảy ra, các bit cao của bộ
1.5 Địa chỉ trực tiếp và địa chỉ gián tiếp, thanh ghi INF và thanh ghi FSR:
Thanh ghi INF không phải là một thanh ghi vật lí Nó chứa giá trị củathanh ghi có địa chỉ nằm ở thanh ghi FSR
Ví dụ:
Thanh ghi tại địa chỉ 10h có giá trị 5Ah
Trang 19Nếu ta đưa 10h vào thanh ghi FSR thì khi đọc thanh ghi INF ta sẽ có giátrị 5Ah
Data EEPROM và Flash Program Memory:
EEPROM là bộ nhớ có khả năng đọc và ghi trong điều kiện làm việc bìnhthường (khi nguồn Vdd không đổi) Bộ nhớ này không được định địa chỉ trựctiếp trong bản đồ bộ nhớ mà được định địa chỉ gián tiếp thông qua các thanhghi chức năng đặc biệt:
Trang 20Riêng chân RA4 được tích hợp chứcnăng là chân cung cấp xung clock ngoài choTimer 0 (RA4/T0CKI) Những chân kháccủa Port A được đa hợp với các chân ngõvào Analog của ADC và chân ngõ vào điệnthế so sánh của bộ so sánh Comparator Hoạtđộng của những chân này được quy địnhbằng những bit tương ứng trong các thanhghi ADCCON1 và CMCON1 Khi các châncủa Port A được sử dụng làm ngõ vàoAnalog thì các bit trong thanh ghi TRISAphải được set bằng 1
ChứcnăngcủacácchânPortA
Bảng tóm tắt các thanh ghi liên quan đếnPort A
Trang 221.6.2 Port B và thanh ghi TRISB:
Port B gồm 8 chân từ chân RB0-RB7 Việc ghi giá trị vào thanh ghiTRISB sẽ quy định các chân của Port B là input hay output (1: input, 0:output) Việc đọc thanh ghi Port B sẽ đọc trạng thái của các chân ở Port B Việcghi giá trị vào thanh ghi Port B sẽ thay đổi trạng thái của các chân Port B
Ba chân của Port B được đa hợp với chức năng In-Circuit Debugger vàLow Voltage Programming function: RB3/PGM, RB6/PGC, RB7/PGD
Mỗi chân Port B có một transistor kéo lên Vdd Chức năng này hoạt động khibit RBPU (Option <7>) được xóa Chức năng này sẽ tự động được xóa khi Port
B được quy định là input
Bốn chân của Port B từ RB7 đến RB4 có chức năng ngắt khi trạng tháichân Port B thay đổi (Khi Port B được quy định là output thì chức năng nàykhông hoạt động Giá trị chân của Port được so sánh với giá trị đã được lưutrước đó, khi có sự sai lệch giữa 2 giá trị này ngắt sẽ xảy ra với cờ ngắt RBIF(INTCON<0) sẽ bật lên Ngắt có thể làm cho VĐK thoát khỏi trạng tháiSLEEP
Bất cứ sự truy xuất nào trên PortB sẽ xóa trạng thái sai lệch, kết thúc ngắt
và cho phép xóa cờ ngắt RBIF
Trang 23Bảng chức năng PortB :
Bảng tóm tắt các thanh ghi liên quan đến Port B :
Trang 241.6.3 Port C và thanh ghi TRISC:
Port C gồm 8 chân từ chân RC0-RC7 Việc ghi giá trị vào thanh ghiTRISC sẽ quy định các chân của Port C là input hay output (1: input, 0:output) Việc đọc thanh ghi Port C sẽ đọc trạng thái của các chân ở Port C Việcghi giá trị vào thanh ghi Port C sẽ thay đổi trạng thái của các chân Port C Các chân của Port C được đa hợp với các chức năng ngoại vi
Khi các chức năng ngoại vi được cho phép ta cần quan tâm chặt chẽ tớigiá trị các bit của thanh ghi TRISC Một số chức năng ngoại vi sẽ ghi đè giá trị
0 lên các bit của thanh ghi TRISC và mặc định các chân này là output, ngoài ramột số chức năng ngoại vi khác sẽ tự động mặc định một số chân là ngõ vào
Do đó cần xem xét kĩ các tính năng của các hàm ngoại vi để thiết lập giá trị cácbit trong thanh ghi TRISC cho thích hợp
Bảng chức năng Port C :
Trang 25Bảng tóm tắt các thanh ghi lien quan đến PortC
1.6.4 Port D và thanh ghi TRISD
Port D gồm 8 chân từ chân RD0-RD7 Bên cạnh chức năng là port xuấtnhập, Port D còn có thể hoạt động như một cổng song song bằng cách set bitPSPMODE (TRISE<4>), trong chế độ này buffer ngõ vào là TTL
Bảng chức năng Port D :
Trang 26Bảng tóm tắt các thanh ghi liên quan đến Port D :
1.6.5 Port E và thanh ghi TRISE:
Port E có 3 chân RE0 /RD/AN5, RE1/WR /AN6, RE2 /CS/AN7, có thểđược cấu hình như các chân xuất nhập thông thường
Các chân của Port E có thể trở thành các chân điều khiển cho cổng songsong của VĐK khi bit PSPMODE (TRISE<4>) được set bằng 1 Trong chế độnày, người sử dụng phải đảm bảo các chân của PortE là ngõ vào
Ngoài ra các chân Port E còn có thể được cấu hình như các ngõ vàoAnalog, tại chế độ này, khi đọc giá trị của các chân này sẽ cho ta giá trị là 0 Thanh ghi TRISE quy định chức năng xuất nhập của Port E ngay cả khi
nó được sử dụng như các ngõ vào Analog Phải đảm bảo các chân này đượcquy định là ngõ vào trong chế độ này
Trang 27Bảng chức năng các chân Port E :
Bảng tóm tắt các thanh ghi liên quan đến Port E :
Thanh ghi TRISE :
Các bit điều khiển trạng thái của Port song song
Bit 7 IBF : Bit trạng thái báo buffer ngõ vào đầy
1 : Một từ (word -16bit) được nhận vào và đang được đọc bởi CPU
0 : Không có từ nào được nhận vào
Bit 6 OBF: Bit trạng thái báo buffer ngõ ra đầy
1 : Buffer ngõ ra vẫn còn giữ một từ đã được đọc trước đó
0 : Buffer ngõ ra đã được đọc
Bit 5 IBOV: Bit báo trạng thái buffer ngõ vào tràn ( trong chế độ Vi xử lí)
1 : Chu kì ghi mới đã bắt đầu nhưng giá trị cũ vẫn còn trang buffer ( phải
được xóa bằng phần mềm)
0:Khôn tràn xảy ra
Bit 4 PSPMODE: Bit chọn chế độ cổng song song cho Port D
1 : Port D được cấu hình như cổng song song
0 : Port D cấu hình như ngõ xuất nhập thông thường
Trang 28Bit 3 Không sử dụng, đọc là ‘0’
Các bit xác định xuất nhập của Port E:
Bit 2 Bit 2: Xác định chiều xuất nhập cho chân RE2/CS/AN7
Trang 291.7.1.2 Hoạt động của bộ định thời
Chế độ định thời được chọn bằng cách xóa bit T0CS (OPTION_REG
<5>) Trong chế độ này thanh ghi TMR0 sẽ tăng lên sau mỗi chu kì (prescalerkhông có tác dụng hoặc tỉ lệ 1 :1) Nếu thanh ghi TMR0 được ghi một giá trịmới, giá trị trong thanh ghi này sẽ không tăng trong 2 chu kỳ lệnh kế tiếp.Vìvậy để khắc phục hiện tượng này chúng ta có thể hiệu chỉnh giá trị nhập vàothanh ghi TMR0
Chế độ đếm được lựa chọn bằng cách set bit T0CS (OPTION_REG <5>).Trong chế độ đếm, thanh ghi TMR0 sẽ tăng lên khi có cạnh lên hoặc cạnhxuống xuất hiện trên chân T0CKL ( cạnh lên hoặc cạnh xuống được lựa chọnbởi bit T0SE (OPTION_REG <4>, xóa bit T0SE sẽ lựa chọn cạnh lên)
1.7.1.3 Ngắt Timer 0
Ngắt Timer 0 được tạo ra khi thanh ghi TMR0 tràn từ 0FFh đến 00h Khixảy ra tràn, cờ T0IF(INTCON<2>) được bật lên Ngắt có thể được ngăn chặnbằng cách xóa bit T0IE (INTCON<5>) Cờ ngắt T0IF phải được xóa bằng phầnmềm truớc khi thoát khỏi chương trình ngắt trở về chương trình chính
Lưu ý : Ngắt Timer 0 không làm VĐK thoát khỏi trạng thái ngủ
1.7.1.4 Sử dụng Timer 0 với nguồn xung clock ngoài
Khi bộ tiền định tỉ lệ không được sử dụng, ngõ vào xung clock ngoại cũnggiống như ngõ ra bộ tiền định tỉ lệ Nguồn xung clock ngoại sẽ được đồng bộvới xung clock nội bằng cách: nó sẽ được lấy mẫu tại chu kỳ Q2 và Q4 củaxung clock nội Do đó, T0CKI phải ở mức cao ít nhất 2 Tosc và ở mức thấp ítnhất cũng là 2 Tosc
1.7.1.5 Bộ tiền định tỉ lệ 8 bit của Timer 0
Bộ đếm 8 bit được sử dụng như bộ tiền định tỉ lệ cho Timer 0 hoặc bộ hậuđịnh tỉ lệ cho WDT Bit PSA (OPTION_REG<3>) sẽ lựa chọn bộ đếm này sẽ
sử dụng cho Timer 0 hay WDT, các bit PS2, PS1, PS0 sẽ xác định tỉ lệ của bộđếm
Trang 301.7.2 Bộ định thời Timer 1
1.7.2.1 Giới Thiệu
Timer 1 là một bộ định thời/ đếm 16 bit bao gồm hai thanh ghi 8 bit(TMR1H và TMR1L), có khả năng đọc được và ghi được Cặp thanh ghiTMR1H và TMR1L sẽ tăng từ 0000h lên FFFFh rồi sau đó tràn về 0000h Nếuđược cho phép (bit TMR1IE được set), ngắt sẽ xảy ra khi giá trị TMR1 tràn từFFFFh về 0000h, lúc đó cờ ngắt TMR1IF sẽ bật lên
Trang 31Bit 2 T1SYNC : Bit lựa chọn đồng bộ hóa xung clock ngoài của Timer 1
(Chú ý: Bit này chỉ có tác dụng khi bit TMR1CS = 1)
1: Không đồng bộ hóa xung clock ngoại
0: Đồng bộ hóa xung clock ngoại
Bit 1 TMR1CS : Bit chọn nguồn xung clock cho Timer 1
1: Chọn xung clock ngoài qua chân T1OSC/T1CKI ( tác động cạnh lên) 0: Chọn xung clock nội (Fosc/4)
Bit 0 TMR1ON: Bit cho phép ngoặc ngưng Timer 1
1: Cho phép
0: Không cho phép
1.7.2.3 Chế độ định thời trong hoạt động của Timer 1 :
Chế độ định thời được lựa chọn bằng cách xóa bit TMR1CS(T1CON<1>) Trong chế độ này, xung clock cung cấp cho Timer 1 là Fosc/4,bit đồng bộ T1SYNC (T1CON<2>) không có tác dụng vì xung clock nội đãluôn luôn được đồng bộ
Xung clock ngoại sẽ được đồng bộ với xung clock nội, hoạt động đồng bộđược thực hiện ngay sau bộ tiền định tỉ lệ xung (prescaler) Trong chế độ ngủhoạt động đồng bộ sẽ bị tắt cho dù có xung clock ngoài thì Timer 1 cũng khôngtăng Điều này có nghĩa là chế độ đếm đồng bộ sẽ không hoạt động được trongchế độ ngủ (SLEEP)
Khi chế độ sử dụng xung clock ngoài được lựa chọn cho Timer 1 ở chế độđếm đồng bộ, chúng ta phải đảm bảo xung clock ngoài đã được đồng bộ vớixung clock nội
Trang 32Đếm bất đồng bộ :
Nếu bit T1SYNC được set, xung clock ngoài sẽ không được đồng bộhóa Bộ định thời sẽ tiếp tục đếm trong suốt quá trình Sleep của VĐK và có khảnăng tạo ra một ngắt khi bộ định thời tràn và làm VĐK thoát khỏi trạng tháingủ
* Một số đặc điềm lưu ý khi đọc ghi vào Timer :
- Việc đọc thanh ghi TMR1H hoặc TMR1L trong khi bộ định thời đang chạy từmột nguồn xung clock ngoài không đồng bộ sẽ cho giá trị tức thời (không phảingưng Timer lại) Tuy nhiên, phải chú ý rằng việc đọc Timer 1 sẽ phải bao gồm
2 lần đọc giá trị 8 bit, do đó có thể phát sinh vấn đề là Timer có thể bị tràn giữa
2 lần đọc
- Để ghi vào Timer tốt nhất chúng ta nên dừng Timer lại và ghi giá trịchúng ta mong muốn Chúng ta có thể ghi giá trị váo khi Timer đang chạynhưng việc đó có thể tạo ra một giá trị không như ta mong muốn
1.7.2.5 Dao động riêng của Timer 1 :
Chúng ta có thể tạo một bộ dao động độc lập cho Timer 1 bằng cách sửdụng thạch anh có tần số tối đa 200Khz.Với bộ dao động này Timer có thể đếmngay cả khi VĐK rơi vào trạng thái ngủ
1.7.2.6 Ngắt Timer 1 :
Khi ngắt được cho phép, nó sẽ xảy ra khi Timer tràn từ giá trị FFFFhxuống 0000h Khi xảy ra tràn, cờ báo ngắt TMR1IF sẽ bật lên Ngắt có thểngăn chặn bằng cách xóa bit TMR1IE, cờ TMR1IF phải được xóa bằng phầnmềm trước khi thoát khỏi chương trình phục vụ ngắt trở về chương trình chính.Lưu ý : Ngắt của Timer 1 ở chế độ định thời và chế độ đếm đồng bộkhông làm cho VĐK thoát khỏi trạng thái ngủ, chỉ có ngắt ở chế độ đếm bấtđồng bộ mới làm cho VĐK thoát khỏi trạng thái ngủ
Các thanh ghi liên quan đến Timer 1 :
Trang 331.7.3 Bộ định thời Timer 2 :
1.7.3.1 Giới thiệu :
Timer 2 là một bộ định thời 8 bit bao
gồm một bộ tiền định tỉ lệ và một bộ hậu
định tỉ lệ, Timer 2 cung cấp thời gian hoạt
động cho chế độ PWM nếu module CCP
được chọn.Thanh ghiTMR2 là một thanh ghi
có thể đọc và ghi được, nó bị xóa bởi bất cứ tác đông reset nào
Xung clock ngõ vào (Fosc/4) có các tùy chọn tỉ lệ là 1:1, 1:4, 1:16, đượclựa chọn bằng các bit điều khiển T2CKPS1 : T2CKPS0 (T2CON<1 :0>) Timer 2 có một thanh ghi khoảng thời gian 8 bit PR2, đây là một thanhghi có khả năng đọc được và ghi được Timer 2 sẽ tăng từ 00h đến khi bằng giátrị ở thanh ghi PR2 nó sẽ reset về 00h ở chu kỳ tăng tiếp theo
1.7.3.2 Thanh ghi điều khiển T2CON
Trang 341- Ghi một giá trị vào thanh ghi TMR2
2- Ghi một giá trị vào thanh ghi TCON2
3- Bất cứ một reset thiết bị nào
Thanh ghi TMR2 không bị xóa khi thanh ghi TCON2 được ghi
1.7.3.4 Nguồn xung clock cho Timer 2
Timer 2 có một nguồn xung clock đó là xung clock của VĐK Một bộ tiềnđịnh tỉ lệ được lựa chọn bởi các bit T2CKPS1:T2CKPS0
1.7.3.5 Thanh ghi TMR2 và PR2
Thanh ghi TMR2 và PR2 là 2 thanh ghi đọc được và ghi được Timer 2 sẽtăng từ giá trị 00h lên tới giá trị nằm trong thanh ghi PR2, sau đó nó sẽ reset về00h cho đến chu kỳ đếm kế tiếp
1.7.3.6Tín hiệu báo trạng thái cân bằng
Khi giá trị trong thanh ghi TMR2 bằng với giá trị trong PR2, bộ so sánh
sẽ tạo ra một xung báo hiệu, xung này có thể được dùng cho bộ hậu định tỉ lệhoặc được dùng làm xung clock cho module truyền nối tiếp Ngoài ra nó cònđược dùng làm tín hiệu Reset cho Timer 2
Trang 351.8 MODULE CCP
11.8.1 Giới thiệu :
Module CCP được xây dựng để hỗ trợ
cho việc đo lường và điều khiển thời gian
hoạt động của các tín hiệu, đo chu kỳ hoạt
động của tín hiệu, tạo ra các tín hiệu có tần
số khác nhau, điều khiển tốc độ động cơ DC…
Mỗi module CCP có môt thanh ghi 16 bit có thể hoạt động như:
0 - Một thanh ghi Capture 16 bit
1 - Một thanh ghi Compare 16 bit
2 - Một thanh ghi điểu khiển chu kỳ nhiệm vụ của bộ PWM PIC16F877A có 2 module CCP là CCP1 và CCP2:
Trang 36Module CCP1:
Thanh ghi CCPR1 bao gồm 2 thanh ghi 8 bit: CCPR1L và CCPR1H.Thanh ghi CCP1CON điều khiển hoạt động cùa module CCP1 Các xung đặcbiệt xảy ra bằng các thuật toán so sánh và sẽ reset Timer 1
Module CCP2:
Thanh ghi CCPR2 bao gồm 2 thanh ghi 8 bit: CCPR2L và CCPR2H.Thanh ghi CCP2CON điều khiển hoạt động cùa module CCP2 Các xung đặcbiệt xảy ra bằng các thuật toán so sánh sẽ reset Timer 1 và bắt đầu chuyển đổiADC (nếu chuyển đổi ADC được cho phép)
1.8.2 Thanh ghi điều khiển module CCP:
Bit 3:0 CCPxM3:CCPxM0: Các bit chọn chế độ cho module CCPx
0000: Tắt tất cả các chức năng CCP
0100: Chế độ Capture, hoạt động ở mỗi xung cạnh xuống
0101: Chế độ Capture, hoạt động ở mỗi xung cạnh lên
Trang 370110: Chế độ Capture, hoạt động ở mỗi 4 xung cạnh lên
0111: Chế độ Capture, hoạt động ở mỗi 16 xung cạnh lên
1000: Chế độ Compare, ban đầu ngõ ra CCP ở mức thấp, khi điều kiện cânbằng xuất hiện nó lên mức cao (cờ CCPIF được set)
1001: Chế độ Compare, ban đầu ngõ ra CCP ở mức cao, khi điều kiện cân bằngxuất hiện nó xuống mức thấp (cờ CCPIF được set)
1010: Chế độ Compare, tạo ra một ngắt phần mềm khi điều kiện cân bằng xuấthiện (cờ CCPIF được set, chân CCP không đổi)
1011: Chế độ Compare , sự kiện đặc biệt xảy ra (cờ CCPIF được set, chân CCPkhông đổi), CCP1 reset TMR1, CCP2 reset TMR1, bắt đầu chuyển đổi A/D( nếu module ADC được cho phép)
11xx: Chế độ PWM
1.8.3 Chế độ Capture
Để module CCP hoạt động trong
chế độ Capture thì Timer 1 phải thiết
lập ở chế độ định thời hoặc chế độ đếm
đồng bộ, nếu không chế độ Capture sẽ
không làm việc Khi chế độ Capture
được sử dụng, chân CCP phải được
mặc định là ngõ vào
Trong chế độ Capture, hai thanh ghi CCPRxH và CCPRxL sẽ ghi lại giátrị 16 bit của Timer 1 khi có môt sự kiện xuất hiện trên chân CCPx (giá trịtrong Timer 1 không bị reset) Một sự kiện được định nghĩa bởi:
Trang 38và cờ CCPxIF được bật lên, cờ này phải được xóa bằng phần mềm trước khimột sự kiện khác xảy ra nếu không giá trị lưu trước đó sẽ bị xóa
Khi thay đổi hoạt động chế độ Capture sẽ tạo ra một ngắt nên khi muốnthay đổi hoạt động chế độ Capture trước hết phải vô hiệu hóa các ngắt và xóacác cờ ngắt
1.8.3.1 Bộ định tỉ lệ của CCP:
Bộ định tỉ lệ prescaler có 4 giá trị tỉ lệ được lựa chọn bởi các bitCCPxM3:CCPxM0 Bất cứ khi nào module CCP ngừng hoạt động hoặc khônghoạt động trong chế độ Capture thì giá trị tỉ lệ sẽ bị xóa Bất cứ reset nào cũngxóa giá trị tỉ lệ
Trang 39Khi thay đổi giá trị prescaler có thể gây ra một ngắt Giá trị đếm prescaler
sẽ không bị xóa nên sự Capture đầu tiên có thể không xuất phát từ giá trị 0 của
bộ prescaler
1.8.4 Chế độ Compare:
Để module CCP hoạt động trong
chế độ Compare thì Timer 1 phải thiết
lập ở chế độ định thời hoặc chế độ đếm
đồng bộ, nếu không chế độ Compare sẽ
không làm việc Khi chế độ Compare
được sử dụng, chân CCP phải được mặc
định là ngõ vào
Trong chế độ Compare giá trị trong thanh ghi TMR1 sẽ được so sánh vớimột giá trị đã được lưu sẵn trong thanh ghi 16 bit CCPRx, khi hai giá trị nàybằng nhau, một ngắt sẽ xảy ra nếu được cho phép.Chân CCPx sẽ:
1- Lên mức cao
2- Xuống mức thấp
3- Hay giữ nguyên trạng thái
Trạng thái của chân CCP sẽ phụ thộc vào các bit CCPxM3:CCPxM0 Việc xóa thanh ghi CCPxCON sẽ đẩy trạng thái của chân CCP xuống mứcthấp
Đặc biệt trong chế độ này, khi giá trị trong 2 thanh ghi TMR1 và CCPRxbằng nhau thì một xung tín hiệu sẽ được tạo ra Xung này sẽ reset cặp thanh ghiTMR1H và TMR1L Điều này cho phép thanh ghi CCPRx hoạt động giốngnhư một thanh ghi khoảng thời gian cho Timer 1
Trang 401.8.5 Chế độ điều biến xung PWM:
Trong chế độ điều chế độ rộng xung
PWM, chân CCP tạo ra một tín hiệu có độ
phân giải 10 bit Chân CCP phải được mặc
1Thanh ghi TMR2 bị xóa
2- Chân CCPx được set lên mức 1
3- Giá trị Duty cycle ( Chu kỳ nhiệm vụ) từ thanh ghi CCPRxL sẽ chuyểnsang thanh ghi CCPRxH
Lưu ý: Bộ postcaler của Timer 2 không có tác dụng trong việc quyết định tần
số PWM Bộ prescaler được kết hợp với thanh ghi TMR2 để tạo ra bộ đếm 10bit tương ứng
1.8.5.2 Chu kỳ nhiệm vụ của PWM:
Giá trị chu kỳ nhiệm vụ của PWM được quy định bằng 10 bit : 8 bit trongthanh ghi CCPRxL và 2 bit trong thanh ghi CCPxCON (DCxB1, DCxB0) Chu
kỳ nhiệm vụ PWM có thể được tính theo công thức sau:
Ton PWM = ( Giá trị của DCxB9:DcxB0) * Tosc * giá trị tỉ lệ tiền định TMR2 Giá trị DCxB9:DcxB0 có thể thay đổi tùy ý nhưng giá trị này sẽ khôngđược tải vào trong thanh ghi CCPRxH cho đến khi trạng thái cân bằng xảy ragiữa 2 thanh ghi PR2 và TMR2 Trong chế độ PWM thanh ghi CCPRxH làthanh ghi chỉ đọc
Độ phân giải PWM có thể tính theo công thức sau: