PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > Cơ bản về vi điều khiển và PIC

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Bài Trong Ngày Vi điều khiển

Cơ bản về vi điều khiển và PIC Những bài hướng dẫn cơ bản nhất để làm quen với vi điều khiển PIC

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 13-10-2009, 05:46 PM   #1
bluexylitol
Đệ tử 2 túi
 
Tham gia ngày: Aug 2009
Bài gửi: 28
:
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.
bluexylitol vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 13-10-2009, 07:59 PM   #2
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
Trích:
Nguyên văn bởi bluexylitol View Post
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,
__________________
Biển học mênh mông, sức người có hạn.

Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
http://www.picvietnam.com/forum/showthread.php?t=1263
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 14-10-2009, 10:01 AM   #3
bluexylitol
Đệ tử 2 túi
 
Tham gia ngày: Aug 2009
Bài gửi: 28
:
Đầ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)
bluexylitol vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 14-10-2009, 10:30 AM   #4
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
Trích:
Nguyên văn bởi bluexylitol View Post
Đầ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,
__________________
Biển học mênh mông, sức người có hạn.

Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
http://www.picvietnam.com/forum/showthread.php?t=1263
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 14-10-2009, 12:18 PM   #5
bluexylitol
Đệ tử 2 túi
 
Tham gia ngày: Aug 2009
Bài gửi: 28
:
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
Hình Kèm Theo
File Type: bmp 1.bmp (459.1 KB, 8 lần tải)
File Type: bmp 2.bmp (447.4 KB, 6 lần tải)
bluexylitol vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 14-10-2009, 12:55 PM   #6
bluexylitol
Đệ tử 2 túi
 
Tham gia ngày: Aug 2009
Bài gửi: 28
:
@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
bluexylitol vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 17-10-2009, 10:19 PM   #7
tieulongnu
Đệ tử 1 túi
 
Tham gia ngày: Sep 2009
Bài gửi: 16
:
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 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 19-10-2009, 12:10 PM   #8
tieulongnu
Đệ tử 1 túi
 
Tham gia ngày: Sep 2009
Bài gửi: 16
:
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 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 19-10-2009, 02:14 PM   #9
tieulongnu
Đệ tử 1 túi
 
Tham gia ngày: Sep 2009
Bài gửi: 16
:
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 .
tieulongnu vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 19-10-2009, 03:28 PM   #10
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
Trích:
Nguyên văn bởi tieulongnu View Post
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,
__________________
Biển học mênh mông, sức người có hạn.

Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
http://www.picvietnam.com/forum/showthread.php?t=1263
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời


Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


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


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam