Thông báo

Collapse
No announcement yet.

Hướng dẫn giúp mình về giao tiếp one-wire (với ds1820)

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

  • Hướng dẫn giúp mình về giao tiếp one-wire (với ds1820)

    Bác nào có thể post hướng dẫn về giao tiếp 1-dây được ko??? cụ thể là giao tiếp với ds1820. Mình cần 1 đoạn code mẫu (bằng asm) về giao tiếp này, thanks nhiều. Mình search nhiều trên net nhưng chỉ thấy nói ko à chứ ko có bài hướng dẫn cụ thể về loại giao tiếp này.

  • #2
    Nguyên văn bởi vodangks Xem bài viết
    Bác nào có thể post hướng dẫn về giao tiếp 1-dây được ko??? cụ thể là giao tiếp với ds1820. Mình cần 1 đoạn code mẫu (bằng asm) về giao tiếp này, thanks nhiều. Mình search nhiều trên net nhưng chỉ thấy nói ko à chứ ko có bài hướng dẫn cụ thể về loại giao tiếp này.
    mình chỉ có source C thôi
    Attached Files

    Comment


    • #3
      mình cũng k dành cái này lắm, nhưng có cái file pdf hay hay. bạn thử đọc xem. biết đâu nó giúp ích đc j đó.
      |

      Comment


      • #4
        lúc nãy quên chưa up file. sorry
        Attached Files
        |

        Comment


        • #5
          Mấy bạn nói rõ hơn 1 chút về giao tiếp 1 dây này dc ko, mình xem toàn tiếng Anh, chả hiểu mù gì
          À mà mình tìm dc 1 project dùng ds1820 nhưng code của nó lại có đuôi .a51 nên ko biết mở thế nào
          http://www.8051projects.info/proj.asp?ID=75

          Comment


          • #6
            Nguyên văn bởi tranpic Xem bài viết
            mình chỉ có source C thôi
            Bạn tranpic ơi cai file bạn up khi chạy file proteus thì nó báo lỗi gì ấy, liệu làm mạch thật bằng code ấy có được ko

            Comment


            • #7
              tui lượm được trên mạng đoạn code này các bạn tham khảo nhé. Không chắc đúng đâu. Tui nghiên cứu lại rồi post sau.
              ;; Dallas DS1820 multidrop routines using timer 0 in mode 3 for MCS51
              ;; External power for DS1820 assumed
              ;; Clock is 11.0592 MHz -> one cycle is 1.0850694 us
              ;; Copyright 1999, Leon Kos, University of Ljubljana
              ;; TODO: Initial check routines for external power on each device
              ;; $Id: ds1820.asm,v 1.2 2003/09/13 15:31:57 leon Exp $
              NAME DS1820

              APD BIT 0F8h ; P5.0 driving gate of the DMOS for
              READ BIT 0EFh ; P4.7 reading response from slaves

              ds1820_routines SEGMENT CODE
              T1_interrupt SEGMENT CODE
              ds1820rom SEGMENT CODE
              dowcrc SEGMENT CODE
              ds1820data SEGMENT DATA
              bitvar SEGMENT BIT


              public ds1820_init
              public _ds1820_start
              public touch_byte
              public convert_time
              public ds1820error
              public scratchpad
              public ds1820crc_ok
              public errornum
              public ds1820device

              CSEG AT 0001BH
              jmp timer1

              RSEG T1_interrupt

              timer1:
              push acc ; 2
              push psw ; 2
              push dpl ; 2
              push dph ; 2
              jnb bit_state, matchROM_loop

              bit_loop: ; bit writing/reading loop
              clr APD
              setb bit_state ; enable this state
              mov c, read_slot
              mov a, touch_byte
              rrc a
              mov touch_byte, a
              djnz bitcnt, touch_bit
              mov bitcnt, #9
              clr bit_state
              jmp exit_t1

              touch_bit:
              setb APD ; 1T
              nop ; 1T
              nop
              nop
              nop ; 1T
              cpl c ; 1T
              mov APD, c ; 1T
              nop
              nop
              nop
              nop
              nop
              nop
              nop
              mov c, READ
              mov read_slot, c
              mov TH0, #(0FFh - 30)
              pop dph ; 2
              pop dpl ; 2
              pop psw ; 2
              pop acc ; 2
              reti

              matchROM_loop:
              jnb matchROM_state, reset_state_loop
              mov a, loop ; test the loop counter
              clr C ; clear for one byte substraction
              subb a, #8 ; loop couner in incrementing
              jz _rom_end ; substract to match zero at end
              mov dptr, #rom_table; point to in CODE device table
              mov a, ds1820device ; which device
              rl a ; address
              rl a ; is multiple of
              rl a ; 8 offset
              add a, loop ; select byte from table
              movc a, @a+dptr
              mov touch_byte, a
              inc loop
              jmp bit_loop
              _rom_end:
              clr matchROM_state
              inc state
              jmp state_loop

              reset_state_loop:
              jnb reset_state, state_loop
              mov a, loop
              dec a
              jz _reset_end
              mov loop, a
              add a, #254
              jnz _rst0
              clr APD
              _rst0: jmp exit_t1

              _reset_end:
              clr reset_state
              inc state

              state_loop: ; Main state machine loop
              mov a, state ; must be in the middle
              mov dptr, #jump_table; of the code
              movc a, @a+dptr
              jmp @a+dptr

              jump_table:
              db reset0 - jump_table
              db match_rom0 - jump_table
              db convertT - jump_table
              db readbusy - jump_table
              db reset1 - jump_table
              db match_rom1 - jump_table
              db read_scratchpad - jump_table
              db temp_lsb - jump_table
              db temp_msb - jump_table
              db user_byte1 - jump_table
              db user_byte2 - jump_table
              db reserved1 - jump_table
              db reserved2 - jump_table
              db count_remain - jump_table
              db count_per_c - jump_table
              db crc - jump_table
              db stop - jump_table

              reset0:
              mov loop, #4
              setb reset_state
              mov TH0, #(255-200) ; first half of the reset time
              setb APD
              jmp exit_t1
              match_rom0:
              mov touch_byte, #55h
              mov loop, #0
              setb matchROM_state
              jmp bit_loop
              convertT:
              mov touch_byte, #44h
              inc state
              mov convert_time, #00h
              mov convert_time + 1, #00h
              jmp bit_loop

              readbusy: ; check every 280us
              inc convert_time + 1;
              mov a, convert_time + 1
              jnz _noinc
              inc convert_time
              mov a, #12h ; 12*72ms=860ms overrun
              anl a, convert_time
              jz _noinc
              setb ds1820error ; short circuit
              mov errornum, #1 ; to long zero resonse
              jmp end_t1
              _noinc: mov a, touch_byte
              mov touch_byte, #0FFh
              inc a
              jz converted
              jmp bit_loop
              converted:
              clr C
              inc state
              reset1:
              mov loop, #4
              setb reset_state
              mov TH0, #(255-200) ; first half of the reset time
              setb APD
              jmp exit_t1
              match_rom1:
              mov touch_byte, #55h
              mov loop, #0
              setb matchROM_state
              jmp bit_loop
              read_scratchpad:
              mov touch_byte, #0BEh
              inc state
              jmp bit_loop
              temp_lsb: ; larger but easy to fetch bytes
              mov touch_byte, #0FFh
              inc state
              jmp bit_loop
              temp_msb:
              mov scratchpad, touch_byte
              mov touch_byte, #0FFh
              inc state
              jmp bit_loop

              user_byte1:
              mov scratchpad + 1, touch_byte
              mov touch_byte, #0FFh
              inc state
              jmp bit_loop
              user_byte2:
              mov scratchpad + 2, touch_byte
              mov touch_byte, #0FFh
              inc state
              jmp bit_loop
              reserved1:
              mov scratchpad + 3, touch_byte
              mov touch_byte, #0FFh
              inc state
              jmp bit_loop
              reserved2:
              mov scratchpad + 4, touch_byte
              mov touch_byte, #0FFh
              inc state
              jmp bit_loop
              count_remain:
              mov scratchpad + 5, touch_byte
              mov touch_byte, #0FFh
              inc state
              jmp bit_loop
              count_per_c:
              mov scratchpad + 6, touch_byte
              mov touch_byte, #0FFh
              inc state
              jmp bit_loop
              crc:
              mov scratchpad + 7, touch_byte
              mov touch_byte, #0FFh
              inc state
              jmp bit_loop
              stop:
              mov scratchpad + 8, touch_byte
              end_t1:
              clr ET1 ; disable interrupt
              clr TR1 ; stop the timer
              mov state, #0 ; reset the machine state
              clr APD ; power the line
              exit_t1: ; exit from interrupt
              pop dph ; 2
              pop dpl ; 2
              pop psw ; 2
              pop acc ; 2
              reti

              RSEG ds1820_routines
              ds1820_init: ; initialize the variables
              mov bitcnt, #9 ; bit counter
              clr APD ; power the devices on line
              setb READ ; enable reading
              clr matchROM_state ; not sending match ROM to ds1820
              clr bit_state ; not in the bit delay state
              clr reset_state ; not in the reset state
              mov state, #0 ; clear machine state
              mov ds1820device,#0 ; default is reading device0
              anl TMOD, #0f0h ; timer 0
              orl TMOD, #03h ; in mode 3
              setb EA ; Enable interrupts
              ret

              _ds1820_start: ; R7 has the device number to read
              mov ds1820device,R7
              mov TH0,#0FAh
              clr ds1820error ; no error at beginning
              mov errornum, #0
              setb ET1
              setb TR1
              ret


              RSEG dowcrc
              ds1820crc_ok: ; extern bit ds1820crc_ok(void);
              mov loop, #9 ; 8+1 byte CRC
              mov ds1820crc, #0 ; clear CRC register
              mov dptr, #dowcrc_table
              mov r0, #scratchpad

              _crc:
              mov a, @r0 ; scratchad value
              xrl a, ds1820crc
              movc a, @a+dptr
              mov ds1820crc, a
              inc r0
              djnz loop, _crc
              jz _ok
              clr CY
              ret
              _ok: setb CY
              ret

              dowcrc_table: DB 0, 94, 188, 226, 97, 63, 221, 131
              DB 194, 156, 126, 32, 163, 253, 31, 65
              DB 157, 195, 33, 127, 252, 162, 64, 30
              DB 95, 1, 227, 189, 62, 96, 130, 220
              DB 35, 125, 159, 193, 66, 28, 254, 160
              DB 225, 191, 93, 3, 128, 222, 60, 98
              DB 190, 224, 2, 92, 223, 129, 99, 61
              DB 124, 34, 192, 158, 29, 67, 161, 255
              DB 70, 24, 250, 164, 39, 121, 155, 197
              DB 132, 218, 56, 102, 229, 187, 89, 7
              DB 219, 133, 103, 57, 186, 228, 6, 88
              DB 25, 71, 165, 251, 120, 38, 196, 154
              DB 101, 59, 217, 135, 4, 90, 184, 230
              DB 167, 249, 27, 69, 198, 152, 122, 36
              DB 248, 166, 68, 26, 153, 199, 37, 123
              DB 58, 100, 134, 216, 91, 5, 231, 185
              DB 140, 210, 48, 110, 237, 179, 81, 15
              DB 78, 16, 242, 172, 47, 113, 147, 205
              DB 17, 79, 173, 243, 112, 46, 204, 146
              DB 211, 141, 111, 49, 178, 236, 14, 80
              DB 175, 241, 19, 77, 206, 144, 114, 44
              DB 109, 51, 209, 143, 12, 82, 176, 238
              DB 50, 108, 142, 208, 83, 13, 239, 177
              DB 240, 174, 76, 18, 145, 207, 45, 115
              DB 202, 148, 118, 40, 171, 245, 23, 73
              DB 8, 86, 180, 234, 105, 55, 213, 139
              DB 87, 9, 235, 181, 54, 104, 138, 212
              DB 149, 203, 41, 119, 244, 170, 72, 22
              DB 233, 183, 85, 11, 136, 214, 52, 106
              DB 43, 117, 151, 201, 74, 20, 246, 168
              DB 116, 42, 200, 150, 21, 75, 169, 247
              DB 182, 232, 10, 84, 215, 137, 107, 53

              alternate_dowcrc: ; slower and thus not used
              mov ds1820crc, #0
              mov loop, #8 ; 8 bytes
              mov r0, #scratchpad

              _dcrc: mov a, @r0
              call do_crc
              inc r0
              djnz loop, _dcrc
              ret

              do_crc: push acc
              push b
              push acc
              mov b, #8
              crc_loop:
              xrl a, ds1820crc
              rrc a
              mov a, ds1820crc
              jnc zero
              xrl a, #18h
              zero: rrc a
              mov ds1820crc, a
              pop acc
              rr a
              push acc
              djnz b, crc_loop
              pop acc
              pop b
              pop acc
              ret

              RSEG ds1820data
              bitcnt: ds 1 ; bit couter
              touch_byte: ds 1 ; touch byte
              scratchpad: ds 9 ; DS1820 scratchpad
              convert_time: ds 2 ; time required for conversion
              state: ds 1 ; machine state
              loop: ds 1 ; shared byte for loops
              errornum: ds 1 ; error number
              ds1820device: ds 1 ; which device number 0,1,...
              ds1820crc: ds 1 ; DOW 8 bit CRC value

              RSEG bitvar
              read_slot: DBIT 1 ; read bit from ds1820
              bit_state: DBIT 1 ; delaying one bit state
              matchROM_state: DBIT 1 ; sending MATCH ROM state
              reset_state: DBIT 1 ; resetting the bus state
              ds1820error: DBIT 1 ; error getting temperature


              RSEG ds1820rom
              rom_table: ; avalable devices on the 1-wire net

              device0: DB 10h, 09Ah, 4Bh, 09h, 00h, 00h, 00h, 08Fh
              device1: DB 10h, 088h, 3Dh, 0Ch, 00h, 00h, 00h, 0CAh
              device2: DB 10h, 05Bh, 49h, 09h, 00h, 00h, 00h, 0A4h
              device3: DB 10h, 022h, 49h, 09h, 00h, 00h, 00h, 0AAh
              device4: DB 10h, 0DAh, 4Ah, 09h, 00h, 00h, 00h, 037h
              device5: DB 10h, 099h, 48h, 09h, 00h, 00h, 00h, 098h
              device6: DB 10h, 021h, 47h, 09h, 00h, 00h, 00h, 051h
              device7: DB 10h, 0EEh, 47h, 09h, 00h, 00h, 00h, 0EAh
              device8: DB 10h, 06Eh, 47h, 09h, 00h, 00h, 00h, 000h
              device9: DB 10h, 0D3h, 49h, 09h, 00h, 00h, 00h, 0EFh
              device10: DB 10h, 09Ah, 47h, 09h, 00h, 00h, 00h, 0AEh
              device11: DB 10h, 0B1h, 4Ah, 09h, 00h, 00h, 00h, 00Ch
              device12: DB 10h, 08Bh, 4Ah, 09h, 00h, 00h, 00h, 02Eh
              device13: DB 10h, 03Ch, 4Bh, 09h, 00h, 00h, 00h, 061h
              device14: DB 10h, 074h, 49h, 09h, 00h, 00h, 00h, 036h
              device15: DB 10h, 024h, 48h, 09h, 00h, 00h, 00h, 0D5h
              device16: DB 10h, 057h, 49h, 09h, 00h, 00h, 00h, 0D9h
              device17: DB 10h, 050h, 04h, 0B0h,90h, 00h, 00h, 0DFh


              END






              

              Comment


              • #8
                ko có code của C à bạn ơi, mình xem code asm chả hiểu gì cả

                Comment


                • #9
                  Nguyên văn bởi thangdt2 Xem bài viết
                  ko có code của C à bạn ơi, mình xem code asm chả hiểu gì cả
                  Hic, thế bạn bắt đầu học VXL bằng ngôn ngữ C luôn à? Có file ebook nào thì share với!

                  Comment


                  • #10
                    Cách giao tiếp với DS1820 có thể tóm tắt và hiểu nôm na như sau:
                    Việc đo nhiệt độ của DS1820 theo tôi được thực hiện theo từng phiên làm việc và mỗi phiên được ngăn cách với phiên làm việc trước bởi 1 tín hiệu reset và 1 presence pulse. Reset được xem như quá trình ngăn cách và khởi động lại quá trình đo nhiệt độ mới, presence pulse giống như tín hiệu báo hiệu cho 8051 biết là DS1820 đang có mặt và đã sẵn sàng. Ở đây mình thực hiện đo nhiệt độ và hiển thị đơn giản nhất với 1 con DS1820 thôi. Do đó có thể bỏ qua các phần : match ROM, search Rom, alarm search, hay read ROM… (các bạn có thể đọc thêm phần này trong datasheet và thực hiện nhưng với mạch chỉ đo nhiệt độ thôi thì không cần thiết…)
                    Reset: đặt chân data xuống mức thấp trong khoảng 480-960us (dùng 500us là ok)
                    Đặt chân data lên mức cao trong khoảng 15-60us
                    Presence pulse: sau khi cho chân đó lên mức cao tiếp tục chờ 60-240us để bắt tín hiệu mức thấp do DS1820 kéo xuống trong khoảng thời gian trên. Bắt được tín hiệu này tức là DS1820 sẵn sàng.
                    Skip ROM: skip ROM để khỏi mất thời gian match ROM … vì chỉ có 1 con thôi khi nào xài nhiều con trên 1 đường dây mới cần match, thực hiện bằng cách nhảy tới chương trình con write và ghi mã skip ROM (CCh) vào data line.
                    Write: clear dataline và delay trong 15us rồi mới đặt bit cần ghi lên và delay 15us nữa, giữa 2 bit cần ghi liên tiếp phải đặt data line lên mức cao trong 1us và tiếp tục ghi bit tiếp theo.
                    Gửi lệnh read scratchpad và đọc dữ liệu về 2 lần, lần đầu lấy byte thấp (chứa giá trị nhiệt độ lưu lại trong thanh ghi R3 lát nữa xử lý sau) lần sau lấy byte cao(chứa dấu của nhiệt độ nếu chỉ đo trong khoảng 0-125 độ thì không cần đọc byte này), sau đó đọc tiếp 7 lần nữa để địa chỉ đọc trở về ban đầu.
                    Read: clear data line trong 1us và đọc dữ liệu về trong vòng 15us giữa 2 lần đọc phải cách nhau <1us (lấy 2us là được) rồi lại đọc tiếp.
                    Convert T: trước khi conv phải reset trước, chờ presence rồi skip ROM, sau đó gửi convert command (44h).
                    Giờ là lúc xử lý thanh ghi R3 đã lưu giá trị nhiệt độ. Có nhiều cách xử lý các bạn hãy nghiên cứu khung dữ liệu của nó và xử lý theo cách riêng để tách giá trị ra. Sau đó chuyển giá trị thành mã BCD rồi xuất ra led hay LCD tùy ý.
                    Đó là toàn bộ các bước thực hiện giao tiếp với DS1820. Chúc các bạn thành công.

                    Comment


                    • #11
                      bác nào làm DS1820 rồi thì xem hộ em doạn code này em sai ở đâu mà không chay!

                      #include <sfr51.inc>
                      org 0000H
                      ljmp main
                      org 0040H
                      main:
                      lcall donhietdo
                      mov p3,r3
                      sjmp main

                      reset:
                      setb p3.0
                      mov R1,#4
                      loop1:mov R2,#40
                      loop2:
                      clr p3.0
                      djnz R2,loop2
                      djnz R1,loop1
                      lcall delay60us
                      ;doi presence pulse
                      lcall delay60us
                      lcall delay60us
                      lcall delay60us
                      lcall delay60us

                      ret

                      delay60us:
                      mov R1,#30
                      lop:djnz r1,lop
                      ret

                      delay15us:
                      mov R1,#7
                      lop2:djnz r1,lop2
                      ret

                      delay45us:
                      mov R1,#22
                      lop3:djnz r1,lop3
                      ret


                      ghi1:
                      setb p3.0
                      clr p3.0
                      ; ghi 1
                      lcall delay60us
                      ret

                      ghi0:
                      setb p3.0 ;
                      mov R1,#20
                      lop1:
                      clr p3.0 ; ghi 0
                      djnz r1,lop1
                      ret

                      skiprom:
                      lcall ghi1
                      lcall ghi1
                      lcall ghi0
                      lcall ghi0
                      lcall ghi1
                      lcall ghi1
                      lcall ghi0
                      lcall ghi0
                      ret

                      convertT:
                      lcall ghi0
                      lcall ghi1
                      lcall ghi0
                      lcall ghi0
                      lcall ghi0
                      lcall ghi1
                      lcall ghi0
                      lcall ghi0
                      ret

                      readscratchpad:
                      lcall ghi1
                      lcall ghi0
                      lcall ghi1
                      lcall ghi0
                      lcall ghi1
                      lcall ghi1
                      lcall ghi1
                      lcall ghi0
                      ret

                      readbit:

                      setb p3.0
                      clr p3.0
                      lcall delay15us
                      jb p3.0,g1
                      clr B.0
                      sjmp gb1
                      g1: setb B.0

                      gb1:
                      lcall delay45us
                      setb p3.0
                      clr p3.0
                      lcall delay15us
                      jb p3.0,g2
                      clr B.1
                      sjmp gb2
                      g2: setb B.1

                      gb2:
                      lcall delay45us
                      setb p3.0
                      clr p3.0
                      lcall delay15us
                      jb p3.0,g3
                      clr B.2
                      sjmp gb3
                      g3: setb B.2

                      gb3:
                      lcall delay45us
                      setb p3.0
                      clr p3.0
                      lcall delay15us
                      jb p3.0,g4
                      clr B.3
                      sjmp gb4
                      g4: setb B.3

                      gb4:
                      lcall delay45us
                      setb p3.0
                      clr p3.0
                      lcall delay15us
                      jb p3.0,g5
                      clr B.4
                      sjmp gb5
                      g5: setb B.4

                      gb5:
                      lcall delay45us
                      setb p3.0
                      clr p3.0
                      lcall delay15us
                      jb p3.0,g6
                      clr B.5
                      sjmp gb6
                      g6: setb B.5

                      gb6:
                      lcall delay45us
                      setb p3.0
                      clr p3.0
                      lcall delay15us
                      jb p3.0,g7
                      clr B.6
                      sjmp gb7
                      g7: setb B.6

                      gb7:
                      lcall delay45us
                      setb p3.0
                      clr p3.0
                      lcall delay15us
                      jb p3.0,g8
                      clr B.7
                      sjmp gb8
                      g8: setb B.7
                      gb8:
                      lcall delay45us
                      ret

                      donhietdo:
                      lcall reset
                      aa: jnb p3.0,aa
                      lcall skiprom
                      lcall convertT
                      lcall readbit
                      lcall reset
                      bb: jb p3.0,bb
                      lcall skiprom
                      lcall readbit
                      mov r3,B
                      mov r7,#8
                      doc8byte:
                      lcall readbit
                      djnz r7,doc8byte
                      lcall reset
                      aaa: jb p3.0,aaa
                      ret

                      end

                      Comment


                      • #12
                        donhietdo:
                        lcall reset
                        aa: jnb p3.0,aa
                        lcall skiprom
                        lcall convertT
                        lcall readbit
                        lcall reset
                        bb: jb p3.0,bb
                        lcall skiprom
                        lcall readbit
                        mov r3,B
                        mov r7,#8
                        doc8byte:
                        lcall readbit
                        djnz r7,doc8byte
                        lcall reset
                        aaa: jb p3.0,aaa
                        ret

                        sau lệnh mov r3,B em thêm lệnh mov p2,r3 để test xem co dọc dc gì không nhưng chả thấy đọc được cái gì cả!

                        Comment


                        • #13
                          Nguyên văn bởi vt04 Xem bài viết
                          Cách giao tiếp với DS1820 có thể tóm tắt và hiểu nôm na như sau:
                          Việc đo nhiệt độ của DS1820 theo tôi được thực hiện theo từng phiên làm việc và mỗi phiên được ngăn cách với phiên làm việc trước bởi 1 tín hiệu reset và 1 presence pulse. Reset được xem như quá trình ngăn cách và khởi động lại quá trình đo nhiệt độ mới, presence pulse giống như tín hiệu báo hiệu cho 8051 biết là DS1820 đang có mặt và đã sẵn sàng. Ở đây mình thực hiện đo nhiệt độ và hiển thị đơn giản nhất với 1 con DS1820 thôi. Do đó có thể bỏ qua các phần : match ROM, search Rom, alarm search, hay read ROM… (các bạn có thể đọc thêm phần này trong datasheet và thực hiện nhưng với mạch chỉ đo nhiệt độ thôi thì không cần thiết…)
                          Reset: đặt chân data xuống mức thấp trong khoảng 480-960us (dùng 500us là ok)
                          Đặt chân data lên mức cao trong khoảng 15-60us
                          Presence pulse: sau khi cho chân đó lên mức cao tiếp tục chờ 60-240us để bắt tín hiệu mức thấp do DS1820 kéo xuống trong khoảng thời gian trên. Bắt được tín hiệu này tức là DS1820 sẵn sàng.
                          Skip ROM: skip ROM để khỏi mất thời gian match ROM … vì chỉ có 1 con thôi khi nào xài nhiều con trên 1 đường dây mới cần match, thực hiện bằng cách nhảy tới chương trình con write và ghi mã skip ROM (CCh) vào data line.
                          Write: clear dataline và delay trong 15us rồi mới đặt bit cần ghi lên và delay 15us nữa, giữa 2 bit cần ghi liên tiếp phải đặt data line lên mức cao trong 1us và tiếp tục ghi bit tiếp theo.
                          Gửi lệnh read scratchpad và đọc dữ liệu về 2 lần, lần đầu lấy byte thấp (chứa giá trị nhiệt độ lưu lại trong thanh ghi R3 lát nữa xử lý sau) lần sau lấy byte cao(chứa dấu của nhiệt độ nếu chỉ đo trong khoảng 0-125 độ thì không cần đọc byte này), sau đó đọc tiếp 7 lần nữa để địa chỉ đọc trở về ban đầu.
                          Read: clear data line trong 1us và đọc dữ liệu về trong vòng 15us giữa 2 lần đọc phải cách nhau <1us (lấy 2us là được) rồi lại đọc tiếp.
                          Convert T: trước khi conv phải reset trước, chờ presence rồi skip ROM, sau đó gửi convert command (44h).
                          Giờ là lúc xử lý thanh ghi R3 đã lưu giá trị nhiệt độ. Có nhiều cách xử lý các bạn hãy nghiên cứu khung dữ liệu của nó và xử lý theo cách riêng để tách giá trị ra. Sau đó chuyển giá trị thành mã BCD rồi xuất ra led hay LCD tùy ý.
                          Đó là toàn bộ các bước thực hiện giao tiếp với DS1820. Chúc các bạn thành công.
                          Bạn có thể minh họa bằng code asm được ko (dùng 8051), thanks nhiều!!!
                          Last edited by vodangks; 02-02-2009, 22:15.

                          Comment


                          • #14
                            Nguyên văn bởi vodangks Xem bài viết
                            Bạn có thể minh họa bằng code asm được ko (dùng 8051), thanks nhiều!!!
                            Bạn google đi, có rất nhiều sample code giao tiếp one-wire với 8051. Nếu viết bằng PIC dùng C thì tớ có, cái one-wire này chỉ chuối mỗi cái là phải là viết hàm relay thật chuẩn, không đúng timing là chạy bằng vành ngay

                            Comment


                            • #15
                              Nguyên văn bởi phamthaihoa Xem bài viết
                              Bạn google đi, có rất nhiều sample code giao tiếp one-wire với 8051. Nếu viết bằng PIC dùng C thì tớ có, cái one-wire này chỉ chuối mỗi cái là phải là viết hàm relay thật chuẩn, không đúng timing là chạy bằng vành ngay
                              cái này mình cũng đã search trên mạng rùi, chỉ thấy có asm cho con ds1620 thui, có cả mạch mô phỏng trên proteus nữa nhưng chỉ toàn bằng C. Đang bí nên mong các bạn giúp đỡ!!!

                              Comment

                              Về tác giả

                              Collapse

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

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

                              Collapse

                              Đang tải...
                              X