|
Tài trợ cho PIC Vietnam |
PIC - Thiết kế và Ứng dụng Ý tưởng cho các sản phẩm sử dụng PIC/dsPIC và các sản phẩm của Microchip |
|
Ðiều Chỉnh | Xếp Bài |
|
20-05-2011, 10:27 PM | #1 |
Đệ tử 6 túi
|
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... 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ó. 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. |
21-05-2011, 10:22 AM | #2 |
Đệ tử 6 túi
|
Sao không anh em nào giúp mình thế nhỉ ?????
|
21-05-2011, 12:49 PM | #3 |
Đệ tử 1 túi
Tham gia ngày: Aug 2008
Bài gửi: 12
: |
Ở 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; |
21-05-2011, 01:06 PM | #4 | |
Đệ tử 6 túi
|
Trích:
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à )..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 đỡ |
|
21-05-2011, 12:58 PM | #5 |
Đệ tử 1 túi
Tham gia ngày: Aug 2008
Bài gửi: 12
: |
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
|
21-05-2011, 09:18 PM | #6 |
Đệ tử 1 túi
Tham gia ngày: Aug 2008
Bài gửi: 12
: |
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 |
21-05-2011, 09:33 PM | #7 |
Đệ tử 1 túi
Tham gia ngày: Aug 2008
Bài gửi: 12
: |
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 |
21-05-2011, 09:49 PM | #8 |
Đệ tử 6 túi
|
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... |
21-05-2011, 10:16 PM | #9 |
Đệ tử 1 túi
Tham gia ngày: Aug 2008
Bài gửi: 12
: |
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 đó |
21-05-2011, 10:18 PM | #10 |
Đệ tử 1 túi
Tham gia ngày: Aug 2008
Bài gửi: 12
: |
Mình vừa gửi bạn cách tính CRC cho Modbus RTU trong thread bạn hỏi về CRC
|
21-05-2011, 10:27 PM | #11 |
Đệ tử 6 túi
|
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.... |
21-05-2011, 10:56 PM | #12 |
Đệ tử 1 túi
Tham gia ngày: Aug 2008
Bài gửi: 12
: |
Ý 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ỉ |
21-05-2011, 11:03 PM | #13 |
Đệ tử 6 túi
|
Đú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
gửi "nhuythuy" :mình gửi tin nhắn vào trong hộp thư của cậu rồi đấy...hjjj |
21-05-2011, 11:14 PM | #14 |
Đệ tử 6 túi
|
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é.. |
14-06-2012, 01:09 PM | #15 |
Nhập môn đệ tử
Tham gia ngày: May 2009
Bài gửi: 8
: |
help help me.cac huynh oi co ai biet con ic tc74a0-5.0 o cho nao ban khong minh kiem o cho nhat tao ma khong thay.chi cho minh voi hay ai co thi de lai cho minh voi. cam on moi nguoi truoc nhe !
|
Ðiều Chỉnh | |
Xếp Bài | |
|
|