PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   PIC - Thiết kế và Ứng dụng (http://www.picvietnam.com/forum/forumdisplay.php?f=23)
-   -   Mạch chuyển đổi RS232<=>RS485 tự động chuyển mạch (http://www.picvietnam.com/forum/showthread.php?t=9404)

stupid11 20-05-2011 10:27 PM

Mạch chuyển đổi RS232<=>RS485 tự động chuyển mạch
 
Em đang làm đồ án tốt nghiệp có liên quan tới truyền thông qua mạng RS485..Em có làm mạch chuyển đổi RS232<=>RS485 của anh HoangLongU bên ĐTVN..nhưng hình như nó không chạy,anh nào có kinh nghiệm hay đã làm mạch này rồi,hoặc có mạch chuyển đổi khác có thể giúp em được không..em đang cần gấp lắm..

Đây là mạch của anh HoangLongU :
For PC:
-Mạch này con 75176 chân 8 nối nguồn,chân 5 nối mass..không biết tại sao anh HoangLongU không vẽ ra nữa...
http://i1090.photobucket.com/albums/...t08b/ForPC.jpg
For MCU:
Mạch này điện trở 120 cho trạm cuối..còn các trạm giữa thì không có.
http://i1090.photobucket.com/albums/...08b/ForMCU.jpg
Em đã tiến hàn và test 2 mạch này.Nhưng khi vừa cấp nguồn thì con LED RxD đã sáng....
Mong các anh giúp đở..Em chân thành cảm ơn.

stupid11 21-05-2011 10:22 AM

Sao không anh em nào giúp mình thế nhỉ ?????

nhuythuy 21-05-2011 12:49 PM

Ở trên PC bạn thử làm theo mạch này xem (SN75176, SN75LBC184 có thể thay thế cho nhau)
http://users.skynet.be/DCI_Site/dcibus_e.html


Ở dưới vi điều khiển, bạn chỉ cần dùng SN75176 nối trực tiếp vào chân Rx và Tx của VĐK. Tuy nhiên bạn phải dùng thêm 1 chân nữa để điều khiển hướng truyền/nhận. Chân này nối với chân DE và RE của SN75176 (2 chân DE và RE nối với nhau và nối với chân điều khiển hướng truyền/nhận này)
Mỗi khi bạn muốn gửi ra bus, chân vi điều khiển nối với DE và RE phải set lên mức 1 (tham khảo datasheet DE tích cực cao, /RE tích cực thấp); sau mỗi khi gửi dữ liệu ra bus, bạn lại ngay lập tức đặt chân này về mức 0 để nó chờ nhận tín hiệu. Tất nhiên, khi khởi tạo trong hàm main, bạn phải đặt chân điều khiển này ở mức 0 để vi điều khiển có thể nhận dữ liệu

Túm lại:
1. Pin_DE_RE = 1;
2. SendData();
3. Pin_DE_RE = 0;

nhuythuy 21-05-2011 12:58 PM

Mình quên là trên PC, phải bổ xung lệnh điều khiển chân điều khiển Request to Send RTS (pin 7). Cách điều khiển chân này tương tự như điều khiển chân DE, /RE phá dưới VXL (nhưng nhớ là MAX232 có tác dụng đảo tín hiệu Negative của MAX232 tương ứng với + của SN75176 và ngược lại

stupid11 21-05-2011 01:06 PM

Trích:

Nguyên văn bởi nhuythuy (Post 45327)
Ở trên PC bạn thử làm theo mạch này xem (SN75176, SN75LBC184 có thể thay thế cho nhau)
http://users.skynet.be/DCI_Site/dcibus_e.html


Ở dưới vi điều khiển, bạn chỉ cần dùng SN75176 nối trực tiếp vào chân Rx và Tx của VĐK. Tuy nhiên bạn phải dùng thêm 1 chân nữa để điều khiển hướng truyền/nhận. Chân này nối với chân DE và RE của SN75176 (2 chân DE và RE nối với nhau và nối với chân điều khiển hướng truyền/nhận này)
Mỗi khi bạn muốn gửi ra bus, chân vi điều khiển nối với DE và RE phải set lên mức 1 (tham khảo datasheet DE tích cực cao, /RE tích cực thấp); sau mỗi khi gửi dữ liệu ra bus, bạn lại ngay lập tức đặt chân này về mức 0 để nó chờ nhận tín hiệu. Tất nhiên, khi khởi tạo trong hàm main, bạn phải đặt chân điều khiển này ở mức 0 để vi điều khiển có thể nhận dữ liệu

Túm lại:
1. Pin_DE_RE = 1;
2. SendData();
3. Pin_DE_RE = 0;

Cảm ơn bạn !
Việc điều khiển hướng IC driver 485 thì mình biết..nhưng quan trọng là trên PC việc đk bằng tín hiệu bắt tay thì mình không biết lập trình như thế nào hết (mới mò VB mà :D )..với lại có 1 vấn đề nữa làm sao để mình biết data đã đi hết mà đảo hướng IC driver đây.(cả trên PC lẫn VĐK luôn).nếu không thì data sẽ bị mất..hay phải quy định 1 khoảng delay,,.phải chăng là có 1 cờ kiểm tra nào đó mà mình ko biết..Nên mình muốn làm mạch tự động đổi hướng truyền nhận để dễ dàng cho việc lập trình hơn...
Mong các bạn giúp đỡ

nhuythuy 21-05-2011 09:18 PM

Bạn có thắc mắc rất hợp lý. Mình đã code phần mềm chạy với một số thiết bị "của Tây" chưa gặp hiện tượng như bạn đã nêu. Lý do theo mình có thể là:

- Phần mềm của mình viết là Modbus Master

- Khi master còn đang phát request, tức là trên bus đang còn có tín hiệu thì slave sẽ không thể phát tín hiệu.

- Khi Master đang còn phát yêu cầu (request), tức là slave chưa nhận hết request thì slave chưa thể hiểu request là gì mà trả lời, nên trên bus sẽ không thể có tín hiệu nào khác ngoài tín hiệu của master.

- Khi chưa nhận hết bản tin request (yêu cầu) từ master thì thiết bị (slave) nhận chưa thể biết phải làm gì, nên nó không gửi tín hiệu gì trên.

- Các slave khác khi chưa có request thì cũng sẽ không có respond, nên trên bus chỉ có tín hiệu request từ master

nhuythuy 21-05-2011 09:33 PM

Mình quên về cách code chân RTS. Đây là đoạn code trên Delphi bạn có thể thực hiện tương tự trên VB hay VC

mcComm.FlushInBuffer();
mcComm.RTS := False;
mcComm.RS485Mode := False;
mcComm.PutString(sRequest);
mcComm.RS485Mode := True;
mcComm.RTS := True;


Mình vừa mò lại bằng VB, có vẻ code như thế này

mcComm.RTSEnable = True
mcComm.Output = sRequest
mcComm.RTSEnable = False

stupid11 21-05-2011 09:49 PM

Cảm ơn bạn rất nhiều !!!
Mình hiểu giao thức Master-Slave này rồi...vậy ở trạm tớ (slave) mình sẽ qui định 1 khoảng delay vừa đủ để cho data truyền đi hết sau đó sẽ đảo hướng MAX485.Mình tính như sau cậu xem có hợp lý không nhé :
tốc độ baud=9600;thì 1s truyền được 1200 byte..frame truyền của mình gồm 10 byte vậy mình sẽ delay 1 khoảng là 8.3 ms (mình sẽ chọn 10ms cho an toàn)..như vậy sau 10ms mình sẽ đảo hướng truyền sang nhận...

nhuythuy 21-05-2011 10:16 PM

Theo mình ko cần delay.

Lý do là bên slave mà chưa gửi xong respond cho master thì master cũng chưa hiểu slave nói gì. Nên nó sẽ vẫn còn đợi cho đến khi nhận xong toàn bộ respond từ slave (vì sau khi nhận xong hết master mới tính được CRC và hiểu Slave gửi respond đúng hay không). Vậy là chỉ khi nào slave gửi xong respond thì master mới phân tích và hiểu được respond đó rồi sau đó nó mới tiếp tục gửi request cho slave khác hoặc chính slave đó

nhuythuy 21-05-2011 10:18 PM

Mình vừa gửi bạn cách tính CRC cho Modbus RTU trong thread bạn hỏi về CRC

stupid11 21-05-2011 10:27 PM

Hình như bạn vẫn chưa hiểu ý mình thì phải,
ví dụ như thế này nhé :
daohuong=1;
printf("abcdef");
daohuong=0;

Nếu bạn viết như vậy thì đảm bảo sẽ không truyền hết được data..vì khi bạn gửi 1 byte đi thì byte đo sẽ được đưa vào bộ đệm rồi CPU sẽ tự động đẩy đi..còn viết như trên thì data chưa được đẩy đi hết thì ta đã đảo hưởng max485 như vậy data sẽ bị mất..nên theo mình phải viết :
daohuong=1;
printf("abcdef");
delay_ms(....); //thời gian này để đảm bảo data được đẩy đi hết....
daohuong=0;

Hay có thể mình hiểu sai lệnh printf()...
printf(.....)
lệnh a;
truyền data xong thì mới thực hiện lệnh a....

nhuythuy 21-05-2011 10:56 PM

Ý của bạn đúng đấy. Mình đã hiểu nhầm ý bạn.

Mình làm như vậy và chưa gặp lỗi bao h nên chủ quan. Có thể phải kiểm tra bộ đệm truyền sau đó mới reset bit điều khiển, như vây mới chắc được.

Ko biết các a e khác đã từng làm hoặc có chiêu gì chia sẻ với nhỉ

stupid11 21-05-2011 11:03 PM

Đúng đấy theo mình chắc phải kiểm tra cờ trong bộ đệm gửi..nếu đã rỗng thì mới đảo hướng IC driver..còn delay chỉ là giải pháp tình thế thôi :D

gửi "nhuythuy" :mình gửi tin nhắn vào trong hộp thư của cậu rồi đấy...hjjj

stupid11 21-05-2011 11:14 PM

Bạn thử xem mình vẽ cấu trúc mạng RS485 như vậy có được không.
Mình đang phân vân chỗ điện trở chặn đầu cuối..bạn xem qua rồi cho ý kiến nhé..

http://i1090.photobucket.com/albums/...mngRS485-1.jpg

nhuythuy 21-05-2011 11:25 PM

Theo mình, bạn không cần dây Ground chung chắc chắn vẫn OK. Mình đoán bạn đưa vào cho chắc :D. Ngoài ra, mình thấy cấu hình vậy là Ok rồi.

Về điện trở đầu cuối theo mình cũng vẫn OK, nếu khoảng cách ngắn ko cần vẫn chạy tốt (cty mình đang thử với khoảng 200 m, ko cần nó chạy vẫn ngon).
Good luck


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

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam