PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > Các ngôn ngữ lập trình khác (CCS C, HT 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

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 20-03-2012, 12:07 PM   #1
tienchuan
Đệ tử 4 túi
 
tienchuan's Avatar
 
Tham gia ngày: Oct 2008
Bài gửi: 71
:
Kinh nghiệm sử dụng 2 UART trên Pic18

Chào mọi người
E hiện đang làm Project có yêu cầu sử dụng 2 cổng UART để truyền thông thông qua sử dụng ngắt RS232, e chọn pic 18f97j60 để làm.
Yêu cầu của em là đọc dữ liệu ở UART1 rồi dùng UART2 để truyền lên máy tính ( bắt buộc phải sử dụng 2 cổng UART như vậy ạ)
Em thử test trên Hyper, gởi chuỗi giả xuống VĐK, sau cho bắt chuỗi, đẩy lên PC thì nhận được hết.
Nhưng khi test với mạch thì chỉ nhận được chuỗi duy nhất 1 lần.
Vậy cho em hỏi là lỗi này có phải do cấu hình UART sai hay có cần cấu hình gì thêm ko ạ ?
Cảm ơn mọi người đã đọc bài.
Thân chào mọi người.
tienchuan vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 20-03-2012, 03:22 PM   #2
longtu
Đệ tử 6 túi
 
longtu's Avatar
 
Tham gia ngày: Jul 2007
Bài gửi: 146
:
Send a message via Yahoo to longtu
Trích:
Nguyên văn bởi tienchuan View Post
Chào mọi người
E hiện đang làm Project có yêu cầu sử dụng 2 cổng UART để truyền thông thông qua sử dụng ngắt RS232, e chọn pic 18f97j60 để làm.
Yêu cầu của em là đọc dữ liệu ở UART1 rồi dùng UART2 để truyền lên máy tính ( bắt buộc phải sử dụng 2 cổng UART như vậy ạ)
Em thử test trên Hyper, gởi chuỗi giả xuống VĐK, sau cho bắt chuỗi, đẩy lên PC thì nhận được hết.
Nhưng khi test với mạch thì chỉ nhận được chuỗi duy nhất 1 lần.
Vậy cho em hỏi là lỗi này có phải do cấu hình UART sai hay có cần cấu hình gì thêm ko ạ ?
Cảm ơn mọi người đã đọc bài.
Thân chào mọi người.
Chuẩn,

Việc sử dụng 2 UART trên PIC cũng đơn giãn thôi. Chuẩn xem phần Help của CCS nhé.
Hình Kèm Theo
File Type: png Two RS232 ports on one PIC.png (34.2 KB, 67 lần tải)
__________________
--------------------------------------------------------------------------------------
Phùng Minh Tuân
Email: tuan.phmt@gmail.com
"Cuộc đời sóng gió nuôi ta lớn
Bao lần thất bại dạy ta khôn".
longtu vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 20-03-2012, 04:06 PM   #3
eman
Nhập môn đệ tử
 
Tham gia ngày: Dec 2006
Bài gửi: 6
:
2 hay nhiều UART trên PIC dùng bình thường.
Có thể tienchuan gặp vấn đề này: HyperTerminal chỉ truyền dữ liệu ASCII 7-bit thôi.
eman vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 20-03-2012, 05:04 PM   #4
tienchuan
Đệ tử 4 túi
 
tienchuan's Avatar
 
Tham gia ngày: Oct 2008
Bài gửi: 71
:
Trích:
Nguyên văn bởi longtu View Post
Chuẩn,

Việc sử dụng 2 UART trên PIC cũng đơn giãn thôi. Chuẩn xem phần Help của CCS nhé.
Chào a Longtu.
E cũng đã coi phần Help của CCS như a nói rồi mà vẫn thấy họ chỉ nói về phần config thôi a ah, e nghĩ vấn đề của e không biết có phải do xung đột ngắt UART giửa UART nhận (2) và UART gởi(0) a ?
Vì em thấy thắc mắc ở chỗ là code của e đã chạy đúng khi gởi chuỗi giả trên Hyper xuống, nhận và gởi lên PC hiển thị đúng, nhưng khi e kết nối với cảm biến thì lại chỉ gởi được chuỗi dữ liệu đầu tiên.
Thật sự mong các ACE gặp phải tình huống này như e rồi thì chỉ giáo cho e vs ạ
Cảm ơn a Longtu+mọi người đã đọc bài
Thân
tienchuan vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 20-03-2012, 05:07 PM   #5
longtu
Đệ tử 6 túi
 
longtu's Avatar
 
Tham gia ngày: Jul 2007
Bài gửi: 146
:
Send a message via Yahoo to longtu
Trích:
Nguyên văn bởi tienchuan View Post
Chào a Longtu.
E cũng đã coi phần Help của CCS như a nói rồi mà vẫn thấy họ chỉ nói về phần config thôi a ah, e nghĩ vấn đề của e không biết có phải do xung đột ngắt UART giửa UART nhận (2) và UART gởi(0) a ?
Vì em thấy thắc mắc ở chỗ là code của e đã chạy đúng khi gởi chuỗi giả trên Hyper xuống, nhận và gởi lên PC hiển thị đúng, nhưng khi e kết nối với cảm biến thì lại chỉ gởi được chuỗi dữ liệu đầu tiên.
Thật sự mong các ACE gặp phải tình huống này như e rồi thì chỉ giáo cho e vs ạ
Cảm ơn a Longtu+mọi người đã đọc bài
Thân
Chuẩn,

Chuẩn đưa code lên đây nhé. Nhớ là chỉ trích những đoạn code liên quan thôi, dừng có chép hết tấc cả các code lên, sẽ không ai chụi nhìn code đâu.

Thân.
__________________
--------------------------------------------------------------------------------------
Phùng Minh Tuân
Email: tuan.phmt@gmail.com
"Cuộc đời sóng gió nuôi ta lớn
Bao lần thất bại dạy ta khôn".
longtu vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 20-03-2012, 05:13 PM   #6
tienchuan
Đệ tử 4 túi
 
tienchuan's Avatar
 
Tham gia ngày: Oct 2008
Bài gửi: 71
:
Trích:
Nguyên văn bởi eman View Post
2 hay nhiều UART trên PIC dùng bình thường.
Có thể tienchuan gặp vấn đề này: HyperTerminal chỉ truyền dữ liệu ASCII 7-bit thôi.
@ eman: chào bạn.
Mình dùng chương trình Terminal lấy trên dientuvietnam.net và đã chọn cấu hình 8 bit data, 1 stop, none parity như hình gởi để test thử bạn ah.
Không biết bạn có gặp lỗi này lần nào như mình chưa ? Nếu có chỉ giúp minh với nhé.
Cảm ơn bạn
Thân
Hình Kèm Theo
File Type: jpg test_pic.JPG (89.4 KB, 15 lần tải)
tienchuan vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 20-03-2012, 05:21 PM   #7
tienchuan
Đệ tử 4 túi
 
tienchuan's Avatar
 
Tham gia ngày: Oct 2008
Bài gửi: 71
:
Sr a Longtu, e luần quần miết nên quên đính kềm code để minh họa ạh
Đây là đoạn code config UART của em:
Code:
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7,bits=8,stop=1,parity=n,stream=ID1) //GPRS_PORT 
#use rs232(baud=4800, xmit=PIN_G1, rcv=PIN_G2,bits=8,stop=1,parity=n,stream=ID2) //GPS_PORT
Còn đây là đoạn code e sử dụng chính :
Code:
char user_str[11]="test,test,"; 
char gps_str[100]=""; 
char gps_str_send[80]; 
char gps_buffer[100]=""; 
int8 chk_gprs=0; 
int8 index= 0; 


#int_rda2 
void ngat_gps(void) 
{ 
   char c1; 
   c1=fgetc(ID2); 
  
   switch(c1) 
   { 
      case '$':   { 
                  index=0; 
                  
                  } 
                  break; 
                  
      case 13:    check_gprmc(); 
                  break; 
      default:    { 
                  gps_buffer[index]=c1; 
                  index++; 
                  } 
                  break; 
   }    
    
} 

//------------------------------------------------------------------------------ 
void check_gprmc(void) 
{ 
   if ((gps_buffer[1]=='G')&&(gps_buffer[2]=='P')&&(gps_buffer[3]=='R')&&(gps_buffer[4]=='M')&&(gps_buffer[5]=='C'))      
   { 
      strcpy(gps_str,gps_buffer); 
      fprintf(ID1,gps_str); 
   } 
   else {}; 
}
tienchuan vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 20-03-2012, 08:25 PM   #8
longtu
Đệ tử 6 túi
 
longtu's Avatar
 
Tham gia ngày: Jul 2007
Bài gửi: 146
:
Send a message via Yahoo to longtu
Vấn đề sử dụng 2 UART trong PIC

Chuẩn,

A khuyên em thế này:
- Với ngắt nói chung em nên viết chương trình để xử lý thật nhanh chóng và thoát ra khỏi ngắt ngay. Ví dụ ở code của em, em sử dụng ngắt RDA2 để nhận data từ vệ tinh qua GPS module. Data này là liên tục và tương đối dài(có thể khoảng 70 bytes). Nếu như em xử lý không nhanh chóng có thể sẽ bị mất dữ liệu hay thậm chí làm ảnh hưởng đến chương trình(ví dụ: treo chương trình ...do chưa thoát được ngắt).
- Em gọi chương trình check_gprmc(); trong ngắt RDA2 là rất không nên, vì trong chương trình này chứa lệnh: fprintf(truyền data lên PC) trong khi em vẫn chưa thoát ra ngắt RDA2(nhận data từ PC)

Thêm nữa lệnh strcpy(gps_str,gps_buffer); em cũng sữ dụng ngay trong ngắt RDA2. Em nên sự dụng này bên ngoài ngắt. Em chỉ nên xử lý dữ liệu nhận được từ PC và lưu vào bộ nhớ tạm mà thôi, không làm việc gì khác trong Ngắt.

Anh nhắc lại, việc sử dụng 2 hay nhiều ngắt UART trong PIC không có vấn đề gì hết đâu, chi đơn giãn như vi dụ minh họa trong CCS. Việc còn lại là khéo léo xử lý để chương trình chạy xuông sẻ thôi.

Thân.
__________________
--------------------------------------------------------------------------------------
Phùng Minh Tuân
Email: tuan.phmt@gmail.com
"Cuộc đời sóng gió nuôi ta lớn
Bao lần thất bại dạy ta khôn".
longtu vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 26-09-2014, 05:40 PM   #9
tienchuan
Đệ tử 4 túi
 
tienchuan's Avatar
 
Tham gia ngày: Oct 2008
Bài gửi: 71
:
hic, bài này lâu quá mình quên cập nhựt, chắc do hồi đó lu bu sửa đồ án, h có bạn hỏi nên mình up lại phần source, chỉ tham khảo thôi chứ viết code quá dở
Thanks a Longtu đã hỗ trợ e nhiệt tình
//------------------------------------------------------------------------------
//------------------------ CHECK "CONNECT OK" STRING GPRS-----------------------
//------------------------------------------------------------------------------
#int_rda
void ngat_gprs(void)
{
char c1;
c1=fgetc(ID1);
switch(c1)
{
case 10:
{
indexx=0;
}
break;
case 13:
{
//chk_gprs=0;
check_connect();
}
break;
default:
{
connect_buffer[indexx]=c1;
indexx++;
}
break;
}
}
//------------------------------------------------------------------------------
void check_connect(void)
{
if((connect_buffer[0]=='C')&&(connect_buffer[1]=='O')&&(connect_buffer[2]=='N')
&&(connect_buffer[3]=='N')&&(connect_buffer[4]=='E')&&(connect_buffer[5]=='C')
&&(connect_buffer[6]=='T')&&(connect_buffer[8]=='O')&&(connect_buffer[9]=='K'))
{
chk_gprs=1;
indexx=0;
}
else
{
//chk_gprs=0;
//indexx=0;
}
}
//------------------------------------------------------------------------------
//------------------------- GET GPS DATA STRING -------------------------------
//------------------------------------------------------------------------------
#int_rda2
void ngat_gps(void)
{
char c2;
c2=fgetc(ID2);
switch(c2)
{
case '$':
{
index=0;
}
break;

case 13:
{
chk_gps=0;
check_gprmc();
}
break;
default:
{
gps_buffer[index]=c2;
index++;
}
break;
}
}
//------------------------------------------------------------------------------
void check_gprmc(void)
{
//disable_interrupts(int_rda2);// edit
if((gps_buffer[0]=='G')&&(gps_buffer[1]=='P')&&(gps_buffer[2]=='R')
&&(gps_buffer[3]=='M')&&(gps_buffer[4]=='C'))

{
strcpy(gps_str,gps_buffer);
chk_gps=1;
//enable_interrupts(int_rda2);// edit
index=0;
}
else
{
chk_gps=0;
//enable_interrupts(int_rda2);//edit
index=0;
};
}
tienchuan 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à 11:58 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