![]() |
dsPIC30F4011 RS232 RS485 nhờ mọi người giúp!!!
1 Attachment(s)
Kính gửi anh Nam và các bạn,
Em dùng dsPIC30F4011 và dsPIC2010 giao tiếp RS485. dsPIC30F4011 vừa giao tiếp RS485 vừa giao tiếp RS232 với PC. _ Tình trạng lỗi như sau: + với dsPIC30F4011 nếu dùng kết nối RS485 thì tín hiệu truyền từ PIC lên chập chờn, lúc được lúc không lúc thì nhiễu loạn, nếu sờ tay vào dây nối giữa dsPIC và Max485 thì nhiễu càng nhiều. Toàn nhận được các ký tư <0> và các số ngẫu nhiên đủ thứ. Với RS232 thì chạy tốt, khi sờ tay vào dây nối giữa dsPIC và RS232 thì không xuất hiện các giá trị trên. + Đối với dsPIC30F2010 thì làm việc tốt cả với RS232 và RS485. Dưới đây là Schematic và code em sửa từ Tutorial của anh Nam. Mong rằng các bạn đã gặp tình huống này thì chia sẻ kinh nghiệm xử lý cho mình và mọi người cùng biết. Xin cảm ơn và chào đoàn kết. |
Trước hết, cần nối các chân AVDD và AVSS vào những điện thế thích hợp. Ngay cả khi chúng ta không dùng module ADC, vẫn cần phải nối những chân này đến nguồn. Đơn giản vì chúng ta không biết cấu trúc bên trong của dsPIC như thế nào, nên không thể khẳng định rằng thả nổi hai chân này sẽ không gây ảnh hưởng gì đến các module lân cận nó.
Và các cặp chân nguồn luôn luôn cần tụ bypass (decoupling) để đảm bảo hoạt động ổn định, thường dùng tụ gốm/kẹo (ceramic) 100 nF (104) cho mục đích này. Thân, |
Chào anh Nam và các bạn,
Em đã cắm tụ mà vẫn không xử lý được hiện tượng trên, em dùng điện trở 10K treo chân Tx của dsPIC lên nguồn thì thấy không còn tình trạng trên, nhưng lại sinh một tình trạng mới khi viết code truyền. Đoạn code em viết như sau: Code:
#include <p30f4011.h> Khi có 2 dòng lệnh này thì cả hai dòng dưới cũng được thực hiện. Dữ liệu truyền không còn bị nhiễu như trước. Mong anh và mọi người trợ giúp!!! Chúc mọi người một ngày mới tốt đẹp! namqn: bạn chú thích thẳng dòng 71 và 72 là những dòng nào trong code. |
Bạn chú thích thẳng vào code đã post vị trí hai dòng đó, vì copy code đã post vào trình soạn thảo cho thấy dòng 71 chỉ có chú thích chứ không chứa lệnh.
Thân, |
Xin lỗi anh vì em copy thiếu phần title của chương trình!
Dạ, nó nằm trong vòng lặp While() thứ 2 của hàm Main(), đó là 2 dòng lệnh này anh ạ: Code:
//U1TXREG = gRec[1]; //Neu bo dong nay Em vẫn chưa tìm ra được nguyên nhân. |
Theo sơ đồ phần cứng của bạn, chân PWM1L/RE0 điều khiển chiều truyền/nhận của MAX485. Và trong code hiện tại không có lệnh thao tác trạng thái của chân này. Như vậy trạng thái của các chân DE và /RE (đã nối vào nhau) của MAX485 là không xác định trước, và dễ bị nhiễu nếu chân RE0 là ngõ vào, vì chỉ được treo bởi một điện trở 10 k lên 5 V.
Thân, |
Dạ em đã sửa lại code.
Em thử nhiều lần thì phát hiện rằng: trong vòng lặp While() thứ 2 của hàm Main() nếu số lần truyền là số chẵn thì không bị mất dữ liệu, còn nếu số lần truyền là số lẻ thì sẽ mất ký tự cuối cùng, không biết điều này có liên quan gì đến việc cấu hình không vậy anh? Code:
#include <p30f4011.h> Chương trình xử lý ngắt có sai không anh? |
À, bạn chưa cho biết đang thử nghiệm theo kiểu nào? Bạn đang gửi trả những gì nhận được từ dsPIC về nó hay sao?
Thân, |
Hiện tại em dùng PC (có RS232-RS485 converter) để thử nghiệm việc truyền nhận.
Em nhận các ký tự truyền từ PC xuống dsPIC và dsPIC truyền trả lại PC những ký tự nó đã nhận được. Và em đã tìm ra lỗi: Nguyên nhân do em không có khoảng delay sau khi truyền có lẽ MAX485 chưa truyền xong em đã nâng DE/RE lên 1 nên mất ký tự cuối cùng. Nhưng em không hiểu sao khi mình truyền 2, 4, 6. ký tự thì lại không bị mất và mình nên delay khoảng bao lâu là tốt nhất vậy anh? |
Trích:
MAX485 chỉ chuyển mức tín hiệu từ RS-232 (so với 0 V) thành RS485 (vi sai) thôi, nhưng dsPIC cần điều khiển các chân DE và /RE một cách thích hợp. Về code ở trên, có thể giải thích những gì đang diễn ra như sau: Vì các bit <7:6> của thanh ghi U1STA bằng '00', mỗi ký tự nhận được tại UART1 của dsPIC sẽ tạo 1 ngắt, do đó vòng lặp while () trong code xử lý ngắt chẳng có tác dụng gì ngoài việc chỉ đọc ký tự đó vào bộ đệm nhận rồi trở về, sau khi bật cờ gFlag_1. Khi đó vòng lặp chính trong main() có thể phát hiện ra đã thu được một ký tự và dsPIC bắt đầu phát một loạt ký tự về PC, việc phát là ổn vì code kiểm tra trạng thái của bộ đệm phát, và chỉ thoát khỏi vòng lặp kiểm tra khi đã phát xong ký tự. Phía PC thu được như thế nào lại là chuyện khác. Trong quá trình dsPIC đang phát loạt ký tự về PC, nếu PC cũng phát tiếp một ký tự nữa thì không rõ chuyện gì sẽ xảy ra, vì không rõ hành vi của bộ chuyển đổi RS-232/RS-485 bên phía PC. Câu hỏi của bạn về truyền 2, 4, 6 ký tự lại không bị mất là không rõ ràng, vì không rõ dsPIC phát hay PC phát? Ở đây thực chất có 2 kênh truyền nhưng chỉ có một đường truyền, do đó cần xác định rõ ràng. Khi dsPIC phát và PC thu, dsPIC có thể đặt trạng thái cho MAX485 nối vào nó để làm việc đó. Khi PC phát và dsPIC thu, thông thường dsPIC không biết lúc nào sẽ xảy ra việc truyền thông, nên nó thường phải đặt trạng thái cho MAX485 nối vào nó ở chế độ thu. Tuy nhiên, như đã nêu ở trên, vẫn có khả năng PC thử phát 1 ký tự vào đường truyền đang được dùng để phát từ dsPIC về PC. Hành vi của phía chủ động phát là PC đến lúc này vẫn chưa rõ. Thân, |
Dạ, vì em đang thử nghiệm xem UART hoạt động thế nào nên em cho PC chỉ truyền 1 ký tự để dsPIC xảy ra ngắt trên UART1. Khi dsPIC nhận được ký tự thì dsPIC truyền ngược lại nhiều ký tự cho PC (trong code em truyền 6 ký tự), số kỵ tự này là lẻ thì PC không nhận được ký tự cuối cùng anh ạ.
Em cảm ơn anh! |
Phía PC bạn dùng công cụ gì để theo dõi việc truyền nhận? Dựa vào đâu bạn khẳng định khi phát loạt 6 ký tự từ dsPIC thì 2 ký tự sau cùng đều là 0 (lý do của câu hỏi này là các ký tự có mã ASCII < 0x20 đều thuộc loại không thể hiển thị được, vì chúng là các mã điều khiển)?
Nếu bạn dùng dsPIC phát liền một mạch các loạt ký tự với độ dài của loạt ký tự khác nhau thì sao (cứ thử phát 3, 4, 5, 6, ... ký tự liên tiếp thì kết quả thế nào)? Thân, |
Dạ, em sử dụng Terminal V1.9b. Em nhận dữ liệu dạng Hex nên chắc chắn là giá trị 0 anh ạ. Trong 6 giá trị em truyền thì 2 giá trị cuối là các giá trị nhận được từ PC.
Nếu em không nhận dữ liệu từ PC mà tự cho dsPIC phát thì không vấn đề gì anh ạ, vì lúc đó nối thẳng DE/RE lên 5V. em đợi tin Anh! |
Trích:
Thân, |
Vâng em sẽ báo cáo kết quả với anh.
Còn một việc nữa mà em vẫn băn khoăn là chân Tx. Hôm trước nó có hiện tượng nhiễu giống như bị bỏ lửng, em treo một điện trở 10K lên 5V thì nó không bị nhiễu nữa nhưng em thấy làm thế không đúng vì bình thường chân Tx đâu có ai treo lên như vậy. Mong anh và mọi người chỉ bảo Em cảm ơn anh! |
Múi giờ GMT. Hiện tại là 04:55 PM. |
Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam