Thông báo

Collapse
No announcement yet.

Đo nhiệt độ dùng DS18b20! Help!

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

  • #16
    Nguyên văn bởi nguyenhuuson Xem bài viết
    bac tranpic cho cho em hoi may cho trong cai project y. Em khong hieu lam , sao lai gan chan P0 nhu vay ha bac ? bac giup em nha!
    Port0 4 bit cao dùng để xuất mã cho IC giải mã 7 đoạn, 4 bit thấp để quét led thôi chứ có gì đâu bạn

    Comment


    • #17
      chào các bạn. mình đang phải làm đồ án về thiết kế mạch đo nhiệt độ cho lò nhiệt trở sử dụng cảm biến nhiệt độ thông minh DS18B20. mong mọi ngưởi giúp mình với.cảm ơn mọi người, xin liên lạc với mình qua địa chỉ mail hetgaoroi_bg9x@yahoo.com

      Comment


      • #18
        Nguyên văn bởi tranpic Xem bài viết
        trời định nhờ tui làm luôn hay sao vậy, trong file tui gửi kèm là gần như xong đồ án của bạn rồi chỉ còn việc báo cháy nữa thôi mà. Còn các vấn đề bạn hỏi thì cứ xem trong datasheet đây, xem chừng nào hiểu thì thôi (người ta đã bỏ công viết datasheet cho bạn rồi mà bạn ko coi à)


        gửi lại file đính kèm cho bạn xem nè, mở bằng Proteus (ko mở bằng Orcad được đâu )
        sao nó chạy mophong là 28 vậy làm sao cho nó thay đổi

        Comment


        • #19
          bài của bác tranpic cách đây nhiều năm khi thế hệ chúng mình chưa là sinh viên cùng thời bác tranpic chỉ còn bác chung1608 còn lên 4rum chia sẻ kiến thức cho thế hệ bây giờ,bạn lenhoc91 muốn hỏi bác tranpic thì phải hỏi nhiều năm về trước,còn bây giờ thì không biết tìm bác ấy ở đâu

          Comment


          • #20
            Led 7 đoạn nhấp nháy khi dùng ds18b20

            Nguyên văn bởi tranpic Xem bài viết
            cái này tui post lên rồi ma, mấy bạn chẳng chịu khó tìm tài liệu j hết mà chỉ lo hỏi không hà, vào đây mà xem(mạch đã chạy ngoài thực tế)
            Bộ đo và khống chế nhiệt độ

            nếu dùng led 7 đoạn thì sẽ có trường hợp là led bị chớp, do thời gian đọc dữ liệu về, để khắc phục việc này thì cần viết chương trình hoặc sử dụng mạch chốt(cách này dơ do tốn tiền làm phần cứng) tốt nhất dùng lcd mà hiển thị vừa đơn giản vừa ít tốn tiền.
            Mình thấy bác tranpic146668 nói về mạch chốt để led bảy đoạn không bị chớp khi đọc dữ liệu.
            Mình dùng cách khác là bộ timer0 khi làm trên pic16f876A để định kỳ quét led với thời gian là 51,2*(255-105) = 7ms. Nhưng không hiểu sao vẫn bị nhấp nháy.
            Phần dữ liệu thì chắc không sai do mình đã hiển thị tốt trên Laptop dùng RS232
            Có ai có cao kiến gì giúp mình ko?
            Attached Files

            Comment


            • #21
              Nguyên văn bởi vinh1411176 Xem bài viết
              Mình thấy bác tranpic146668 nói về mạch chốt để led bảy đoạn không bị chớp khi đọc dữ liệu.
              Mình dùng cách khác là bộ timer0 khi làm trên pic16f876A để định kỳ quét led với thời gian là 51,2*(255-105) = 7ms. Nhưng không hiểu sao vẫn bị nhấp nháy.
              Phần dữ liệu thì chắc không sai do mình đã hiển thị tốt trên Laptop dùng RS232
              Có ai có cao kiến gì giúp mình ko?
              Khi viết code đọc từ 18b20 nếu khéo léo bạn vẫn có thể dùng phương pháp quét led 7seg mà vẫn không bị chớp. Bạn có thể tham khảo 1 đoạn code sau trong đó đoạn LCALL DL_X2 được chèn vào để chống chớp led:

              ;===============================DOC_NHIET: ;chuong trinh giao tiep voi cam bien nhiet DS18B20
              ;===============================
              RELOAD:
              CALL TEM_BGN ; goi ctrinh con khoi dong DS18B20
              MOV A,#4EH ; lenh de ghi TH va TL
              CALL WRT_DATA
              MOV A,#TH
              CALL WRT_DATA
              MOV A,#TL
              CALL WRT_DATA
              LCALL DL_X2 ; DL + CHONG NHAY LED 7SEG
              ;doc lai noi dung tu DS18B20
              CALL TEM_BGN
              MOV A,#0BEH ; read Scratchpad
              CALL WRT_DATA
              ; nhan 9 byte du lieu tu DS18B20
              CALL GET_9BYTE ;chuong trinh con nhan 9 byte du lieu
              ; kiem tra lai xem viec ghi TH va TL dung chua?
              MOV A, #TH
              CJNE A, BYTE2, RELOAD ; TH=Byte2?
              MOV A, #TL
              CJNE A, BYTE3, RELOAD ; TL=Byte3?
              LCALL DL_X2 ; DL + CHONG RUNG LED
              ; viec ghi TH va TL hoan tat va da duoc kiem tra dung, ghi TH va TL vao EEPROM
              ; cho DS18B20 ghi vao EEPROM, nen cho DQ high > 10us
              CALL TEM_BGN
              MOV A,#48H
              CALL WRT_DATA ; copy Scratchpad vao EEPROM
              SETB DQ
              LCALL DL_X2 ; DL + CHONG RUNG LED
              ; yeu cau DS18B20 thuc hien viec do nhiet do
              CALL TEM_BGN
              MOV A,#44H ; convert T
              CALL WRT_DATA
              ; cho DS18B20 do nhiet do, nen set DQ high tren 750ms
              LCALL DL_X2
              LCALL DL_X2
              ; doc lai gia tri nhiet do tu DS18B20
              CALL TEM_BGN
              MOV A,#0BEH ; read Scratchpad
              CALL WRT_DATA
              ; nhan 9 byte du lieu tu DS18B20
              CALL GET_9BYTE
              LCALL DL_X2
              ;chuyen doi gia tri nhiet do trong BYTE0 va BYTE1 thanh nhiet do.
              CALL DECODE_T
              RET

              DL_X2: ;240us
              LCALL HIEN_THI
              LCALL HIEN_THI
              RET
              Last edited by pctcom; 29-05-2012, 19:05.
              PCT COMPUTER
              (Để không làm ảnh hưởng đến thời gian và công việc cá nhân. Xin vui lòng không nhắn tin và điện thoại)

              Comment


              • #22
                Uhm, từ khi làm quen pic đến nay mình chỉ dùng C, bạn có thể giải thích giúp mình đoạn code "LCALL DL_X2" có tác dụng gì không? Theo như mình tính thì cứ mỗi 7ms chạy chương trình ngắt để quét 6 led 7 đoạn thì có ổn?

                Comment


                • #23
                  Theo mình nhận thấy timer ở trong các đoạn code cần nhiều thời gian như ds18b20 sẽ làm thời gian bị giãn ra hay sao đó. Nên mình chuyển sang cách thủ công hơn là làm một hàm quet_led() để chèn vào trong khi ds18b20 đang chuyển đổi nhiệt độ. Hiệu quả khá rõ. Sau đó mình chèn thêm một vài nơi nữa, nhưng tránh ở các chỗ đang read hay write hay đang làm phép toán. Tuy nhiên có vẻ cũng còn nhấp nháy khi nhìn lâu! Mình sẽ cải tiến tiếp, sau đó lại post lên.

                  Comment


                  • #24
                    Nguyên văn bởi vinh1411176 Xem bài viết
                    Uhm, từ khi làm quen pic đến nay mình chỉ dùng C, bạn có thể giải thích giúp mình đoạn code "LCALL DL_X2" có tác dụng gì không? Theo như mình tính thì cứ mỗi 7ms chạy chương trình ngắt để quét 6 led 7 đoạn thì có ổn?
                    Thay vì dùng delay thường để chờ ds18b20 xử lý data thì ta sẽ chèn code hiển thị led vào thay thế nó. Tác dụng là loại bỏ hiện tượng nhấp nháy khi đọc ds18b20.

                    DL_X2: ;240us
                    LCALL HIEN_THI
                    LCALL HIEN_THI
                    RET
                    PCT COMPUTER
                    (Để không làm ảnh hưởng đến thời gian và công việc cá nhân. Xin vui lòng không nhắn tin và điện thoại)

                    Comment


                    • #25
                      Nguyên văn bởi vinh1411176 Xem bài viết
                      Theo mình nhận thấy timer ở trong các đoạn code cần nhiều thời gian như ds18b20 sẽ làm thời gian bị giãn ra hay sao đó. Nên mình chuyển sang cách thủ công hơn là làm một hàm quet_led() để chèn vào trong khi ds18b20 đang chuyển đổi nhiệt độ. Hiệu quả khá rõ. Sau đó mình chèn thêm một vài nơi nữa, nhưng tránh ở các chỗ đang read hay write hay đang làm phép toán. Tuy nhiên có vẻ cũng còn nhấp nháy khi nhìn lâu! Mình sẽ cải tiến tiếp, sau đó lại post lên.
                      Thời gian cho quét led bị code dọc nhiệt độ ds18b20 chiếm dụng quá lâu nên mới xảy ra hiện tượng này. Cách xử lý triệt để nhất khi viết code trên c là dùng ngắt tỉme để quét led.
                      PCT COMPUTER
                      (Để không làm ảnh hưởng đến thời gian và công việc cá nhân. Xin vui lòng không nhắn tin và điện thoại)

                      Comment


                      • #26
                        Đã khắc phục được

                        Thanks bạn, mình đã dùng lại timer và đã khắc phục được hiện tượng nhấp nháy trên.
                        Đây là code dùng C của mình, PIC 16F876A
                        Code:
                        #include "DS18B20 on led 7 segment.h"
                        #include "1-wire.c"
                           int8 const bangso_led[10] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
                           int8 const bangso_led_dot[10] = {0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
                           signed int16 temperature, temperature2;
                           int8 i, j, led[7];
                        
                        #int_TIMER0
                        void TIMER0_ISR()
                           {
                              set_timer0(100); // Set timer0 tu 80 tro len
                              quet_led();
                              
                           }
                        signed int16 ds1820_read()
                        { 
                         int8 busy=0, temp1, temp2; 
                         signed int16 temp3; 
                        
                         onewire_reset(); 
                         onewire_write(0xCC); 
                         onewire_write(0x44); 
                        
                         while (busy == 0)
                         {
                           busy = onewire_read();
                        
                         }
                        
                         onewire_reset(); 
                         onewire_write(0xCC); 
                         onewire_write(0xBE);
                        
                         temp1 = onewire_read(); 
                         temp2 = onewire_read(); 
                         temp3 = make16(temp2, temp1); 
                          
                         return(temp3); 
                        }
                        
                        
                        void main()
                        {
                        
                           setup_adc_ports(NO_ANALOGS);
                           setup_adc(ADC_CLOCK_DIV_2);
                           setup_spi(SPI_SS_DISABLED);
                           setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);
                           set_timer0(100);
                           enable_interrupts(GLOBAL);
                           enable_interrupts(INT_TIMER0);
                           setup_timer_1(T1_DISABLED);
                           setup_timer_2(T2_DISABLED,0,1);
                           setup_ccp1(CCP_OFF);
                           setup_comparator(NC_NC_NC_NC);
                           setup_vref(FALSE);
                        
                           //TODO: User Code
                        
                           led[6] = 0xFF;
                           led[2] = 0x9C;
                           led[1] = 0xC6;
                           
                           while(true)
                              {
                              temperature = ds1820_read();
                              if (bit_test(temperature,15))
                                 {
                                    led[6] = 0xBF;
                                    temperature = ~(--temperature);
                                 } 
                                 else
                                 {
                                    led[6] = 0xFF;
                                 }
                                    temperature2 = temperature >> 4;
                                    led[5] = bangso_led[(temperature2*10)/100];
                                    led[4] = bangso_led_dot[((temperature2*10)%100)/10];
                                    led[3] = bangso_led[((temperature & 0x000F)*10)>>4];
                           }
                        }
                        Nguyên nhân lần trước chưa được là do mình định nghĩa sai dạng biến ra của hàm ds1820_read(). Sau đó mình đã set timer là 100 thì dùng được. Nếu dùng dưới 100 thì thường hay bị chớp dấu trừ do chưa chuyển đổi kịp.

                        Comment


                        • #27
                          Chào bạn. cảm ơn về bài code của bạn, mình vẫn chưa hiểu 2 lệnh này, bạn giải thích cho mình với" shift_right(&data,1,input(ONE_WIRE_PIN)) và shift_right(&data,1,0).Thanks bạn nhiều.

                          Comment


                          • #28
                            anh Tranpic oi, anh viết lại đoạn code bang asambly dum em dc khong, em cần gấp, đoạn code trong Newfoder anh up len do
                            cam on anh hi
                            Email:
                            Phone: 0969 226 539

                            Comment


                            • #29
                              em có làm giống trên nhưng cũng không chạy bác ak

                              Comment

                              Về tác giả

                              Collapse

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

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

                              Collapse

                              Đang tải...
                              X