2.1.3.8 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
Trang 2Với sự phát triển không ngừng của khoa học công nghệ, cuộc sống con người ngày càng trở nên tiện nghi và hiện đại hơn Điều đó đem lại cho chúng ta nhiều giải pháp tốt hơn, đa dạng hơn trong việc xử lý những vấn đề tưởng chừng như rất phức tạp gặp phải trong cuộc sống Việc ứng dụng các thành tựu khoa học kỹ thuật hiện đại trong tất cả các lĩnh vực đã và đang rất phổ biến trên toàn thế giới, thay thế dần những phương thức thủ công , lạc hậu và ngày càng được cải tiến hiện đại hơn, hoàn mỹ hơn.Cùng với sự phát triển chung đó, nước ta cũng đang mạnh mẽ tiến hành công cuộc công nghiệp hóa và hiện đại hóa đất nước để theo kịp sự phát triển của các nước trong khu vực và trên thế giới Trong đó lĩnh vực điện tử đang ngày càng đóng vai trò quan trọng trong việc phát triển kinh tế và đời sống con người Sự phổ biến của nó đóng góp không nhỏ tới sự phát triển của tất cả các ngành sản xuất, giải trí, trong những năm gần đây đặc biệt trong lĩnh vực tự động nhất là nhiệt độ, nó đã có sự phát triển mạnh mẽ với nhiều hình thức, phương pháp tiếp cận, chia sẻ thông tin hiện đại và toàn diện hơn.
Với lòng đam mê, yêu thích của mình trong lĩnh vực này, nhóm đã quyết định
chọn đề tài “ĐỌC NHIỆT ĐỘ HIỂN THỊ LÊN LCD” làm đề tài môn học
Trong thời gian thực hiện đề tài cộng với kiến thức còn nhiều hạn chế, nên trong cuốn đồ án này không tránh khỏi những thiếu sót, nhóm thực hiện rất mong được sự đóng góp ý kiến của thầy cô và các bạn sinh viên
Nhóm sinh viên thực hiện đề tài
Trang 3LỜI CẢM ƠN
Trong suốt khóa học tại XXX, với sự giúp đỡ của quý thầy cô và giáo viên
hướng dẫn về mọi mặt từ nhiều phía và nhất là trong thời gian thực hiện đề tài, nên đề tài đã được hoàn thành đúng thời gian qui định Nhóm thực hiện xin chân thành cảm ơn đến :
Quí thầy cô trong khoa Điện tử -Tin học đã giảng dạy những kiến thức chuyên môn làm cơ sở để thực hiện tốt đồ án môn học và đã tạo điều kiện thuận lợi cho chúng em hoàn tất đồ án môn học này
Đặc biệt, Thầy XXX ,giáo viên hướng dẫn đề tài đã nhiệt tình giúp đỡ và
cho nhóm thực hiện những lời chỉ dạy quý báu, giúp nhóm thực hiện định hướng tốt trong khi thực hiện đề tài
Tất cả bạn bè đã giúp đỡ và động viên trong suốt quá trình làm đề tài.
TP.HCM Ngày 29 Tháng 5 năm 2011
Nhóm sinh viên thực hiện
Trang 4NHẬN XÉT CỦA GIẢNG VIÊN HƯỚNG DẪN
-o0o -
Tp Hồ Chí Minh, ngày… tháng …năm 2010
Giảng viên hướng dẫn
NGUYỄN TRỌNG KHANH
Trang 5II) GIỚI HẠN ĐỀ TÀI :
Với quy mô là đồ án tốt môn học, nên nhóm chúng em đã cố gắng hết sức làm những gì mà giảng viên yêu cầu, nhưng do kiến thức còn hạn chế nên chúng em chỉ thực hiện được những yêu cầu sau :
1 Hiển thị nhiệt độ lên LCD
2 Nhập thông số cài đặt nhiệt độ từ nút nhấn
3 Báo động khi nhiệt độ quá mức cho phép
Trang 6III) 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ình môn học để đủ điều kiện hoàn thành yêu cầu của môn học Cụ thể khi nghiên cứu đề tài là chúng em muốn phát huy những thành quả ứng dụng của vi điều khiển để váo một mạch thực tế
Nó còn là kinh nghiệm cho chúng em tiến đên đồ án tốt nghiệp sắp tới
Ngoài ra quá trình thực hiện đề tài là một cơ hội để chúng em tự kiểm tra lạ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
IV) ĐỐI TƯỢNG NGHIÊN CỨU:
1.Các phương án điều khiển và xử lý dữ liệu
2.Tìm hiểu về vi xử lý PIC16F877A
3.Tìm hiểu về LCD
4.Tìm hiểu về cảm biến nhiệt độ LM35
Trang 7CHƯƠNG 2 : GIỚI THIỆU VỀ CÁC LINH KIỆN2.1) Giới thiệu về PIC:
2.1.1) Sơ lược về vi điều khiển PIC 16F877A:
Hình 2.1 Sơ đồ chân PIC 16F877A
Trang 9 40 chân trên được chia thành 5 PORT, 2 chân cấp nguồn, 2 chân GND, 2 chân thạch anh và một chân dùng để RESET vi điều khiển.
Mỗi chân của vi điều khiển PIC 16F877A có một chức nă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
2.1.2) Cấu trúc phần cứng của PIC 16F877A:
PIC là tên viết tắt của “ Programmable Intelligent computer” do hãng General Instrument đặt tên cho con vi điều khiển đầu tiên của họ Hãng Micrchip tiếp tục phát triển sản phầm này và cho đến hàng đã tạo ra gần 100 loại sản phẩm khác nhau
PIC16F887A là dòng PIC khá phổ biến, khá đầy đủ tính năng phục vụ cho hầu hết tất cả các ứng dụng thực tế Đây là dòng PIC khá dễ cho người mới làm quen với PIC
có thể học tập và tạo nền tản về họ vi điều khiển PIC của mình
Cấu trúc tổng quát của PIC16F877A như sau :
368x8 bytes Ram
5 port vào ra với tín hiệu điều khiển độc lập
2 bộ định thời Timer0 và Timer2 8 bit
Trang 10 1 bộ định thời Timer1 16 bit có thể hoạt động ở cả chế độ tiết kiệm năng lượng với nguồn xung clock ngoài
2 bộ Capture/ Compare/ PWM
1 bộ biến đổi Analog -> Digital 10 bit, 8 ngõ vào
2 bộ so sánh tương tự
1 bộ định thời giám sát (Watch Dog Timer)
1 cổng song song 8 bit với các tín hiệu điều khiển
1 cổng nối tiếp
15 nguồn ngắt
Sơ đồ khối
Trang 11Hình 2.3 Sơ đồ khối bên trong của vi điều khiển 16F877A
2.1.3) Một số chế độ đặt biệt của vi điều khiển PIC 16F877A:
2.1.3.1) Dao động:
PIC16F877A có thể hoạt động trong bốn chế độ dao động khác nhau:
Trang 12Việc lựa chọn tụ trong dao động thạch anh được lựa chọn dựa vào bảng sau:
Hình 2.5 Giá trị tụ trong dao động thạch anh
Trang 13Tụ có giá trị lớn sẽ mang tính ổn định của dao động nhưng làm tăng thời gian khởi động.
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 thì chu kỳ dao động của thạch anh là Tosc = 1/Fosc= 1/10*106(s)
Chu kỳ máy:
T_instruction = 4*Tosc = 4/10*10 6 (s) = 0.4 µs = 400 ns 2.1.3.2) Reset:
PIC16F877A có thể bị reset bởi nhiều nguyên nhân khác nhau:
• Power-on Reset (POR)
• MCLR Reset during sleep
• MCLR Reset during normal operation
• WDT Reset (during normal operation)
• WDT Wake-up (during sleep)
• Brown-out Reset (BOR)
Hình 2.6 Các chế độ reset
Trang 142.1.3.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.
* Các thanh ghi chức năng ngắt: INTCON, PIE1, PIR1, PIE2, PIR2 (các thanh ghi
này sẽ được nghiên cứu ở các phần sau)
Trang 15Hình 2.7 Các chế độ ngắt
2.1.3.5) Bộ định thời giám sát (Watch Dog Timer – WDT):
Hình 2.8 Bộ định thời giám sát WDT
Trang 162.1.3.6) Tổ chức bộ nhớ:
Cấu trúc bộ nhớ của vi điều khiển PIC16F877A bao gồm bộ nhớ chương trình (Program memory) và bộ nhớ dữ liệu (Data Memory)
2.1.3.6.1) Bộ nhớ chương trình:
Hình 2.9 Bộ nhớ chương trình PIC 16F877A
Bộ nhớ chương trình của vi điều khiển PIC16F877A là bộ nhớ Flash, dung lượng 8K word (1 word chứa 14bit) và được phân thành nhiều trang như hình trên
Để mã hóa được địa chỉ 8K word bộ nhớ chương trình, thanh ghi đếm chương trình PC có dung lượng 13 bit
Khi vi điều khiển reset, bộ đếm chương trình sẽ trỏ về địa chỉ 0000h Khi có ngắt xảy ra thì thanh ghi PC sẽ trỏ đến địa chỉ 0004h
Bộ nhớ chương trình không bao gồm bộ nhớ Stack và không được địa chỉ hóa
bởi bộ đếm chương trình
Trang 172.1.3.6.2) Bộ nhớ dữ liệu:
Bộ nhớ dữ liệu của PIC l bộ nhớ EEPROM được chia ra làm nhiều bank
Bộ nhớ dữ liệu của PIC16F877A được chia thành 4 bank Mỗi bank có dụng lượng 128 byte Nếu như 2 bank bộ nhớ dữ liệu của 8051 phân chia riêng biệt :
128 byte đầu tiên thuộc bank1 là vùng Ram nội chỉ để chứa dữ liệu, 128 byte còn lại thuộc bank 2 là cùng các thanh ghi có chức năng đặc biệt SFR mà người dùng không được chứa dữ liệu khác trong đây thì 4 bank bộ nhớ dữ liệu của PIC16F877A được tổ chức theo cách khác
Mỗi bank của bộ nhớ dữ liệu PIC16F877A bao gồm cả các thanh ghi có chức năng đặc biệt SFR nằm ở các các ô nhớ địa chỉ thấp và các thanh ghi mục đích dùng chung GPR nằm ở vùng địa chỉ còn lại của mỗi bank thanh ghi Vùng ô nhớ các thanh ghi mục đích dùng chung này chính là nơi người dùng sẽ lưu dữ liệu trong quá trình viết chương trình Tất cả các biến dữ liệu nên được khai báo chứa trong vùng địa chỉ này
Trong cấu trúc bộ nhớ dữ liệu của PIC16F877A, các thanh ghi SFR nào mà thường xuyên được sử dụng (như thanh ghi STATUS) sẽ được đặt ở tất cả các bank để thuận tiện trong việc truy xuất Sở dĩ như vậy là vì, để truy xuất một thanh ghi nào đó trong bộ nhớ của 16F877A ta cần phải khai báo đúng bank chứa thanh ghi đó, việc đặt các thanh ghi sử dụng thường xuyên giúp ta thuận tiên hơn rất nhiều trong quá trình truy xuất, làm giảm lệnh chương trình
Trang 18Hình 2.10 Bộ nhớ dữ liệu PIC 16F877A
Trang 19Dựa trên sơ đồ 4 bank bộ nhớ dữ liệu PIC16F877A ta rút ra các nhận xét như sau :
- Bank0 gồm các ô nhớ có địa chỉ từ 00h đến 77h, trong đó các thanh ghi dùng chung để chứa dữ liệu của người dùng địa chỉ từ 20h đến 7Fh Các thanh ghi PORTA, PORTB, PORTC, PORTD, PORTE đều chứa ở bank0, do đó để truy xuất dữ liệu các thanh ghi này ta phải chuyển đến bank0 Ngoài ra một vài các thanh ghi thông dụng khác ( sẽ giới thiệu sau) cũng chứa ở bank0
- Bank1 gồm các ô nhớ có địa chỉ từ 80h đến FFh Các thanh ghi dùng chung có địa chỉ từ A0h đến Efh Các thanh ghi TRISA, TRISB, TRISC, TRISD, TRISE cũng được chứa ở bank1
- Tương tự ta có thể suy ra các nhận xét cho bank2 và bank3 dựa trên sơ đồ trên Cũng quan sát trên sơ đồ, ta nhận thấy thanh ghi STATUS, FSR… có mặt trên cả 4 bank Một điều quan trọng cần nhắc lại trong việc truy xuất dữ liệu của PIC16F877A là : phải khai báo đúng bank chứa thanh ghi đó Nếu thanh ghi nào mà 4 bank đều chứa thì không cần phải chuyển bank
• 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ực tiếp hoặc gián tiếp thông qua thanh ghi FSR Vùng RAM đa mục đích được phân phố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
• 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 CPU hoặc các module ngoại vi để điều khiển hoạt động của VĐK Các thanh ghi 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ác chức năng của CPU, loại
Trang 20thứ 2 dùng cho các chức năng ngoại vi.
2.1.3.7) Thanh ghi trạng thái (Status Register):
Thanh ghi này có mặt ở cả 4 bank thanh ghi ở các địa chỉ 03h, 83h, 103h và 183h : chứa kết quả thực hiện phép toán của khối ALU, trạng thái reset và các bit chọn bank cần truy xuất trong bộ nhớ dữ liệu
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
Trang 210: 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
2.1.3.8) 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
H hình 2.12 Option-Reg Register
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: Bít 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
Trang 22Bit 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
2.1.3.9) Thanh ghi điều khiển ngắt INTCON (Interrupt Control Register):
Hình 2.13 Intcon 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ông 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
Trang 230: 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: 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)
Trang 240: Thanh ghi TMR1 chưa tràn
2.1.3.10 ) Thanh ghi Work và tập lệnh của PIC 16F877A:
Đây là thanh ghi rất đặc biệt trong PIC16F877A Nó có vai trò tương tự như thanh ghi Accummulator của 8051, tuy nhiên tầm ảnh hưởng của nó rộng hơn rất nhiều
Tập lệnh của PIC16F877A có tất cả 35 lệnh thì số lệnh có sự “góp mặt” của thanh ghi W là 23 lệnh Hầu hết các lệnh của PIC16F877A đều liên quan đến thanh ghi
W Ví dụ như, trong PIC chúng ta không được phép chuyển trực tiếp giá trị của một thanh ghi này qua thanh ghi khác mà phải chuyển thông qua thanh ghi W
Thanh ghi W có 8 bit và không xuất hiện trong bất kỳ bank thanh ghi nào của bộ nhớ dữ liệu của 16F877A Mỗi dòng lệnh trong PIC16F877a được mô tả trong 14 bit Khi ta thực hiện một lệnh nào đó, nó phải lưu địa chỉ của thanh ghi bị tác động (chiếm
8 bit) và giá trị một hằng số k nào đó (thêm 8 bit nữa) là 16 bit, vượt quá giới hạn 14 bit Do vậy ta không thể nào tiến hành một phép tính toàn trực tiếp nào giữa 2 thanh ghi với nhau hoặc giữa một thanh ghi với một hằng số k Hầu hết các lệnh của PIC16F877A đều phải liên quan đến thanh ghi W cũng vì lý do đó Khi thực hiện một dòng lệnh nào đó, thì PIC sẽ không phải tốn 8 bit để lưu địa chỉ của thanh ghi W trong
mã lệnh ( vì được hiểu ngầm) Có thể xem thanh ghi W là thanh ghi trung gian trong quá trình viết chương trình cho PIC16F877A
PIC16F877A có tất cả 35 lệnh và được trình bày khá rõ trong datasheet Em sẽ đính kèm tập lệnh ở phần cuối cùng của bài báo cáo
Trong chương trình, em sử dụng ngôn ngữ asembly để viết Trình biên dịch là Mplab được Microchip cung cấp miễn phí cho người dùng
Trang 252.1.3.11) Khái quát về chức năng các Port trong vi điều khiển PIC
16F877A:
Cổng xuất nhập (I/O port) chính là phương tiện mà vi điều khiển dùng để tương tác với thế giới bên ngoài Sự tương tác này rất đa dạng và thông qua quá trình tương tác đó, chức năng của vi điều khiển được thể hiện một cách rõ ràng
Một cổng xuất nhập của vi điều khiển bao gồm nhiều chân (I/O pin), tùy theo cách bố trí và chức năng của vi điều khiển mà số lượng cổng xuất nhập và số lượng chân trong mỗi cổng có thể khác nhau Bên cạnh đó, do vi điều khiển được tích hợp sẵn bên trong các đặc tính giao tiếp ngoại vi nên bên cạnh chức năng là cổng xuất nhập thông thường, một số chân xuất nhập còn có thêm các chức năng khác để thể hiện sự tác động của các đặc tính ngoại vi nêu trên đối với thế giới bên ngoài Chức năng của từng chân xuất nhập trong mỗi cổng hoàn toàn có thể được xác lập và điều khiển được thông qua các thanh ghi SFR liên quan đến chân xuất nhập đó
Vi điều khiển PIC16F877A có 5 cổng xuất nhập, bao gồm PORTA, PORTB, PORTC, PORTD và PORTE
2.1.3.11.1)Port A và thanh ghi TRIS A:
PORTA gồm có 6 chân Các chân của PortA, ta lập trình để có thể thực hiện được chức năng “hai chiều” : xuất dữ liệu từ vi điều khiển ra ngoại vi và nhập dữ liệu từ ngoại vi vào vi điều khiển
Trang 26Hình 2.14:Sơ đồ khối chân RA3:RA0 và chân RA5 và của chân RA4/TOCKI của cổng
A
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.
Trang 27Chức năng các chân trong Port A.
Hình 2.15: PORT A Function
Ngoài ra, PORTA còn có các chức năng quan trọng sau :
- Ngõ vào Analog của bộ ADC : thực hiện chức năng chuyển từ Analog sang Digital
- Ngõ vào điện thế so sánh
- Ngõ vào xung Clock của Timer0 trong kiến trúc phần cứng : thực hiện các nhiệm
vụ đếm xung thông qua Timer0…
- Ngõ vào của bộ giao tiếp MSSP (Master Synchronous Serial Port)
Các thanh ghi FSR liên quan đến PORTA bao gồm:
• PORTA (địa chỉ 05h) : chân giữ vai trò các pin trong PORTA
• TRISA (địa chỉ 85h) : điều khiển xuất nhập
• CMCON (địa chỉ 9Ch) : thanh ghi điều khiển khối so sánh
• CVRCON (địa chỉ 9Dh) : thanh ghi điều khiển khối so sánh điện áp
Trang 28• ADCON1 (địa chỉ 9Fh) : thanh ghi điều khiển khối ADC
2.1.3.11.2) PORT B và thanh ghi TRISB:
PORTB có 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 PortB 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 PortB đượ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
Trang 29Hình 2.16:Sơ đồ khối chân PORT B
Hình 2.17:Chức năng các chân trong Port B
Các thanh ghi FSR liên quan đến PORTB bao gồm:
• PORTB (địa chỉ 06h,106h) : giữ vai trò các pin trong PORTB
• TRISB (địa chỉ 86h,186h) : điều khiển xuất nhập
• OPTION_REG (địa chỉ 81h,181h) : điều khiển ngoại vi vào bộ Timer0
2.1.3.11.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
Trang 30bit 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, ngồ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
Hình 2.18:Sơ đồ khối chân PORT C
Các thanh ghi điều khiển liên quan đến PORTC:
• PORTC (địa chỉ 07h) : giữ vai trị pin trong PORTC
• TRISC (địa chỉ 87h) : điều khiển xuất nhập
2.1.3.11.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, PortD cịn cĩ thể hoạt động như một cổng song song bằng cách set bit PSPMODE (TRISD<4>), trong chế độ này buffer ngõ vào là TTL PORTD còn là cổng xuất dữ liệu của chuẩn giao tiếp PSP (Parallel Slave Port)
Trang 31Hình 2.19:Sơ đồ khối chân PORT D
Các thanh ghi liên quan đến PORTD bao gồm:
• Thanh ghi PORTD : giữ vai trò các pin trong PORTD
• Thanh ghi TRISD : điều khiển xuất nhập
• Thanh ghi TRISD : điều khiển xuất nhập PORTD và chuẩn giao tiếp PSP
2.1.3.11.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
Trang 32trong chế độ này
Hình 2.20:Sơ đồ khối chân PORT E
• Các thanh ghi liên quan đến PORTE bao gồm:
• PORTE: giữ vai trò các pin PORTE
• TRISE: điều khiển xuất nhập PORTD và chuẩn giao tiếp PSP
• ADCON1 : thanh ghi điều khiển ADC
2.1.4) Bộ định thời của PIC 16F877A:
PIC16F877A có tất cả 3 timer : timer0 (8 bit), timer1 (16 bit) và timer2 (8 bit)
2.1.4.1 ) Bộ định thời Timer 0:
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
Trang 33Hình 2.21:Sơ đồ khối của Timer0 và WDT
• Hoạt động của Bộ định thời Timer 0
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 chân T0CKL (cạnh lên hoặc cạnh xuống được lựa chọn bởi bit T0SE (OPTION_REG<4>, xóa bit T0SE sẽ lựa chọn cạnh lên)
• Ngắt Timer 0
Trang 34Ngắ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ằng cách xóa bit T0IE (INTCON<5>) Cờ ngắt T0IF phải được xóa bằng phần mề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 Vi Điều Khiển thoát khỏi trạng thái ngủ
• Sử dụng Timer 0 với nguồn xung Clock bên ngoài
Khi bộ tiền định tỉ lệ không được sử dụng, ngõ vào xung clock ngoại cũng giố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ủa xung clock nội Do
đó,T0CKI phải ở mức cao ít nhất 2 Tosc và ở mức thấp ít nhất cũng là 2 Tosc.
• 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 Timer0 hay WDT, các bit PS2, PS1, PS0 sẽ xác định tỉ lệ của bộ đếm
Trang 35• Các thanh ghi điều khiển liên quan đến Timer 0
TMR0 (địa chỉ 01h, 101h) : chứa giá tri đếm Timer0
INTCON (địa chỉ 0Bh, 8Bh, 10Bh, 18Bh): cho phép ngắt hoạt động (GIE và PEIE)
OPTION_REG (địa chỉ 81h, 181h): điều khiển prescaler
2.1.4.2) Bộ định thời Timer 1:
Timer1 là một bộ định thời 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
ghi điều khiển Timer 1
Trang 360 : 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
• Chế độ định thời trong hoạt động cuả 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
Trang 37(T1CON<2>) không có tác dụng vì xung clock nội đã luôn luôn được đồng bộ.
• Chế độ đếm
Timer 1 có thể hoạt động ở cả chế độ đồng bộ hoặc bất đồng bộ tùy thuộc vào việc cài đặt bit TMR1CS (T1CON<1>).
- Đếm Đồng Bộ
Chế độ này được lựa chọn bằng cách set bit TMR1CS và xóa bit T1SYNC
Trong chế độ này giá trị của Timer 1 sẽ tăng khi có xung cạnh lên trên chân
T1OSI/RC1 ( nếu bit T1OSCEN được set) hoặc chên trân T1OSO (nếu bit T1OSCEN được xóa).
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ô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 xung clock 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ă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á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ải ngư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
Trang 38Để 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ưng việc đĩ cĩ thể tạo ra một giá trị khơng như ta mong muốn.
• 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ể đếm ngay cả
khi VĐK rơi vào trạng thái ngủ
• 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ố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ần mềm trước khi thố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 thố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 thốt khỏi trạng thái ngủ
• Các thanh ghi liên quan đến Timer 1
INTCON (địa chỉ 0Bh, 8Bh, 10Bh, 18Bh): cho phép ngắt hoạt động (GIE và PEIE).
PIR1 (địa chỉ 0Ch): chứa cờ ngắt Timer1 (TMR1IF).
PIE1(địa chỉ 8Ch): cho phép ngắt Timer1 (TMR1IE).
MR1L (địa chỉ 0Eh): chứa 8bit thấp vào bộ Timer1.
TMR1H (địa chỉ 0Eh): chứa 8bit cao vào Timer1.
T1CON (địa chỉ 10h): xác lập các tham số cho Timer1.
2.1.4.3) Bộ định thời Timer 2:
Trang 39Timer2 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ệ, Timer2 cung cấp thời gian hoạt động cho chế độ PWM nếu module CCP được chọn Thanh ghi TMR2 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, đượ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.
• Thanh ghi điều khiển Timer 2 T2CON
Hình 2.24 T2CON Register
Bit 7: không sử dụng
Bit 6:3 TOUTPS3:TOUTPS0: Bit chọn tỉ lệ ngõ ra của Timer 2
Trang 40- 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
• Nhận xét:
Timer0 và Timer2 là bộ đếm 8 bit (giá trị đếm tối đa là FFh), trong khi Timer1
là bộ đếm 16 bit (giá trị đếm tối đa là FFFFh) Timer0, Timer1 và Timer2 đều có hai chế độ hoạt động là timer và counter Xung clock có tần số bằng ¼ tần số của oscillator Xung tác động lên Timer0 được hỗ trợ bởi prescaler và có thể được thiết
lập ở nhiều chế độ khác nhau (tần số tác động, cạnh tác động) trong khi các thông số
của xung tác động lên Timer1 là cố định Timer2 được hỗ trợ bởi hai bộ chia tần số prescaler và postcaler độc lập, tuy nhiên cạnh tác động vẫn được cố định là cạnh