Professional Documents
Culture Documents
UART
UART
UART
01
Ngày: 2/9/2006 Trang: 1/9
Tutorial no 03.02
Gửi đến: picvietnam@googlegroups.com
Nội dung: Kết nối PIC với EEPROM, DS1307 dùng I2C
MICROSOFT WORD
Tóm tắt:
Trong Tutorial của bạn Ngô Hải Bắc đã có phần hướng dẫn về cách lập trình giao tiếp cổng Com
trong PC dùng VC++6.0. Hôm nay mình sẽ giới thiệu cho các bạn cách thức lập trình giao tiếp nối
tiếp UART trên PIC:
1. Giao tiếp nối tiếp dùng UART
Viết tắt của Universal Asynchronous Receiver – Transmitter – thường là một mạch
tích hợp được sử dụng trong việc truyền dẫn dữ liệu nối tiếp giữa máy tính và thiết bị
ngoại vi thông qua cổng nối tiếp. Rất nhiều vi điều khiển hiện nay đã tích hợp UART. Để
bắt đầu việc truyền dữ liệu bằng UART, một start bit được gửi đi, sau đó là 5‐8 bit dữ
liệu, sau đó là stop bit. Start bit có trạng thái ngược với trạng thái bình thường của đường
truyền dữ liệu. Stop bit có cùng trạng thái với trạng thái bình thường của đường truyền
dữ liệu. Tốc độ của UART được quy định bởi tốc độ baud. Một số interface chuẩn của
UART là EIA, RS 232, RS 422 và RS 485.
Như vậy để làm việc với UART chúng ta phải quan tâm đến các thông số sau:
• Tốc độ Baud: thường là 9600
• Số bít được dùng để truyền Data: từ 5 đến 8 ( thường là 8 )
• Bít Stop 1, hay 2 thường chọn 1
• Bit chẵn lẻ
2. Giao tiếp UART trong PIC16F877A
2.1. Các thanh ghi được sử dụng trong PIC16F877A
Trong PIC16F877A có tất cả 5 thanh ghi cho qua 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.
Người báo cáo: Phạm Đức Mạnh Tài liệu: TUT03.01
Ngày: 2/9/2006 Trang: 2/9
Thanh ghi TXSTA
CSRC:
TX9 : chọn chế độ chuyề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ế dộ truyền cao hay thấp ( =1 HIGH, =0: LOW )
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
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
CREN : tiếp tục nhận dữ liệu
ADDEN : dùng trong chế độ chọn 9 bit: ( master , slave )
Người báo cáo: Phạm Đức Mạnh Tài liệu: TUT03.01
Ngày: 2/9/2006 Trang: 3/9
FERR : bít báo hiệu lỗi đường truyền
OERR : báo hiệu lỗi đường truyền
RX9D : giá trị bít thứ 9 trong quá trình Receive được lưu tại đây.
Thanh ghi TXREG: dùng để chứa dữ liệu truyền đi trong quá trình Transmit
Thanh ghi RCREG: dùng để lưu dữ liệu từ ngoài vào trong quá trình Receive
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. Việc phân chia hai mức tốc độ này để có sự chọn lựa cho
trường hợp sai số với tốc độ baud chuẩn của PC: Mà trong PC có các mức chuẩn: 300,
2400, 9600, 19200, 28800. Các bạn có thể tham khảo bảng 10‐3 ở trang 114 để biêt được các
mức tốc độ :
Hình 1: BAUD RATE FOR ASYNCHORONOUS MODE ( BRGH=0 )
Người báo cáo: Phạm Đức Mạnh Tài liệu: TUT03.01
Ngày: 2/9/2006 Trang: 4/9
Hình 2: BAUD RATE FOR ASYNCHRONOUS MODE ( BRGH=1 )
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ói sai số là 0.15 và SPBRG = 6 ứng với BRGH =0 có sai số 6.99. Rõ ràng là ta
chọn gia trị nào có sai số bế nhất và ứng với VD trên ta nên chọn SPBRG = 25 , BRGH= 1
vì nó có sai số nhỏ hơn trường hợp kia. 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 đó.
2.2. Quá trình truyền và nhận của PIC với PC
Trong PIC16F877A có nhiều chế độ truyền nhận khác nhau: chế độ truyền nhận dùng
bit 9 để định chẵn lẻ, hay cho mạng VĐK 1 master và nhiều slave. Và chế độ chuyền
đồng bộ ứng dụng cho việc giao tiếp với A/D, D/A hay với các EEPRO. Và tất nhiên các
chế dộ này sẽ được thiết lập bởi các bit trong thanh ghi TXSTA, và TCSTA. Tuy nhiên
trong tutorial này chỉ xin giới thiệu chế độ truyền và nhận 8 bit giao tiếp với PC một
trong các chức năng của bộ AUSART của PIC
Quá trình nhận dữ liệu
Trong PIC16F877A để nhận biết được dữ liệu truyền tới người ta dùng bit cờ RCIF
trong thanh ghi PIR1. Như vậy khi thanh ghi đệm dữ liệu chứa dữ liệu thì RCIF sẽ được
đưa lên 1. Và chính cờ này cho phép PIC16F877A có hai phương thức để nhận biết lúc
nào có dữ liệu truyền tới. Sử dụng ngắt và sử dụng kiểu Polling ( quay vòng )
Người báo cáo: Phạm Đức Mạnh Tài liệu: TUT03.01
Ngày: 2/9/2006 Trang: 5/9
• Kiểu Polling: liên tục kiểm tra cờ RCIF nếu =1 thì đọc dữ liệu: Phương thức này có ưu
điểm dẽ lâp trình , phù hợp với những ứng dụng nhỏ.
• Kiểu dùng ngăt: được thiết lập bằng cách cho RCIE= 1 để cho phép ngắt. Tức là mỗi
khi có dữ liệu truyền tới RCREG thì sinh ra một ngắt và PIC sẽ tạm dừng chương trình
hiện thời để xử lý dữ liệu vừa nhận được. Cách này chủ yếu được sử dụng
Như vậy các bước cho quá trình nhận dữ liệu của quá trình sử dụng INTERUPT bao
gồm:
‐ 1. Khởi tạo tốc độ baud: ở thanh ghi SPBRG. Cho SPBRG = 25, BRGH =1 ứng với tốc
độ 9600 ( thạch anh 4M)
‐ 2. Cho phép quá trình truyền không đồng bộ bắng cách thiết lập SPEN = 1, SYNC= 0;
‐ 3. Cho phép ngắt quá trình nhận dữ liệu: RCIE=1
‐ 4 Cho phép nhận dữ liệu : CREN = 1
‐ 5. Cho phép ngắt toàn cục băng việc GIE =1, PEIE = 1 ( GIE, PEIE trong thanh ghi
INTCON )
‐ 6. Xử lý các phần khác chương trình khi có ngắt xảy ra thì xử lý dữ liệu
VD : nhận dữ liệu từ PC với tốc độ baud: 96000 sử dụng ngắt
2.2.2. Quá trình truyền dữ liệu
Trong quá trình truyền dữ liệu cũng có hai chế độ sử dụng ngắt và Polling , tuy
nhiên quá trình truyền dữ liệu lên PC không phải là thời diểm bất kỳ mà dặt dưới sự
kiểm soát của chương trình cho nên người ta thưòng sử dụng kiểu polling khi cần truyền
thì truyền đi.
Như vậy các bước cho quá trình thiết lập ngắt:
‐ 1. Khởi tạo tốc độ baud: ở thanh ghi SPBRG. Cho SPBRG = 25, BRGH =1 ứng với tốc
độ 9600 ( thạch anh 4M)
‐ 2. Cho phép quá trình truyền không đồng bộ bắng cách thiết lập SPEN = 1, SYNC= 0;
‐ 3. Cho phép truyền dữ liệu bằng cách thiết lập bít TXEN = 1;
‐ 4. Khi cần truyền dữ liệu chỉ cần Load dữ liệu đó lên TXREG
VD:
Lưu ý: trư khi cho quá trình truyền và nhận dữ liệu ta phải thiết lập trạng thái chân
của RC7, RC6 cho hợp lý. Cho RC7 là dạng in , RC6 là dạng out
3. Một vi dụ đơn giản
Đây là một VD về quá trình truyền và nhận dữ liệu từ PC. PIC nhận dữ liệu tù PC
chuyển qua PORTB ( hiển thị qua led ) rồi truyền trở lại PC
Người báo cáo: Phạm Đức Mạnh Tài liệu: TUT03.01
Ngày: 2/9/2006 Trang: 7/9
list p=16f877A
#include <p16f877A.inc>
__CONFIG 0x393A
errorlevel ‐302
w_temp EQU 0x71
status_temp EQU 0x72
pclath_temp EQU 0x73
ACC EQU 0x74
R2 EQU 0x7A
R3 EQU 0x7B
R4 EQU 0x7C
;**********************************************************************
ORG 0x000 ; processor reset vector
goto main ; go to beginning of program
ORG 0x004 ; interrupt vector location
movwf w_temp ; save off current W register contents
movf STATUS,w ; move STATUS register into W register
movwf status_temp ; save off contents of STATUS register
movf PCLATH,W ; move PCLATH register into W register
movwf pclath_temp ; save off contents of PCLATH register
;=============================================================================
BANKSEL RCREG
MOVF RCREG,W ; Nhan du lieu tu RCREG chuyen cho thanh
ghi W
MOVWF PORTB ; Dua du lieu ra PORTB
BANKSEL TXREG
MOVWF TXREG ; Truyen du lieu do len PC
;==============================================================================
movf pclath_temp,w ; retrieve copy of PCLATH register
movwf PCLATH ; restore pre‐isr PCLATH register contents
movf status_temp,w ; retrieve copy of STATUS register
movwf STATUS ; restore pre‐isr STATUS register contents
swapf w_temp,f
swapf w_temp,w ; restore pre‐isr W register contents
retfie
main
BANKSEL ADCON1
MOVLW 0x06
MOVWF ADCON1 ; Chọn chế độ Digital ở cac chan
CALL Init_serialport
BANKSEL TRISB
CLRF TRISB ; Cho dang PORTB la dang out
BSF INTCON,GIE ; Cho phep ngat
BSF INTCON,PEIE
GOTO $
Init_serialport
BANKSEL TXSTA
Người báo cáo: Phạm Đức Mạnh Tài liệu: TUT03.01
Ngày: 2/9/2006 Trang: 8/9
Với sơ đồ kêt nối như hình vẽ:
+5V
Mach TEST USART dung PIC16F877A
16
MAX232
2 1
VCC
V+ C1+
6 3 U1
V- C1 1
4 2 MCLR/VPP 33
C2+ 3 RA0/AN0 RB0/INT 34
P1 4 RA1/AN1 RB1 35 U5
1 5 5 RA2/AN2 RB2 36 U6
6 C2- 6 RA3/AN3/VREF+ RB3 37 U7
2 14 11 7 RA4/TOCKI RB4 38 U8
7 T1out T1in RA5/AN4 RB5 39 U9
3 7 10 15 RB6 40
8 T2out T2in 16 RC0 RB7
4 17 RC1 19
9 13 12 18 RC2 RD0 20
5 R1in R1out 23 RC3/SCL RD1 21
GND
8 9 24 RC4/SDA RD2 22
R2in R2out 25 RC5 RD3 27
CONNECTOR DB9 26 RC6/TX RD4 28
RC7/RX RD5
15
29
RD6 30
13 RD7
OSC1/CLK1
8
RE0 9
14 RE1 10 +5V
OSC2/CLK0 RE2
11 12
32 VDD VSS 31
VDD VSS
PIC16F877A
Lưu ý: ở sơ đồ trên sử dụng Max232 kết nối máy tính vì mức điện áp của PC và PIC là khác
nhau và Max232 ở đây có tác dụng làm bộ chuyển đổi trung gian giữa PC và PIC
‐ Cách thức test
Người báo cáo: Phạm Đức Mạnh Tài liệu: TUT03.01
Ngày: 2/9/2006 Trang: 9/9
‐ Sử dụng chương trình giao tiếp máy tính bất kỳ có chế độ truyền và nhận dữ liệu. (
dùng chương trình MSCOM của Ngohaibac )
‐ Soạn thảo code chương trình như trên tạo file Hex rồi nạp vào PIC16F877A.
‐ Thiết lập phần cứng như trong hình vẽ.
‐ Kết nối PIC với cổng com của máy tính như sơ đồ trên.
‐ Mở chương trình giao tiếp máy tính qua cổng Com rồi chọn chế độ truyền 8 bit, tốc
độ BAUD 9600.
‐ Chọn connect rồi chuyền dữ liệu. Các bạn sẽ thấy dữ liệu nhận được sẽ như khi ta
nối tắt hai chân 2, 3 của cổng com và bạn sẽ thấy dữ liệu hiển thị qua LED> VD
truyền chữ ʺTʺ ứng với 0x54 hay 01010100 các bạn sẽ thấy có ba led sáng: led 6 và
led 4 , led 2 sáng còn các Led còn lại tối
‐ ( lưu ý là dữ liệu hiển thị ra led là dữ liệu cuối cùng của đoạn text, vì các dữ liệu kia
chỉ xuất hiện trong thời gian rất ngắn nên không thể nhận ra được )
Hình 4: Giao diện mẫu
4. Kết luận
Trong tutorial này chỉ hướng dãn về cách thức truyền và nhận dữ liệu không đồng bộ
qua PC cơ chế sử dụng 8 bit. Để tìm hiểu thêm về cơ chế USART trong PIC các bạn có thể
tham khảo Datasheet của PIC16F877A ( trang 111 )
Qua tutorial này các bạn sẽ biết được cách lập trình truyền nhận dữ liệu một cách đơn
giản, cách sử dung chương trình kết nối máy tính hay sơ đô sử dụng Max232 kết nối máy
tính.