PIC sử dụng microcode đơn giản đặt trong ROM, và mặc dù, cụm từ RISC chưa được sử dụng thời bấy giờ,nhưng PIC thực sự là một vi điều khiển với kiến trúc RISC, chạy một lệnh một chu kỳ má
Trang 12.1 Vi điều khiển Pic
2.1.1 Sơ lược về Pic
PIC là một họ vi điều khiển RISC được sản xuất bởi công ty Microchip
Technology Dòng PIC đầu tiên là PIC1650 được phát triển bởi MicroelectronicsDivision thuộc General_Instrument PIC bắt nguồn từ chữ viết tắt của
“Programmable Intelligent Computer” (Máy tính khả trình thông minh) là một sảnphẩm của hãng General Instruments đặt cho dòng sản phẩm đầu tiên của họ làPIC1650 Lúc này, PIC 1650 được dùng để giao tiếp với các thiết bị ngoại vi chomáy chủ 16 bit CP1600, vì vậy, người ta cũng gọi PIC với tên “Peripheral InterfaceController” (Bộ điều khiển giao tiếp ngoại vi) CP1600 là một CPU tốt, nhưng lại
kém về các hoạt động xuất nhập, và vì vậy PIC 8-bit được phát triển vào khoảng
năm 1975 để hỗ trợ hoạt động xuất nhập cho CP1600 PIC sử dụng microcode đơn
giản đặt trong ROM, và mặc dù, cụm từ RISC chưa được sử dụng thời bấy giờ,nhưng PIC thực sự là một vi điều khiển với kiến trúc RISC, chạy một lệnh một chu
kỳ máy (4 chu kỳ của bộ dao động) Năm 1985 General Instruments bán bộ phận viđiện tử của họ, và chủ sở hữu mới hủy bỏ hầu hết các dự án – lúc đó quá lỗi thời.Tuy nhiên, PIC được bổ sung EPROM để tạo thành 1 bộ điều khiển vào ra khảtrình Ngày nay rất nhiều dòng PIC được xuất xưởng với hàng loạt các modulengoại vi tích hợp sẵn (như USART, PWM, ADC…), với bộ nhớ chương trình từ
512 Word đến 32K Word
2.1.2 PIC 16F877A
PIC 16F877A là dòng PIC phổ biến nhất hiện nay (đủ mạnh về tính năng, 40chân, bộ nhớ đủ cho hầu hết các ứng dụng thông thường) Cấu trúc tổng quát củaPIC 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
Trang 2- Đượ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
2.1.2.1 Sơ đồ chân :
Hình 2.1.2.1: Sơ đồ chân của Pic
PIC16F877A là họ vi điều khiển có 40 chân, mỗi chân có một chức năngkhá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.(chi tiết xem phần phụ lục)
2.1.2.2 Sơ đồ khối Pic:
Trang 3Hình 2.1.2.2: Sơ đồ khối của Pic 2.1.3 Một số đặc điểm đặc biệt của P16F877A
Trang 4Hình 2.1.3.1:Sơ đồ mạch dao động
Việc lựa chọn tụ trong dao động thạch anh dựa vào bảng sau:
Bảng 1: Cách chọn giá trị tụ cho thạch anh
Lưu ý: Tụ có giá trị lớn sẽ tăng tính ổn định của dao động nhưng cũng làmtă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ệm trong cácứng dụng không cần sự chính xác về thời gian
Hình 2.1.3.1:Dao động RC 2.1.3.2Reset
PIC16F877A có một bộ lọc nhiễu ở phần MCLR Bộ lọc nhiễu này sẽ phát
hiện và bỏ qua các tín hiệu nhiễu
Trang 5Ngõ vào MCLR trên chân 1 của PIC16F877A Khi đưa chân này xuống thấp
thì các thanh ghi bên trong VĐK sẽ được tải những giá trị thích hợp để khởi độnglại hệ thống
(Lưu ý: Reset do WDT không làm chân MCLR xuống mức thấp).
Hình 2.1.3.2: Sơ đồ chân Reset 2.1.3.3 Interupt
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 6Hình 2.1.3.3: Sơ đồ ngắt 2.1.3.4 Sleep
Đâ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 đượcthự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ởi dòngđiện của VĐK vì dòng điện nhỏ không đủ khả năng cung cấp cho 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 MCLR phải ở mức logic cao
2.1.3.5 Watch dog Timer (WDT)
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à
Trang 7WDT) đượ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ìvậ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 WDThoạt động
Hình 2.1.3.5: Sơ đồ WDT 2.1.4 Bộ nhớ của Pic16F877A
Bộ nhớ của Pic 16f877a bao gồm bộ nhớ chương trình và bộ nhớ dữ liệu
2.1.4.1 Bộ nhớ chương trình
Bộ nhớ chương trình của Pic16F877A là bộ nhớ Flash, dung lượng bộ nhớ
là 8K word và được chia thành 4 trang Để mã hóa được địa chỉ của 8K word bộnhớ chương trình,bộ đếm chương trình có dung lượng 13bit
Khi Reset bộ đếm chương trình sẽ trở về địa chỉ 00H khi có ngắt bộ đếmchương trình sẽ chỉ đến địa chỉ 04H
Trang 8Hình 2.1.4.1: Bộ nhớ chương trình của Pic 2.1.4.2 Bộ nhớ dữ liệu
Bộ nhớ dữ liệu của Pic là bộ nhớ EEPROM được chia làm 4
bank Mỗi bank có dung lượng 128 byte bao gồm các thanh ghi đặc biệt và cácthanh ghi mục đích chung
Hình 2.1.4.2: Bộ nhớ dữ liệu của Pic 2.1.4.2.1 Vùng Ram mục đích chung
Trang 9Vù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
2.1.4.2.2 Vùng thanh ghi chức năng
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
2.1.4.3 Bộ đếm chương trình
Bộ đếm chương trình PC (program counter) có độ dài 13 bit, được dùng đểchứa địa chỉ của lệnh được thực thi kế tiếp Byte thấp chứa trong thanh ghi PCL cóthể đọc/ghi một cách trực tiếp Các bit cao (bit 12:8) chứa trong thanh ghiPCLATH, không thể đọc nhưng có thể ghi gián tiếp bằng cách sử dụng thanh ghiPCLATH 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ộ đếmchương trình PC
Hình 2.1.4.3: Sơ đồ bộ đếm chương trình 2.1.4.4 Bộ nhớ 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
Trang 102.2.1.1 PORTA và ghi TrisA
PORTA có độ rộng 6 bit , là port vào ra hai chiều Thanh ghi dữ liệu trựctiếp tương ứng là TRISA Cho tất cả các bit của TRISA là 1 thì các chân tươngứng ở PORTA là ngõ vào Cho tất cả các bit của TRISA là 0 thì các chân tươngứng ở PORTA là ngõ ra Việc đọc các thanh ghi của PORTA sẽ đọc trạng thái củanhững chân , ngược lại việc ghi lên nó sẽ ghi qua port chốt Tất cả những hoạtđộng ghi là các hoạt động đọc-điều chỉnh-ghi Bởi vậy , dữ liệu được ghi đến port
có nghĩa là những chân của port là đọc , giá trị được chỉnh sửa và được ghi vàoport chốt dữ liệu
Chân RA4 được đa hợp với xung clock ngoài ở ngõ vào của Timer0 thànhchân RA4/T0CKI Chân RA4/T0CKI là ngõ vào có một Trigger Schmitt và mộtngõ ra có dạng thoát mở Tất cả những chân khác của PORTA có ngõ vào TTL và
có ngõ ra điều khiển CMOS
Những chân khác của PORTA được đa hợp với ngõ vào tương tự và ngõvào tương tự VREF Hoạt động của mỗi chân được chọn bằng cách xoá hoặc đặtnhững bit điều khiển trong thanh ghi ADCON1 ( A/D Control Register1 )
Thanh ghi TRISA điều khiển hướng của những chân RA , ngay cả khichúng được sử dụng như ngõ vào tương tự Người sử dụng cần phải chắc rằngnhững bit trong thanh ghi TRISA luôn luôn được đặt khi sử dụng chúng như ngõvào tương tự
Hình 2.2.1.1: PortA và thanh ghi TrisA Các thanh ghi SFR liên quan đến PortA
Trang 11PortA (05H): chứa giá trị các Pin trong PortA.
TrisA (85H): Điều khiển xuất nhập
CMCON (9CH): thanh ghi điều khiển bộ so sánh
CVRCON (9DH): thanh ghi điều khiển bộ so sánh điện áp
ADCON1 (9FH): thanh ghi điều khiển bộ ADC
2.2.1.2 PortB và thanh ghi TrisB
PORTB có độ rộng 8 bit , là port vào ra hai chiều Ba chân của PORTBđược đa hợp với chức năng lập trình mức điện thế thấp (Low VoltageProgramming ) : RB3/PGM , RB6/PGC và RB7/PGD Mỗi chân của PORTB cómột điện trở kéo lên yếu ở bên trong Một bit điều khiển đơn có thể mở tất cả
những điện trở kéo lên này Điều này được thực hiện bằng cách xóa bit RBPU
(OPTION_REG<7>) Những điện trở kéo lên này sẽ tự động tắt khi các chân củaport được cấu hình như ngõ ra Các
điện trở này bị cấm khi có một Power-on Reset
Bốn chân của PORTB , RB7:RB4 ,có một ngắt để thay đổi đặc tính Chỉnhững chân được cấu hình như ngõ vào mới có thể gây ra ngắt này Những chânvào ( RB7:RB4 ) được so sánh với giá trị được chốt trước đó trong lần đọc cuốicùng của PORTB Các kết quả không phù hợp ở ngõ ra
trên chân RB7: RB4 được OR với nhau để phát ra một ngắt Port Change
RB với cờ ngắt là RBIF ( INTCON<0> ) Ngắt này có thể đánh thức thiết bị từtrạng thái nghĩ ( SLEEP ) Trong thủ tục phục vụ ngắt , người sử dụng có thể xóangắt theo cách sau:
Đọc hoặc ghi bất kì lên PORTB Điều này sẽ kết thúc điều kiện khônghòa hợp
Xóa bit cờ RBIF
Trang 12Hình 2.2.1.2: PortB và thanh ghi TrisB Các thanh ghi SFR liên quan đến PortB:
PortB (06H,106H):chứa giá trị các Pin trong PortB
TrisB (86H,186H): điều khiển xuất nhập
Option_reg (81H,181H):điều khiển ngắt ngoại vi
2.2.1.3 PortC và thanh ghi TrisC
PORTC có độ rộng là 8 bit , là port hai chiều Thanh ghi dữ liệu trực tiếptương ứng là TRISC Cho tất cả các bit của TRISC là 1 thì các chân tương ứng ởPORTC là ngõ vào Cho tất cả các bit của TRISC là 0 thì các chân tương ứng ởPORTC là ngõ ra PORTC được đa hợp với vài chức năng ngoại vi , những châncủa PORTC có đệm Trigger Schmitt ở ngõ vào Khi bộ I2C được cho phép , chân
3 và 4 của PORTC có thể được cấu hình với mức I2C bình thường , hoặc với mứcSMBus bằng cách sử dụng bit CKE (SSPSTAT<6>) Khi những chức năng ngoại
vi được cho phép , chúng ta cần phải quan tâm đến việc định nghĩa các bit củaTRIS cho mỗi chân của PORTC
Một vài thiết bị ngoại vi ghi đè lên bit TRIS để tạo nên một chân ở ngõ ra ,trong khi những thiết bị ngoại vi khác ghi đè lên bit TRIS thì sẽ tạo nên một chân ởngõ vào
Khi những bit TRIS ghi đè bị tác động trong khi thiết bị ngoại vi được chophép ,những lệnh đọc-thay thế-ghi ( BSF , BCF , XORWF ) với TRISC là nơi đếncần phải được tránh Người sử dụng cần phải chỉ ra vùng ngoại vi tương ứng đểđảm bảo cho việc đặt TRIS bit là đúng
Trang 13Hình 2.2.1.3: PortC và thanh ghi TrisC Các thanh ghi SFR liên quan đến PortC:
PortC (07H): chứa giá trị các Pin trong PortC
TrisC (87H): điều khiển xuất nhập
2.2.1.4 PortD và thanh ghi TrisD
PORTD và TRISD không có đối với PIC16F873 hoặc PIC16F876 PORTD
là port 8 bit với đệm Trigger Schmitt ở ngõ vào Mỗi chân có thể được cấu hìnhriêng lẻ như một ngõ vào hoặc ngõ ra.PORTD có thể được cấu hình như port của
bộ vi xử lý rộng 8 bit ( parallel slave port ) bằng cách đặt bit điều khiển PSPMIDE( TRISE <4>)
Trang 14Hình 2.2.1.4: Thanh ghi TrisD Các thanh ghi SFR liên quan đến PortD
PortD (08H): chứa giá trị các Pin trong PortD
TrisD (88H): điều khiển xuất nhập
2.2.1.5 PortE và Thanh Ghi TrisE.
PORTE và TRISE không có đối với PIC16F873 hoặc PIC16F876 PORTE
có ba chân (RE0/RD/AN5 , RE1/WR/AN6 , và RE2/CS/AN7 ) mỗi chân được cấuhình riêng lẻ như những ngõ vào hoặc những ngõ ra Những chân này có đệmTrigger Schmitt ở ngõ vào Những chân của PORTE đóng vai trò như những ngõvào điều khiển vào ra cho port của vi xử lý khi bit PSPMODE ( TRISE <4> ) đượcset Trong chế độ này ,người sử dụng cần phải chắc rằng những bit TRISE <2:0>được set , và chắc rằng những chân này được cấu hình như những ngõ vào số Cũng bảo đảm rằng ADCON1 được cấu hình cho vào ra số Trong chế độ này ,những đệm ở ngõ vào là TTL
Những chân của PORTE được đa hợp với những ngõ vào tương tự Khiđược chọn cho ngõ vào tương tự , những chân này sẽ đọc giá trị ‘0’
TRISE điều khiển hướng của những chân RE chỉ khi những chân này được
sử dụng như những ngõ vào tương tự Người sử dụng cần phải giữ những chânđược cấu hình như những ngõ vào khi sử dụng chúng như những ngõ vào tương
tự
Trang 15Hình 2.2.1.5: Thanh ghi TrisE Các thanh ghi SFR liên quan đến PortE:
PortE (09H): chứa giá trị các Pin trong PortE
TrisE (89H): điều khiển xuất nhập và xác lập các thông số cho chuẩngiao tiếp PSP
ADCON1 (9FH): Thanh ghi điều khiển khối ADC
2.2.2 Bộ định thời Timer0
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
Trang 16Hình 2.2.2: Sơ đồ khối của bộ Timer0
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)
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 clocknộ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
Trang 17Hình 2.2.3: Sơ đồ khối của bộ Timer1
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ộ
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ânT1OSI/RC1 ( nếu bit T1OSCEN được set) hoặc chên trân T1OSO (nếu bitT1OSCEN đượ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 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 :