2.3.3.1 Tổng quan về vi điều khiển PIC
PIC là một họ vi điều khiển RISC được sản xuất bởi công ty Microchip Technology. Thế hệ PIC đầu tiên là PIC1650 được phát triển bởi Microelectronics Division thuộc General – Instrument.
PIC1650 được dùng để giao tiếp với các thiết bị ngoại vi cho máy chủ 16 bit CP1600, vì vậy, ngƣời ta cũng gọi PIC với cái tên "Peripheral Interface Controller" – bộ điều khiển giao tiếp ngoại vi.
CP1600 là một CPU mạnh nhưng lại yếu về các hoạt động xuất nhập vì vậy PIC 8- bit được phát triển vào năm 1975 để hỗ trợ cho hoạt động xuất nhập của CP1600. ROM để chứa mã, mặc dù khái niệm 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 với một chu kỳ máy – gồm 4 chu kỳ của bộ dao động.
Năm 1985 General Instruments bán công nghệ các 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 EEPROM để tạo thành 1 bộ điều khiển vào ra lập 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 module ngoạ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.3.3.2 Một số đặc tính chung của vi điều khiển pic
Hiện nay có khá nhiều dòng PIC và có rất nhiều khác biệt về phần cứng, nhưng chúng ta có thể điểm qua một vài nét như sau:
- Là CPU 8/16 bit, xây dựng theo kiến trúc Harvard.
- Có bộ nhớ Flash và ROM có thể tuỳ chọn từ 256 byte đến 256 Kbyte. - Có các cổng xuất – nhập (I/O ports).
- Có timer 8/16 bit.
- Có các chuẩn giao tiếp nối tiếp đồng bộ/không đồng bộ USART. - Có các bộ chuyển đổi ADC 10/12 bit.
- Có các bộ so sánh điện áp (Voltage Comparators). - Có các khối Capture/Compare/PWM.
- Có hỗ trợ giao tiếp LCD.
- Có MSSP Peripheral dùng cho các giao tiếp I²C, SPI, và I²S. - Có bộ nhớ nội EEPROM - có thể ghi/xoá lên tới 1 triệu lần. - Có khối Điều khiển động cơ, đọc encoder.
- Có hỗ trợ giao tiếp USB. - Có hỗ trợ điều khiển Ethernet. - Có hỗ trợ giao tiếp CAN.
Đặc điểm thực thi tốc độ cao CPU RISC của họ vi điều khiển PIC16F87XA là: - Chỉ gồm 35 lệnh đơn.
- Thời gian thực hiện tất cả các lệnh là 1 chu kì máy, ngoại trừ lệnh gọi chương trình con là 2.
- Tốc độ hoạt động:
* DC- 20MHz ngõ vào xung clock. * DC- 200ns chu kì lệnh.
- Dung lượng của bộ nhớ chương trình Flash là 8K×14words. - Dung lượng của bộ nhớ dữ liệu RAM là 368×8bytes.
- Dung lượng của bộ nhớ dữ liệu EEPROM là 256×8 bytes. 1. CÁC ĐẶC TÍNH NGOẠI VI
- Timer0: là bộ định thời timer/counter 8 bit có bộ chia trước.
- Timer1: là bộ định thời timer/counter 16 bit có bộ chia trước, có thể đếm khi CPU đang ở trong chế độ ngủ với nguồn xung từ tụ thạch anh hoặc nguồn xung bên ngoài.
- Timer2: bộ định thời timer/counter 8 bit với thanh ghi 8-bit, chia trước và bộ chia sau.
- Hai khối Capture, Compare, PWM.
+ Capture có độ rộng 16-bit, độ phân giải 12.5ns + Compare có độ rộng 16-bit, độ phân giải 200ns + Độ phân giải lớn nhất của PWM là 10-bit. 2. CÁC ĐẶC TÍNH TƯƠNG TỰ
- Có 8 kênh chuyển đổi tín hiệu tương tự thành tín hiệu số ADC. - Khối so sánh điện áp tương tự:
+ Hai bộ so sánh tương tự.
+ Khối tạo điện áp chuẩn VREF tích hợp bên trong có thể lập trình.
+ Đa hợp ngõ vào lập trình từ ngõ vào của CPU với điện áp chuẩn bên trong.
+ Các ngõ ra của bộ so sánh có thể truy xuất từ bên ngoài. 3. CÁC ĐẶC TÍNH ĐẶC BIỆT CỦA VI ĐIỀU KHIỂN
- Bộ nhớ chƣơng trình Enhanced Flash cho phép xóa và ghi 100,000 lần. - Bộ nhớ dữ liệu EEPROM cho phép xóa và ghi 1,000,000 lần.
- Bộ nhớ EEPROM có thể lưu giữ dữ liệu hơn 40 năm và có thể tự lập trình lại. - Mạch lập trình nối tiếp ISP thông qua 2 chân (In-Circuit Serial Programming). - Nguồn sử dụng là nguồn đơn 5V cấp cho mạch lập trình nối tiếp.
- Có Watchdog Timer (WDT) với bộ dao động RC tích hợp trên Chip. - Có thể lập trình mã bảo mật.
- Có thể hoạt động ở chế độ ngủ để tiết kiệm năng lượng. - Có thể lựa chọn bộ dao động.
- Có mạch điện gỡ rối ICD (In-Circuit Debug).
2.3.3.3 Cấu hình PIC16F877A:
PIC16F877A có 40/44 chân với cấu trúc như sau: - Có 5 port xuất/ nhập.
- Có 8 kênh chuyển đổi A/D. - Có port giao tiếp song song.
- Có bộ nhớ gấp đôi so với PIC16F873A/PIC16F874A.
Đặc điểm PIC16F877A
Tần số hoạt động DC-20MHz
Reset (và Delay) POR, BOR(PWRT,OST)
Bộ nhớ chương trình Flash (14-bit word) 8K
Bộ nhớ dữ liệu (byte) 368
Bộ nhớ dữ liệu EEPROM (byte) 256
Các nguồn tắt 15
Các port xuất nhập Các port A,B,C,D,E
Giao tiếp nối tiếp MSSP,USART
Giao tiếp song song PSP
Module A/D 10bit 8 kênh ngõ vào
Bộ so sánh tương tự 2
Tập lệnh 35 lệnh
Số chân 40 chân PDIP
44 chân PLCC 44 chân TQFP 44 chân QFP
Bảng 2.15 Các đặc điểm của PIC 16F877A
Hình 2.13 Cấu hình bên trong PIC 16F877A
2.3.3.4 Sơ đồ khối bên trong
Hình 2.14 Sơ đồ khối bên trong PIC 16F877A
Sơ đồ khối của PIC16F877A, gồm các khối: - Khối ALU – Arithmetic Logic Unit.
- Khối bộ nhớ chứa chương trình – Flash Program Memory. - Khối bộ nhớ chứa dữ liệu EEPROM – Data EPROM.
- Khối bộ nhớ file thanh ghi RAM – RAM file Register.
- Khối giải mã lệnh và điều khiển – Instruction Decode Control. - Khối thanh ghi đặc biệt.
- Khối bộ nhớ ngăn xếp.
- Khối reset mạch khi có điện, khối định thời reset mạch khi có điện, khối định thời ổn định dao động khi có điện, khối định thời giám sát, khối reset khi sụt giảm nguồn, khối gỡ rối, khối lập trình bộ nhớ điện áp thấp.
- Khối ngoại vi timer T0, T1,T2. - Khối giao tiếp nối tiếp.
- Khối chuyển đổi tín hiệu tương tự sang số –ADC. - Khối so sánh điện áp tương tự.
- Khối tạo điện áp tham chiếu. - Khối các port xuất nhập.
2.3.3.5 SƠ ĐỒ CHÂN VÀ CHỨC NĂNG CÁC CHÂN PIC16F877A:
Sơ đồ chân của PIC gồm nhiều loại nhưng ở đây khảo sát loại PIC 40 chân như hình
Hình 2.15 Sơ đồ chân PIC16F877A
- Chân MCLR/VPP (1): có 2 chức năng:
+ MCLR: là ngõ vào reset tích cực mức thấp.
+ VPP: ngõ vào nhận điện áp khi ghi dữ liệu vào bộ nhớ nội flash. - Chân RA0/AN0 (2): có 2 chức năng:
+ RA0: xuất/ nhập số.
+ AN0: ngõ vào tương tự của kênh thứ 0. - Chân RA1/AN1(3):
+ RA1: xuất/nhập số.
+ AN1: ngõ vào tương tự của kênh thứ 1. - Chân RA2/AN2/VREF-/CVREF (4):
+ RA2: xuất/nhập số.
+ AN2: ngõ vào tương tự của kênh thứ 2.
+ VREF-: ngõ vào điện áp chuẩn (thấp) của bộ ADC. + CVREF: điện áp tham chiếu VREF ngõ ra bộ so sánh
- Chân RA3/AN3/VREF+ (5): + RA3: xuất/nhập số.
+ AN3: ngõ vào tương tự kênh thứ 3.
+ VREF+: ngõ vào điện áp chuẩn (cao) của bộ A/D. - Chân RA4/TOCKI/C1OUT (6):
+ RA4: xuất/nhập số – mở khi đƣợc cấu tạo là ngõ ra. + TOCKI: ngõ vào xung clock từ bên ngoài cho Timer0. + C1OUT: ngõ ra bộ so sánh 1.
- Chân RA5/AN4/SS/C2OUT (7): + RA5: xuất/nhập số.
+ AN4: ngõ vào tương tự kênh thứ 4. + SS: ngõ vào chọn lựa SPI phụ. + C2OUT: ngõ ra bộ so sánh 2. - Chân RE0/RD/AN5 (8):
+ RE0: xuất/nhập số.
+ RD: điều khiển đọc port song song. + AN5: ngõ vào tương tự 5.
- Chân RE1/WR/AN6 (9): + RE1: xuất/nhập số.
+ WR: điều khiển ghi port song song. + AN6: ngõ vào tương tự kênh thứ 6. - Chân RE2/CS/AN7 (10):
+ RE2: xuất/nhập số.
+ CS: Chip chọn lựa điều khiển port song song. + AN7: ngõ vào tương tự kênh thứ 7.
- Chân OSC1/CLKI (13): là ngõ vào kết nối với dao động thạch anh hoặc ngõ vào nhận xung clock bên ngoài.
+ OSC1: ngõ vào dao động thạch anh hoặc ngõ vào nguồn xung ở bên ngoài. Ngõ vào có mạch Schmitt Trigger nếu sử dụng dao động RC.
+ CLKI: ngõ vào nguồn xung bên ngoài.
+ Chân OSC2/CLKO (14): ngõ ra dao động thạch anh hoặc ngõ ra cấp xung clock.
+ OSC2: ngõ ra dao động thạch anh. Kết nối đến thạch anh hoặc bộ cộng hƣởng.
+ CLKO: ở chế độ RC, ngõ ra của OSC2, bằng ¼ tần số của OSC1 và chính là tốc độ của chu kì lệnh.
- Chân RC0/T1OSO/T1CKI (15): + RC0: xuất/nhập số.
+ T1OSO: ngõ ra của bộ dao động Timer1.
+ T1CKI: ngõ vào xung clock từ bên ngoài Timer1. - Chân RC1/T1OSI/CCP2 (16):
+ RC1: xuất/nhập số.
+ T1OSI: ngõ vào của bộ dao động Timer1.
+ CCP2: ngõ vào Capture2, ngõ ra compare2, ngõ ra PWM2. - Chân RC2/CCP1 (17):
+ CCP1: ngõ vào Capture1, ngõ ra compare1, ngõ ra PWM1 - Chân RC3/SCK/SCL (18):
+ RC3: xuất/nhập số.
+ SCK: ngõ vào xung clock nối tiếp đồng bộ/ngõ ra của chế độ SPI. + SCL: ngõ vào xung clock nối tiếp đồng bộ/ngõ ra của chế độ I2C. - Chân RD0/PSP0 (19):
+ RD0: xuất/nhập số.
+ PSP0: dữ liệu port song song. - Chân RD1/PSP1 (20):
+ RD1: xuất/nhập số.
+ PSP1: dữ liệu port song song.
- Các chân RD2/PSP2 (21), RD3/PSP3 (22), RD4/PSP4 (27), RD5/PSP5 (28), RD6/PSP6(29),
- RD7/PSP7 (30) tương tự chân 19, 20. - Chân RB0/INT (33):
+ RB0: xuất/nhập số.
+ INT: ngõ vào nhận tín hiệu ngắt ngoài. - Chân RB1 (34): xuất/nhập số.
- Chân RB2 (35): xuất/nhập số. - Chân RB3/PGM:
+ RB3: xuất/nhập số.
+ PGM: Chân cho phép lập trình điện áp thấp ICSP. - Chân RB4 (37), RB5 (38): xuất/nhập số.
- Chân RB6/PGC (39): + RB6: xuất/nhập số.
+ PGC: mạch gỡ rối và xung clock lập trình ICSP. - Chân RB7/PGD (40):
+ RB7: xuất/nhập số.
- PGD: mạch gỡ rối và dữ liệu lập trình ICSP. - Chân RC4/SDI/SDA (23):
+ RC4: xuất/nhập số. + SDI: dữ liệu vào SPI.
+ SDA: xuất/nhập dữ liệu I2C. - Chân RC5/SDO (24):
+ RC5: xuất/nhập số. + SDO: dữ liệu ra SPI. - Chân RC6/TX/CK (25): + RC6: xuất/nhập số. + TX: truyền bất đồng bộ USART. + CK: xung đồng bộ USART. - Chân RC7/RX/DT (26): + RC7: xuất/nhập số. + RX: nhận bất đồng USART. + DT: dữ liệu đồng bộ USART.
- Chân VDD (11,32) và VSS (12, 31): là các chân nguồn của PIC.
2.3.3.6 Chuẩn truyền thông SPI trong PIC16F877A.
a. Chuẩn truyền thông SPI
SPI (Serial Peripheral Bus) là một chuẩn truyền thông nối tiếp tốc độ cao do hãng Motorola đề xuất. Đây là kiểu truyền thông Master-Slave, trong đó có 1 chip Master điều phối quá trình tuyền thông và các chip Slaves được điều khiển bởi Master vì thế truyền thông chỉ xảy ra giữa Master và Slave. SPI là một cách truyền song công (full duplex) nghĩa là tại cùng một thời điểm quá trình truyền và nhận có thể xảy ra đồng thời. SPI đôi khi được gọi là chuẩn truyền thông “4 dây” vì có 4 đường giao tiếp trong chuẩn này đó là SCK (Serial Clock), MISO (Master Input Slave Output), MOSI (Master Ouput Slave Input) và SS (Slave Select). Hình 1 thể hiện một kết SPI giữa một chip Master và 3 chip Slave thông qua 4 đường.
SCK: Xung giữ nhịp cho giao tiếp SPI, vì SPI là chuẩn truyền đồng bộ nên
cần 1 đường giữ nhịp, mỗi nhịp trên chân SCK báo 1 bit dữ liệu đến hoặc đi. Đây là điểm khác biệt với truyền thông không đồng bộ mà chúng ta đã biết trong chuẩn UART. Sự tồn tại của chân SCK giúp quá trình tuyền ít bị lỗi và vì thế tốc độ truyền của SPI có thể đạt rất cao. Xung nhịp chỉ được tạo ra bởi chip Master.
MISO– Master Input / Slave Output: nếu là chip Master thì đây là đường
Input còn nếu là chip Slave thì MISO lại là Output. MISO của Master và các Slaves được nối trực tiếp với nhau..
MOSI – Master Output / Slave Input: nếu là chip Master thì đây là đường
Output còn nếu là chip Slave thì MOSI là Input. MOSI của Master và các Slaves được nối trực tiếp với nhau.
SS – Slave Select: SS là đường chọn Slave cần giap tiếp, trên các chip Slave
đường SS sẽ ở mức cao khi không làm việc. Nếu chip Master kéo đường SS của một Slave nào đó xuống mức thấp thì việc giao tiếp sẽ xảy ra giữa Master và Slave đó. Chỉ có 1 đường SS trên mỗi Slave nhưng có thể có nhiều đường điều khiển SS trên Master, tùy thuộc vào thiết kế của người dùng.
.
Hình 2.16Kết nối SPI.
Hoạt động: mỗi chip Master hay Slave có một thanh ghi dữ liệu 8 bits. Cứ
mỗi xung nhịp do Master tạo ra trên đường giữ nhịp SCK, một bit trong thanh ghi dữ liệu của Master được truyền qua Slave trên đường MOSI, đồng thời một bit trong thanh ghi dữ liệu của chip Slave cũng được truyền qua Master trên đường MISO. Do 2 gói dữ liệu trên 2 chip được gởi qua lại đồng thời nên quá trình truyền dữ liệu này được gọi là “song công”. Hình 2.17 mô tả quá trình truyền 1 gói dữ liệu thực hiện bởi module SPI trong PIC, bên trái là chip Master và bên phải là Slave.
Hình 2.17 Truyền dữ liệu SPI.
Cực của xung giữ nhịp, phase và các chế độ hoạt động: cực của xung giữ nhịp (Clock Polarity) được gọi tắt là CPOL là khái niệm dùng chỉ trạng thái của
chân SCK ở trạng thái nghỉ. Ở trạng thái nghỉ (Idle), chân SCK có thể được giữ ở mức cao (CPOL=1) hoặc thấp (CPOL=0). Phase (CPHA) dùng để chỉ cách mà dữ liệu được lấy mẫu (sample) theo xung giữ nhịp. Dữ liệu có thể được lấy mẫu ở cạnh lên của SCK (CPHA=0) hoặc cạnh xuống (CPHA=1). Sự kết hợp của SPOL và CPHA làm nên 4 chế độ hoạt động của SPI. Nhìn chung việc chọn 1 trong 4 chế độ này không ảnh hưởng đến chất lượng truyền thông mà chỉ cốt sao cho có sự tương thích giữa Master và Slave.
Với PIC 16F877A, ta cần sử dụng 4 chân cho chuẩn giao tiếp này:
+ RC5/SDO: ngõ ra dữ liệu dạng nối tiếp (Serial Data Output). + RC4/SDI/SDA: ngõ vào dữ liệu dạng nối tiếp (Serial Data Input). + RC3/SCK/SCL: xung đồng bộ nối tiếp (Serial Clock).
+ RA5/SS/C2OUT: chọn đối tượng giao tiếp (Serial Select) khi giao tiếp ở chế độ Slave mode.
b. Các thanh ghi liên quan
Thanh ghi điều khiển: SSPCON (MSSP Control Register) Thanh ghi trạng thái: SSPSTAT (MSSP Status Register)
Thanh ghi đệm dữ liệu: SSPBUF (Serial Receive/ Transmit Buffer Register) Thanh ghi dịch: SSPSR (MSSP Shift Register) – không thể truy cập
Thanh ghi trạng thái SSPSTAT
Bit 7 SMP: Sample bit SPI Master mode:
1 = Các bit dữ liệu mẫu sẽ được chèn vào cuối chuỗi dữ liệu ra 0 = Các bit dữ liệu mẫu sẽ được chèn vào giữa chuỗi dự liệu ra SPI Slave mode:
SMP phải ở mức logic thấp nếu sử dụng ở Slave mode
Bit 6 CKE: SPI clock select bit
1 = Dữ liệu sẽ được truyền khi xung clock ở trạng thái tích cực chuyển sang trạng thái không tích cực
0 = Dữ liệu sẽ được truyền khi xung clock ở trạng thái không tích cực