Thông báo

Collapse
No announcement yet.

Xin chỉ chỗ sai trong chương trình test giao tiếp máy tính qua r485

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • #31
    cái đó mình chưa đo, nhưng mình đã làm,và chạy tốt,dữ liệu truyền nhận đều ổn.
    mà mạch đó có thể không hoạt động được với tốc độ truyền cao cỡ vài M,bởi vì bạn còn phải xem tần số hoạt động tối đa của các linh kiện sử dụng.
    ví dụ max485 có fmax là 2.5M.
    nói chung là truyền nhận với tốc độ <M hoàn toàn ổn.
    hãy quý những j hiện tại mình đang có

    Comment


    • #32
      Nếu có dạng sóng để đo thì giải thích thật thấu đáo nhỉ ? Mình không giám nghi ngờ về phương pháp bởi thực tế mạch chạy tốt và truyền không sai dữ liệu thì chẳng thể nào phủ nhận nó là một phương pháp khả thi thực sự. Vậy là chỉ cần từ với hai cổng Not là có thể giải quyết được vấn đề điều khiển hướng truyền của 485. cả ở phía CP (master) và avr (slave).
      - Không biết bạn làm với bao nhiêu slave vậy ?

      Comment


      • #33
        Trong diễn đàn này thấy bác Hoctro89xxxx cũng có nói về mạch này và đã làm thành sản phẩm và chạy tốt.. mặc dù là dùng cổng not bằng CD4069 có độ trễ tín hiệu vào ra lớn hơn con 74LS004 mà vẫn oke thì ổn wa... Có một điều khó hơi khó hiểu là khi Tx truyền bit 1. thì 485 của mình cho phép nhận trong khi nó đang muốn truyền đi. Mình chưa giải thích được đoạn này có Mấy Mod ở nước ngoài cũng nói trong xuốt quá trình truyền thì pin_23 phải luôn ở mức cao.. nhưng cũng có thể họ chưa làm mạch kiểu này bao giờ . Theo trang web mà mình đọc được nói về chuẩn 485 cũng nói về phương pháp auto.. có một mạch kiểu này nhưng dùng 555 bạn có đánh giá gì về chất lượng 2 kiểu này không ?

        Comment


        • #34
          dúng rùi.đánh giá chất lượng thì mình ko dám,nhưng dùng cổng not hay dùng một transistor để điều khiển thì ko cần bận tâm đến các giá trị tụ,trở như dùng 555
          Mình làm mạng gồm 4 điểm,pc(master) +3 slave thôi,để phục vụ cho học tập mà.
          còn phần slave bạn dang nhận dữ liệu thì theo nguyên tắc nó chỉ họat động bán song công thôi nên ko thể vừa truyền vừa nhận dữ liệu cùng một lúc được.
          hãy quý những j hiện tại mình đang có

          Comment


          • #35
            Nếu bạn đã làm tốt phần này thì rất mong được bạn giúp đỡ ! bạn có thể cho mình đc mail kô ? nếu có gặp bí thì mình xin hỏi vậy !

            Comment


            • #36
              ok.có j bạn cứ hỏi.mình trả lời dc thì mình nói,nếu ko có rất nhiều cao thủ về lĩnh vực này đó.
              bạn có dung chế độ đa xử lý hay ko vậy.bạn nên dùng chế độ này vì khi truyền nhận nhiều thì các slave # sẽ mấy thời gian xử lý dữ liệu ko phải truyền cho nó.
              hãy quý những j hiện tại mình đang có

              Comment


              • #37
                Bạn có thể nói rõ hơn về chế độ này và cách thiết lập : Bởi như mình hình dung định làm thì vd CP truyền frame : địa chỉ slave + địa chỉ thiết bị + lệnh yêu cầu +lỗi ( như vậy chẳng hạn thì tất cả các slave đều mất thời gian thu frame này rồi mới so sánh với địa chỉ có khớp với nó kô thì đúng là mất thời gian vô ích.

                Comment


                • #38
                  khung truyền thì tự do mình định thôi.
                  ví dụ như một khung truyền gồm 4 byte.
                  byte1 là địa chỉ của cần truyền tới.byte2 là mã lệnh,byte3 là nội dung,byte4 là byte kiểm tra lỗi(ví dụ CRC).
                  khi bạn lựa chọn chế độ đa xử lý(9 bit),bits thứ 9 bạn set lên 1(đối với byte address) còn các byte ko fai là địa chỉ thì có bít thứ 9 là 0.
                  khi các điểm mạng nhận được byte address thì nó kiểm tra xem có fai địa chỉ của minh ko?nếu đúng thì nhận tiếp các byte sau(đủ một khung).
                  còn nếu không phải địa chỉ của mình thì nó bỏ qua tất cả các byte sau,chỉ nhận byte địa chỉ của khung truyền tiếp theo và kiểm tra như trên.như vậy các node mạng khong được gọi sẽ không mất thời gian xử lý các byte không fai gửi cho mình (cụ thể ở dây là các byte dữ liệu).
                  hãy quý những j hiện tại mình đang có

                  Comment


                  • #39
                    Uhm đêm wa không ngủ làm cái coverter 232 - 485 và một cái slave dạng auto direction và plug and play liền . Mình cho truyền nhận đúng như bạn nói không sai một kí tự nào rất tốt. mặc dù mình chơi thạch anh 16Mhz. (error 9600 0.2%).

                    giờ mình mới bắt đầu viết test thử để làm thêm các slave khác và ngoại vi hoàn chỉnh ..

                    - Để kiểm tra địa chỉ khi master gửi xuống mình thử làm một cái đơn giản thế này nhé (nếu cp gửi A thì sẽ on một con led ( katot nối với PORTC.5). Nếu gửi B thì sẽ off nó đi.
                    +) Khi mình test với một vài dòng code kiểu này thì nó chạy rất oke :
                    Code:
                    while(rx_counter >0 )          
                        {   
                        
                     //     putchar(getchar());    
                      //    }   
                    //  switch( getchar())
                    //      {
                          if('A'== getchar())
                     //    case 'A' :
                          PORTC.5 = 0;    // sáng led
                         // delay_ms(100);   
                         if('B'== getchar())
                      //    case 'B' :
                          PORTC.5 = 1;  // tắt led
                          //delay_ms(100);    
                    //      default :
                          ;
                          }
                    +) Tiếp đó mình không mún dùng dạng if để kiểm tra mà dùng switch case thì kết quả tệ chắc sai rùi mà mình chưa nhìn ra . Bạn chỉ xem sai chỗ nào nhé... ( Khi mình gửi các kí tự thường (kô phải kí tự viết hoa (thì led luôn sáng vì mặc định ban đầu khởi tạo là ở mức thấp mà nên sẽ cấp đất cho led . Vcc thì lun được cấp cố định vào anot rùi). Tiếp theo khi mình gửi A hoặc B thì led lập tức tắt lun và cho dù mình có gửi kí tự gì xuống nó cũng không sáng lại .
                    đoạn code như thế này :
                    Code:
                    while(rx_counter >0 )          
                        {   
                        
                     //     putchar(getchar());    
                      //    }   
                     switch( getchar())
                    //      {
                    //      if('A'== getchar())
                        case 'A' :
                          PORTC.5 = 0; // on led
                         // delay_ms(100);   
                     //    if('B'== getchar())
                          case 'B' :
                          PORTC.5 = 1; // off led
                          //delay_ms(100);    
                          default :
                          ;
                          }
                    ??

                    Comment


                    • #40
                      what ! binh lun

                      Comment


                      • #41
                        Thiếu cái break òi !

                        Comment


                        • #42
                          U ! với 2 code trên mình thấy code viết với swich cho độ ổn định tốt hơn hẳn.
                          vì code viết với if ở trên nhiều lúc mình phải click 2 lần thì nó mới sáng hoặc tối. ??
                          còn với code viết bằng switch thì click 10 cái đc lun 10 ..

                          Comment


                          • #43
                            Nguyên văn bởi newbie_avr Xem bài viết
                            Uhm đêm wa không ngủ làm cái coverter 232 - 485 và một cái slave dạng auto direction và plug and play liền . Mình cho truyền nhận đúng như bạn nói không sai một kí tự nào rất tốt. mặc dù mình chơi thạch anh 16Mhz. (error 9600 0.2%).

                            giờ mình mới bắt đầu viết test thử để làm thêm các slave khác và ngoại vi hoàn chỉnh ..

                            - Để kiểm tra địa chỉ khi master gửi xuống mình thử làm một cái đơn giản thế này nhé (nếu cp gửi A thì sẽ on một con led ( katot nối với PORTC.5). Nếu gửi B thì sẽ off nó đi.
                            +) Khi mình test với một vài dòng code kiểu này thì nó chạy rất oke :
                            Code:
                            while(rx_counter >0 )          
                                {   
                                
                             //     putchar(getchar());    
                              //    }   
                            //  switch( getchar())
                            //      {
                                  if('A'== getchar())
                             //    case 'A' :
                                  PORTC.5 = 0;    // sáng led
                                 // delay_ms(100);   
                                 if('B'== getchar())
                              //    case 'B' :
                                  PORTC.5 = 1;  // tắt led
                                  //delay_ms(100);    
                            //      default :
                                  ;
                                  }
                            +) Tiếp đó mình không mún dùng dạng if để kiểm tra mà dùng switch case thì kết quả tệ chắc sai rùi mà mình chưa nhìn ra . Bạn chỉ xem sai chỗ nào nhé... ( Khi mình gửi các kí tự thường (kô phải kí tự viết hoa (thì led luôn sáng vì mặc định ban đầu khởi tạo là ở mức thấp mà nên sẽ cấp đất cho led . Vcc thì lun được cấp cố định vào anot rùi). Tiếp theo khi mình gửi A hoặc B thì led lập tức tắt lun và cho dù mình có gửi kí tự gì xuống nó cũng không sáng lại .
                            đoạn code như thế này :
                            Code:
                            while(rx_counter >0 )          
                                {   
                                
                             //     putchar(getchar());    
                              //    }   
                             switch( getchar())
                            //      {
                            //      if('A'== getchar())
                                case 'A' :
                                  PORTC.5 = 0; // on led
                                 // delay_ms(100);   
                             //    if('B'== getchar())
                                  case 'B' :
                                  PORTC.5 = 1; // off led
                                  //delay_ms(100);    
                                  default :
                                  ;
                                  }
                            ??
                            2 đoạn code có lỗi hết.
                            đoạn trên thì bạn bị ở chỗ hàm getchar();
                            hàm này sẽ lấy data ra khỏi bộ đệm, vì vậy , với đoạn code này, mỗi một giá trị mà bạn gửi xuống thì nó chỉ được kiểm tra một lần thôi, cho dù nó đúng hay ko đúng thì cũng bị xóa,bạn nên sửa lại thế này.
                            Code:
                            unsigned char temp;
                            
                            while(rx_counter >0 )          
                                {   
                               temp=getchar(); 
                             
                                  if(temp=='A')
                                  PORTC.5 = 0;    // sáng led
                                   if(temp=='B')
                                  PORTC.5 = 1;  // tắt led
                                    }
                            đoạn code dưới thì thiếu break() nên khi mới khởi động thì nó sẽ sáng, sau đó nếu bạn gửi A thì nó sẽ chạy một mạch từ trễn xuống dưới.. nên sẽ tắt led, nếu gửi B thì nó sẽ nhảy đến dòng tắt led.. và led cũng bị tắt, kết quả là dù bạn gửi A hay B j thì led cũng tắt và ko thể bật lại, trừ khi bạn reset.

                            Comment


                            • #44
                              Nguyên văn bởi newbie_avr Xem bài viết
                              Trong diễn đàn này thấy bác Hoctro89xxxx cũng có nói về mạch này và đã làm thành sản phẩm và chạy tốt.. mặc dù là dùng cổng not bằng CD4069 có độ trễ tín hiệu vào ra lớn hơn con 74LS004 mà vẫn oke thì ổn wa... Có một điều khó hơi khó hiểu là khi Tx truyền bit 1. thì 485 của mình cho phép nhận trong khi nó đang muốn truyền đi. Mình chưa giải thích được đoạn này có Mấy Mod ở nước ngoài cũng nói trong xuốt quá trình truyền thì pin_23 phải luôn ở mức cao.. nhưng cũng có thể họ chưa làm mạch kiểu này bao giờ . Theo trang web mà mình đọc được nói về chuẩn 485 cũng nói về phương pháp auto.. có một mạch kiểu này nhưng dùng 555 bạn có đánh giá gì về chất lượng 2 kiểu này không ?
                              về độ trễ tín hiệu thì với giao tiếp rs này ko có vấn đề j đâu, chắc bạn dùng cao lắm là vài chục k.
                              vấn đề cần giải quyết ở đây là làm sao khi bên truyền có bit 0 thì bên nhận là bit 0, khi truyền là bit 1 thì bên nhận cũng là bit 1, ko cần biết là truyền trực tiếp hay gián tiếp.
                              bạn coi kĩ trong chỗ Function Tables DS75176B Receiving
                              nếu chân RE =0 thì ngõ ra RO sẽ là 1 khi trên đường truyền là mức 1 hay được thả lỏng(ko có tín hiệu) nó chỉ về mức 0 khi mà trên đường truyền có tín hiệu mức 0,
                              do đó cách giải quyết là ta sẽ truyền bit 0 lên đường truyền và bit 1 thì bỏ nó đi, thả lỏng đường truyền thay vì đưa nó lên mức tín hiệu 1. đây được xem như là cách gián tiếp để truyền data 1 từ bên này sang bên kia.
                              dựa vào bảng
                              Function Tables
                              DS75176B Transmitting
                              bạn sẽ chọn được 2 trạng thái ở giữa.. khi nối cổng not vào giữa DE và DI thì khi DI=0 thì đường truyền =0, ngược lại, khi DI=1 thì đường truyền sẽ được thả lỏng,
                              như vậy là đã giải quyết được vấn đề rồi.

                              đây là phương pháp truyền data đi mà ko cần ràng buộc về chân 2,3 khi truyền, còn nếu bạn muốn chắc chắn rằng data luôn được truyền đi khi truyền, nghĩa là chân 2,3 luôn ở mức cao thì dùng con 555, làm mạch trễ, nó sẽ tạo trễ trong thời gian bạn truyền một byte đi, lúc này bạn phải tính tốc độ truyền và suy ra thời gian này để tính toán các linh kiện cho mạch 555.

                              Comment


                              • #45
                                newbie_avr làm đến đâu rồi mình cũng đang làm một mạch tương tự như newbie_avr. Mình dùng PC làm master và atmega8 cho 2 slaver. Mạch chuyển đổi thì mình dùng 555 và 75176 nói chung phần cứng mình làm xong rồi, mình cũng đã test thử nhưng chỉ truyền nhận giữa 1 slaver và PC thôi thì chạy ok còn bây giờ thêm 1 slaver nữa thì mình chwa làm đc .Mình cũng chỉ mới bắt đầu tìm hiểu về Avr thôi nên lập trình còn kém lắm mong newbie_avr và các bạn chỉ giáo

                                Comment

                                Về tác giả

                                Collapse

                                newbie_avr Tìm hiểu thêm về newbie_avr

                                Bài viết mới nhất

                                Collapse

                                Đang tải...
                                X