1.4.3.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ái Reset 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 tiếp). 1 = Bank 2, 3 (100h – 1FFh )
0 = Bank 0, 1 (00h – FFh)
Bit 6 – 5 RP1 – RP0: Bit lựa chọn bank thanh ghi (Dùng trong định điạ chỉ trực tiếp). 11 = Bank 3 ( 180h – 1FFh)
10 = Bank 2 (100h – 17Fh) 01 = Bank 1 (80h – FFh) 00 = Bank 0 (00h – 7Fh) 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.
Bit 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.4.3.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ăng như: 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ời gian chờ của WDT
Bit 7 RBPU : 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: Cho phép PORTB kéo lên nguồ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
Bit 2-0 PS2:PS0: Dùng để lựa chọn tốc độđếm của timer hay WDT
Thời gian tràn WDT 18 ms 36ms 72ms 144ms 288ms 576ms 1.1s 2.2s
1.4.3.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
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
1: Cho phép
0: Không cho phép
Bit 2 TMR0IF: Cờ báo ngắt Timer 0 1: Timer 0 tràn
0: Timer 0 chưa tràn
Bit 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.4.3.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
1: Cho phép
0: Không cho phép
Bit 6 ADIE: Bit cho phép ngắt chuyển đổi A/D
1: Cho phép
0: Không cho phép
Bit 5 RCIE: Bit cho phép ngắt nhận USART
1: Cho phép
0: Không cho phép
Bit 4 TXIE: Bit cho phép ngắt truyền USART
0: Không cho phép
Bit 3 SSPIE: Bit cho phép ngắt Port nối tiếp đồng bộ
1: Cho phép
0: Không cho phép
Bit 2 CCP1IE: Bit cho phép ngắt module CCP1 1: Cho phép ngắt
0: Không cho phép
Bit 1 TMR2IE: Bit cho phép ngắt xảy ra khi TMR2 bằng thanh ghi PR2
1: Cho phép
0: Không cho phép
Bit 0 TMR1IE: Bit cho phép ngắt tràn TMR1
1: Cho phép
0: Không cho phép
1.4.3.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ương trình chính từ chương trình phục vụ ngắt.
0: Không có ngắt xảy ra Bit 2 CCP1IF: Cờ báo ngắt CCP1
Chếđộ Capture (Bắt giữ):
1: Một Capture thanh ghi TMR1 xảy ra( phải được xóa bằng phần mềm) 0: Không xảy ra Capture thanh ghi TMR1
Chếđộ Compare ( So sánh):
1: Khi các giá trị so sánh trong thanh ghi TMR1 được thỏa ( phải được xóa bằng phần mềm)
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ần mề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
1: 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.4.3.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 vi nà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: Cho phép
0: Không cho phép
Bit 4 EEIE: Bit cho phép ngắt do ghi EEPROM
1: Cho phép
0: Không cho phép
Bit 3 BCLIE: Bit cho phép ngắt do xung đột bus
1: Cho phép
0: Không cho phép
Bit 0 CCP2IE: Cho phép ngắt module CCP2
1: Cho phép
1.4.3.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.
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
Chếđộ Capture (bắt giữ):
1: Một sự bắt giữ thanh ghi TMR1 đã xảy ra (phải được xóa bằng phần mềm)
0: Không xảy ra Capture thanh ghi TMR1
Chếđộ Compare (So sánh):
1: Một thuật toán so sánh trong thanh ghi TMR1 xảy ra (phải được xóa bằng phần mềm)
0: Không xảy ra thuật toán so sánh
1.4.4 PCL và PCLATH:
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ộ đếm chương trình PC sẽ bị xóa. Xem thêm hai ví dụ
sau đây để hiểu thêm về hoạt động của bộđếm chương trình PC.
1.4.5 Ngăn xếp Stack:
Stack cho phép 8 lệnh gọi chương trình con và ngắt hoạt động. Stack chứa địa chỉ
mà chương trình chính sẽ quay về thực hiện từ sau chương trình con hay ngắt. Đối với PIC16F877A Stack có độ sâu 8 lớp. Stack không nằm trong cả bộ nhớ chương trình lẫn bộ nhớ dữ liệu.
1.4.6 Đị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ủa thanh ghi có
địa chỉ nằm ở thanh ghi FSR. Ví dụ:
Thanh ghi tại địa chỉ 10h có giá trị 5Ah
Nế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ình thường (khi nguồn Vdd không đổi). Bộ nhớ này không được định địa chỉ trực tiếp trong bản đồ
bộ nhớ mà được định địa chỉ gián tiếp thông qua các thanh ghi chức năng đặc biệt:
- EECON1 - EECON2 - EEDATA - EEDATH - EEADR - EEADRH
Trong đó thanh ghi EEDATA lưu giữ giá trị 8 bit sẽ được ghi hoặc đọc. Thanh ghi EEADR lưu giữđịa chỉ mà chúng ta muốn ghi hoặc đọc, thanh ghi này có khả năng định
địa chỉ cho 256 byte EEPROM. Thanh ghi EECON1 chứa các bit điều khiển còn thanh ghi EECON2 được sử dụng để khởi tạo quá trình ghi/đọc.
1.5 I/O ports:
1.5.1 Port A và thanh ghi TRISA:
Port A gồm 6 chân từ RA0 đến RA5. Việc ghi giá trị vào thanh ghi TRISA sẽ qui định các chân của Port A là input hay output (nếu là 1 thì là input, là output nếu là 0). Việc đọc thanh ghi Port A sẽ đọc trạng thái của các chân ở Port A. Việc ghi giá trị vào thanh ghi Port A sẽ thay đổi trạng thái của các chân Port A.
Riêng chân RA4 được tích hợp chức năng là chân cung cấp xung clock ngoài cho Timer 0 (RA4/T0CKI). Những chân khác củ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ện thế so sánh của bộ
so sánh Comparator. Hoạt động của những chân này được quy định bằng những bit tương ứng trong các thanh ghi ADCCON1 và CMCON1. Khi các chân của Port A được sử dụng làm ngõ vào Analog thì các bit trong thanh ghi TRISA phải được set bằng 1.
Bảng tóm tắt các thanh ghi liên quan đến Port A
1.5.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 ghi TRISB 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ệc ghi 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 khi bit 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ái chân Port B thay đổi (Khi Port B được quy định là output thì chức năng này không hoạt động. Giá trị
chân của Port được so sánh với giá trị đã được lưu trướ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ái SLEEP.
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.
Bảng chức năng PortB :
Bảng tóm tắt các thanh ghi liên quan đến Port B :
1.5.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 ghi TRISC 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ệc ghi 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ới giá 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 ra mộ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ác bit trong thanh ghi TRISC cho thích hợp.
Bảng chức năng Port C :
1.5.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ất nhập, Port D còn có thể hoạt động như một cổng song song bằng cách set bit PSPMODE (TRISE<4>), trong chếđộ này buffer ngõ vào là TTL.
Bảng chức năng Port D :
Bảng tóm tắt các thanh ghi liên quan đến Port D :
1.5.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 song song 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ào Analog, 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 được quy định là ngõ vào trong chếđộ này.
Bả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
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 Bit 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 1 : Ngõ vào
0 : Ngõ ra
Bit 1 Bit 1: Xác định chiều xuất nhập cho chân RE1/WR/AN6 1 : Ngõ vào
0 : Ngõ ra
Bit 0 Bit 0: xác định chiều xuất nhập cho chân RE0/RD/AN5 1 : Ngõ vào
CHƯƠNG II : BỘ ĐỊNH THỜI
2.1 Bộđịnh thời Timer 0 : 2.1.1 Giới thiệu : 2.1.1 Giới thiệu :
Module Timer 0 là một bộ định thời/ đếm 8 bit, có khả năng đọc và ghi được , có một bộ tiền định tỉ lệ (Prescaler) 8 bit lập trình được, có bit lựa chọn nguồn xung clock trong hoặc ngoài, có ngắt khi Timer tràn, có bit lựa chọn cạnh tác động của xung clock ngoài.
2.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ì (prescaler khô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ào thanh 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ạnh xuống xuất hiện trên