PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Cơ bản về vi điều khiển và PIC (http://www.picvietnam.com/forum/forumdisplay.php?f=8)
-   -   Lỗi UART trong PIC16f877A (http://www.picvietnam.com/forum/showthread.php?t=5070)

bluexylitol 13-10-2009 05:46 PM

Lỗi UART trong PIC16f877A
 
Mình làm việc với con PIC16F877A. Mình dùng thạch anh 11.0592M (có nối thêm 2 tụ 33pF). Đã thiết lập dao động mode HS. Trong hàm khởi tạo uart mình khởi tạo như sau:

BRGH=1;//High Speed Mode
//SPBRG=FOSC/(16*Baud rate)-1
SPBRG=11059200/(16*9600)-1;

//Transmit
SPEN=1;//Serial Port enabled
SYNC=0;//EUSART Mode is Asynchronous
TXEN=1;//Transmit enabled
TX9=0;//8 bit transmission
TXIE=0;//inturupt disabled

//Receiver
SPEN=1;//Serial Port enabled
SYNC=0;//EUSART Mode is Asynchronous
CREN=1;//Receiver enabled
RX9=0;//8 bit reception
RCIE=0;//inturupt disabled

Tuy vậy khi giao tiếp với PC qua RS232, mình có nhận được dữ liệu gửi lên và xuống, tuy nhiên mình gửi 1 ký tự thì lại hiện vài ký tự. Mình không biết chương trình của mình sai chỗ nào, các bạn góp ý mình với. Thanks.

namqn 13-10-2009 07:59 PM

Trích:

Nguyên văn bởi bluexylitol (Post 30208)
Mình làm việc với con PIC16F877A. Mình dùng thạch anh 11.0592M (có nối thêm 2 tụ 33pF). Đã thiết lập dao động mode HS. Trong hàm khởi tạo uart mình khởi tạo như sau:

BRGH=1;//High Speed Mode
//SPBRG=FOSC/(16*Baud rate)-1
SPBRG=11059200/(16*9600)-1;

//Transmit
SPEN=1;//Serial Port enabled
SYNC=0;//EUSART Mode is Asynchronous
TXEN=1;//Transmit enabled
TX9=0;//8 bit transmission
TXIE=0;//inturupt disabled

//Receiver
SPEN=1;//Serial Port enabled
SYNC=0;//EUSART Mode is Asynchronous
CREN=1;//Receiver enabled
RX9=0;//8 bit reception
RCIE=0;//inturupt disabled

Tuy vậy khi giao tiếp với PC qua RS232, mình có nhận được dữ liệu gửi lên và xuống, tuy nhiên mình gửi 1 ký tự thì lại hiện vài ký tự. Mình không biết chương trình của mình sai chỗ nào, các bạn góp ý mình với. Thanks.

Vậy đoạn chương trình gửi dữ liệu ra sao?

Thân,

bluexylitol 14-10-2009 10:01 AM

Đầu tiên e cám ơn bác namqn vì bác luôn tận tình giúp đỡ!
Đoạn code gửi nhận ký tự của em thế này, em không dùng ngắt:
//function name: putch_uart
//Description: send a character to serial port
//return: none
void putch_uart(unsigned char byte){
/* output one byte */
while(!TXIF) /* set when register is empty */
continue;
TXREG = byte;
}
////////////////////////////////////////////////////////////////
//function name: getch_uart
//Description: get a character from serial port
//return: received character
unsigned char getch_uart(void){
/* retrieve one byte */
while(!RCIF) /* set when register is not empty */
continue;
return RCREG;
}
////////////////////////////////////////////////////////////////
//function name: getche_uart
//Description: get a character and resend the character via
// serial port
//return: received character
unsigned char getche_uart(void){
unsigned char c;
putch_uart(c = getch_uart());
return c;
}
trong hàm main e viết thế này (trích)
{
//...
putch_uart('D');
while(1) getche_uart();
//..
}
thì ký tự nhận được không phải là D mà là cụm ba 00 00 FC
hàm getche_uart() cũng gửi về ký tự không giống ký tự gửi lên. Em cũng gửi từ PC xuống ký tự D thì nhận được từ PIC lên hoặc là E0 hoặc là 00
(E chọn phần mềm quan sát trên PC là Terminal, và set up baud là 9600)

namqn 14-10-2009 10:30 AM

Trích:

Nguyên văn bởi bluexylitol (Post 30228)
Đầu tiên e cám ơn bác namqn vì bác luôn tận tình giúp đỡ!
Đoạn code gửi nhận ký tự của em thế này, em không dùng ngắt:
//function name: putch_uart
//Description: send a character to serial port
//return: none
void putch_uart(unsigned char byte){
/* output one byte */
while(!TXIF) /* set when register is empty */
continue;
TXREG = byte;
}
////////////////////////////////////////////////////////////////
//function name: getch_uart
//Description: get a character from serial port
//return: received character
unsigned char getch_uart(void){
/* retrieve one byte */
while(!RCIF) /* set when register is not empty */
continue;
return RCREG;
}
////////////////////////////////////////////////////////////////
//function name: getche_uart
//Description: get a character and resend the character via
// serial port
//return: received character
unsigned char getche_uart(void){
unsigned char c;
putch_uart(c = getch_uart());
return c;
}
trong hàm main e viết thế này (trích)
{
//...
putch_uart('D');
while(1) getche_uart();
//..
}
thì ký tự nhận được không phải là D mà là cụm ba 00 00 FC
hàm getche_uart() cũng gửi về ký tự không giống ký tự gửi lên. Em cũng gửi từ PC xuống ký tự D thì nhận được từ PIC lên hoặc là E0 hoặc là 00
(E chọn phần mềm quan sát trên PC là Terminal, và set up baud là 9600)

Các từ khóa continue không có tác dụng gì trong trường hợp của bạn.

Ở main(), bạn chỉ nên xuất một ký tự và chờ nhận 1 ký tự, không nên đặt lệnh gọi hàm getche_uart() vào vòng while (1).

Theo hiện tượng bạn đã mô tả, tôi cho là baud rate hai bên không giống nhau. Bạn hãy kiểm tra lại tốc độ xung clock của PIC xem có đúng như bạn đang giả thiết hay không.

Thân,

bluexylitol 14-10-2009 12:18 PM

2 Attachment(s)
Em vẫn chưa giải quyết được vấn đề này, cho em hỏi dùng thạch anh ở mode HS có cần nối thêm điện trở Rs giữa điểm giao của thạch anh và tụ với chân OSC2 của PIC ko?
P/s: Em đính thêm file cho rõ thông tin em hỏi

bluexylitol 14-10-2009 12:55 PM

@namqn and mọi người:
Em giải quyết được rồi,
Em dùng HiTech Compiler, nó không biên dịch chính xác được dòng lệnh:
SPBRG=11059200/(16*9600)-1;
Hi vọng mọi người biết và rút kinh nghiệm

tieulongnu 17-10-2009 10:19 PM

giao tiếp 16f877 và PC dùng VB
 
các anh có thể vui lòng xem giúp em chỗ nào sai hay thiếu với , em đang tập giao tiếp máy tính em chẳng thấy gì xảy ra hết.
http://www.mediafire.com/?sharekey=5...d0568e5b24962e

tieulongnu 19-10-2009 12:10 PM

card PCI sang COM
 
các bạn cho mình hỏi : mình mới gắn thêm cổng com ( com 3 và com 4) dùng card PCI , trước đây mình nạp cho PIC 16f877 bằng com 1 thì không có vấn đề gì ,nhưng giờ mình dùng com 3 hoặc com 4 để nạp thì không được.Ai biết làm ơn chỉ giúp mình với . Mình hỏi nhiều người rồi .Rất cảm ơn các bạn

tieulongnu 19-10-2009 02:14 PM

Tôi dùng WinPIC Programmer của anh Nam , thì đã nạp được qua cổng COM 4 ( PCI card). Cảm ơn anh Nam.Dùng WinPIC800 thì không được .

namqn 19-10-2009 03:28 PM

Trích:

Nguyên văn bởi tieulongnu (Post 30391)
Tôi dùng WinPIC Programmer của anh Nam , thì đã nạp được qua cổng COM 4 ( PCI card). Cảm ơn anh Nam.Dùng WinPIC800 thì không được .

Xin đính chính đôi chút ở chỗ này, WinPIC Programmer là do Wolfgang Buescher viết, không phải là sản phẩm của tôi.

Thân,


Múi giờ GMT. Hiện tại là 03:27 PM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam