![]() |
![]() |
#1 |
Đệ tử 4 túi
Tham gia ngày: Aug 2006
Bài gửi: 81
: |
anh Nam giúp em giải thích vấn đề RS232 của PIC với!
em đang thực hiện việc giao tiếp giữa PIC với Mobie theo RS232 dùng CCS C
em truyền các mảng ký tự tương ứng với các lệnh AT với tốc độ 9600 như sau : Code:
void read_SMS(){ int8 i,j; i=0; j=0; while ((i<18)){ putc(mang1[i]); i++;} while (j<11){ putc(mang2[j]); j++;} } điểm đặc biệt khi giao tiếp với Mobie là mỗi khi có một ký tự nào truyền đến từ chân TX của PIC thì Mobie sẽ truyền lại đúng ký tự đó theo chân RX và em dùng ngắt nhận để nhận những ký tự này Code:
#INT_RDA void Recieve_isr(){ char c; c = getc(); count++; } Vì mới chuyển sang CCS C nên em chuă thể hiểu thấu đáo được,diều em băn khoăn ở đây là : +)liệu với cách thức truyền ký tự như thế thì có đúng là tốc độ 9600 không,vì nếu em cho thêm 1 khoảng trễ trong read_SMS() thì số lần ngắt lại khác +)em dùng thạch anh 12M thì liếu có đáp ứng kịp khi vừa truyền xong 1 ký tự thì có một ngắt nhận ký tự xảy ra hay không Mong anh giải thích giùm em hiện tượng này! cảm ơn anh rất nhiều 1 thay đổi nội dung bởi: david, 11-04-2008 lúc 11:38 PM. |
![]() |
![]() |
![]() |
#2 |
Trưởng lão PIC bang
|
Số ngắt nhận của bạn nhiều hơn hay ít hơn số ký tự được PIC truyền đi?
Nếu bạn thêm khoảng trễ thì thêm như thế nào? Và số ngắt nhận khi đó tăng lên hay giảm đi so với khi không có khoảng trễ? Có giá trị trễ nào làm cho số ký tự nhận được bằng với số ký tự được truyền đi hay không? Có lẽ bạn sẽ phải thử nghiệm thêm, vì tôi không tìm thấy thông tin cần thiết về việc truyền liên tiếp nhiều ký tự bằng putc() của CCS C. 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 |
![]() |
![]() |
![]() |
#3 |
Đệ tử 4 túi
Tham gia ngày: Aug 2006
Bài gửi: 81
: |
nếu em một mảng truyền lên PC bằng lệnh putc() thì không có gì sai cả,cái khác ở đây là sẽ có ký tự phản hồi từ Mobie(cái này thì em đã kiểm tra gữa mobie và PC) và làm cho ngắt nhận xảy ra không còn đúng nữa
nếu em thêm 1 khoảng trễ như thế này thì số ngắt nhận xảy ra nhiều hơn,nhưng vẫn không đúng: Code:
void read_SMS(){ int8 i,j; i=0; j=0; while ((i<18)){ putc(mang1[i]); delay_ms(10); i++;} while (j<11){ putc(mang2[j]); delay_ms[10]; j++;} } em nghĩ vấn đề ở đây là do sự truyền nhận xảy ra liên tục làm cho các ngắt nhận xảy ra sai nhưng cũng thấy vô lý vì với tốc độ 9600 bit/s thì 1 byte truyền đi mất khoảng 900 us,trong khi đó 1 lệnh của PIC thực hiện trong 1/3 us (thạch anh 12M) --------> khi PIC truyền xong 1byte,thì PIC có thể thực hiện 2700 lệnh trước khi truyền byte tiếp theo,do vậy nó phải đủ thời gian để nhảy vào ngắt nhận đển nhận byte phản hồi từ Mobie chứ --------> rất khó hiểu Mong anh cùng em suy nghĩ,giải thích vấn đề này! |
![]() |
![]() |
![]() |
#4 |
Trưởng lão PIC bang
|
Ok, như vậy là bỏ qua phía mobile, vì nó làm việc tốt với PC.
Khi bạn truyền 1 byte từ PIC đến mobile, mobile phải nhận xong ký tự đó rồi mới truyền lại cho PIC. Nếu PIC dùng 10 bit cho một byte (1 start bit, 8 bit dữ liệu, và 1 stop bit, không có parity), thì bạn có thể truyền khoảng 960 byte mỗi giây từ PIC, ở baud rate 9600 bps. Như vậy, giả sử mobile truyền lại ngay sau khi nhận được byte đó, bạn sẽ cần 1 khoảng thời gian cho 20 bit (khoảng 2.08 ms) để hoàn thành việc truyền 1 byte đến mobile và nhận 1 byte phản hồi từ mobile. Ở phía PIC thì việc truyền và nhận là xảy ra đồng thời, do đó PIC có thể hoàn toàn xử lý việc nhận dữ liệu. Không rõ ở phía PC bạn thử ra sao, bạn gõ vào các ký tự trong một terminal hay dùng một phần mềm nào để gửi đi 1 loạt byte? Bạn thử dùng PIC để giả lập lại tình huống gửi dữ liệu từ PC đến mobile xem. Điều gì xảy ra nếu mobile yêu cầu các byte không được truyền nhanh hơn một tốc độ nào đó (tốc độ dữ liệu đến mobile, hoàn toàn khác với baud rate của đường truyền nhé)? 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 |
![]() |
![]() |
![]() |
#5 |
Đệ tử 4 túi
Tham gia ngày: Aug 2006
Bài gửi: 81
: |
Em dùng HeyperTerminal để test giữa PC và Mobie,mỗi khi gõ một ký tự của lệnh AT thì Mobie sẽ đáp ứng lại ngay,và kết thúc câu lệnh đó,mobie truyền lại một chuỗi tưng ứng với lệnh đó
Em đã giả lập lại bằng PIC,dữ liệu truyền đi từ PIC là đúng vì em câu chân TX của PIC đến chân nhận của MAX232 và hiện thị lên máy tính đúng chuỗi ký tự đó,bằng cách này em cũng xác định được dữ liệu truyền về từ Mobie cũng đúng nốt Cái sai ở đây là PIC không nhận đúng ký tự truyền về thôi Nếu như thế thì chỉ do chương trình nhận không đúng,nhưng em nghĩ dùng ngắt như thế là hợp lý rồi hic,anh giúp em phân tích vấn đề với! em sẽ thử code lại bằng ASM xem thế nào |
![]() |
![]() |
![]() |
#6 |
Đệ tử 4 túi
Tham gia ngày: Aug 2006
Bài gửi: 81
: |
Đã kết nối thành công giữa Mobie và PIC ! (cả 2 chiều đoc tin và gửi tin)
Có một điều rất đặc biệt khí đọc dữ liệu từ Mobie đấy anh Nam ạ! ![]() |
![]() |
![]() |
![]() |
#7 |
Trưởng lão PIC bang
|
Nếu bạn không ngại thì có thể chia xẻ điều đặc biệt ấy với các thành viên khác. Rất cám ơn bạn.
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 |
![]() |
![]() |
![]() |
#8 |
Đệ tử 1 túi
Tham gia ngày: Jun 2008
Bài gửi: 19
: |
Mong được các bác giúp đỡ
Em cũng có một đề tài giao tiếp PIC với Mobile bác có thể chỉ giáo được không! Em muốn truyền lệnh AT từ PIC sang mobile để thực hiện nhắn tin chẳng hạn! Ý tưởng của em đo lượng mưa từ PIC và truyền qua mạng di động tới máy tính! Mong bác giúp!
__________________
Tôi ơi đừng tuyệt vọng! |
![]() |
![]() |
![]() |
#9 |
Đệ tử 2 túi
Tham gia ngày: Sep 2008
Bài gửi: 27
: |
Gà vịt,máy cái này trăm ngàn người đã làm rồi,giờ có làm đc cũng chẳng qua chỉ là bắt chước thôi,hà cớ chi phải private một cái vốn chẳng có bí mật gì ghê gớm
|
![]() |
![]() |
![]() |
|
|