Tải bản đầy đủ (.pdf) (32 trang)

nghiên cứu chuẩn giáo tiếp spi, i2c, uart của pic 16f877a thi công mạch giao tiếp

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (2.43 MB, 32 trang )

BỘ GIÁO DỤC VÀ ĐÀO TẠO
TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT
THÀNH PHỐ HỒ CHÍ MINH

ĐỀ TÀI NCKH CẤP SINH VIÊN

NGHIÊN CỨU CHUẨN GIÁO TIẾP SPI, I2C, UART
CỦA PIC 16F877A - THI CÔNG MẠCH GIAO TIẾP
S

K

C

0

0

3

9

5

9

MÃ SỐ: SV53 - 2008

S KC 0 0 2 3 0 1

Tp. Hồ Chí Minh, 2008




BỘ GIÁO DỤC VÀ ĐÀO TẠO
TRƢỜNG ĐẠI HỌC SƢ PHẠM KỸ THUẬT TP.HCM



NGHIÊN CỨU KHOA HỌC CẤP SINH VIÊN
ÑEÀ TAØI:

MÃ SỐ: SV53_2008
THUỘC NHÓM NGÀNH

: KHOA HỌC KỸ THUẬT

CHỦ NHIỆM ĐỀ TÀI

: CHÂU TUẤN HOÀNG

NGƢỜI THAM GIA

: NGUYỄN TẤN HÕA
TRỊNH VĂN DUY

ĐƠN VỊ

: KHOA ĐIỆN _ ĐIỆN TỬ

TP. HỒ CHÍ MINH
THÁNG 12 NĂM 2008



MỤC LỤC
PHẦN 1: ĐẶT VẤN ĐỀ ------------------------------------------------------- 2
I.

LÝ DO CHỌN ĐỀ TÀI ---------------------------------------------------------------- 2

II.

ĐỐI TƢỢNG NGHIÊN CỨU -------------------------------------------------------- 2

III. TÌNH HÌNH NGHIÊN CỨU CỦA ĐỀ TÀI --------------------------------------- 3

PHẦN 2: GIẢI QUYẾT VẤN ĐỀ ---------------------------------------- 3
I.

MỤC ĐÍCH NGHIÊN CỨU ---------------------------------------------------------- 3

II.

PHƢƠNG PHÁP NGHIÊN CỨU ---------------------------------------------------- 3

III. NỘI DUNG NGHIÊN CỨU ----------------------------------------------------------- 4
3.1. Tổng quan về họ vi điều khiển PIC--------------------------------------------- 4
3.2. Sơ lƣợc về vi điều khiển PIC 16F877A ---------------------------------------- 4
3.3. Tập lệnh của vi điều khiển PIC 16F877A ------------------------------------- 6
3.4. Khối Port nối tiếp đồng bộ chủ ( MSSP) -------------------------------------- 7
3.4.1. Chuẩn giao tiếp SPI của vi điều khiển PIC 16F877A ---------------- 8
3.4.2. Chuẩn giao tiếp I2C của vi điều khiển PIC 16F877A ---------------- 13

3.5. Chuẩn giao tiếp UART của vi điều khiển PIC 16F877A ------------------- 21
3.6. Mạch giao tiếp SPI, I2C, UART ------------------------------------------------ 26
IV. KẾT QUẢ ĐẠT ĐƢỢC ---------------------------------------------------------------- 27
4.1. Tính khoa học ----------------------------------------------------------------------- 27
4.2. Tính thực tiễn ----------------------------------------------------------------------- 27
4.3. Hiệu quả kinh tế -------------------------------------------------------------------- 27

PHẦN 3: KẾT LUẬN VÀ KHUYẾN NGHỊ------------------------ 28
I.

KẾT LUẬN ----------------------------------------------------------------------------- 28

II.

KHUYẾN NGHỊ ---------------------------------------------------------------------- 28

PHẦN 4: TÀI LIỆU THAM KHẢO ------------------------------------ 29

1


PHẦN 1:

ĐẶT VẤN ĐỀ
I. LÝ DO CHỌN ĐỀ TÀI.
Chúng ta thấy rằng trong những thập niên gần đây, các dòng vi điều khiển được phát
triển một cách mạnh mẽ. Các nhà sản xuất chip điện tử đã cho ra đời những dòng vi điều
khiển khá mạnh với những tính năng mới đáp ứng nhu cầu phát triển ngày càng cao của
khoa học kỹ thuật như: giao tiếp qua cổng USB, hỗ trợ các chuẩn giao tiếp như SPI, I2C ,
tích hợp ADC, tăng dung lượng bộ nhớ nội,…

Microchip là một nhà sản xuất chip điên tử hàng đầu trên thế giới, trong những năm
gần đây họ đã cho ra đời những dòng vi điều khiển cực mạnh như dòng PIC, dòng dsPIC.
Trong dòng vi điều khiển PIC thì họ PIC16 là một họ vi điều khiển 8bit khá mạnh và khá
phổ biến.
Với mong muốn có thêm kiến thức về họ vi điều khiển PIC16 cho bản thân mình và
phần nào giúp mọi người có thể hiểu rõ hơn họ vi điều khiển này, bên cạnh sự hướng dẫn
của Thầy Ths. NGUYỄN ĐÌNH PHÖ và những kiến thức về vi điều khiển đã được học ở
trường, em đã chọn đề tài nghiên cứu khoa học cấp sịnh viên là: “NGHIÊN CỨU
CHUẨN GIAO TIẾP SPI, I2C, UART CỦA PIC 16F877A – THI CÔNG MẠCH
GIAO TIẾP”.

II. ĐỐI TƢỢNG NGHIÊN CỨU.
-

Vi điều khiển PIC 16F877A.

-

Chuẩn giao tiếp SPI, I2C, UART.

-

Bộ thí nghiệm cho PIC 16F877A.

-

Một số chương trình thí nghiệm cho PIC 16F877A.

-


Phần mềm biên dịch và sọan chương trình cho PIC 16F877A: MPLAB,
PIC C Compiler (CCS).

-

Phần mềm nạp chương trình cho PIC 16F877A: WinPic 800.
2


III. TÌNH HÌNH NGHIÊN CỨU CỦA ĐỀ TÀI
Hiện nay ở nước ta, dòng vi điều khiển PIC16 đã được sử dụng nhiều và ngày càng
phổ biến, để góp phần bổ sung thêm các ứng dụng của Pic nên nhóm muốn nghiên cứu
các ứng dụng truyền dữ liệu của Pic.

PHẦN 2:

GIẢI QUYẾT VẤN ĐỀ
I. MỤC ĐÍCH NGHIÊN CỨU
-

Xây dựng được hệ thống kiến thức cơ bản bằng tiếng Việt về các chuẩn giao tiếp
SPI, I2C, UART đối với vi điều khiển PIC 16F877A.

-

Thiết kế mạch giao tiếp đối với các chuẩn giao tiếp SPI, I2C, UART cho vi điều
khiển PIC 16F877A.

-


Sử dụng được phần mềm MPLAB hoặc phần mềm PIC C Compiler (CCS) để soạn
và biên dich chương trình cho PIC 16F877A.

-

Sử dụng được phần mềm WinPic 800 để nạp chương trình cho PIC 16F877A.

-

Viết các chương trình truyền dữ liệu cho PIC 16F877A theo các chuẩn giao tiếp SPI,
I2C, UART.

II. PHƢƠNG PHÁP NGHIÊN CỨU
-

Tham khảo và dịch tài liệu: tìm hiểu kiến thức cơ bản về PIC 16F877A và về các
chuẩn giao tiếp SPI, I2C, UART.

-

Thi công mạch và thực hành: thi công mạch giao tiếp đối với các chuẩn giao tiếp SPI,
I2C, UART cho vi điều khiển PIC 16F877A. Viết các chương trình thí nghiệm về các
chuẩn giao tiếp.
3


III. NỘI DUNG NGHIÊN CỨU
1. Tổng quan về họ 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.
Dòng PIC đầu tiên là PIC1650 được phát triển bởi Microelectronics Division thuộc

General Instrument. Lúc này, PIC1650 được dùng để giao tiếp với các thiết bị ngoại vi
cho máy chủ 16bit CP1600. 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 EEPROM để 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 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. Sơ lƣợc về vi điều khiển PIC 16F877A
- Sơ đồ chân loại PDIP 40 chân:

4


Bảng tóm tắt đặc điểm PIC16F877A
Đặ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

8K

(14-bit word)
Bộ nhớ dữ liệu (byte)

368

Bộ nhớ dữ liệu EEPROM (byte)

256

Nguồn ngắt

15

Các port xuất nhập

Các port A, B, C, D, E

Timer

3

Các module capture/compare/PWM

2


Giao tiếp nối tiếp
Giao tiếp song song
Module A/D 10bit
Bộ so sánh tương tự
Tập lệnh

MSSP, USART
PSP
8 kênh ngõ vào
2
35 lệnh
40 chân PDIP

Số chân

44 chân PLCC
44 chân TQFP
44 chân QFN

5


3. Tập lệnh của vi điều khiển PIC 16F877A
 Khung định dạng chung cho các lệnh:

6


 Bảng tốm tắt các lệnh của PIC 16F877A


4. Khối Port nối tiếp đồng bộ chủ ( MSSP)
 Khối MSSP có thể hoạt động ở một trong hai chế độ sau:
+ Serial Peripheral Interface (SPI).
+ Inter – Intergrate Curcuit (I2C).
Cả hai chế độ trên đều hoạt động truyền dữ liệu nối tiếp.
7


 Khối MSSP có 3 thanh ghi là: thanh ghi trạng thái (SSPSTAT), hai thanh ghi điều
khiển (SPPCON1 và SPPCON2).

4.1. Chuẩn giao tiếp SPI của vi điều khiển PIC 16F877A
 Sơ đồ khối MSSP ở chế độ SPI:

8


-

Chế độ SPI cho phép 8bit dữ liệu được truyền và phát đồng bộ một cách đồng thời.

-

Để thành lập truyền thông các chân sau được sử dụng:
+ Ngõ ra dữ liệu nối tiếp (SDO): RC5/SDO.
+ Ngõ vào dữ liệu nối tiếp (SDI): RC4 /SDI/SDA.
+ Xung clock nối tiếp (SCK): RC3 /SCK/SCL.
Khi hoạt động trong chế độ slave, chân thứ tư có thể được sử dụng:
+ Lựa chọn slave ( SS ): RA5/AN4/ SS .


-

Có 4 thanh ghi cần quan tâm trong chế độ SPI:
+ Thanh ghi điều khiển 1 MSSP (SSPCON1).
+ Thanh ghi trạng thái MSSP (SSPSTAT).
+ Thanh ghi nhận nối tiếp/ đệm phát (SSPBUF).
+ Thanh ghi dịch MSSP (SSPSR) – không thể truy xuất trực tiếp.

-

Các bit điều khiển SSPCON1<5:0> và SSPSTAT<7:6> cho phép xác định:
+ Chế độ chủ ( SCK là ngõ ra xung clock)
+ Chế độ tớ ( SCK là ngõ vào xung clock)
+ Cực tính xung clock (trạng thái chờ SCK)
+ Pha lấy mẫu dữ liệu ngõ vào ( ở giữa hay cuối thời điểm dữ liệu ngõ ra)
+ Cạnh xung clock (dữ liệu ngõ ra ở cạnh lên hay cạnh xuống của SCK)
+ Tốc độ xung clock (chỉ ở chế độ chủ)
+ Chế độ lựa chọn slave ( chỉ ở chế độ tớ)

HOẠT ĐỘNG
-

Thanh ghi SSPSR dịch dữ liệu vào và ra, đầu tiên là bit MSB.

-

Sau khi nhận đủ 8 bit dữ liệu thì byte dữ liệu được chuyển đến thanh ghi SSPBUF.
Sau đó bít báo bộ đệm đầy BF ( SSPSTAT<0>) và cờ ngắt SSPIF lên mức 1.

-


Trong khi truyền/nhận dữ liệu thì bất kỳ việc ghi dữ liệu nào vào thanh ghi SSPBUF
sẽ bị bỏ qua và bit WCOL (SSPCON1<7>) sẽ được set. Do đó người lập trình phải
xóa bit WCOL để cho những lần ghi dữ liệu tiếp theo.

-

SSPBUF nên được đọc trước khi ghi byte dữ liệu tiếp theo vào nó. Khi đọc SSPBUF
được đọc thì bit BF được xóa.
9


 CHẾ ĐỘ CHỦ: Thiết bị chủ có thể khởi tạo việc truyền dữ liệu bất cứ lúc nào vì nó
điều khiển xung clock (SCK). Trong chế độ chủ dữ liệu được truyền hoặc nhận ngay khi
dữ liệu được ghi vào thanh ghi SSPBUF.
Trong chế độ SPI, tốc độ xung clock (tốc độ bit) do người lập trình lựa chọn một trong
các tốc độ sau:

 CHẾ ĐỘ TỚ: Trong chế độ tớ, dữ liệu được truyền và nhận khi có sự xuất hiện cạnh
xung clock từ bên ngoài trên chân SCK. Khi bit cuối cùng được chốt thì cơ ngắt SSPIF
(PIR1<3>) được set.
CHO PHÉP SPI I/O
-

Cho phép SPI: set bit SSPEN ( SSPCON1<5>).

-

Reset hay định cấu hình lại: xóa bit SSPEN rồi khởi tạo lại và set SSPEN.


-

Định chức năng cho các chân:
+ SDI: được điều khiển tự động bởi module SPI
+ SDO: phải xóa TRISC<7>.
+ SCK (chế độ chủ): phải xóa TRISB<1>.
+SCK (chế độ tớ): phải set TRISB<1>.
+ SS : phải set TRISA<5>.

10


KẾT NỐI MASTER- SLAVE

CHƢƠNG TRÌNH THÍ NGHIỆM:
Master:
#include <16F877A.h>
#include <DEF_16F877A.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP,PUT
#use Delay(Clock=12MHz)
int8 value;
const unsigned char dig[] ={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90};
void main(void)
{
value=0;
setup_spi(SPI_MASTER | SPI_H_TO_L | SPI_CLK_DIV_16);
// khoi rao spi
while (1)
{
spi_write(dig[value]);


// ghi value den spi

value++;

// tang value
11


delay_ms(200);
if (value ==10)

// value =10 thi cho value=0

{
value=0;
delay_ms(300);
}
}
}

Slave:
#include <16F877A.h>
#include <DEF_16F877A.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP,PUT
#use Delay(Clock=12MHz)
int8 data;

void main(void)
{

setup_spi(spi_slave | spi_h_to_l | spi_ss_disabled);
// khoi tao spi
while(true)
{
while(!spi_data_is_in()); // kiem tra da nhan du lieu xong chua
{
data = spi_read();

// chua xong thi tiep tuc nhan

}
output_D(value);
output_bit(pin_B0,0);

// xuat value ra portD
// cho hien thi

}
}
12


4.2. Chuẩn giao tiếp I2C của vi điều khiển PIC 16F877A
 Sơ đồ khối MSSP ở chế độ I2C tớ:

 Sơ đồ khối MSSP ở chế độ I2C chủ:

13



- Chế độ I2C có thể hoạt động ở nhiều chế độ khác nhau:
 Một chủ một tớ (one master – one slave)
 Một chủ nhiều tớ (one master – multi slave)
 Nhiều chủ nhiều tớ (Multi master – multi slave)

- Khi truyền dữ liệu đáp ứng ngắt ở Start bit và Stop bit để biết khi nào đường Bus rảnh.

- Hai chân được sử dụng để truyền:
+ Xung clock nối tiếp (SCL): RC3 /SCK/SCL.
+ Dữ liệu nối tiếp (SDA): RC4/SDI/SDA.
- Chân SCL và SDA phải có điện trở kéo lên nguồn.
-

Có 6 thanh ghi cần quan tâm trong chế độ hoạt động I2C:
+ Thanh ghi điều khiển 1 MSSP (SSPCON1).
+ Thanh ghi điều khiển 2 MSSP (SSPCON2).
+ Thanh ghi trạng thái MSSP (SSPSTAT).
+ Thanh ghi nhận nối tiếp/ đệm phát (SSPBUF).
+ Thanh ghi dịch MSSP (SSPSR): dịch dữ liệu vào/ra – không thể truy xuất trực tiếp.
+ Thanh ghi định địa chỉ MSSP (SSPADD): trong chế độ tớ thì chứa địa chỉ thiết bị tớ,

trong chế độ chủ thì 7bit thấp hoạt động như bộ phát tốc độ Baud nạp lại giá trị.
HOẠT ĐỘNG
-

Cho phép: set bit SSPEN (SSPCON1<5>).

-

4 bit lựa chọn chế độ SSPCON1<3:0> cho phép một trong những chế độ I 2C sau

được chọn:
+ Chế độ chủ.
+ Chế độ tớ (định địa chỉ 7bit).
+ Chế độ tớ (định địa chỉ 10bit).
14


+ Chế độ tớ (định địa chỉ 7bit), cho phép ngắt ở bit Start và bit Stop.
+ Chế độ tớ (định địa chỉ 10bit), cho phép ngắt ở bit Start và bit Stop.
+ Chế độ master điều khiển Firmware, slave chờ.
CHẾ ĐỘ TỚ:
-

Chân SCL và SDA được định cấu hình là ngõ vào.

-

Phần cứng luôn tạo ra một ngắt trên một kết nối địa chỉ.

-

Khi một địa chỉ được kết nối hoặc dữ liệu truyền đi sau một sự kết nối địa chỉ được
nhận, thì phần cứng phát ra xung ACK một cách tự động, xung này do bên nhận kéo
đường SDA xuống mức thấp để báo cho biết đã nhân đủ 8bit. Và chuyển giá trị hiện
thời trong thanh ghi SSPSR vào thanh ghi SSPBUF.

-

ACK không được phát ra trong các điều kiện sau:


+ Bô đệm đầy, bit BF (SSPSTAT<0>) được set trước khi dữ liệu truyền đi được nhận.
+Bit báo tràn SSPOV (SSPCON1<6>) được set trước khi dữ liệu truyền đi được nhận.
-

Trong trường hợp này,nội dung SSPSR không chuyển vào SSPBUF, nhưng bit
SSPIF (PIR<3>) được set.

-

Bit BF được xóa bằng cách đọc thanh ghi SSPBUF, trong khi SSPOV được xóa bằng
phần mềm.

Định địa chỉ:
-

Mỗi thiết bị tớ có 1 địa chỉ nhất định có 7 bit để gán địa chỉ, do đó có thể có 128 thiết
bị tớ.

-

Sau khi điều kiện Start xảy ra thì 8 bit được dịch vào thanh ghi SSPSR. Tất cả các bit
đều được lấy mẫu ở cạnh lên của xung clock (đường SCL).

-

Giá trị SSPSR<7:1> (bit còn lại là bit định hướng dữ liệu) được so sánh với giá trị
trong thanh ghi SSPADD ở cạnh xuống của 8 xung clock (SCL). Nếu bit kết nối địa
chỉ, bit BF, bit SSPOV được xóa thì các sự kiện sau xảy ra:
1.Giá trị trong SSPSR được chuyển vào SSPBUF.
2.Bit BF được set.

3.Xung ACK được phát ra

15


4.Bit ngắt SSP được set (nếu cho phép) ở cạnh xuống xung thứ 9 của xung clock
(SCL)
- Trong chế độ 10bit, slave cần nhận 2byte địa chỉ. 5bit cao (MSbs) của byte thứ nhất
xác định đây có phải là 10bit địa chỉ hay không. Bit R/ W ( SSPSTAT<2>) phải phải xác
định một sự kiện ghi thì thiết bị slave sẽ nhận byte địa chỉ thứ 2.
Đối với 10 bit địa chỉ thì byte thứ nhất sẽ là ‘11110 A9 A8 0’ , A9 và A8 là 2 MSbs của
địa chỉ.
Các sự kiện với 10 bit địa chỉ, bước 7 đến bước 9 giành cho bộ phát tớ:
1.Nhận byte thứ nhất (high) của địa chỉ ( bit BF, bit SSPIF, bit UA (SSPSTAT<1>) được
set.
2.Cập nhật SSPADD với byte thứ hai (low) của địa chỉ (xóa bit UA và cách li đường
SCL).
3.Đọc thanh ghi SSPBUF (xóa bit BF và bit SSPIF).
4.Nhận byte thứ hai (low) của địa chỉ ( bit BF, bit SSPIF, bit UA (SSPSTAT<1>) được
set.)
5.Cập nhật SSPADD với byte thứ nhất (high) của địa chỉ (nếu cách li đường SCL thì UA
được xóa).
6.Đọc thanh ghi SSPBUF (xóa bit BF và bit SSPIF).
7.Nhận điều kiện Start lặp lại.
8. Nhận byte thứ nhất (high) của địa chỉ ( bit BF, bit SSPIF được set.)
9. Đọc thanh ghi SSPBUF (xóa bit BF và bit SSPIF).
- Bit định hướng dữ liệu R/ W của byte dữ liệu:
+ Nhận: R/ W = 0  truyền từ chủ đến tớ.
+ Truyền: R/ W =1 truyền từ tớ đến chủ.
CHẾ ĐỘ CHỦ:

-

Cho phép bằng các bit SSPM trong SSPCON1.

-

Các chân SDA , SCL được điều khiển bằng phần cứng của MSSP.

-

Khi chế đọ Master được cho phép, người sử dụng có 6 tùy chọn.
1.Xác nhận 1 điều kiện Start trên SDA và SCL.
16


2.Xác nhận 1 điều kiện Start lặp lại trên SDA và SCL.
3.Ghi vào thanh ghi SSPBUF dữ liệu/địa chỉ truyền khởi đầu.
4.Định cấu hình port I2C để nhận dữ liệu
5.Phát tín hiệu ACK sau khi nhận 1 byte dữ liệu
6. Phát 1 điều kiện Stop trên SDA và SCL.
- Các sự kiện sau sẽ làm cho bit SSPIF được set:
+ Điều kiện Start
+ Điều kiện Stop
+ Truyền dữ liệu byte truỳên/nhận
+ Truyền ACK
+ Điều kiện Start lặp lại.
Hoạt động
-

Thiết bị chủ tạo ra xung clock nối tiếp, điều kiện Start, Stop.


-

Trong chế độ master truyền, SDA là ngõ ra dữ liệu nối tiếp, SCL là ngõ ra xung
clock nối tiếp. Byte đầu tiên chứa 7 bit địa chỉ thiết bị tớ và 1 bit R/ W =0. Dữ liệu nối
tiếp được truyền 8 bit 1 lầnvà sau mỗi byte được truyền thì nhận 1bit ACK.

-

Trong chế độ master nhận, byte được truyền đầu tiên chứa 7 bit địa chỉ thiết bị tớ và
1 bit R/ W =1. Dữ liệu nối tiếp được nhận qua SDA, trong khi SCL vẫn là ngõ ra xung
clock nối tiếp. Dữ liệu nối tiếp được nhận 8bit 1lần và sau mỗi byte dữ liệu được
nhận thì truyền bit ACK

-

Trình tự phát như sau:

1. Người dùng phát ra điều kiện Start bằng cách set bit cho phép Start, SEN
(SSPCON2<0>.
2. SSPIF được set. Module MSSP sẽ đợi thời gian bắt đầu được yêu cầu trươc khi bất cứ
hoạt động khác thay thế.
3. Người dùng nạp địa chỉ Slave để truyền vào SSPBUF.
4. Địa chỉ được dich ra chân SDA cho đến khi 8 bit được truyền.
5. Module MSSP dịch vào bit ACK từ thiết bị slave và ghi nó vào SSPCON2<6>.
6. Module MSSP phát ra ngắt ở cuối chu kỳ xung clock (SCL) thứ 9, bằng cách set
SSPIF
17



7. Người dùng nạp 8 bit dữ liệu vào SSPBUF
8. Dữ liệu được dich ra chân SDA cho đến khi 8 bit được truyền.
9. Module MSSP dịch vào bit ACK từ thiết bị slave và ghi nó vào SSPCON2<6>.
10. Module MSSP phát ra ngắt ở cuối chu kỳ xung clock (SCL) thứ 9, bằng cách set
SSPIF
11. Người dùng phát ra điều kiện Stop bằng cách set bit cho phép Stop, PEN
(SSPCON2<2>).
12. Ngắt được phát ra khi điều kiện Stop hoàn thành.
CHƢƠNG TRÌNH THÍ NGHIỆM:
Master:

#include <16F877A.h>
#include <DEF_16F877A.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP,PUT
#use Delay(Clock=12MHz)
#define SLAVE_ADDRESS 0x10
#use i2c(master, sda=PIN_B0, scl=PIN_B1)

int8 value,i;
const

unsigned

char

dig[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90};

void write_I2C(int8 a)

// ghi du lieu den i2c


{
i2c_start();

// dieu kien start

i2c_write(SLAVE_ADDRESS); // ghi dia chi slave
i2c_write(a);

//ghi du lieu

i2c_stop();

// dieu kien stop

}
18


void main()
{
value = 0;
while(1)
{
i=10;
while(i>0)
{
write_I2C(dig[value]);
i--;
delay_ms(200);

}
if(i==0)
{
value++;
}
if (value == 10)
{
value =0;
}
delay_ms(300);
}
}
Slave:

#include <16F877A.h>
#include <DEF_16F877A.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP,PUT
19


#use delay(Clock=20MHz)
#use i2c(SLAVE,SDA=PIN_B0,SCL=PIN_B1,address=0x10,force_hw)
#use fast_io(B)
#use fast_io(D)
#use fast_io(C)
int8 value;

#INT_SSP
void i2c_isr()
{

int8 state;
state = i2c_isr_state();

//trang thai i2c

if(state < 0x80)

// neu dang ghi thi doc du lieu

{
value = i2c_read();
}
if (state == 0x80)

// ghi xong, yeu cau gui thi ghi lai value den i2c

{
i2c_write(value);
}
}
void main()
{
enable_interrupts(GLOBAL); // cho phep ngat toan cuc
enable_interrupts(INT_SSP); // cho phep ngat ssp
set_tris_D(0);
set_tris_C(0);
while(1)
{
output_D(value);


// xuat du lieu
20


output_bit(pin_C0,0); // cho hien thi
}
}

5. Chuẩn giao tiếp UART của vi điều khiển PIC 16F877A
Trong PIC16F877A có tất cả 5 thanh ghi cho quá trình điều khiển UART. Trong đó có 2
thanh ghi chức năng TXSTA, RCSTA, 2 thanh ghi dữ liệu RCREG, TXREG., và thanh
ghi tốc độ Baud: SPBRG.
 Thanh ghi TXSTA (address 98h):

R/W-0 R/W-0

R/W-0 R/W-0 U-0 R/W-0

CSRC TX9

TXEN SYNC

-

R-1

R/W-0

BRCH TRMT TX9D


CSRC

- bit lựa chọn nguồn xung clock

TX9

- chọn chế độ truyền 9 bit: (=1: 9 bit, =0: 8 bit)

TXEN

- cho phép truyền

SYNC

- chọn chế độ truyền đồng bộ hay không đồng bộ: (=1: đồng
bộ, =0: không đồng bộ)

BRGH

- chọn chế độ truyền cao hay thấp =1 HIGH, =0: LOW)

TRMT

- bit báo trạng thái của bộ đệm: =1: TSR rỗng(dữ liệu đã được
truyền xong), =0: TSR đầy (dữ liệu còn trong bộ đệm của UART)

TX9D

- giá trị của bít thứ 9 trong chế độ truyền 9 bit. Bit này có thể dùng
lưu bit Parity.


 Thanh ghi RCSTA:

R/W-0

R/W-0

R/W-0

R/W-0 R/W-0

R-0

R-0

R-0

SPEN

RX9

SREN

CREN ADDEN FERR OERR RX9D

21


SPEN


- cho phép sử dụng bộ UART

RX9

- chấp nhận chế độ nhận 9 bit

SREN

- không dùng với trường hợp Asychoronous
- tiếp tục nhận dữ liệu

CREN

- dùng trong chế độ chọn 9 bit: ( master , slave )

ADDEN
FERR

- bít báo hiệu lỗi đường truyền

OERR

- báo hiệu lỗi đường truyền
- giá trị bit thứ 9 trong quá trình nhận được lưu tại đây.

RX9D

Thanh ghi TXREG: dùng để chứa dữ liệu truyền đi trong quá trình truyền
Thanh ghi RCREG: dùng để lưu dữ liệu từ ngoài vào trong quá trình nhận
Thanh ghi: SPBRG là thanh ghi thiết lập tốc độ baud của PIC

Trong PIC16F877A có hai chế độ truyền High speed, và Low speed được quy định
bởi bit BRGH của thanh ghi TXSTA.
Tốc độ Baud cho chế độ bất đồng bộ ( BRGH = 0)

Baud
Rate

Fosc=20Mhz
KBaud

(K)

%

Fosc=4MHz

SPBRG KBaud %

Error

Fosc=3.6864MHz

SPBRG KBaud %

Error

SPBRG

Error


0.3

-

-

-

0.300

0

207

0.3

0

191

1.2

1.221

1.75

255

1.202


0.17

51

1.2

0

47

2.4

2.404

0.17

129

2.404

0.17

25

2.4

0

23


9.6

9.766

1.73

31

8.929

6.99

6

9.6

0

5

19.2

19.531

1.72

15

20.833


8.51

2

19.2

0

2

28.8

31.250

8.51

9

31.250

8.51

1

28.8

0

1


33.6

34.722

3.34

8

-

-

-

-

-

-

57.6

62.500

8.51

4

62.500


8.51

0

57.6

0

0

HIGH

1.221

-

25

0.244

-

255

0.225

-

255


-

0

62.500

-

0

57.6

-

0

LOW 312.500

22


Tốc độ Baud cho chế độ bất đồng bộ ( BRGH = 0)

Baud
Rate

Fosc=20Mhz
KBaud

(K)


%

Fosc=4MHz

SPBRG KBaud

Error

%

Fosc=3.6864MHz

SPBRG KBaud %

Error

SPBRG

Error

0.3

-

-

-

0.3


-

-

0

-

-

1.2

-

-

-

1.202

0.17

207

1.2

0

191


2.4

-

-

-

2.404

0.17

103

2.4

0

95

9.6

9.615

0.16

129

9.615


0.16

25

9.6

0

23

19.2

19.231

0.16

64

19.231

0.16

12

19.2

0

11


28.8

29.070

0.94

42

27.798

3.55

8

28.8

0

7

33.8

33.784

0.55

36

35.714


6.29

6

32.9

2.04

6

57.6

59.524

3.34

20

62.500

8.51

3

57.6

0

3


HIGH

4.883

-

255

0.977

-

255

0.9

-

255

-

0

250.000

-

0


230.4

-

0

LOW 1250.000

Thông qua bảng trên ta thấy ứng với tần số thạch anh là 4M để chọn cho tốc độ baud
là 9600 ta có thể chọn hai giá trị của thanh ghi SPBRG ở hai trường hợp : SPBRG = 25
ứng với BRGH =1 có sai số là 0.15 và SPBRG = 6 ứng với BRGH =0 có sai số 6.99. Ta
chọn giá trị nào có sai số bé nhất và ứng với thạch anh 4MHz ta nên chọn SPBRG = 25 ,
BRGH= 1 vì nó có sai số nhỏ hơn trường hợp kia.
Đối với thạch anh 20MHz để chọn tốc độ baud là 9600 ta có thể chọn hai giá trị của
thanh ghi SPBRG ở hai trường hợp: SPBRG=129 ứng với BRGH=1 có sai số là 0.16 và
SPBRG=31 ứng với BRGH=0 có sai số là 1.73. Ta chọn giá trị nào có sai số bé nhất và
ứng với thạch anh 20MHz ta nên chọn SPBRG = 129 , BRGH= 1 vì nó có sai số nhỏ hơn
trường hợp SPBRG=31, BRGH=0. Như vậy ứng với trường hợp nào có sai số nhỏ hơn
trong hai giá trị thì ta sẽ chọn cái đó.

23


×