- 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âmCPU hoặc các module ngoại vi
Trang 1CHƯƠNG 1: CHƯƠNG DẪN NHẬP I) ĐẶT VẤN ĐỀ :
Trong công nghiệp và trong đời sống có rất nhiều yếu tố ảnh hưởng đến quá trình sản xuất và ảnh hưởng đến con người, mà con người muốn sản xuất nhanh chóng thì cần có động cơ hỗ trợ Trong động cơ tốc độ là yếu tố thường được đề cập đến nhiều nhất của động cơ Vì vậy sự ra đời của các mạch đo tốc độ động cơ là rất cần thiết Với sự phát triển của khoa học kỹ thuật, vi điều khiển ra đời đã giúp cho chúng ta có thể dễ dàng thiết kế mạch đo tốc độ động cơvới độ chính xác cao, đáng tin cậy… mà chi phí có thể chấp nhận được
II) 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ị được tốc độ động cơ lên led 7 đoạn
2. Tốc độ còn hạn chế và có sự sai số do thiếu kinh nghiệm
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ì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 đồ ántố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
Trang 2tự 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 quyết 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ề led 7 đoạn và động cơ xoay thuận nghịch
4 Tìm hiểu về Encoder
5 Ứng dụng viết chương trình xử lí
Trang 3CHƯƠNG 2 : GIỚI THIỆU VỀ CÁC LINH KIỆN 2.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 4• Sơ đồ nguyên lý:
Hình 2.2 Sơ đồ nguyên lý PIC 16F877A
Trang 5Mỗ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ấtnhậ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ãngGeneral Instrument đặt tên cho con vi điều khiển đầu tiên của họ HãngMicrochip tiếp tục phát triển sản phầm này và cho đến hiện nay đã tạo ra gần
100 loại sản phẩm khác nhau
Trang 6PIC16F887A là dòng PIC khá phổ biến, khá đầy đủ tính năng phục vụ chohầ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àmquen 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 :
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
1 bộ định thời Timer1 16 bit có thể hoạt động ở cả chế độ tiết kiệmnă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
Trang 7 Sơ đồ khối
Hình 2.3 Sơ đồ khối bên trong của vi điều khiển 16F877A
Trang 82.1.3) Một số chế độ đặt biệt của vi điều khiển PIC 16F877A:
Trang 9Hình 2.5 Giá trị tụ trong dao động thạch anh
Tụ 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*106(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)
Trang 10• WDT Wake-up (during sleep)
• Brown-out Reset (BOR)
Trang 11* 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 12Hình 2.7 Các chế độ ngắt
2.1.3.4) 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 132.1.3.5) 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.5.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, dunglượng 8K word (1 word chứa 14bit) và được phân thành nhiều trang như hìnhtrên
Để mã hóa được địa chỉ 8K word bộ nhớ chương trình, thanh ghi đếmchương trình PC có dung lượng 13 bit
Trang 14Khi 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
2.1.3.5.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êngbiệt :
128 byte đầu tiên thuộc bank1 là vùng Ram nội chỉ để chứa dữ liệu, 128byte 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ệucủ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áochứ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
Trang 15thanh ghi nào đó trong bộ nhớ của 16F877A ta cần phải khai báo đúng bankchứa thanh ghi đó, việc đặt các thanh ghi sử dụng thường xuyên giúp ta thuậntiên hơn rất nhiều trong quá trình truy xuất, làm giảm lệnh chương trình.
Hình 2.10 Bộ nhớ dữ liệu PIC 16F877A
Trang 16Dựa trên sơ đồ 4 bank bộ nhớ dữ liệu PIC16F877A ta rút ra các nhận xétnhư sau :
- Bank 0 gồm các ô nhớ có địa chỉ từ 00h đến 77h, trong đó các thanh ghidùng chung để chứa dữ liệu của người dùng địa chỉ từ 20h đến 7Fh Các thanhghi PORTA, PORTB, PORTC, PORTD, PORTE đều chứa ở bank 0, do đó đểtruy xuất dữ liệu các thanh ghi này ta phải chuyển đến bank 0 Ngoài ra một vàicác thanh ghi thông dụng khác ( sẽ giới thiệu sau) cũng chứa ở bank 0
- Bank 1 gồm các ô nhớ có địa chỉ từ 80h đến FFh Các thanh ghi dùngchung có địa chỉ từ A0h đến Efh Các thanh ghi TRISA, TRISB, TRISC, TRISD,TRISE cũng được chứa ở bank 1
- Tương tự ta có thể suy ra các nhận xét cho bank 2 và bank 3 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ệucủa PIC16F877A là: phải khai báo đúng bank chứa thanh ghi đó Nếu thanh ghinà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ự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
Trang 17- 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âmCPU hoặc các module ngoại vi để điều khiển hoạt động của VĐK Các thanh ghichứ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ứcnăng của CPU, loại thứ 2 dùng cho các chức năng ngoại vi
2.1.3.6) 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ácbit chọn bank cần truy xuất trong bộ nhớ dữ liệu
Trang 1810 = Bank 2 (100h – 17Fh)
01 = Bank 1 (80h – FFh)
00 = Bank 0 (00h – 7Fh)
Each bank is 128 bytes
Bit 4 TO: Bit báo hiệu hoạt động của WDT.
1: Lệnh xóa WDT hoặc Sleep xảy ra
0: WDT hoạt động
Bit 3 PD: Bit báo công suất thấp ( Power down bit).
1: Sau khi nguồn tăng hoặc có lệnh xóa WDT
0: Thực thi lệnh Sleep
Bit 2 Z: Bit Zero
1: Khi kết quả của một phép toán bằng 0
0: Khi kết quả của một phép toán khác 0
Bit 1 DC: Digit Carry
1: Có một số nhớ được sinh ra bởi phép cộng hoặc phép trừ 4 bitthấp
0: Không có số nhớ sinh ra
Bit 0 C: Cờ nhớ (Carry Flag)
Trang 191: 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.7) 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ứană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
Trang 20Bit 4 T0SE: Bit lựa chọn cạnh nào của xung clock tác động lên timer0
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
2.1.3.8) 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
Trang 211: 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
0: Không cho phép ngắt ngoại vi
Bit 3 RBIE: Cho phép ngắt khi trạng thái PORTB thay đổi
Trang 221: Khi các giá trị so sánh trong thanh ghi TMR1 được thỏa ( phải
được xóa bằng phần mềm)
0: Khi các giá trị so sánh trong thanh ghi TMR1 không được thỏa Chế độ PWM: Không sử dụng trong chế độ này
Bit 1 TMR2IF: Cờ báo ngắt xảy ra khi giá trị trong thanh ghi TMR2 bằng trong thanh ghi PR2.
1: Giá trị trong thanh ghi TMR2 bằng thanh ghi PR2 (phải được xóa
bằng phần mềm)
0: Giá trị trong thanh ghi TMR2 chưa bằng thanh ghi PR2.
Trang 23Bit 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
2.1.3.9 ) 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ộnghơ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 đếnthanh ghi W Ví dụ như, trong PIC chúng ta không được phép chuyển trực tiếpgiá trị của một thanh ghi này qua thanh ghi khác mà phải chuyển thông quathanh ghi W
Thanh ghi W có 8 bit và không xuất hiện trong bất kỳ bank thanh ghi nàocủ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à 16bit, 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ínhtoà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ộthằ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ảitốn 8 bit để lưu địa chỉ của thanh ghi W trong mã lệnh ( vì được hiểu ngầm) Có
Trang 24thể xem thanh ghi W là thanh ghi trung gian trong quá trình viết chương trìnhcho 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êndịch là Mplab được Microchip cung cấp miễn phí cho người dùng
2.1.3.10) 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 quaquá 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ùytheo 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ứcnă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ácchứ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 đốivớ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ổnghoàn toàn có thể được xác lập và điều khiển được thông qua các thanh ghi SFRliê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
Trang 252.1.3.10.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
Hì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
Trang 26Port 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àicho Timer 0 (RA4/T0CKI) Những chân khác của Port A được đa hợp với cácchâ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ánhComparator Hoạt động của những chân này được quy định bằng những bittươ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ức năng các chân trong Port A
Trang 27Hì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 sangDigital
- 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ácnhiệ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
• ADCON1 (địa chỉ 9Fh) : thanh ghi điều khiển khối ADC
2.1.3.10.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 ghiTRISB sẽ quy định các chân của Port B là input hay output (1: input, 0: output).Việc đọc thanh ghi 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à
Trang 28Low Voltage Programming function: RB3/PGM, RB6/PGC, RB7/PGD Mỗichâ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áichân Port B thay đổi (Khi Port B được quy định là output thì chức năng nàykhông hoạt động Giá trịchân của PortB được so sánh với giá trị đã được lưutrước đó, khi có sự sai lệch giữa 2 giá trị này ngắt sẽ xảy ra với cờ ngắt RBIF(INTCON<0) sẽ bật lên Ngắt có thể làm cho VĐK thoát khỏi trạng thá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
Hình 2.16:Sơ đồ khối chân PORT B
Trang 29Hì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.10.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àothanh 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
Trang 30Khi 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êncác bit của thanh ghi TRISC và mặc định các chân này là output, ngoài ra một sốchức năng ngoại vi khác sẽ tự động mặc định một số chân là ngõ vào Do đó cầnxem 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 trongthanh 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
Trang 31• TRISC (địa chỉ 87h) : điều khiển xuất nhập.
2.1.3.10.4) Port D và thanh ghi TRISD:
Port D gồm 8 chân từ chân RD0-RD7 Bên cạnh chức năng là port xuấtnhập, PortD còn có thể hoạt động như một cổng song song bằng cách set bitPSPMODE (TRISD<4>), trong chế độ này buffer ngõ vào là TTL PORTD cònlàm cổng xuất dữ liệu của chuẩn giao tiếp PSP (Parallel Slave Port)
Hình 2.19: Sơ đồ khối chân PORT D
Trang 32Cá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.10.5) Port E và thanh ghi TRISE:
Port E có 3 chân RE0 / RD/ AN5, RE1/ WR / AN6, RE2 / CS/AN7, có thểđược cấu hình như các chân xuất nhập thông thường
Các chân của Port E có thể trở thành các chân điều khiển cho cổng songsong của VĐK khi bit PSPMODE (TRISE<4>) được set bằng 1 Trong chế độnày, người sử dụng phải đảm bảo các chân của PortE là ngõ vào
Ngoài ra các chân Port E còn có thể được cấu hình như các ngõ và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 33Hì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)
Trang 342.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ọnnguồn xung clock trong hoặc ngoài, có ngắt khi Timer tràn, có bit lựa chọn cạnhtác động của xung clock ngoài
Hình 2.21:Sơ đồ khối của Timer0 và WDT
Trang 35• 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ắcphục hiện tượng này chúng ta có thể hiệu chỉnh giá trị nhập vào thanh ghiTMR0
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)
• Ngắt Timer 0
Ngắt Timer 0 được tạo ra khi thanh ghi TMR0 tràn từ 0FFh đến 00h Khixảy ra tràn, cờ T0IF(INTCON<2>) được bật lên Ngắt có thể được ngăn chặnbằng cách xóa bit T0IE (INTCON<5>) Cờ ngắt T0IF phải được xóa bằng phầnmềm truớc khi thoát khỏi chương trình ngắt trở về chương trình chính
Lưu ý : Ngắt Timer 0 không làm 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ũ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 nội Do đó, T0CKI phải ở mức cao ít nhất 2 Tosc và ở mức thấp ít nhất
Trang 36cũ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 37• Các thanh ghi điều khiển liên quan đến Timer 0
TMR0 (địa chỉ 01h, 101h) : chứa giá trị đế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
Trang 38• Thanh ghi điều khiển Timer 1
Bit 3 T10SCEN : Bit cho phép bộ dao động Timer 1 Oscillator
1 : Cho phép dao động
0 : 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
Trang 390: Đồ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 (T1CON<2>) không có tác dụng vì xung clock nội đã luôn luôn được
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
Trang 40T1OSCEN đượ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ớixung 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 Để 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 đangchạ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