Bài 6: Giao tiếp máy tính
Nội dung
Khối USART
Ứng dụng giao tiếp vi điều khiển với máy tính
USART
Universal Synchronous Asynchronous Receiver
Transmitter
Synchronous:
giao tiếp với các thiết bị ngoại vi như các IC A/D, D/A,
EEPROMs
Asynchronous:
giao tiếp với máy tính PC
USART trong PIC16F877A
5 thanh ghi quan trọng:
2 thanh ghi chức năng TXSTA, RCSTA
2 thanh ghi dữ liệu RCREG, TXREG
Thanh ghi tốc độ Baud: SPBRG
TXSTA
CSRC: Clock Source Select bit
Chế độ bất đồng bộ: không quan tâm
Chế độ đồng bộ: 1->chế độ Master( clock từ BRG)
0->chế độ Slave( clock từ bên ngoài)
TX9 : 9-bit Transmit Enable bit: chọn chế độ truyền 9 bit: ( =1: 9 bit, =0: 8 bit )
TXEN : Transmit Enable bit
=1: cho phép truyền , =0: cấm
SYNC : USART Mode Select bit
Chọn chế độ truyền đồng bộ hay không đồng bộ( =1: đồng bộ, =0: không đồng bộ )
BRGH : High Baud Rate Select bit
Chỉ hoạt động ở chế độ bất đồng bộ: chọn tốc độ cao hay thấp ( =1 HIGH, =0: LOW )
TRMT : Transmit Shift Register Status bit
bít 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 : 9th bit of Transmit Data, can be Parity bit
giá trị của bít thứ 9 trong chế độ truyền 9 bit.
RCSTA
Bit 7 SPEN Serial Port Enable bit( = 1 Cho phép cổng giao tiếp USART )
Bit 6 RX9 9-bit Receive Enable bit( = 1 nhận 9 bit dữ liệu, = 0 nhận 8 bit dữ liệu)
Bit 5 SREN Single Receive Enable bit
Ỡ chế độ USART bất đồng bộ: bit này không cần quan tâm.
Ở chế độ USART Master đồng bộ:( = 1 cho phép chức năng nhận 1 byte dữ liệu (8 bit hoặc 9 bit))
Bit 4 CREN Continous Receive Enable bit
Ở chế độ bất đồng bộ:( = 1 cho phép nhận 1 chuỗi dữ liệu liên tục)
Ở chế độ đồng bộ:(= 1 cho phép nhận dữ liệu cho tới khi xóa bit CREN, = 0 không cho phép nhận
chuỗi dữ liệu)
Bit 3 ADDEN Address Detect Enable bit
Ở chế độ USART bất đồng bộ 9 bit
ADDEN = 1 cho phép xác nhận địa chỉ, khi bit RSR<8> được set thì ngắt được cho phép thực
thi và giá trị trong buffer được nhận vào.
ADDEN = 0 không cho phép xác nhận địa chỉ, các byte dữ liệu được nhận vào và bit thứ 9 có
thể được sử dụng như là bit parity.
Bit 2 FERR Framing Eror bit( = 1 xuất hiện lỗi “Framing- sai bit Stop” trong quá trình truyền nhận dữ
liệu
Bit 1 OERR Overrun Error bit(= 1 xuất hiện lỗi “Overrun- tràn”)
Bit 0 RX9D
Bit này chứa bit dữ liệu thứ 9 của dữ liệu truyền nhận
TXREG , RCREG , SPBRG
TXREG: chứa dữ liệu truyền đi trong quá trình truyền
RCREG: lưu dữ liệu từ ngoài vào trong quá trình nhận
SPBRG: thiết lập tốc độ baud
(BRGH=0) ( BRGH=1 )
Quá trình truyền và nhận
Quá trình nhận dữ liệu :
Nhận biết lúc nào có dữ liệu truyền tới:
Kiểu Polling: liên tục kiểm tra cờ RCIF( thanh ghi
PIR1) nếu =1 thì đọc dữ liệu
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
1. Khởi tạo tốc độ baud: ở thanh ghi SPBRG.
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
Quá trình truyền và nhận
1. Khởi tạo tốc độ baud: ở thanh ghi SPBRG
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
Quá trình truyền dữ liệu
CCS
#use rs232 (options)
options được tách nhau bởi dấu phẩy, và có thể là:
BAUD=x// Đặt baud rate
parity=N// Đặt parity
XMIT=pin// Đặt chân truyền
RCV=pin// Đặt chân nhận
Bits=x// Số bit
Ví dụ: #use
rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
- value = getc()
value = fgetc(stream)
value=getch()
value=getchar()
Hàm này trả về 1 giá trị kí tự 8 bit. Hàm này có tác dụng
nhận về 1 kí tự từ chân nhận
- putc (cdata)
putchar (cdata)
fputc(cdata, stream)
Hàm này không trả về giá trị,nó có tác dụng đặt 1 kí tự
lên chân truyền
- gets (string)
value = fgets (string, stream)
Nó có tác dụng nhận 1 xâu từ chân nhận
- puts (string)
value = fputs (string, stream)
Đặt 1 xâu lên chân truyền
-
printf (string)
printf (cstring, values )
printf (fname, cstring, values )
fprintf (stream, cstring, values )
chức năng như hàm puts()
- value = kbhit()
value = kbhit (stream)
Hàm naỳ trả về 1 (hoặc TRUE) nếu 1 kí tự đã được
nhận.
- setup_uart(baud, stream)
setup_uart(baud)
set_uart_speed (baud, [stream, clock])
perror(string);
Bài toán
Chương trình
chính
Đọc giá trị từ cổng
Com
Đẩy ra PORTD
Đẩy data lên máy
tính
Kbhit()
Đ
S
#include <16f877a.h>
#include <def_877a.h>
#device *=16 ADC=8
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT,
NOLVP, NOCPD, NOWRT
#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
char h_thi;
void main()
{trisd=0x00;//dau ra
portd=0x00;//ban dau led tat
while(true)
{ if(kbhit()){
h_thi=getc();
portd=h_thi;
putc(h_thi);
};
}
}
Truyền 1 số có 3 chữ số ( < 256) từ máy tính xuống.
Vi điều khiển nhận và hiển thị giá trị nhận được lên
các led ở portd. Chẳng hạn: Ta truyền số 255 thì tất
cả các led ở portd đều sáng
Bài toán