Thông báo

Collapse
No announcement yet.

hothothot Tạo đường truyền BUS giữa 4 atmega 16

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

  • #16
    Nguyên văn bởi leemjnhwuong Xem bài viết
    cho e hỏi các pác về kịch bản truyền nhận của master và slave như thế nào để khỏi có sự xung đột đường truyền bus? ví dụ để tránh 2 con slave hoặc 1 con slave và 1 con master cùng truyền 1 lúc.
    Master gửi lệnh yêu cầu Slave gửi dữ liệu về và Slave nhận được ID trùng với của mình thì nhận lệnh CMD rồi gửi dữ liệu về master.
    Tức là con Slave nào nhận được yêu cầu mới gửi dữ liệu. Còn không thì không gửi. Như vậy mới tránh xung đột đường truyền.
    n
    ĐT: 0986 492 489

    Tham khảo:

    Comment


    • #17
      cảm ơn pác minhhiếu nhiều.
      em xin hỏi thêm, ở đây e xem 1 con slave như 1 trạm làm việc, nếu làm như pác thì nghĩa là con master lần lượt CMD cho từng con slave đúng không, cứ như vậy xoay vòng để nhận dữ liệu từ các trạm gởi về, nếu e làm nhiều trạm cùng 1 lúc thì hiệu quả công việc sẽ không cao, vì trạm có tín hiệu cần truyền thì chưa nhận lệnh, còn trạm không có tín hiệu để truyền lại được nhận lệnh.
      em xin đưa ra 1 kịch bản như thế này các pác nghĩ xem:
      1.trong lúc master truyền dữ liệu thì các slave không được truyền (vì master ưu tiên cao nhất)
      2.khi slave muốn truyền thì phải kiểm tra đường truyền xem đường truyền co "rảnh" không,
      _ nếu không thì đợi 1 thời gian kiểm tra lại
      _ nếu "rảnh" thì truyền cho master

      mong các pác giúp, cảm ơn!

      Comment


      • #18
        đây là kịch bản mà em đã soạn hai anh xem và cho em í kiến nha.theo em thì số lượng bye start dùng càng nhiều thì càng tránh tình trạng mất và nhận sai dữ liệu ví dụ là nếu ta truyền 3 kí tự @ liên tiếp để làm start cho 1 frame mới,sau đó kiểm tra nếu nhận 3 ký tự @ liên tiếp thì sẽ là bắt đầu 1 frame mới.kinh nghiệm em rất non mong các bác chỉ giáo thêm em dùng chuẩn RS232
        http://www.mediafire.com/file/wow2cnq24gx/bus.rar
        Last edited by thanh48ctu; 05-11-2009, 22:54.

        Comment


        • #19
          Túm lại các bạn chả chịu tìm tài liệu đọc gì cả. Cứ đi mò mẫm những thứ mà hãng modicon đã viết thành sách và chỉ bảo rất cụ thể. Mất nhiều thời gian lắm.

          Comment


          • #20
            Để truyền nhiều con với nhau với đường truyền 232 hay 485 không đáp ứng kịp về mặt thời gian đâu. Cách này chỉ áp dụng với mạng < 32 thiết bị chủ tớ thôi. Muốn nhanh có thể dùng Ethernet, SPI, CAN... Vì bài toán chỉ cần 4 con thì cách này là phù hợp, Về Header cũng không đáng ngại đâu. Chỉ cần 2 đến 3 byte là đủ rồi.
            n
            ĐT: 0986 492 489

            Tham khảo:

            Comment


            • #21
              Ờ đúng rồi, mất thời gian lắm! Nhưng nhiều khi mò mẫm, tự tìm hiểu cũng có cái hay và đến khi ra được vấn đề thì mới biết mình đang đi lại con đường của người khác đã làm. Tuy nhiên, nếu có tài liệu thì tốt quá, chúng ta nên đọc nó trước hết, để nắm được cái cơ bản, nền tảng; sau đó mà đủ trình thì muốn chế gì thì chế thôi.
              Bạn hungnp và cả bạn minhhieu có nhiều kinh nghiệm về cái này, có thể tổng hợp lại chúng được không! (như giới thiệu khái quá, các đường liên kết tìm tài liệu, một số vd mẫu đơn giản...). Chúng ta sẽ dần dần xây dựng 1 chủ để ổn định, đầy đủ. Như vậy các anh em sẽ đỡ biết bao nhiêu, đặc biệt là những người mới, không phải mò mẫm hoài, không phải sục sạo lại các chủ để cũ và lâu lâu lại đế thêm màn "hót" với "cun" nữa.
              !e

              Comment


              • #22
                Mình đã có ý định tạo một BOX trong AVR chuyên về các ví dụ bằng Code từ ví dụ cho người mới học đến cho đến nâng cao để tất cả mọi thành viên có ví dụ kèm comment post vào cho anh em mới học được dễ hiểu. BOX AVR hiện tại thấy viết tràn lan quá. Khổ cái thời gian để làm các ví dụ rất hạn hẹp. Công việc chiếm gần như hết thời gian. Bạn hungnp và nhiều bạn khác có nhiều kinh nghiệm xin hãy post nhiều bài cho anh em diễn đàn. Cảm ơn rất nhiều!
                n
                ĐT: 0986 492 489

                Tham khảo:

                Comment


                • #23
                  Mình nghĩ ở đây bạn minhhieu đưa ra giải pháp trên là tốt rồi. Ý tưởng của bạn minhhieu là phải tạo khung truyền để đồng bộ hóa việc truyền dữ liệu và đảm bảo vấn đề dữ liệu được truyền đúng đến nơi cần đến. Còn việc bạn định nghĩa khung truyền như thế nào sẽ ảnh hưởng đến xác suất thành công của việc truyền dữ liệu này. Theo kinh nghiệm của mình thì khung truyền (mình tạm gọi là package) sẽ bao gồm các thành phần sau:
                  1> Start package: đó là 1 hoặc một chuỗi các dữ liệu để đánh dấu việc bắt đầu của package. Tùy theo bạn định nghĩa cái này ra sao sẽ dẫn đến việc trùng lắp giữa dữ liệu nhiều hay ít. Ví dụ bạn định nghĩa: AA55h là start package thì khả năng trùng lắp ~ 1/64000
                  2> Package indicator: là phần dữ liệu điều khiển cho package. Chẳng hạn bạn muốn biết package này là data hay là command, hay là bất cứ thứ gì mà ban định nghĩa
                  3> Data: dữ liệu chính trong package
                  4> Checksum: phần kiểm tra checksum cho package. Khả năng kiểm tra lỗi tùy theo bạn định nghĩa checksum. Cái này người ta hay dùng CRC hoặc đơn giản hơn chỉ việc XOR tất cả các byte trong package
                  5> End package: giống như start package nhưng dùng để đánh dấu việc kết thúc của package. Trong thực tế đôi khi người ta bỏ qua phần này

                  Vấn đề là đối với từng ứng dụng chúng ta sẽ định nghĩa khung truyền như thế nào thôi. Mình ví dụ 1 khung truyền như sau:
                  1> Start package: AA55H (2 bytes)
                  2> Package indicator: 1 byte (= 0 là command và 1 là data)
                  3> Data: 4bytes (có thể là 4 bytes data hoặc 4 bytes opcode của command tùy thuộc vào giá trị ở trên)
                  4> Checksum: 1 bytes =XOR của 1 byte package indicator và 4 bytes data
                  5> End package: A5A5H

                  Còn về các chuẩn RS232/RS485 chỉ là chuẩn vật lý và khung truyền quy định ở mức sơ khai cho 1 byte data thôi.

                  Comment


                  • #24
                    @gltd: rất chuẩn và ko cần chỉnh

                    Comment


                    • #25
                      trong truyền thông em thấy hay đề cập đến vấn đề thời gian thực như trong công nghiệp PC hay dùng win98.
                      vậy trong truyền thông bus như của em khi truyền dữ liệu lên máy tình thì có cần "thời gian thực hay không"?
                      .nếu dùng thì dùng như nào? em bít có con RTC để tạo thời gian thực.

                      Em đọc tài liệu truyền bus họ khuyên nên lắp thêm 2 con trở ở cuối để dập tín hiệu bị phản xạ về.nếu dùng trở đầu cuối thì các xác định giá trị của trở như nào?

                      thanks các sư huynh rất nhiều.

                      Comment


                      • #26
                        Không có công thức tính nhưng họ khuyến cáo:
                        Với trở LT(Line Terminal) có giá trị khoảng 150Ohm.
                        Trở Pull up and Pull down có giá trị nằm trong khoảng 450-650Ohm.

                        Comment


                        • #27
                          Tôi xin viết tiếp.
                          Nếu ta muốn ra lệnh cho con Slave 1 gửi dữ liệu về Master ta sẽ làm như sau:
                          Ví dụ 2 byte Header là 0x45 và 0xDE, quy ước lệnh gửi dữ liệu trở lại CMD = 1, CMD = 2 là yêu cầu xử lý dữ liệu của Master ( ví dụ Master yêu cầu Slave cho nhấp nháy đèn led, máy tính nhận dữ liệu và hiển thị....) có thể thêm nữa tùy bạn. Ví dụ dữ liệu của chúng ta có 3 byte dùng để truyền giá trị đếm được từ slave....
                          Checksum sẽ được tính : Checksum = (CMD + ID + Byte Data1 + Byte Data2 + Byte Data3)%100.
                          Vậy khung truyền thông như sau: 0x45; 0xDE; 0x02; 0x01; 0x12; 0x13; 0x85, Checksum.
                          Truyền ra từ Master như sau:
                          putchar(0x45);
                          putchar(0xDE);
                          putchar(0x02); //lệnh xử lý dữ liệu...
                          putchar(0x01); //slave 1 nhận dữ liệu
                          putchar(0x01); // byte dữ liệu cao
                          putchar(0x12); //byte dữ liệu giữa
                          putchar(0x13); //byte dữ liệu thấp
                          putchar((unsigned char)Checksum);

                          đến đây đã truyền được dữ liệu ra đến slave.
                          Còn Slave sẽ nhận dữ liệu. Dựa vào ID trùng với của mình rồi mới cho phép nhận dữ liệu. Dựa vào lệnh tương ứng mà Slave làm việc.....
                          Cách nhận dễ thôi. Tôi để các bạn tự tìm hiểu cho thêm thú vị.
                          Với máy tính. Coi như là một slave . máy tính sẽ hiển thị hoặc đưa lệnh cho Master cũng tương tự như trên.
                          Chúc thành công!


                          cho hỏi minhhieu viết đoạn code trên thuộc chuẩn nào thế ASCII hay RTU

                          Comment


                          • #28
                            Nguyên văn bởi anhhungckcd Xem bài viết
                            Tôi xin viết tiếp.
                            Nếu ta muốn ra lệnh cho con Slave 1 gửi dữ liệu về Master ta sẽ làm như sau:
                            Ví dụ 2 byte Header là 0x45 và 0xDE, quy ước lệnh gửi dữ liệu trở lại CMD = 1, CMD = 2 là yêu cầu xử lý dữ liệu của Master ( ví dụ Master yêu cầu Slave cho nhấp nháy đèn led, máy tính nhận dữ liệu và hiển thị....) có thể thêm nữa tùy bạn. Ví dụ dữ liệu của chúng ta có 3 byte dùng để truyền giá trị đếm được từ slave....
                            Checksum sẽ được tính : Checksum = (CMD + ID + Byte Data1 + Byte Data2 + Byte Data3)%100.
                            Vậy khung truyền thông như sau: 0x45; 0xDE; 0x02; 0x01; 0x12; 0x13; 0x85, Checksum.
                            Truyền ra từ Master như sau:
                            putchar(0x45);
                            putchar(0xDE);
                            putchar(0x02); //lệnh xử lý dữ liệu...
                            putchar(0x01); //slave 1 nhận dữ liệu
                            putchar(0x01); // byte dữ liệu cao
                            putchar(0x12); //byte dữ liệu giữa
                            putchar(0x13); //byte dữ liệu thấp
                            putchar((unsigned char)Checksum);

                            đến đây đã truyền được dữ liệu ra đến slave.
                            Còn Slave sẽ nhận dữ liệu. Dựa vào ID trùng với của mình rồi mới cho phép nhận dữ liệu. Dựa vào lệnh tương ứng mà Slave làm việc.....
                            Cách nhận dễ thôi. Tôi để các bạn tự tìm hiểu cho thêm thú vị.
                            Với máy tính. Coi như là một slave . máy tính sẽ hiển thị hoặc đưa lệnh cho Master cũng tương tự như trên.
                            Chúc thành công!


                            cho hỏi minhhieu viết đoạn code trên thuộc chuẩn nào thế ASCII hay RTU
                            các Pro ơi giúp em với ! Trong Mega 128 em khởi động 2 USART0, USART1 cùng một lúc mà không được ? Bác nào có giải pháp gì giúp em với .Mục đích của em là muốn dùng cùng một lúc 2 USART để vừa có thể truyền lên mày tính đông thời cũng nhận tín hiệu từ các slave ( chắc là không được các Pro nhỉ Mega128 có phải là chíp đa nhiệm đâu nhỉ ? "em mong là mình sai ") Các pro nào có giải pháp gì mach em với

                            Comment


                            • #29
                              mình cũng đang học truyền thông giữa các at8...nhưng cũng không hiểu được nhiều lắm,may mà gặp cái này cũng hiểu thêm được một it...cảm ơn bạn
                              nhiều nha

                              Comment

                              Về tác giả

                              Collapse

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

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

                              Collapse

                              Đang tải...
                              X