View Full Version : Lỗi UART trong PIC16f877A
bluexylitol
13-10-2009, 05:46 PM
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
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
Đầ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
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
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=5a324f228335e92d391d7d881749d3a772e560df 42c02fa5a2d0568e5b24962e
tieulongnu
19-10-2009, 12:10 PM
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
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,
vBulletin® v3.8.11, Copyright ©2000-2025, vBulletin Solutions Inc.