- Có 1 bộ định thời timer 1 -16 bit có thể hoạt động trong chế độ tiết kiệm năng lượng SLEEP MODE với nguồn xung clock từ bên ngoài.. Tên chân BitLoạiST:Schmitt RC0/T1OS0/T1CKI 0 ST Chân
Trang 1BẢN THUYẾT MINH
ĐỀ TÀI: DÙNG VI ĐIỀU KHIỂN PIC 16F877A KẾT
HỢP VỚI DS1307 ĐỂ ĐIỀU KHIỂN HỆ THỐNG
ĐÈN GIAO THƠNG.
GVHD: GS.TS Nguyễn Đức Thành GVPB: Thầy Nguyễn Trọng Tài SVTH: Nguyễn Hữu Tân
I Giới thiệu sơ lược về PIC 16F877A
- Tần số hoạt động lớn nhất: 20MHz
- 8k byte ROM nội (Flash Rom)
- 368 byte RAM nội
- 256 byte EEROM trong vùng ROM nội đươc dùng để chứa dữ liệu
- Về giao tiếp, có 5 port A, port B, port C, port D, port E vàøo ra với tín hiệu điều khiển độc lập
- Có 2 bộ định thời Timer 0 vàø timer 2 – 8 bit
- Có 1 bộ định thời timer 1 -16 bit có thể hoạt động trong chế độ tiết kiệm năng lượng (SLEEP MODE) với nguồn xung clock từ bên ngoài
- Có 2 bộ Capture/Compare/PWM
- Có 1 bộ ADC 10 bit với 8 ngõ vàøo
- Có 2 bộ so sánh tương tự (Comparator)
- Có một bộ Watch Dog Timer
- Có một bộ Serial ở bên trong chip
- Có moat cổng song song 8 bit với các tín hiệu điều khiển
- Có 15 nguồn ngắt
- Nạp chương trình thông qua cổng nối tiếp (ICSP – In Circuit Serial
Programming)
Đại học Bách Khoa TP.HCM |Nguyễn Hữu Tân-40402247 1
Trang 2- Được chế tạo dựa trên công nghệ CMOS.
- Về cấu trúc lệnh, có tất cả 35 lệnh có độ dài 14 bit
II Giới thiệu về DS1307
- Tần số dao động thạch anh sử dụng 32.768kHz, không cần có điện trở, cũng như các tụ gắn thêm
- IC real-time DS1307 là một IC hoạt động với chế độ thời gian thực, công suất thấp, sử dụng mã BCD đầy đủ
- Có 56 byte ram nội Địa chỉ, cũng như dữ liệu được ghi và đọc theo chuẩn giao tiếp I2C, đa hướng (chi tiết về chuẩn giao tiếp I2C này đã được em trình bày ở trong đồ án)
- IC real-time DS1307 cung cấp thông tin về giây, phút, giờ, ngày, tháng, năm, thông tin về năm IC này cũng tự điều chỉnh cho những tháng có ít hơn 31 ngàyvà bao gồm luôn cả năm nhuận Đồng hồ trong IC hoạt động với hai chế độ:
24 giờ, hay 12 giờ (bao gồm cả chỉ thị cho biết đang là AM hay PM)
- IC real-time DS1307 cũng được tích hợp sẵn một mạch nhận biết sự cố điện ápvà sẽ tự động chuyển sang dùng nguồn PIN nuôi dự phòng khi có sự cố mất điện áp xảy ra để ngăn ngừa tình trạng mất dữ liệu
III Giới thiệu sơ đồ khối của mạch thực hiện
Đại học Bách Khoa TP.HCM |Nguyễn Hữu Tân-40402247 2
Khối ngõ ra, gồm
12 đèn thể hiện cho 1 ngã 4
Trang 3IV Giới thiệu các mode hoạt động và cài đặt
a Mode I: Chế độ vận hành tự động cho đèn giao thông với giờ đã cài đặt sẵn
b Mode II: Chế độ vận hành bằng tay cho đèn Có hai mode con:
- Mode con 1: chỉ sử dụng hai đèn xanh và đỏ Đèn vàng không được sử dụng Dùng khi người điều khiển giao thông muốn chủ động điều khiểnthời gian theo ý muốn của mình
- Mode con 2: chỉsử dụng đèn vàng, đèn vàng chớp với chu kì 1s Dùng khi chiến sĩ cảnh sát giao thông muốn người và phương tiện tham gia lưu thông tuân theo hiệu lệnh của mình thay vì tín hiệu đèn giao thông
c Mode III: Chế độ xem giờ đã cài đặt, cài đặt thời gian đèn xanh, đỏ, vàng, xác
định xem cĩ sử dụng giờ của 1307 hay khơng? Mode này cĩ các mode con sau
- Mode con 1: sử dụng để xem giờ đã cài đặt cho đèn giao thông Giờ càiđặt được lưu trong EEPROM nên không bị mất khi có sự cố mất điện
- Mode con 2: sử dụng để định giờ mới cho đèn Sau khi định giờ xong, giờ mới cài đặt này sẽ được lưu vào trong ROM và chương trình sẽ trở lại khâu chọn mode hoạt động
d Mode IV: Chế độ xem giờ hiện tại của hệ thống cũng như thiết đặt giờ chuyển
sang chế độ đèn vàng Mode này có ba mode con :
- Mode con 1: sử dụng để xem giờ hiện tại của hệ thống đọc được từ IC1307 Giờ cài đặt được lưu trong IC real-time DS1307 có PIN nuôi dựphòng nên không bị mất khi có sự cố mất điện
- Mode con 2: sử dụng để xem, định giờ mới cho hệ thống làm cho hệ thống chuyển sang chế độ đèn vàng Sau khi định giơ, xem giờø xong, chương trình sẽ trở lại khâu chọn mode hoạt động
- Mode con 3: sử dụng để cài đặt giờ cho hệ thống (giờ lưu trong IC DS1307)
Đại học Bách Khoa TP.HCM |Nguyễn Hữu Tân-40402247 3
Trang 4M C L C ỤC LỤC ỤC LỤC I) CHƯƠNG 1: VI ĐIỀU KHIỂN PIC 16F877A
a Giới thiệu chung về VĐK PIC
b Giới thiệu về vi điều khiển PIC 16F877A
c Giới thiệu các chân của vi điều khiển PIC 16F877A
d Giới thiệu về tổ chức bộ nhớ của PIC 16F877A
i Tổ chức bộ nhớ
ii Các thanh ghi của PIC 16F877A
e Giới thiệu về bộ định thời trong PIC 16F877A
f Giới thiệu về ngắt trong PIC 16F877A
g Sử dụng giao tiếp theo chuẩn giao tiếp I2C trong PIC 16F877A
h Module CCP?
i Các bộ Comparator?
j Bộ biến đổi dữ liệu ADC 10 bit?
II) CHƯƠNG II: GIỚI THIỆU VỀ PHẦN MỀM CCS C HỖ TRỞ LẬP TRÌNG CHO
CÁC DÒNG PIC
III) CHƯƠNG III: GIỚI THIỆU MẠCH THỰC HIỆN ĐỒ ÁN MÔN HỌC.
IV) Phụ lục: Tập lệnh của PIC 16F877A
Đại học Bách Khoa TP.HCM |Nguyễn Hữu Tân-40402247 4
Trang 5CHƯƠNG I
VI ĐIỀU KHIỂN PIC 16F877A
A Giới thiệu về vi điều khiển PIC
PIC (Programmable intelligent Controller) do hãng General Instrument đặt
tên cho con vi điều khiển đầu tiên của họ: PIC 1650 Hãng Microchip tiếp tục phát tri63n sản phẩm này Cho đến nay, các sản phẩm vi điều khiển PIC của Microchip đã có gần 100 loại sản phẩm từ 10Fxxx đến 12Cxxx, 12Fxxx, 16Cxxx, 17Cxx, 16Fxx, 16Fxxx, 16FxxA, 16FxxxA, 16LFxxxA, 18Fxxx, 18LFxxx, 18Fxxxx, 18LFxxxx…
Cách phân loại PIC:
+ Theo chữ cái:
-Các họ có chữ C như PIC xxCxxx thuộc nhóm OTP (One Time Programmable) chỉ có thể lập trình vàø nạp cho nó moat lần duy nhất.-Cá họ có chữ F hoặc LF (thuộc nhóm Flash) cho phép ghi vàø xóa nhiều lần bằng các mạch điện tử thông thường
+Theo hai chữ số đầu tiên:
-PIC 12Cxx: dòng PIC cơ bản (base-line), có độ dài lệnh là 12 bit.-PIC 10F, 12F vàø 16F: dòng PIC phổ thông (mid-range), độ dài lệnh 14 bit
-PIC 18: dòng PIC cao cấp (high-end), có độ dài lệnh là 16 bit
B Giới thiệu về Vi điều khiển 16F877A
Đây là dòng PIC phổ biến nhất Có những đặc điểm tổng quát như sau:
o Tần số hoạt động lớn nhất: 20MHz (16F877A, 16F84A), đối với các họPIC mà không có kí tự A đứng cuối thì tần số hoạt động lớn nhất là 10MHz
o 8k byte ROM nội (Flash Rom)
o 368 byte RAM nội
o 256 byte EFROM trong vùng ROM nội đươc dùng để chứa dữ liệu
o Về giao tiếp, có 5 port A, port B, port C, port D, port E vàøo ra với tín hiệu điều khiển độc lập
o Có 2 bộ định thời Timer 0 vàø timer 2 – 8 bit
Trang 6o Có 1 bộ định thời timer 1 -16 bit có thể hoạt động trong chế độ tiết kiệm năng lượng (SLEEP MODE) với nguồn xung clock từ bên ngoài.
o Có 2 bộ Capture/Compare/PWM
o Có 1 bộ ADC 10 bit với 8 ngõ vàøo
o Có 2 bộ so sánh tương tự (Comparator)
o Có một bộ Watch Dog Timer
o Có một bộ Serial ở bên trong chip
o Có moat cổng song song 8 bit với các tín hiệu điều khiển
o Có 15 nguồn ngắt
o Nạp chương trình thông qua cổng nối tiếp (ICSP – In Circuit Serial Programming)
o Được chế tạo dựa trên công nghệ CMOS
o Về cấu trúc lệnh, có tất cả 35 lệnh có độ dài 14 bit
C Giới thiệu về các chân của vi điều khiển 16F877A
Sơ đồ chân cuả PIC 16F877A
Trang 71 Nhóm chân cấp nguồn
Chân 11, 32: nối vàøo Vcc (+5V)
Chân 12, 31: nối mass
2 Chân Reset (chân số 1)
Vi điều khiển PIC sẽ được reset khi chân số 1 chuyển từ mức logic 1 xuống mức logic 0
3 Nhóm chân tạo xung Clock
Xung clock sẽ được đưa vàøo chân số 13 vàø 14, thạch anh giữ vài trò định tần cho mạch dao động bên trong chip PIC 16F877A có thể hoạt động trong 4 chế độ dao động khác nhau
LP Low Power
Crystal 200kHz32kHz 68-100pF15-33pF 68-100pF15-33pF
XT Crystal/Resonator 100kHz
2MHz4MHz
150pF15-33pF
100-15-33pF15-33pF15-33pF
HS High speed
crystal/ Resonator
4MHz20Mhz
15-33pF15-33pF
15-33pF15-33pF
RC Resitor/ Capacitor Không quan trong độ chính
Trang 8xác
4 Nhóm chân port
Các chân port của 16F877A đều cho phép truyền vàø nhận dữ liệu theo hai hướng Nghĩa là ta được phép đọc hoặc xuất dữ liệu ở các port này Hướng truyền được xác định bằng cách đưa giá trị thích hợp vàøo thanh ghi TRISX (trong đó X là tên port) Mỗi bit trong thanh ghi TRISX sẽ điều khiển 1 hướng xuất nhập cho 1 chân của port Nếu 1 bit trong thanh ghi TRISX xuống 0 thì PIC sẽ hiểu rằng chân điều khiển bởi bit đó là chân xuất dữ liệu (output) Ngược lại, nếu 1 bit trong TRISX lên mức 1 thì PIX sẽ hiểu rằng chân điều khiển bởi bit đó là chân nhập dữ liệu (input)
Ví dụ: nếu TRISB = b’11110000’ thì chân RB0->RB3: output, RB4->RB7:input
Port A vàø thanh ghi TRISA (85H)
Trang 9Port A gồm các chân từ RA0 đến RA5 Nội dung của thanh ghi TRISA sẽ
qui định chân nào của port A là input hay output
Riêng chân RA4 còn có chức năng là chân cung cấp xung clock ngoài cho timer 0 Đây là chân có cực thu để hở, nên khi test port A, ta cần gắn điện trở kéo lên để đảm bảo kết quả hiển thị cho chân này
Các chân khác của port A còn có chức năng là chân ngõ vàøo analog của bộ ADC vàø chân ngõ vàøo điện thế so sánh của bộ comparator
Các thanh ghi liên quan đến Port A
Tóm tắt chức năng các chân Port A:
Tên chân Bit (ST:SchmittLoại
Trigger)
Chức năng
RA0/AN0 0 TTL Chân I/O hay chân ngõ vào analog
RA1/AN1 1 TTL Chân I/O hay chân ngõ vào analog
RA2/AN2/Vref-/
CVref 2 TTL Chân I/O hay chân ngõ vào analog hay Vref- hayCVrefRA3/AN3/Vref+ 3 TTL Chân I/O hay chân ngõ vào analog hay Vref+ hay CVrefRA4/TOCKI/C1OUT 4 TTL
Chân I/O hay chân ngõ vào cho xung clock ngoài
cho timer 0 hay ngõ ra bộ so sánh.Ngõ ra cực máng hở.
RA5/SS/AN4/
Chân I/O hay ngõ vào chọn slave trong chế đô giao tiếp nối tiếp đồng bộ, ngõ vào analog hay ngõ ra bộ so sánh điện áp
PortB vàø TRISB
Port B gồm tám chân RB0-> RB7 Việc thay đổi giá trị thanh ghi TRISB sẽ quyết định chân nào của port B là Input, chân nào là output
Trang 10Ba chân của port B được tích hợp chức năng In-circuit Debugger vàø Low Programming là RB3/PGM, RB6/PGC vàø RB7/PGD.
Mỗi chân của port B có một điện trở kéo lên nguồn Bốn chân RB4-> RB7 có chức năng ngắt khi trạng thái thay đổi (chức năng này không hoạt động khi chân port được quy định là output)
Các thanh ghi liên quan đến Port B
Bảng tóm tắt chức năng các chân Port B
Trang 11Tên chân Bit
Loại(ST:Schmitt
RB0/INT 0 TTL/ST Chân I/O hay ngõ ra ngắt ngoài Có thể lập trình bằng phần mềm để sử dụng điện trở kéo lên yếu
ở bên trong
RB1 1 TTL Chân I/O Có thể lập trình bằng phần mềm để sử dụng điện trở kéo lên yếu ở bên trong.RB2 2 TTL Chân I/O Có thể lập trình bằng phần mềm để sử dụng điện trở kéo lên yếu ở bên trong.
RB3/PGM 3 TTL Chân I/O hay chân lập trình LVP( Low Voltage Programming) Có thể lập trình bằng phần mềm
để sử dụng điện trở kéo lên yếu ở bên trong
Chân I/O với ngắt khi có sự thay đổi mức logic trên chân Port Có thể lập trình bằng phần mềm để sử dụng điện trở kéo lên yếu ở bên trong
RC5 5 TTL Chân I/O với ngắt khi có sự thay đổi mức logic trên chân Port Có thể lập trình bằng phần mềm
để sử dụng điện trở kéo lên yếu ở bên trong
Chân I/O với ngắt khi có sự thay đổi mức logic trên chân Port hay chân In-Circuit debugger Có thể lập trình bằng phần mềm để sử dụng điện trở kéo lên yếu ở bên trong Xung nhịp cho lập trình nối tiếp
Chân I/O với ngắt khi có sự thay đổi mức logic trên chân Port hay chân In-Circuit debugger Có thể lập trình bằng phần mềm để sử dụng điện trở kéo lên yếu ở bên trong.Là đường dữ liệu cho lậptrình nối tiếp
Port C vàø TRISC
Ta có cấu trúc chân của PORT C:
Trang 12Port C gồm 8 chân từ RC0 đến RC7, tương tự các Port khác, việc qui định giá trị các bit của thanh ghi TRISC sẽ quyết định chân nào của PORT C là chân xuất, chân nào là chân nhập Khi sử dụng Port C cần lưu ý giá trị của thanh ghi TRISC vì một số chức năng ngoại vi sẽ làm cho các chân Port C mặc định là Output Trong khi đó, một số chức năng ngoại vi sẽ làm cho các chân Port C là chân Input.
Việc đọc thanh ghi PortC sẽ giúp tra biết được trạng thái chân của PORTC Việc ghi giá trị vào thanh ghi này cũng sẽ làm thay đổi trạng thái logic các chân của Port C
Các thanh ghi liên quan đến Port C:
Trang 13Tên chân Bit
Loại(ST:Schmitt
RC0/T1OS0/T1CKI 0 ST Chân I/O hay ngõ ra của bộ dao động timer 1/ Xung clock cho timer 1
RC1/T1OSI/CCP2 1 ST Chân I/O hay ngõ vào bộ dao động cho timer 1 hay ngõ vào bộ Capture 2/ Ngõ ra bộ so sánh 2/
ngõ ra bộ PWM2RC2/CCP1 2 ST Chân I/O hay ngõ vào bộ Capture 1/ Ngõ ra bộ sosánh 1/ Ngõ ra bộ PWM1RC3/SCK/SCL 3 ST Chân I/O hay chân cung cấp xung clock nối tiếp đồng bộ trong chuẩn giao tiếp SPI hay I2CRC4/SDI/SDA 4 ST Chân I/O hay đường SPI Data hay đường SDA (đối với I2C)RC5/SDO 5 ST Chân I/O hay ngõ ra port giao tiếp nối tiếp đồng bộRC6/TX/CK 6 ST Chân I/O hay chân phát bất đồng bộ trong chuẩn giao tiếp nối tiếp.RC7/RX/DT 7 ST Chân I/O hay chân nhận trong chuẩn giao tiếp nốitiếp bất đồng bộ.
Port D vàø TRISD
Port D có tám chân từ RD0 đến RD7 Port D có thể hoạt động như là một Port xuất nhập thông thường hoặc như một cổng song song của PSP (Parallel Slave Port) bằng cách set bit PSP mode (TRISE.4) lên 1 Trong chế độ này, buffer ngõ vào là linh kiện họ TTL
Các thanh ghi liên quan đến Port D:
Cấu trúc chân Port D:
Trang 14Tên chân Bit Loại Chức năng
RD0/PSP0 0 ST/TTL Chân I/O hay bit 0 của PSP
RD1/PSP1 1 ST/TTL Chân I/O hay bit 1 của PSP
RD2/PSP2 2 ST/TTL Chân I/O hay bit 2 của PSP
RD3/PSP3 3 ST/TTL Chân I/O hay bit 3 của PSP
RD4/PSP4 4 ST/TTL Chân I/O hay bit 4 của PSP
RD5/PSP5 5 ST/TTL Chân I/O hay bit 5 của PSP
RD6/PSP6 6 ST/TTL Chân I/O hay bit 6 của PSP
RD7/PSP7 7 ST/TTL Chân I/O hay bit 7 của PSP
Port E vàø TRISE
Cấu trúc chân của Port E:
Trang 15Port E có năm chân, trong đó có ba chân RE0/RD/AN5, RE1/WR/AN6, RE2/CS/AN7 có thể được cấu hình là các chân xuấ nhập.
Các chân Port E có thể trở thành các chân điều khiển cho các cổng của vi xử líKhi bit PSPMODE (TRISE.4) được set lên 1 Khi đó, các bit từ 0 đến 2 của TRISE phải bằng 1 để các chân này được cấu hình là các chân ngõ vào Trongchế độ PSP, bộ đệm ngỏ vào Port E là linh kiện họ TTL
Các chân của Port E còn có chức năng Analog, tại mode này, các chân này sẽ được đọc về là giá trị 0
Các thanh ghi liên quan đến Port E:
Chức năng các chân của Port E:
Trang 16Tên chân Bit Loại Chức năng
RE0/RD/¿AN5 0 ST/TTL(1)
Chân I/O hay hay chân đọc trong mode PSP hay ngõ vào Analog
1: rảnh rỗi0: đang có hoạt động đọc diễn ra Nội dung của thanh ghi PortD là output cho các chân I/O( nếu chip được chọn)
RE1/WR/AN6 1 ST/TTL(1)
Chân I/O hay hay chân ghi trong mode PSP hay ngõ vào Analog
1: rảnh rỗi0: đang có hoạt động ghi diễn ra Mức logic của cacù chân I/O được chốt theo thanh ghi PortD( nếu chip được chọn)
D Cấu trúc bộ nhớ của PIC 16F877A
Có 3 phần riêng biệt trong bộ nhớ của 16F877A gồm: Bộ nhớ chương trình, bộ nhớ dữ liệu vàø bộ nhớ EEROM
I Tổ chức bộ nhớ Tổ chức bộ nhớ chương trình
PIC 16F877A có Program Counter (PC) 13 bit có thể định địa chỉ cho 8KB bộ nhớ.Bộ nhớ chương trình còn bao gồm một ngăn stack có 8 mức
Vector RESET được đặt ở địa chỉ 0000h, vector địa chỉ ngắt ngoại vi được đặt ở đia chỉ 0004h
Trang 17Tổ chức vùng nhớ dữ liệu
Vùng nhớ dữ liệu được chia làm 4 bank thanh ghi Mỗi bank gồm 128 byte dữ liệu, vùng nhớ có địa chỉ thấp trong các bank này dùng cho các thanh ghi có chức năng đặc biệt –SFR (Special Function Register); trong khi đó, vùng có địa chỉ cao trong các bank này đươc sử dụng làm vùng RAM đa dụng (GeneralPurpose Register) Một số thanh ghi SFR trong bank này cũng được ánh xạ sang các bank khác nhằm làm tăng tốc độ truy cập vàøgiảm độ dài code Việc
Trang 18lựa chọn bank thanh ghi phụ thuộc vàøo bit RP0 vàø RP1 trong thanh ghi STATUS.
Bản đồ vùng RAM nội của pic 16f877a.
Trang 19Vùng nhớ EEPROM vàø vùng nhớ chương trình FLASH:
Vùng nhớ dữ liệu EEPROM vàø vùng nhớ chương trình FLASH là vùng nhớ ROM có thể đọc vàø ghi trong khi chương trình hoạt động chỉ với điện thế Vcc=+5V Việc reset hệ thống cũng như mất điện không làm mất dữ liệu trongvùng nhớ này Để truy xuất vùng nhớ này, ta phải thông qua các thanh ghi sau:EEDATA, EEDATH, EEADR, EEADRH, EECON1, EECON2
Tuy nhiên, để tiện việc truy xuất vùng nhớ này, em đã sử dụng phần mềm CCS Cv4.013 có hỗ trợ sẵn các lệnh sau để truy xuất:
Ngăn xếp Stack:
Ngăn xếp này cho phép 8 lệnh gọi chương trình con và ngắt hoạt động
Stack được dùng để chứa địa chỉ mà chương trình sẽ quay trở về từ chương trình con và ngắt Đối với dòng Mid-range như pic 16f877a, stack có độ sâu là
8 lớp Vị trí stack không name trong bộ nhớ chương trình cũnh như bộ nhớ dữ liệu
II Các thanh ghi chức năng đặc biệt trong PIC 16F877A
Thanh ghi STATUS (03H, 83H)
Chức năng các bit như sau:
o C: dùng trong các lệnh liên quan đến các phép toán C sẽ lên 1 nếu có số nhớ sinh ra trong phép toán
o DC: dùng cho các lệnh liên quan đến các phép toán DC sẽ lên
1 nếu có số nhớ sinh ra bởi phép cộng hoặc trừ từ 4 bit thấp
o Z: bit này sẽ lên 1 nếu kết quả phép toán bằng 0 Nếu kết quả phép toán khác 0, bit này sẽ bị xóa về 0
Trang 20o PD (power-down bit)(bit công suấ thấp): được dùng để báo
trạng thái ngủ của PIC 16F877A Ở trạng thái ngủ, bit nàysẽ bị xóa về 0 Ở điều kiện bình thường, bit này bằng 1
o ¿ (time-out bit): bit này sẽ bằng 1 sau khi bật nguồn, sau lệnh CLRWDT, hoặc sau lệnh SLEEP Bit này sẽ bằng 0 khi WDT đi vàøo hoạt động vàø thời gian chờ RESET được tính
o RP1:RP0: Dùng để chọn các bank thanh ghiRP1 RP0 Bank được chọn Địa chỉ
Thanh ghi tùy chọn OPTION REGISTER
(Được trình bày trong phần timer 0)
Các thanh ghi điều khiển ngắt
(Được trình bày trong phần ngắt)
Thanh ghi đếm chương trình PC (Program Counter)
Thanh ghi này được dùng để chứa địa chỉ lệnh kế tiếp khi thực hiện chương trình Nó có độ dài là 13 bit, byte thấp chứa trong thanh ghi PCL, byte cao chứa trong thanh ghi PCH
Thanh ghi W (Working register)
Là một thanh ghi mục đích chung mà ta có thể đặt nó lên bất kì giá trị nào ta muốn Ta có thể gán một giá trị cho thanh ghi W hay dùng nó làm thanh ghi trung gian để gán nội dung cho một thanh ghi khác Khi
ta gán một giá trị mới cho thanh ghi W thì giá trị cũ sẽ bị ghi đè lên Thanh ghi này có thể truy cập từ tất cả các bank
E Giới thiệu về các bộ định thời trong PIC 16F877A
Bộ WDT (Watch Dog Timer)
Bên trong pic 16f877a có một mạch dao động RC, mạch này cung cấp xung nhịp
cho PIC độc lập với xung nhịp của PIC Khi WDT được cho phép, nó sẽ đếm từ
00h-FFh (mỗi lần tăng lên 1 đơn vị Và khi đếm vượt qua FFh, trở thành 00h thì
Trang 21PIC 16F877A sẽ bị reset bất kể đang làm gì Chúng ta ứng dụng WDT để ngăn ngừa sự cố chương trình trong PIC 16F877A bị treo.
Bộ định thời timer 0
o Giới thiệu
Timer 0 là một bộ định thời /đếm 8 bit, có khả năng đọc được vàø ghi được, có một bộ prescaler có thể lập trình được 8 bit, có thể sử dụng với nguồn xung clock nội hay ngoại, có thể ngắt khi có sự kiện tràn timer vàø có thể lựa chọn canh tác động của xung clock ngoài
o Thanh ghi điều khiển (OPTION-REG):
Là thanh ghi tùy chọn chứa các bit điều khiển để cấu hình các chức năng của timer 0, chức năng sử dụng điện trở kéo lên ở PORTB vàø chức năng của WDT
Trong đó, chức năng các bit như sau:
RBPU: nếu bit này bằng 1 thì các chân của Port B sẽ được các điện trở kéo lên nguồn Nếu bit này bằng 0, các chân của Port B sẽ không được các điện trở kéo lên nguồn
INTEDG: qui định ngắt sẽ tác động cạnh lên hay cạnh xuống của xung tại chân RB0 Nếu bit này bằng 1: ngắt sẽ tác đông cạnh lên, nếu bit này bằng 0: ngắt sẽ tác động cạnh xuống
T0CS: chọn nguồn xung clock cấp cho timer 0 Nếu bit này bằng 1: timer 0 sẽ được cấp nguồn xung clock từ bên ngoài vàøo Nếu bit nàybằng 0: timer 0 sẽ được cấp xung clock bởi nguồn dao động nội
T0SE: qui định cạnh lên hay cạnh xuống của xung clock sẽ tác độnglên timer 0 Nếu bit này bằng 1, timer 0 sẽ tác động bởi cạnh xuống của xung clock Nếu bit này bằng 0, timer 0 sẽ bị tác động bởi cạnh lên của xung
PSA (prescaler assignment bit): xác định prescaler sẽ tác động lên timer 0 hay WDT Nếu PSA =1, WDT được chon Nếu PSA=0, thì timer 0 được chọn
PS2PS0: dùng để lựa chọn tốc độ đếm của timer 0 hay của WDT(thời gian chờ của WDT) trước khi reset thiết bị
Trang 22PS2 PS1 PS0 Tốc độ timer 0 Tốc độ của WDT Thời gian chờ
(1 chu kì máy =4/tần số dao động của thạch anh)
Vd: đối với thạch anh 4MHz thì 1 chu kì máy là 1us
o Hoạt động của bộ định thời
Có hai chế độ hoạt động cho timer 0:
Chế độ định thời: giá trị của timer 0 chứa trong thanh ghi TMR0 sẽ tăng lên1 sau mỗi x chu kì máy (với 1:x là tỉ lệ prescaler ) Nếu TMR0 đươc nạp giá trị mới, giá trị này sẽ không được tăng trong 2 chu kì máy kế tiếp Để khắc phục hiện tượng này, ta thường hiệu chỉnh giá trị được lưu vàøo trong timer 0
Chế độ đếm: TMR0 sẽ tăng lên khi có cạnh lên hay cạnh xuống củaxung xuất hiện tại chân T0CKL (chân số 6)
o Ngắt timer 0
Ngắt trong timer 0 chỉ xảy ra khi giá trị trong TMR0 tràn từ FFh xuống 00h Khi xảy ra tràn, cờ báo tràn T0IF được bật lên vàø phải được xóa bằng phần mềm trong chương trình phục vụ ngắt (ISR) trước khi trở về chương trình chính
Ngắt này được cho phép bởi bit T0IE Ngắt này cũng không làm vi điều khiển thoát khỏi trạng thái ngủ
o Bộ Prescaler của timer 0
Một bộ đếm 8 bit được sử dụng như là bộ pre-scaler cho timer 0hay bộ post-scaler cho WDT Bit PSA sẽ quyết định bộ đếm này được sử dụng chotimer 0 hay WDT 3 bit PS2PS0 sẽ xác định tỉ lệ bộ đếm
Hình sau đây trình bày sơ đồ bộ prescaler cho timer 0 vàø WDT
Trang 23Bộ định thời timer 1
o Giới thiệu
Timer 1 là mộtbộ định thời/đếm 16 bit bao gồm 2 thanh ghi 8 bit là TMR1H vàø TMR1L, có khả năng đọc vàø ghi được Cặp thanh ghi này đếm từ 0000H đến FFFFH rồi trở về 0000H
Trang 24Sơ đồ bộ định thời timer 1
o Thanh ghi điều khiển (T1CON)
- - TICKPS
1 TICKPS0 T10SEN T1SYNC TMR1CS TMR1ON
Trong đó, chức năng các bit như sau:
Bit 7:6: không sử dụng
Bit 5:4: TICKPS1:T1CKPS0: chọn tỉ lệ xung ngõ vàøo cho timer 1
T1SYNC: lựa chọn đồng bộ hóa xung clock ngòai của timer 1 Khi
nó bằng 1: không đồng bộ hóa xung clock ngoài Khi bit này bằng
0: đồng bộ hóa xung clock ngoài
TM1CS: bit chọn nguồn xung clock cho timer 1 Nếu bit này bằng 1:chọn xung clock ngoài đưa qua hai chân T1OSO/T1CKI (tác động
Trang 25theo cạnh lên của xung) Nếu bit này bằng 0: chọn xung clock nội (Fosc/4)
TMR1ON: cho phép hoặc ngưng timer 1Nếu bit này bằng 1: cho phép timer 1Nếu bit này bằng 0: không cho phép timer 1
o Hoạt động của bộ định thời timer 1
Timer 1 có ba chế độ hoạt động:
Chế độ hoạt động định thời đồng bộ: xung cấp cho timer 1 là Fosc/4 TMR1CS=0, T1SYNC không có tác dụng
Chế độ đếm đồng bộ: Giá trị bộ đếm sẽ tăng lên khi có xung cạnh lên tại chân T1OSI/RC1 Xung clock ngoài này phải được đồng bộ với xung clock nội Chế độ đếm đồng bộ sẽ không hoạt đông trong Sleep Mode
Chế độ đếm không đồng bộ: (được đặt bằng các set bit T1SYNC lên1) Bộ định thời sẽ tiếp tục đếm trong quá trình ngủ của PIC
16F877A vàø có thể xảy ra một ngắt khi bộ định thời tràn vàø làm cho PIC 16F877A thoát khỏi chế độ ngủ Ở chế độ này, để đọc giá trị timer, ta không cần dừng timer1, nhưng để đảm bảo việc ghi là chính xác, ta phải dừng timer
o Bộ dao động riêng của timer 1: ta có thể xây dựng một bộ dao động riêng
cho timer 1 (độc lập với bộ dao động của PIC 16F877A) nhờ đó, bộ đếm cóthể hoạt động ngay cả khi pic 16f877a rơi vàøo trạng thái ngủ
o Ngắt timer 1: xảy ra khi giá trị trong hai thanh ghi TMR1 có sự tràn từ
FFFFH xuống 0000H Khi xảy ra tràn, cờ TMR1IF được bật lên vàø phải được xóa bằng phầm mềm trước khi thoát khỏi chương trình phục vụ ngắt (isr) trở về chương trình chính Ngắt này cũng không làm cho PIC 16F877Athoát khỏi trạng thái ngủ, chỉ có chế độ đếm không đồng bộ mới làm cho PIC 16F877A thoát khỏi trạng thái ngủ
Bộ định thời timer 2
o Giới thiệu
Bộ định thời timer 2 là một bộ định thời 8 bit bao gồm một bộ prescaler vàømột bộ postscaler vàø một thanh ghi chu kì PR2 Có thể kết hợp timer 2 với hai bộ định tỉ lệ trên cho phép PIC 16F877A hoạt động như một bộ đếm 16
Trang 26bit Module timer 2 cung cấp thời gian hoạt động cho chế độ điều rộng xung (PWM) nếu module CCP được chọn.
o Thanh ghi điều khiển (T2CON)
- TOUTPS
3
TOUTPS2
TOUTPS1
TOUTPS0
TMR2ON
T2CKPS1
T2CKPS0
Trong đó, chức năng các bit như sau:
Bit7: không sử dụng
TOUTSP3:TOUTSP0: chọn tỉ lệ ngõ ra cho timer 2
T2CKPS1:T2CKPS0: bit chọn tỉ lệ ngõ vàøo cho timer 2
o Nguồn xung clock cho timer 2:
Timer 2 chỉ có một nguồn xung clock đó là xung clock nội của PIC 16F877A
o Thanh ghi TMR2 vàø PR2:
Đây là hai thanh gho đọc vàø ghi được TMR2 sẽ tăng từ 00h lên đến giá trị nằm trong PR2, sau đó sẽ được reset về 00h cho chu kì đếm kế tiếp
o Tín hiệu báo trạng thái cân bằng:
Khi giá trị trong thanh ghi TMR2 bằng giá trị trong thanh ghi 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ộ postscaler hoặc 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
o Xóa các bộ tỉ lệ trong timer 2
Các bộ tỉ lệ được xóa khi:
Ghi một giá trị bất kì vàøo TMR2
Ghi một giá trị bất kì vàøo thanh ghi T2CON
Trang 27 Bất cứ một dạng reset thiết bị nào.
o Hoạt động trong Sleep mode
Trong chế độ ngủ, timer 2 không hoạt động Các bộ định tỉ lệ sẽ được lưu lại vàø phục hồi sau khi thoát khỏi trạng thái ngủ
Các hàm trong CCS liên quan đến timer:
o Timer 0:
setup_TIMER_0(mode);
Ý nghĩa: chọn chế độ hoạt động cho timer 0Trong đó mode là một hoặc hai khai báo sau:
(nếu dùng cả hai thì sử dụng dấu “|” đặt ở giữa)
Khai báo Ý nghĩaRTCC_INTERNAL Chọn xung clock nộiRTCC_EXT_L_TO_H Chọn cho timer 0 bị tác động khi có cạnhlên tại chân RA4 (T0CKI)RTCC_EXT_H_TO_L Chọn cho timer 0 bị tác động khi có cạnhxuống tại chân RA4 (T0CKI)RTCC_DIV_2 Chọn tỉ lệ bộ prescaler là 1:2RTCC_DIV_4 Chọn tỉ lệ bộ prescaler là 1:4RTCC_DIV_8 Chọn tỉ lệ bộ prescaler là 1:8RTCC_DIV_16 Chọn tỉ lệ bộ prescaler là 1:16RTCC_DIV_32 Chọn tỉ lệ bộ prescaler là 1:32RTCC_DIV_64 Chọn tỉ lệ bộ prescaler là 1:64RTCC_DIV_128 Chọn tỉ lệ bộ prescaler là 1:128RTCC_DIV_256 Chọn tỉ lệ bộ prescaler là 1:256
setup_COUNTERS (rtcc_state, ps_state);
setup_WDT();
Khai báo của rtcc_state: (chọn nguồn xung nhịp cho counter)
Khai báo Ý nghĩaRTCC_INTERNAL Chọn xung clock nội cho bộ đếmRTCC_EXT_L_TO_
H
Chọn cho timer 0 bị tác động khi có cạnh
lên tại chân RA4 (T0CKI)RTCC_EXT_H_TO_
L Chọn cho timer 0 bị tác động khi có cạnhxuống tại chân RA4 (T0CKI)
Trang 28 Khai báo của ps_state (đặt tỉ lệ bộ prescaler cho cả timer 0 vàø WDT) (do timer 0 vàø WDT sử dụng cùng một bộ chia tần
Khai báo Ý nghĩaRTCC_DIV_2 Chọn tỉ lệ bộ prescaler là 1:2RTCC_DIV_4 Chọn tỉ lệ bộ prescaler là 1:4RTCC_DIV_8 Chọn tỉ lệ bộ prescaler là 1:8RTCC_DIV_16 Chọn tỉ lệ bộ prescaler là 1:16RTCC_DIV_32 Chọn tỉ lệ bộ prescaler là 1:32RTCC_DIV_64 Chọn tỉ lệ bộ prescaler là 1:64RTCC_DIV_128 Chọn tỉ lệ bộ prescaler là 1:128RTCC_DIV_256 Chọn tỉ lệ bộ prescaler là 1:256WDT_18MS WDT sẽ chờ 18 ms trước khi reset hệ thốngWDT_36MS WDT sẽ chờ 36 ms trước khi reset hệ thốngWDT_72MS WDT sẽ chờ 72 ms trước khi reset hệ thốngWDT_144MS WDT sẽ chờ 144 ms trước khi reset hệ thốngWDT_288MS WDT sẽ chờ 288 ms trước khi reset hệ thốngWDT_576MS WDT sẽ chờ 576 ms trước khi reset hệ thốngWDT_1152MS WDT sẽ chờ 1152 ms trước khi reset hệthốngWDT_2304MS WDT sẽ chờ 2304 ms trước khi reset hệthống
(nếu dùng cả hai thì sử dụng dấu “|” đặt ở giữa)
Khai báo Ý nghĩa
Trang 29T1_DISABLE Tắt timer 1T1_INTERNAL Chọn nguồn xung clock nội cho timer 1(Fosc/4)T1_EXTERNAL Chọn nguồn xung clock ngoài cho timer 1tại chân RC0T1_EXTERNAL_SYN
C Chọn nguồn xung clock ngoài có đồng bộT1_CLK_OUT
T1_DIV_BY_1T1_DIV_BY_2T1_DIV_BY_4T1_DIV_BY_8
setup_TIMER_2(mode, period, postscale);
Ý nghĩa: chọn chế độ hoạt động cho timer 2
Khai báo Ý nghĩaT2_DISABLE Tắt timer 2T1_DIV_BY_1 Chọn tỉ lệ cho bộ postscaler là 1:1T1_DIV_BY_4 Chọn tỉ lệ cho bộ postscaler là 1:4T1_DIV_BY_16 Chọn tỉ lệ cho bộ postscaler là 1:16
Period: số nguyên từ 0255 xác định đến xung clock nào thì reset.Postscale: là số nguyên từ 016 xác định số lần tràn của timer 2 trước khi reset
F Giới thiệu về ngắt trong PIC 16F877A
a Giới thiệu chung về ngắt
Trang 30Đối với vi điều khiển PIC 16F877A có nhiều nguồn ngắt Cứ mỗi một module ngoại vi thì có một nguồn ngắt, tuy nhiên, có một số module có nhiều nguồn ngắt.
Sau đây, em xin trình bày một số nguồn ngắt tiêu biểu trong PIC 16F877A:
Ngắt ngoài trên các chân RB0
Ngắt tràn timer 0
Ngắt tràn timer 1
Ngắt tràn timer 2
Ngắt thay đổi trạng thái trên các chân PORTB từ RB4:RB7
Ngắt so sánh điện thế
Ngắt port song song
Ngắt USART
Ngắt nhận dữ liệu
Ngắt truyền dữ liệu
Ngắt hoàn tất chuyển đổi A/D
Ngắt màn hình LCD
Ngắt hoàn tất ghi EEPROM
Ngắt module CCP
Ngắt module SSP
Trang 31Sơ đồ các nguồn ngắt bên trong pic 16f877a
Trong sơ đồ trên ,ta thấy có các chữ cái IE vàø IF, các chữ này có ý nghĩa như sau:
IE: interrupts enable (cho phép ngắt)
Khi ta cho phép một loại ngắt nào đó thì bit có chữ cái tận cùng là IE phải được set lên 1 Mặc định, giá trị của các bit này đều là 0 Chĩ khi nào ta cho phép một ngắt nào đó thì ngắt đó mới có thể xảy ra
IF: interrupts flag: cờ báo ngắt Khi có sự kiện ngắt xảy ra thì cờ này được set
lên 1 Nếu ngắt tương ứng được cho phép thì sẽ có sự kiện ngắt được xảy ra vàøProgram Counter (PC) sẽ nhảy vàøo chương trình phục vụ ngắt (isr) Các cờ
Trang 32báo ngắt đôi khi không tự động được xóa mà phải được xóa bằng phần mềm trước khi thoát khỏi chương trình phục vụ ngắt (isr) trở về chương trình chính.
b Các lớp ngắt
Để sử dụng tất cả các ngắt thuộc các lớp ngắt được trình bày dưới đây, trước tiên, ta phải bật bit cho phép ngắt toàn cục GIE (Global Interrupts Enable) lên1
Lớp ngắt ngoại vi (lớp ngắt nằm ngoài cùng bên trái trong sơ đồ trên)
Vì lớp này có quá nhiều nguồn ngắt vàø vì các nguồn ngắt đều là một số chuẩn giao tiếp hoặc một số chức năng đặc biệt của PIC 16F877A nên ta phân thành các lớp ngắt ngoại vi Để cho phép các ngắt ngoại vi hoạt động thì trước tiên,
ta phải cho phép ngắt ngoại vi, tức là bật bit PIE lên Sau đó, muốn cho phép
ngắt ngoại vi cụ thể nào thì chúng ta bật bit có chứa kí hiệu IE ứng với ngắt đólên
Lớp ngắt thứ hai (lớp ngắt phổ thông)
Khi muốn dùng ngắt phổ thông nào thì chúng ta chỉ cần bật bit IE của nguồnngắt đó Do đó, bit PEIE cũng được coi là một nguồn ngắt phổ thông
c Vectơ ngắt
Vectơ ngắt của PIC 16F877A có địa chỉ là 0x0004 Do đó, khi có sự kiện ngắt xảy ra, PC sẽ nhảy đến địa chỉ 0x0004, thực thi chương trình con phục vụ ngắt tại đó vàø sau đó sẽ nhảy thoát khỏi chương trình phục vụ ngắt để trở về chương trình chính
d Các thanh ghi liên quan đến ngắt
Các thanh ghi liên quan đến ngắt là INTCON, PIE1, PIR1, PIE2, PIR2
Thanh ghi INTCON
Chức năng các bit:
GIE: cho phép tổng quát với tất cả các nguồn ngắt
o GIE=1: các ngắt được cho phép
o GIE=0: các ngắt không được cho phép
EEIE: cho phép ngắt ghi vàøo EEPROM hoàn tất
o EEIE=1: cho phép ngắt ghi EEPROM hoạt động
Trang 33o EEIE=0: không cho phép ngắt ghi EEPROM hoạt động
T0IE: cho phép ngắt khi tràn timer 0
o T0IE=1: cho phép ngắt khi timer 0 tràn
o T0IE=0: không cho phép ngắt khi timer 0 tràn
INTE: cho phép ngắt ngoại vi trên chân RB0/INT
o INTE=1: cho phép ngắt ngoại vi
o INTE=0: không cho phép ngắt ngoại vi trên chân RB0/INT
RBIE: cho phép ngắt khi trạng thái PORTB thay đổi
o RBIE=1: cho phép ngắt khi trạng thái PORTB thay đổi
o RBIE=0: không cho phép ngắt khi trạng thái PORTB thay đổi
T0IF: cờ báo ngắt timer 0
o T0IF=1: báo hiệu TIMER 0 tràn
o T0IF=0: báo hiện TIMER 0 chưa tràn
INTF: cờ báo ngắt ngoài RB0/INT
o INTF=1: báo hiệu ngắt ngoài trên chân RB0/INT
o INTF=0: báo hiệu ngắt ngoài trên chân RB0/INT chưa xuất hiện
RBIF: cờ báo ngắt khi trạng thái PORTB thay đổi
o RBIF=1: báo hiệu có ngắt thay đổi trạng thái trên các chân RB4:RB7
o RBIF=0: ngắt thay đổi trạng thái trên các chân RB4:RB7 chưa xuất hiện
Thanh ghi PIE1 (thanh ghi cho phép ngắt ngoại vi)
PSPIE ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE
Chức năng các bit:
PSPIE: cho phép ngắt ghi vàø đọc của port song song
o PSPIE=1: cho phép ngắt ghi/đọc của port song song
o PSPIE=0: không cho phép ngắt ghi/đọc của port song song
ADIE: cho phép ngắt chuyển đổi A/D
o ADIE=1: cho phép ngắt chuyển đổi A/D
o ADIE=0: không cho phép ngắt chuyển đổi A/D
RCIE: cho phép ngắt nhận USART
Trang 34o RCIE=1: cho phép ngắt nhận USART.
o RCIE=0: không cho phép ngắt nhận USART
TXIE: cho phép ngắt truyền USART
o TXIE=1: cho phép ngắt truyền USART
o TXIE=0: không cho phép ngắt truyền USART
SSPIE: cho phép ngắt port nối tiếp đồng bộ
o SSPIE=1: cho phép ngắt port nối tiếp đồng bộ
o SSPIE=0: không cho phép ngắt port nối tiếp đồng bộ
CCP1IE: cho phép ngắt CCP1
o CCP1E=1: cho phép ngắt CCP1
o CCP1E=0: không cho phép ngắt CCP1
TMR2IE: cho phép ngắt xảy ra khi nội dung TMR2 bằng thanh ghi PR2
o TMR2IE=1: cho phép ngắt xảy ra khi TMR2 bằng thanh ghi PR2
o TMR2IE=0: không cho phép ngắt trên xảy ra
TMR1IE: bit cho phép ngắt tràn timer 1
o TMR1IE=1: cho phép ngắt khi timer 1 bị tràn
o TMR1IE=0: không cho phép ngắt khi timer 1 bị tràn
Thanh ghi PIR1 (Thanh ghi cờ của các ngắt ngoại vi)
PSPIF ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF
Chức năng các bit:
PSPIF: cờ ngắt ghi vàø đọc của port song song
o PSPIF=1: một tác vụ ghi/đọc đã diễn ra
o PSPIF=0: tác vụ ghi/đọc chưa diễn ra
ADIF: cờ báo ngắt chuyển đổi A/D
o ADIF=1: quá trình chuyển đổi A/D đã hoàn thành
o ADIF=0: quá trình chuyển đổi A/D chưa hoàn tất
RCIF: cờ báo ngắt nhận USART
o RCIF=1: buffer nhận USART đã đầy
o RCIF=0: buffer nhận USART còn trống
TXIF: cờ báo ngắt phát USART
o TXIF=1: buffer truyền USART còn trống
o TXIF=0: buffer truyền USART còn trống
Trang 35 SSPIF: cờ báo ngắt SSP
o SSPIF=1: ngắt SSP đã xảy ra vàø phải được xóa bằng phần mềm trước khi trở về chương trình chính
o SSPIF=0: ngắt SSP chưa xảy ra
CCP1IF: cờ báo ngắt CCP1
o Chế độ bắt giữ:
CCP1F=1: việc bắt giữ theo timer 1 đã xảy ra (phải được xóa bằng phần mềm)
CCP1F=0: việc bắt giữ theo timer 1 chưa xảy ra
o Chế độ so sánh:
CCP1F=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)
CCP1E=0: các giá trị so sáng trong thanh ghi TMR1 không thỏa
TMR2IF: cờ báo ngắt xảy ra khi nội dung TMR2 bằng thanh ghi PR2
o TMR2IF=1: khi TMR2 bằng thanh ghi PR2 (phải được xóa bằng phần mềm)
o TMR2IF=0: khi TMR2 chưa bằng PR2
TMR1IF: báo có hiện tượng tràn timer 1
o TMR1IF=1: khi timer 1 bị tràn (phải được xóa bằng phần mềm)
o TMR1IF=0: khi timer 1 chưa bị tràn
Thanh ghi PIE2 (Thanh ghi cho phép ngắt ngoại vi 2)
Chức năng các bit:
Bit 7: không sử dụng (đọc về là 0)
CMIE: cho phép ngắt bộ so sánh điện thế
o CMIE=1: cho phép ngắt bộ so sánh điện thế
o CMIE=0: không cho phép ngắt bộ so sánh điện thế
Bit 5: không sử dụng (đọc về là 0)
EEIE: cho phép ngắt ghi EEPROM
o EEIE=1: cho phép ngắt ghi EEPROM
o EEIE=0: không cho phép ngắt ghi EEPROM
Trang 36 BCLIE: cho phép ngắt do xung đột bus
o BCLIE=1: cho phép ngắt do xung đột bus
o BCLIE=0: không cho phép ngắt do xung đột bus
Bit 2: bit1: không sử dụng (đọc về là 0)
CCP2IE: cho phép ngắt CCP2
o CCP2IE=1: cho phép ngắt CCP2
o CCP2IE=0: không cho phép ngắt CCP2
Thanh ghi PIR2
Chức năng các bit:
Bit 7: không sử dụng (đọc về là 0)
CMIF: cờ báo ngắt bộ so sánh điện thế
o CMIF=1: ngõ vàøo bộ so sánh đã thay đổi
o CMIF=0: ngõ vàøo bộ so sánh không thay đổi
Bit 5: không sử dụng (đọc về là 0)
EEIF: cờ báo ngắt ghi EEPROM
o EEIF=1: ghi EEPROM đã hoàn thành (phải được xóa bằng phần mềm)
o EEIF=0: ghi EEPROM chưa hoàn thành hay chưa bắt đầu
BCLIF: cờ báo ngắt do xung đột bus
o BCLIF=1: xung đột bus đã xuất hiện trong chế độ SSP
o BCLIF=0: không xuất hiện xung đột bus
Bit 2: bit1: không sử dụng (đọc về là 0)
CCP2IF: cờ báo ngắt CCP2
o Chế độ bắt giữ:
CCP2IF=1: việc bắt giữ theo timer 1 đã hoàn thành (phải được xóa bằng phần mềm)
CCP2IF=0: việc bắt giữ theo timer 1 chưa hoàn thành
o Chế độ so sánh:
CCP2IF=1:khi các giá trị so sánh trong TMR1 được thoả (phải được xóa bằng phần mềm)
CCP2IF=0: khi các giá trị so sáng trong TMR1 chưa đượcthỏa
Trang 37e Vàán đề sử dụng ngắt trong CCS
Các hàm thiết lập hoạt động ngắt:
enable_interrupts(level)
Trong đó level bao gồm:
INT_AD Chuyển đổi A/D đã hoàn tất
INT_BUSCOL Ngắt xung đột bus
INT_BUTTON Ngắt nút nhấn
INT_CCP1 Có capture hay compare trên CCP1
INT_CCP2 Có capture hay compare trên CCP2
INT_COMP Kiểm tra bằng nhau trên comparator
INT_EEPROM Hoàn thành ghi EEPROM
INT_EXT Ngắt ngoài
INT_I2C Ngắt khi có hoạt động I2C
INT_LCD Ngắt khi có hoạt động LCD
INT_LOWVOL
T Ngắt khi phát hiện điện áp thấp
INT_PSP Ngắt khi có data ra/vàøo parallel slave port
INT_RB Ngắt khi có bất kì thay đổi nào trên chân từ RB4:RB7
INT_RC Ngắt khi có bất kì thay đổi nào trên các chân từ RC4:RC7INT_RDA Ngắt khi data nhận từ giao tiếp RS232 đã sẵn sàng
INT_RTCC Ngắt khi tràn timer 0
INT_TIMER0 Ngắt khi tràn timer 0
INT_TIMER1 Ngắt khi tràn timer 1
INT_TIMER2 Ngắt khi tràn timer 2
INT_OSCF Ngắt khi có lỗi OSC
INT_PWMTB Ngắt của PWM time base
Để cho phép một ngắt nào đó, trước tiên, ta phải bật bit GIE bằng cách thực hiện lệnh: enable_interrupts(global)
Ví dụ: để cho phép ngắt timer0 vàø timer1 hoạt động:
Ta thực hiện các lệnh sau:
enable_interrupts ( global );
enable_interrupts (int_timer0);
enable_interrupts (int_timer1 ) ;
Trang 38 disable_interrupts(level)
Chức năng: vô hiệu hóa một ngắt bằng cách xóa bit cho phép ngắt về 0 Trong đó, khai báo level hoàn toàn tương tự như phầntrước Không dùng hàm này trong chương trình phục vụ ngắt vì không có tác dụng, cờ ngắt luôn bị xóa tự động
Disable_interrupts(global) sẽ có chức năng cấm tất cả các ngắt
Khai báo chương trình phục vụ ngắt:
(Sẽ được trình bày trong phần phụ lục về CCS)
G Sử dụng giao tiếp theo chuẩn giao tiếp I2C trong PIC 16F877A
a Giới thiệu chung về chuẩn giao tiếp I2C
I2C (Inter- Intergrated Circuit) là một chuẩn giao tiếp do Philips phát triển,được sử dụng rộng rãi trong việc kết nối các ngoại vi có tốc độ thấp vàøo các mạch thích hợp
I2C sử dụng hai đường truyền tín hiệu hai chiều, một đường CLOCK vàø một đường DATA, sử dụng hiệu điện thế 5V Các đường day này được kéo lên nguồn bằng các điện trở
I2C có thể hoạt động ở nhiều mode: mode chuẩn (standard mode) 100kbits/
s, mode tốc độ thấp (low-speed mode) 10kbits/s
I2C sử dụng 7 bit để định địa chỉ Do đó có tất cả 112 thiết bị có thể kết nốivàøo một bus (16 địa chỉ được sử dụng vàøo các mục đích riêng) Điểm mạnh
Trang 39của I2C là với hai chân của vi điều khiển có thể giao tiếp cả một mạng thiết bị.
b Giao thức giao tiếp trong chuẩn i2c
Một số khái niệm:
Master: thiết bị kiểm soát thông điệp (message), có nhiệm vụ tạo xung clock, tạo điều kiện START, STOP
Slave: Thiết bị được kiểm soát bởi master
Sơ lược về các trạng thái của bus I2C:
Bus không bận: cả hai đường SCL vàø SDA đều ở mức cao
Điều kiện start: xảy ra khi có sự chuyển tiếp từ mức cao sang mức
thấp trên SDA khi SCL đang ở mức cao
Điều kiện stop: xảy ra khi có sự chuyển tiếp từ mức thấp sang mức
cao trên SDA khi SCL đang ở mức cao
Dữ liệu phù hợp:
o Sau điều kiện START, dữ liệu phải ổn định trên SDA khi SCL đang ở mức cao Dữ liệu phải được thay đổi trên đường SDA khi SCL đang ở mức thấp
o Mỗi lần chuyển dữ liệu, dữ liệu phải nằm giữa hai điều kiện START vàø điều kiện STOP, số byte được truyền không bị giới hạn Sau mỗi lần truyền, nếu thiết bị nhận nhận được dữliệu thì nó sẽ tạo ra một bit thứ 9 (acknowledge)
Acknowledge:
o Mỗi thiết bị nhận (đã được xác đinh đúng địa chỉ của mình phải tạo ra một điều kiện Acknowledgebằng cách kéo bus SDA xuống mức thấp trongsuốt thời gian mức cao của SCL ứng với bịt ACK do master tạo ra (xem hình vẽ)
o Để kết thúc việc truyền nhận dữ liệu, master sẽ không tạo raxung ACK Trong điều kiện này, slave phải để đường SDA ởmức cao để cho master có thể tạo điều kiện STOP