Thông báo

Collapse
No announcement yet.

[UNI/O] Giao tiếp 1 dây (1-wire interface)

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

  • [UNI/O] Giao tiếp 1 dây (1-wire interface)

    Mình tình cờ biết được có giao thức truyền và điều khiển qua giao tiếp 1 dây, thấy có nhiều ứng dụng rất hữu ích vì nó có thể giảm chi phí và độ phức tạp khi thiết kế mạch. Đọc mãi datasheet của mấy con 1-wire và cả mấy bản hướng dẫn search mà không hiểu được làm sao có thể qui định ID cho từng con và các con slave tránh được xung đột trên đường truyền. Ai đã từng làm hay tìm hiểu về giao thức này, có thể cho xin chút chia sẻ được không ?

  • #2
    Ờ hơ, cuối cùng cũng hiểu sơ sơ vài vấn đề, hóa ra ID của mỗi con đc nhà sản xuất khắc sẵn trong chip,mình chỉ cần đọc và sử dụng giá trị đó là đc.
    Lúc đầu không hiểu rõ tưởng là chỉ 1 bus mà có thể định địa chỉ cho từng con trên một bus (cứ nghĩ mãi làm thế quái nào đc ?!)

    Mình tải file đã search đc lên, anh em ai có hứng thì tìm hiểu. Quả thật là code thì đầy, nhưng mà ko hiểu thì cũng chịu ! Giờ thì yên tâm rùi
    Attached Files

    Comment


    • #3
      Hic hic, hình như chẳng có ai có hứng thú tìm hiểu chuẩn này thì phải, cuối cùng sau mấy ngày lọ mọ vừa code vừa đọc vừa tra từ điển thì cũng ok rùi , ngủ phát đã

      Comment


      • #4
        1wire? chu de nay hay day, em cung dang nghien cuu, bi dinh debug rui nen nho ra tro. em lam DS18b20 +LCD. hay ra phet.
        Nguyễn Đức Tú
        ĐT: 0975636468
        Email:

        Comment


        • #5
          thanks thientaisodo nhé tài liệu của bác rất hay.hôm nào có tài liệu khác úp lên cho anh em tham khảo nhé.bác có tài liệu về Pic hay kg cho mình tham khảo với

          Comment


          • #6
            Nguyên văn bởi thientaisodo Xem bài viết
            Ờ hơ, cuối cùng cũng hiểu sơ sơ vài vấn đề, hóa ra ID của mỗi con đc nhà sản xuất khắc sẵn trong chip,mình chỉ cần đọc và sử dụng giá trị đó là đc.
            Lúc đầu không hiểu rõ tưởng là chỉ 1 bus mà có thể định địa chỉ cho từng con trên một bus (cứ nghĩ mãi làm thế quái nào đc ?!)

            Mình tải file đã search đc lên, anh em ai có hứng thì tìm hiểu. Quả thật là code thì đầy, nhưng mà ko hiểu thì cũng chịu ! Giờ thì yên tâm rùi

            Bạn có làm mạch đo nhiệt độ dùng ds1820 với 8951 chưa, Mình rất muốn làm cái này nhưng kien thức của mình cũng ít lắm, cũng chỉ biết chút xíu thôi, nếu bạn đã nghiên cứu và làm qua rồi, bất cứ mạch gì dùng chuẩn 1 wire này cũng được, xin hướng dẫn lại giứp mình,mình cảm ơn ban nhiều.

            Comment


            • #7
              thanks thientaisodo nhe !

              Comment


              • #8
                KHông biết các bạn đã làm được với con này chưa, mình có thư viện cho con này rồi, mình thấy con này hay phết, tuy đắt một chút nhưng mà nhạy, chính xác và khả năng mở rộng cao, gửi các bạn lib con này, khi cắm con này vào mạch, chỉ cần search rom của nó, ghi lại 8bytes địa chỉ và dùng hàm read_multi_temp(* địa chỉ rom) là nó trả về.
                Trong file đính kèm có cả thư việ lcd luôn, nhưng mà làm với pic, mình lâu lắm ko dùng 89 nên ko có, nếu bạn nào có thể dịch code c ra cho các con khác thì ok.
                good luck!
                Attached Files

                Comment


                • #9
                  Ngoài ra, còn có 1 số con dùng cho điều khiển 1 dây nữa, nghĩa là nếu dùng 1 bus 300 mét có thể điều khiển được khá nhiều thứ, ko nhớ tên con này, nhưng các bạn thứ search của bọn cùng họ với ds18b20 chắc là ra

                  Comment


                  • #10
                    Chào các bạn!
                    Mình mới vào chuyên ngành nên hơi bỡ ngỡ một chút. Mình đang tìm hiểu về giao thức onewire. Tình cờ đọc trong diễn đàn có bài biết về con DS18B20 này. Mình đọc code mà không hiểu lắm. Dưới đây là đoạn code của nó:
                    //chuong trinh con cho ds18b20
                    #include<reg8252.h>
                    #include<stdio.h>
                    sbit DQ = P2^0; // connect with DS1820 Data pin
                    void DelayMs(unsigned int count)
                    { // mSec Delay 11.0592 Mhz
                    unsigned int i; // Keil v7.5a
                    while(count) {
                    i = 115;
                    while(i>0) i--;
                    count--;
                    }
                    }
                    void DelayUs(int us)
                    {
                    int i;
                    for (i=0; i<us; i++);
                    }
                    // Reset DS1820
                    bit ResetDS1820(void)
                    {
                    bit presence;
                    DQ = 0; //pull DQ line low
                    DelayUs(29); // leave it low for about 490us
                    DQ = 1; // allow line to return high
                    DelayUs(3); // wait for presence 55 uS
                    presence = DQ; // get presence signal
                    DelayUs(25); // wait for end of timeslot 316 uS
                    return(presence); // presence signal returned
                    } // 0=presence, 1 = no part

                    // Read one bit from DS1820
                    bit ReadBit(void)
                    {
                    unsigned char i=0;
                    DQ = 0; // pull DQ low to start timeslot
                    DQ=1;
                    for (i=0; i<3; i++); // delay 17 us from start of timeslot
                    return(DQ); // return value of DQ line
                    }
                    // Write one bit to DS1820
                    void WriteBit(bit Dbit)
                    {
                    unsigned char i=0;
                    DQ=0;
                    DQ = Dbit ? 1:0;
                    DelayUs(5); // delay about 39 uS
                    DQ = 1;
                    }
                    // Read 1 byte from DS1820
                    unsigned char ReadByte(void)
                    {
                    unsigned char i;
                    unsigned char Din = 0;
                    for (i=0;i<8;i++)
                    {
                    Din|=ReadBit()? 0x01<<iin;
                    DelayUs(6);
                    }
                    return(Din);
                    }
                    // Write 1 byte
                    void WriteByte(unsigned char Dout)
                    {
                    unsigned char i;
                    for (i=0; i<8; i++) // writes byte, one bit at a time
                    {
                    WriteBit((bit)(Dout & 0x1)); // write bit in temp into
                    Dout = Dout >> 1;
                    }
                    DelayUs(5);
                    }
                    // Read temperature
                    void ReadTemp(unsigned char * buff)
                    {
                    unsigned char n;

                    EA=0; // disable all interrupt
                    ResetDS1820();
                    WriteByte(0xcc); // skip ROM
                    WriteByte(0x44); // perform temperature conversion
                    while (ReadByte()==0xff); // wait for conversion complete
                    ResetDS1820();
                    WriteByte(0xcc); // skip ROM
                    WriteByte(0xbe); // read the result

                    for (n=0; n<9; n++) // read 9 bytes but, use only one byte
                    {
                    buff[n]=ReadByte(); // read DS1820
                    }
                    EA=1;
                    }
                    Còn đây là chuơng trình chính
                    #include<reg8252.h>
                    #include<stdio.h>
                    #include<ds1820.h>

                    unsigned char MyTemp[9];

                    // Main program
                    void main(void)
                    {
                    unsigned char tp,tpd,i;
                    while(1)
                    {
                    ReadTemp(&MyTemp[0]);
                    tp = MyTemp[0] >> 1;
                    tpd = ((MyTemp[0] >> 1)&1) ? 5:0;
                    DelayMs(200);
                    }
                    }

                    Thắc mắc của mình là sau khi chạy chuơng trình, giả sử nhiệt độ đo được là 38 độ thì các biến tp và tpd có giá trị bằng bao nhiêu?
                    Cám ơn các bạn!

                    Comment


                    • #11
                      anh cho em xin số điện thoại của anh đc ko ạ?

                      Comment


                      • #12
                        Nguyên văn bởi techfirepro Xem bài viết
                        anh cho em xin số điện thoại của anh đc ko ạ?
                        mình đã làm được con này, cả trên mô phỏng protues và mạch testboard, nếu bạn muốn tìm hiểu thì mail cho mình .
                        poohnhonha@gmail.com

                        à, nói lun là mình dùng codevision, nên nó được hỗ trợ hàm gần như toàn bộ cho cảm biến này , nếu bạn cũng dùng chương trình này thì nên đọc kỹ phần HELP(F1) của ch trình, nó ghi rất dễ hiểu và cụ thể, nếu làm không được nữa thì mail cho mình những thắc mắc của bạn, mình sẽ giúp hết khả năng có thể

                        chúc bạn thành công!

                        Comment


                        • #13
                          bạn có code search ROM code của nó ko, có gì gửi mình với recca297@yahoo.com

                          Comment


                          • #14
                            Nguyên văn bởi thientaisodo Xem bài viết
                            Hic hic, hình như chẳng có ai có hứng thú tìm hiểu chuẩn này thì phải, cuối cùng sau mấy ngày lọ mọ vừa code vừa đọc vừa tra từ điển thì cũng ok rùi , ngủ phát đã
                            anh cho em hỏi với, em đang làm với đề tài là, dùng pic 16f887 làm master để nhận kết quả đo nhiệt độ của 2 slave (16f886)
                            bằng chuẩn giao tiếp modbus rtu trên rs485.
                            thì lúc mình đọc nhiệt độ DS18B20 ở slave thì có dùng giao tiếp ONE WIRE để truyền dữ liệu nhiệt độ về slave không anh nhỉ?

                            Comment

                            Về tác giả

                            Collapse

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

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

                            Collapse

                            Đang tải...
                            X