Khi đó nếuđược cho phép hoạt động, bộ đếm của WDT sẽ bị xóa nhưng WDT vẫn tiếp tụchoạt động bit PD STATUS được reset về không, bit TO được set, oscillatorngưng hoạt động và các PORT giữ
Trang 1Sau thời gian học tập môn vi xử lý, với sự chỉ dẫn tận tình của Thầy, Cô.Được sự đồng ý của khoa Điện Tử - Tin Học Trường Cao Đẳng Kỹ Thuật CaoThắng ,nhằm ứng dụng những kiến thức đã học vào thực tế qua đồ án tốtnghiệp của mình, em quyết định làm đề tài “ HỆ THỐNG ĐIỀU KHIỂN VÀGIÁM SÁT THIẾT BỊ -NGÔI NHÀ THÔNG MINH”.
II Giới hạn đề tài:
Với thời gian gần năm tuần thực hiện đề tài cũng như trình độ chuyênmôn có hạn, em đã cố gắng hết sức để hoàn thành đồ án này nhưng chỉ giảiquyết được những vấn đề sau:
Hệ Thống Cửa Tự Động và khóa mã
Hệ thống đo và xử lý nhiệt độ trong nhà
Hệ thống điều khiển thiết bị trong nhà
Hệ thống an ninh chống trộm và camera quan sát
Giao diện điều khiển hệ thống ngôi nhà trên máy tính
III Mục đích nghiên cứu :
Mục đích trước hết khi thực hiện đề tài này là để hoàn tất chương trìnhmôn học để đủ điều kiện ra trường Cụ thể khi nghiên cứu đề tài là em muốnphát huy những thành quả ứng dụng của vi điều khiển vào mạch thực tế,cũngnhư đem những gì học được để làm ra những ứng dụng có ích cho xã hội Nócòn là tập tài liệu tham khảo cho các bạn sinh viên khóa sau
Ngoài ra quá trình thực hiện đề tài là một cơ hội để chúng em tự kiểm tralại những kiến thức đã học ở trường Đồng thời phát huy tính sáng tạo, khảnăng giải những vấn đề do nhu cầu đặt ra,từ đó có thể đưa những ứng dụng làm
Trang 2- Các phương án điều khiển và xử lý mã khóa cửa cho hệ thống cửa tự
động
-Truyền dữ liệu giữa máy tính và pic16f877a theo chuẩn RS232
-Cảm biến chống trộm và dùng webcam quan sát hiển thị trên giao diệnvisual basic 6.0
-Cách truyền dữ liệu thông qua module RF
Trang 3PHẦN I:
LÝ THUYẾTMỘT SỐ LINH KIỆN SỬ DỤNG TRONG MẠCH:
I.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ính năng,
40 chân, bộ nhớ đủ cho hầu hết các ứng dụng thông thường) Cấu trúc tổng quátcủa PIC 16F877A như sau:
- 8 K Flash ROM
- 368 Bytes RAM
- 256 Bytes EEPROM
- 5 ports (A, B, C, D, E) vào ra với tín hiệu điều khiển độc lập
- 2 bộ định thời 8 bits (Timer 0 và Timer 2)
- Một bộ định thời 16 bits (Timer 1) có thể hoạt động trong chế độ tiết kiệmnăng lượng (SLEEP MODE) với nguồn xung Clock ngoài
- 2 bô CCP( Capture / Compare/ PWM)
- 1 bộ biến đổi AD 10 bits, 8 ngõ vào
- 2 bộ so sánh tương tự (Compartor)
- 1 bộ định thời giám sát (WatchDog Timer)
- Một cổng song song 8 bits với các tín hiệu điều khiển
- Một cổng nối tiếp
- 15 nguồn ngắt
- Có chế độ tiết kiệm năng lượng
- Nạp chương trình bằng cổng nối tiếp ICSP(In-Circuit SerialProgramming)
- Được chế tạo bằng công nghệ CMOS
- 35 tập lệnh có độ dài 14 bits
- Tần số hoạt động tối đa 20MHz
Trang 4
Sơ lược chân PIC 16f877A
Trang 6PIC16F877A là họ vi điều khiển có 40 chân, mỗi chân có một chức năng khácnhau.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ácthiết bị ngoại vi.
Trang 7Sơ đồ Khối PIC
Trang 8I.2 Một số điểm đặc biệt của CPU:
1.3.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à HSchúng ta sử dụng thạch anh dao độngnối và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ăngtính ổn định của dao động nhưngcũng làm tăng thờ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 đó:
Tần số dao động của thạch anh là Fosc = 10Mhz
→ChukỳdaođộngcủathạchanhlàTosc=1/Tosc=1/10*106 (s)
Trang 9(Lưu ý: Reset do WDT không làm chân xuống mức thấp).
Trang 10I.4 Interrupts:
PIC16F877A có nhiều nguồn ngắt khác nhau Đây là một số ngắt tiêu biểu :
- Ngắt ngoài xảy ra trên chân INT
Trang 11I.5 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ẫn tiếp tụchoạt động bit PD (STATUS <3>) được reset về không, bit TO được set, oscillatorngưng hoạt động và các PORT giữ nguyên trạng thái như trước khi lệ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ực hiệncác bước sau trước khi VĐK thực thi lệnh sleep
• Đưa tất cả các chân về trạng thái VDD hoặc VSS
• 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
• Tạm ngưng hoạt động của khối A/D và không cho phép các xung clockbên ngoài tác dụng vào VĐK
• Để ý chức năng điện trở kéo lên của PORTB
• Pin phải ở mức logic cao
I.6 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 quay trở
về điểm bắt đầu Nhưng mà hãy xem một trường hợp: Giả sử chương trình kiểmtra một chân input, nếu nó lên mức cao thì con Pic sẽ tiếp tục kiểm tra một châninput thứ hai có lên mức cao hay không, nếu chân input thứ hai không lên mứccao, con Pic sẽ ngồi đó chờ và nó sẽ chỉ thoát ra khỏi chỗ ngồi của nó nếu châninput 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ương trình,bạn compiled nó thành công, và ngay cả bạn đã cho chạy mô phỏng từng bước,từng bước một trên máy tính, bằng MPLAB chẳng hạn, có vẻ như mọi chuyện đềutốt, bạn đem nạp vào con Pic Sau một thời gian chạy thử, con Pic thình lình bị kẹtvào nơi nào đó trong chương trình mà không thể thoát ra được trạ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, reset lại hay vẫn để cho nó bịkẹt không thoát ra được, đó là mục đích của mạch Watchdog
Mạch Watchdog thì không phải là mới mẽ gì, có rất nhiều microprocessors
và microcontrollers đã có mạch Watchdog, nhưng mà nó làm việ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 đếnFFh, 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ì
Trang 12vậ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
• Thứ nhất, cần thời gian bao lâu để reset WDT ?
• Thứ hai, làm sao xoá WDT ?
• Cuối cùng, chúng ta phải nói cho con Pic biết chương trình cho phép WDT hoạt độn
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 13I.7.2 Bộ nhớ dữ liệu:
Bản đồ cấu trúc PIC 16F877A
Trang 14
Bộ nhớ dữ liệu bao gồm 4 Bank: Bank 0, Bank1, Bank2 và Bank3 Mỗi bank
có dung lượng 128 Bytes, bao gồm vùng Ram đa mục đích (GPR) và vùng thanhghi chức năng đặc biệt (SFR)
Các Bank này được lựa chọn bằng 2 bit ở thanh ghi STATUS làRP0(Status<5>) và RP1(Status<6>)
I.7.2.1 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 được phânphối ở các Bank như sau:
- Bank 0: 96 Bytes từ địa chỉ 20h đến địa chỉ 7Fh
- Bank 1: 80 Bytes từ địa chỉ A0h đến địa chỉ EFh
-
Bank 2: 96 Bytes từ địa chỉ 110h đến địa chỉ 16Fh
- Bank 3: 96 Bytes từ địa chỉ 190h đến địa chỉ 1EFh
I.7.2.2 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âm CPUhoặc các module ngoại vi để điều khiển hoạt động của VĐK Các thanh ghi chứcnăng đặc biệt này được chia làm 2 loại: loại thứ nhất dùng cho các chức năng củaCPU, loại thứ 2 dùng cho các chức năng ngoại vi
Bảng tóm tắt các chức năng đặc biệt:
Trang 15
I.7.3 Các thanh ghi chức năng đặc biệt:
I.7.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)
Trang 16
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
I.7.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ă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ời gianchờ của WDT
Trang 17Bit 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
Bit 2-0 PS2:PS0: Dùng để lựa chọn tốc độ đếm của timer hay WDT
I.7.3.3 Thanh ghi điều khiển ngắt INTCON (Interrupt Control Register):
Trang 18Bit 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
0: Không có thay đổi xảy ra trên PORTB
I.7.3.4 Thanh ghi cho phép ngắt ngoại vi 1(PIE1 Register):
Trang 19Chú ý: 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 20Bit 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: Không có ngắt xảy ra
Bit2 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ằngphầ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ầ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
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:
Trang 21Chú ý: Bit PEIE (INTCON<6>) phải được set để cho phép bất kì ngắt ngọai vi nàoxả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ế
I.7.3.6 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
Trang 220: Không có xung đột bus xảy ra
Bit 0 CCP2IF: Cờ báo ngắt CPP2
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
I.7.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 hayngắ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
I.7.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 thanhghi 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:
Trang 23EEPROM 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ực tiếptrong bản đồ bộ nhớ mà được định địa chỉ gián tiếp thông qua các thanh ghi chứcnăng đặc biệt:
Trang 24I.8 I/O ports:
I.8.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
ChứcnăngcủacácchânPortA
Bảng tóm tắt các thanh ghi liên quan đến
Port A
Trang 26I.8.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 đọcthanh ghi Port B sẽ đọc trạng thái của các chân ở Port B Việc ghi giá trị vào thanhghi 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à LowVoltage 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 bitRBPU (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ânPort 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 :
Trang 28Bảng tóm tắt các thanh ghi liên quan đến Port B :
I.8.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 đọcthanh ghi Port C sẽ đọc trạng thái của các chân ở Port C Việc ghi giá trị vào thanhghi 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ácbit của thanh ghi TRISC và mặc định các chân này là output, ngoài ra một số chứcnăng ngoại vi khác sẽ tự động mặc định một số chân là ngõ vào Do đó cần xemxé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 ghiTRISC cho thích hợp
Bảng chức năng Port C :
Trang 29Bảng tóm tắt các thanh ghi lien quan đến PortC
I.8.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 :
Trang 30
Bảng tóm tắt các thanh ghi liên quan đến Port D :
I.8.5 Port E và thanh ghi TRISE:
Port E có 3 chân RE0 /RD/AN5, RE1/WR /AN6, RE2 /CS/AN7, có thể đượccấ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
Trang 31Bả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í)
Trang 321 : 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
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
I.9.1 Bộ định thời Timer 0 :
I.9.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
Trang 33trong 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
I.9.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ụchiệ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ốngxuất hiện trên chân T0CKL ( cạnh lên hoặc cạnh xuống được lựa chọn bởi bitT0SE (OPTION_REG <4>, xóa bit T0SE sẽ lựa chọn cạnh lên)
I.9.1.3 Ngắt Timer 0
Ngắt Timer 0 được tạo ra khi thanh ghi TMR0 tràn từ 0FFh đến 00h Khi xảy
ra tràn, cờ T0IF(INTCON<2>) được bật lên Ngắt có thể được ngăn chặn bằngcách xóa bit T0IE (INTCON<5>) Cờ ngắt T0IF phải được xóa bằng phần mềmtruớ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ủ
I.9.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ớixung clock nội bằng cách: nó sẽ được lấy mẫu tại chu kỳ Q2 và Q4 của xung clock
Trang 34nội Do đó, T0CKI phải ở mức cao ít nhất 2 Tosc và ở mức thấp ít nhất cũng là 2Tosc
I.9.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
(Xem lại phần thanh ghi OPTION_REG)
Các thanh ghi có liên quan đến Timer 0:
I.9.2 Bộ định thời Timer 1
I.9.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 ghi TMR1H 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
I.9.2.2 Thanh ghi điều khiển Timer 1:
Trang 350 : Không cho phép dao động
Bit 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
I.92.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ộ
Trang 36Xung 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ông tăng Điều này cónghĩa là chế độ đếm đồng bộ sẽ không hoạt động được trong chế độ 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ới xungclock nội
Đế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ăngtạ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ái ngủ
* 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 2lầ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ạy nhưngviệc đó có thể tạo ra một giá trị không như ta mong muốn
I.9.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ụngthạch anh có tần số tối đa 200Khz.Với bộ dao động này Timer có thể đếm ngay cảkhi VĐK rơi vào trạng thái ngủ
I.9.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ị FFFFh xuống0000h Khi xảy ra tràn, cờ báo ngắt TMR1IF sẽ bật lên Ngắt có thể ngăn chặnbằng cách xóa bit TMR1IE, cờ TMR1IF phải được xóa bằng phần mềm trước khithoá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ônglàm cho VĐK thoát khỏi trạng thái ngủ, chỉ có ngắt ở chế độ đếm bất đồng bộ mớilàm cho VĐK thoát khỏi trạng thái ngủ
Các thanh ghi liên quan đến Timer 1 :
Trang 37I.9.3 Bộ định thời Timer 2 :
I.9.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.ThanhghiTMR2làmộtthanh
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, được lự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 thanh ghi 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
I.9.3.2 Thanh ghi điều khiển T2CON
Trang 38Bit 1:0 T2CKPS1:T2CKPS0: Bit chọn tỉ lệ ngõ vào của Timer 2
- Ghi một giá trị vào thanh ghi TMR2
- Ghi một giá trị vào thanh ghi TCON2
- 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
I.9.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
I.9.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
I.9.3.6Tínhiệubáotrạngtháicânbằ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ùnglàm tín hiệu Reset cho Timer 2
Trang 39I.10.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ư:
- Một thanh ghi Capture 16 bit
- Một thanh ghi Compare 16 bit
- 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:
Module CCP1:
Thanh ghi CCPR1 bao gồm 2 thanh ghi 8 bit: CCPR1L và CCPR1H Thanhghi CCP1CON điều khiển hoạt động cùa module CCP1 Các xung đặc biệt xảy rabằng các thuật toán so sánh và sẽ reset Timer 1
Module CCP2:
Trang 40Thanh ghi CCPR2 bao gồm 2 thanh ghi 8 bit: CCPR2L và CCPR2H Thanhghi CCP2CON điều khiển hoạt động cùa module CCP2 Các xung đặc biệt xảy rabằng các thuật toán so sánh sẽ reset Timer 1 và bắt đầu chuyển đổi ADC (nếuchuyển đổi ADC được cho phép)
I.10.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
0110: 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ân bằngxuấ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ếumodule ADC được cho phép)
11xx: Chế độ PWM
I.10.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