PDA

View Full Version : anh Nam giúp em giải thích vấn đề RS232 của PIC với!


david
11-04-2008, 11:24 PM
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 :

void read_SMS(){
int8 i,j;
i=0;
j=0;
while ((i<18)){
putc(mang1[i]);
i++;}
while (j<11){
putc(mang2[j]);
j++;}
}
mang1 và mang2 là các lệnh AT
đ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

#INT_RDA
void Recieve_isr(){
char c;
c = getc();
count++;
}
biến count là để em kiểm tra xem có bao nhiêu ngắt xảy ra(tưng ứng với số ký tự truyền lại PIC), và vấn đề ở đây là số lần xảy ra ngắt không đúng,mong anh giải thích giùm em !
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

namqn
12-04-2008, 12:30 AM
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,

david
12-04-2008, 12:56 AM
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:

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++;}
}
nếu em truyền một mảng ký tụ từ PC thì số lần ngắt nhận xảy ra đúng
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!

namqn
12-04-2008, 01:53 AM
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,

david
12-04-2008, 09:05 AM
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

david
20-04-2008, 08:37 PM
Đã 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 ạ! :D

namqn
20-04-2008, 10:20 PM
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,

vuvulinh_8x
28-12-2008, 01:12 AM
Đã 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 ạ! :D

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!

dtvtb
06-05-2010, 12:16 AM
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