PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > Analog - Bộ nhớ - Bảo mật - Cảm biến nhiệt độ

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Tìm Kiếm Bài Trong Ngày Ðánh Dấu Ðã Ðọc Vi điều khiển

Analog - Bộ nhớ - Bảo mật - Cảm biến nhiệt độ Thảo luận việc sử dụng và thay thế các sản phẩm Analog, Memory, KEELOG và cảm biến nhiệt độ của Microchip cho các thiết kế

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 08-03-2009, 10:41 AM   #1
notbadday
Nhập môn đệ tử
 
Tham gia ngày: Oct 2007
Bài gửi: 5
:
Question Cần giúp đỡ về giao tiếp 1-wire với ds1820

Em đang viết 1 đoạn chương trình để hiển thị nhiệt độ lên LCD dùng cảm biến ds1820 và pic6f877a. Em đang gặp rắc rối trong việc giao tiếp với ds1820. Cụ thể là không hiện được nhiệt độ. Mấy anh xem giúp,có gì góp ý thì em cảm ơn rất nhiều.
Đây là code CCS, có mượn đoạn code phần LCD của bác nhh (hy vọng bác ko phản đối )
Code:
#include <16F877A.h>
#include <DEFS_16F877A.h>
#include <stdlib.h>

#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)
#define E  RD2
#define RS RD0
#define RW RD1
#define DQ RC0
#DEFINE TRISC 0x07
#byte lcd_data = 0x06   // Dia chi PORTB

/* Khai bao nguyen mau cac ham su dung */
byte lcd_read_byte();
void lcd_send_byte( byte address, byte n );
void lcd_init();
void lcd_gotoxy( byte x, byte y);
void lcd_putc( char c);
void lcd_refresh();
unsigned char ow_reset(void);
unsigned char read_bit(void);
void write_bit(char bival);
unsigned char read_byte(void);
void write_byte(char val);

/* Doc mot byte tu LCD */
byte lcd_read_byte()
{
   byte read_byte;
   set_tris_B(0xFF);       // PORTB = input
   RW = 1;
   delay_cycles(1);
   E  = 1;
   delay_cycles(1);
   read_byte = lcd_data;
   E  = 0;
   set_tris_B(0x00);       // PORTB = output
   return(read_byte);
}

/* Goi 1byte den LCD */
void lcd_send_byte( byte address, byte n )
{
   RS = 0;
   while ( bit_test(lcd_read_byte(),7) ) ;
   RS = address;
   delay_cycles(1);
   RW = 0;
   delay_cycles(1);
   E  = 0;
   lcd_data = n;
   delay_cycles(1);
   E = 1;
   delay_us(2);
   E = 0;
}

/* Khoi tao ban dau cho LCD */
void lcd_init()
{
    byte const lcd_init_string[4] = {0x38, 0x0C, 1 , 6};
    byte i;
    set_tris_B(0x00);
    RS = 0;
    RW = 0;
    E  = 0;
    delay_ms(15);
    for(i=1;i<=3;++i)
       {
         lcd_data = 3;
         delay_cycles(1);
         E = 1;
         delay_us(2);
         E = 0;
         delay_ms(5);
       }
    lcd_data = 2;
    delay_cycles(1);
    E = 1;
    delay_us(2);
    E = 0;
    delay_ms(5);
    for(i=0;i<=3;++i)
      {
         lcd_send_byte(0,lcd_init_string[i]);
      }
}

/* Nhay den vi tri (x,y) tren LCD,nhay nham y se bao loi */
void lcd_gotoxy( byte x, byte y)
{
   byte address;
   switch(y)
      {
         case 1:  address=0;
                  address+=x-1;
                  lcd_send_byte(0,0x80|address);
                  break;
         case 2:  address=0x40;
                  address+=x-1;
                  lcd_send_byte(0,0x80|address);
                  break;
         default :lcd_init();
                  lcd_putc("ERROR Y POSITION");
                  while(true); // Dung tai day!
      }
}

/* Hien thi ki tu hoac chuoi ra LCD */
void lcd_putc( char c)
{
   lcd_send_byte(1,c);
}

/* Hien thi ki tu hoac chuoi ra LCD */
void lcd_refresh()
{
   lcd_send_byte(0,1);
   lcd_send_byte(0,6);
}

//reset

unsigned char ow_reset(void)
{
      unsigned char presence;
      set_tris_C(0);
      DQ = 0; //pull DQ line low
      delay_us(500); // leave it low for at least 480us
      DQ = 1;         // allow line to return high
      delay_us(40);  // wait for presence
      set_tris_C(0x01);
      presence = DQ; // get presence signal
      delay_us(150); // wait for end of timeslot
      return(presence); // presence signal returned
}                            //     0=presence, 1 = no part

unsigned char read_bit(void)
{
      set_tris_C(0);
      DQ = 0; // pull DQ low to start timeslot
      delay_us(1);
      set_tris_C(0x01); //release DQ
      delay_us(15);       
      return(DQ); // return value of DQ line
}

void write_bit(char bitval)
{
      set_tris_C(0);
      DQ = 0; // pull DQ low to start timeslot
      delay_us(15);
      if(bitval==1)   set_tris_C(0x01); //release DQ      
      delay_us(50); // hold value for remainder of timeslot
}

// READ_BYTE - reads a byte from the one-wire bus.
//
unsigned char read_byte(void)
{
      unsigned char i;
      unsigned char value = 0;
      for (i=0;i<8;i++)
      {
         if(read_bit()) value|=0x01<<i;     // reads byte in, one byte at a time and then
                                                   // shifts it left
         delay_us(150); // wait for rest of timeslot
      }
      return(value);
}

void write_byte(char val)
{
      unsigned char i;
      unsigned char temp;
      for (i=0; i<8; i++)             // writes byte, one bit at a time
      {
         temp = val>>i;           // shifts val right 'i' spaces
         temp &= 0x01;               // copy that bit to temp
         write_bit(temp);            // write bit in temp into
      }
      delay_us(100);
}
/* Ham main */
void main (void)
{ 
   unsigned char  x;     
   set_tris_B(0);    //PORTB = output
   set_tris_D(0);    //PORTD = output   
   
   ow_reset();
   write_byte(0xCC); // skip ROM
   write_byte(0x44); // Start conversion
   
   delay_us(100);
   ow_reset();
   write_byte(0xCC);   
   x = read_byte();   
   lcd_init();
   lcd_gotoxy(5,1);
   printf(lcd_putc,"temp = %u",x);
   lcd_gotoxy(4,2);
   lcd_putc("PICVIETNAM!");
  }
File Kèm Theo
File Type: rar ds1820.rar (15.8 KB, 217 lần tải)
notbadday vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 09-03-2009, 02:02 PM   #2
quocloc.pham
Đệ tử 1 túi
 
Tham gia ngày: Jul 2008
Bài gửi: 14
:
bạn phải xem mình đã thực hiện đc qua trình gì trong DS1820?
Bạn init được chưa?
quá trình ghi 1byte ok chưa?
quá trình đọc 1 byte ok?

Thân!
quocloc.pham vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 09-03-2009, 02:33 PM   #3
longtu
Đệ tử 6 túi
 
longtu's Avatar
 
Tham gia ngày: Jul 2007
Bài gửi: 146
:
Send a message via Yahoo to longtu
[QUOTE=notbadday;23330]Em đang viết 1 đoạn chương trình để hiển thị nhiệt độ lên LCD dùng cảm biến ds1820 và pic6f877a. Em đang gặp rắc rối trong việc giao tiếp với ds1820. Cụ thể là không hiện được nhiệt độ. Mấy anh xem giúp,có gì góp ý thì em cảm ơn rất nhiều.
Đây là code CCS, có mượn đoạn code phần LCD của bác nhh (hy vọng bác ko phản đối )

Đúng như bạn Quocloc.pham nói, bạn cần xác định lại xem đã đọc được nhiệt độ ĐÚNG từ DS1820 chưa?
Nếu chưa được, bạn thử Include file DS1820.c và file Temperature.c vao nhé (file đính kèm). Sau đó bạn,khai báo 1 biến: float temperature
và chép doạn chương trình này vào dầu chuong trình cùa bạn xem nó có đọc dúng nhiệt độ chua nhé.
temperature = ds1820_read();
printf("TEMP: %3.1f ", temperature);
__________________
--------------------------------------------------------------------------------------
Phùng Minh Tuân
Email: tuan.phmt@gmail.com
"Cuộc đời sóng gió nuôi ta lớn
Bao lần thất bại dạy ta khôn".
longtu vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 09-03-2009, 02:38 PM   #4
longtu
Đệ tử 6 túi
 
longtu's Avatar
 
Tham gia ngày: Jul 2007
Bài gửi: 146
:
Send a message via Yahoo to longtu
Minh chua biet gui file len:
Ban copy lai nhé:
DS1820.c:
Code:
//************* Reset  *******************
void onewire_reset()  
{ 
 output_low(ONE_WIRE_PIN); 
 delay_us( 500 ); // pull 1-wire low for reset pulse 
 output_float(ONE_WIRE_PIN); // float 1-wire high 
 delay_us( 500 ); // wait-out remaining initialisation window. 
 output_float(ONE_WIRE_PIN); 
}
//************* Write data to the chip*******************
void onewire_write(int data) 
{ 
 int count; 

 for (count=0; count<8; ++count) 
 { 
  output_low(ONE_WIRE_PIN); 
  delay_us( 2 ); // pull 1-wire low to initiate write time-slot. 
  output_bit(ONE_WIRE_PIN, shift_right(&data,1,0)); // set output bit on 1-wire 
  delay_us( 60 ); // wait until end of write slot. 
  output_float(ONE_WIRE_PIN); // set 1-wire high again, 
  delay_us( 2 ); // for more than 1us minimum. 
 } 
} 

//****************Read data from the chip********************
int onewire_read() 
{ 
 int count, data; 

 for (count=0; count<8; ++count) 
 { 
  output_low(ONE_WIRE_PIN); 
  delay_us( 2 ); // pull 1-wire low to initiate read time-slot. 
  output_float(ONE_WIRE_PIN); // now let 1-wire float high, 
  delay_us( 8 ); // let device state stabilise, 
  shift_right(&data,1,input(ONE_WIRE_PIN)); // and load result. 
  delay_us( 120 ); // wait until end of read slot. 
 } 

 return( data ) ;
} 

và file Temperature.c

float ds1820_read()
{ 
 int8 busy=0, temp1, temp2; 
 signed int16 temp3; 
 float result; 

 onewire_reset(); 
 onewire_write(0xCC); //SkipRom:cho phep truy cap den DS1820
 onewire_write(0x44); //Convert Command: chuyen doi gia tri nhiet do thanh so nhi phan
///////////////
 delay_ms(100);
///////////////
while (busy == 0) 
 busy = onewire_read(); 

 onewire_reset(); 
 onewire_write(0xCC); 
 onewire_write(0xBE); //cho Phep MU doc data trong DS1820
 temp1 = onewire_read();
 temp2 = onewire_read(); 
 temp3 = make16(temp2, temp1); 
  
 result = (float) temp3 / 2.0;   //Calculation for DS18S20 with 0.5 deg C resolution 
// result = (float) temp3 / 16.0;  //Calculation for DS18B20 with 0.1 deg C resolution 
 
// delay_ms(200); 
 return(result); 
}
Thân,
__________________
--------------------------------------------------------------------------------------
Phùng Minh Tuân
Email: tuan.phmt@gmail.com
"Cuộc đời sóng gió nuôi ta lớn
Bao lần thất bại dạy ta khôn".

thay đổi nội dung bởi: namqn, 09-03-2009 lúc 04:48 PM. Lý do: định dạng code
longtu vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 09-03-2009, 04:48 PM   #5
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
Gửi bạn longtu,

Bạn xem hướng dẫn upload tập tin lên diễn đàn ở đây:
http://www.picvietnam.com/forum/showthread.php?t=3289

Thân,
__________________
Biển học mênh mông, sức người có hạn.

Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
http://www.picvietnam.com/forum/showthread.php?t=1263
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 09-03-2009, 05:29 PM   #6
longtu
Đệ tử 6 túi
 
longtu's Avatar
 
Tham gia ngày: Jul 2007
Bài gửi: 146
:
Send a message via Yahoo to longtu
Trích:
Nguyên văn bởi namqn View Post
Gửi bạn longtu,

Bạn xem hướng dẫn upload tập tin lên diễn đàn ở đây:
http://www.picvietnam.com/forum/showthread.php?t=3289

Thân,
Cám ơn anh Nam.

Thân chào anh.
__________________
--------------------------------------------------------------------------------------
Phùng Minh Tuân
Email: tuan.phmt@gmail.com
"Cuộc đời sóng gió nuôi ta lớn
Bao lần thất bại dạy ta khôn".
longtu vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 10-03-2009, 08:08 PM   #7
longtu
Đệ tử 6 túi
 
longtu's Avatar
 
Tham gia ngày: Jul 2007
Bài gửi: 146
:
Send a message via Yahoo to longtu
[QUOTE=longtu;23373]Cám ơn anh Nam.

Gửi anh Nam,
Anh cho em hỏi, làm sao de mình có thể tạo 1 chủ đề mới dể mọi người cùng thao luận vậy anh? Ý em là: ngay khi vào Trang chủ của PICVietNam sẽ thấy tựa đề của mình mà muốn mọi người cùng trao đổi?
Cám ơn anh.

Thân chào anh.
__________________
--------------------------------------------------------------------------------------
Phùng Minh Tuân
Email: tuan.phmt@gmail.com
"Cuộc đời sóng gió nuôi ta lớn
Bao lần thất bại dạy ta khôn".
longtu vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 09-03-2009, 05:35 PM   #8
longtu
Đệ tử 6 túi
 
longtu's Avatar
 
Tham gia ngày: Jul 2007
Bài gửi: 146
:
Send a message via Yahoo to longtu
To Notbadday: gui ban File mình da upload len duoc roi.

Than,
File Kèm Theo
File Type: rar nhiet do.rar (1.1 KB, 244 lần tải)
__________________
--------------------------------------------------------------------------------------
Phùng Minh Tuân
Email: tuan.phmt@gmail.com
"Cuộc đời sóng gió nuôi ta lớn
Bao lần thất bại dạy ta khôn".
longtu vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 28-05-2010, 05:16 PM   #9
tbk_05
Đệ tử 1 túi
 
Tham gia ngày: Mar 2010
Bài gửi: 14
:
Các bạn cho mình hỏi mình định nghĩa ONE_WIRE_PIN một chân bất kì nào đó được không, tai sao khi mô phỏng, định nghỉa chân REx lại không được nhỉ. Mình phải định nghĩa chân khác ngoài Porte, nhưng kết quả không như mong muốn(hiển thị âm -0.5). Các bạn xem file đính kèm rối góp ý cho mình với nhé. Mình cám ơn nhiều.(thư viện DS1820.c,Temperature.c mình lấy nguyên của bạn longtu, chỉ sửa lại định nghĩa ONE_WIRE_PIN này thôi a`)
File Kèm Theo
File Type: rar Ds1820.rar (19.5 KB, 64 lần tải)
tbk_05 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 09-03-2009, 09:01 PM   #10
notbadday
Nhập môn đệ tử
 
Tham gia ngày: Oct 2007
Bài gửi: 5
:
Cảm ơn mọi người rất nhiều đã quan tâm vấn đề này.
to quocloc.pham: đoạn code mình đưa ra thực sự chưa làm gì đc, nhiệt độ hiển thị là 1 con số nào đó.
to longtu: đoạn code của bạn giúp ích mình rất nhiều. Mình đã build và mô phỏng thành công.
notbadday vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 27-05-2010, 04:17 PM   #11
thientaisodo
Đệ tử 4 túi
 
Tham gia ngày: Dec 2008
Nơi Cư Ngụ: Hà Tĩnh - Hà Nội
Bài gửi: 61
:
Send a message via Yahoo to thientaisodo
Có code và file hướng dẫn trong đó, bạn vào mà lấy nhé
http://www.dientuvietnam.net/forums/...404#post263404
thientaisodo vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 07-03-2011, 11:09 PM   #12
manucian1988
Nhập môn đệ tử
 
Tham gia ngày: Apr 2010
Bài gửi: 2
:
@longtu,notbadday: các bác cho em hỏi là mô phỏng ds18b20 trên proteus có vấn đề gì ko vì em dùng code ở trên và rất nhiều code khác mô phỏng đều ko được >.<
manucian1988 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 28-06-2012, 12:21 AM   #13
mrtddiep
Nhập môn đệ tử
 
Tham gia ngày: May 2009
Bài gửi: 8
:
cam on ban longtu rat nhieu code cua ban rat huu ich doi voi nguoi moi tap tanh choi voi pic nhu minh.cho minh hoi them la che do onewrite nay truyen duoc bao xa nhi ? va hay bi loi khong nhi ? thank's moi nguoi truoc nha !
mrtddiep vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 13-10-2013, 11:43 AM   #14
khactinh88hn
Nhập môn đệ tử
 
Tham gia ngày: Jul 2013
Bài gửi: 3
:
chào mọi người mình đang cân gấp tài liệu về giao tiếp onewire để báo cáo.mà tìm trên mạng thị ko chuẩn.bạn nào có tài liệu chuẩn về onewire cho mình xin đi.mình cảm ơn.
khactinh88hn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 17-09-2016, 10:37 PM   #15
tuanbo555
Nhập môn đệ tử
 
Tham gia ngày: Apr 2009
Bài gửi: 2
:
khoảng cách giao tiếp với sensor nhiệt ds18b20

Cam´ ơn bạn, mình cũng đã giao tiếp đuoc̣ sensor 18b20, co´ một vấn đề em muốn hỏi khoảng cách kết nối từ MCU đến sensor laˋ bao nhiêu,khi em nối dai dây thiˋ không giao tiếp được với ds18b20, theo ly´ thuyêt em tìm hiểu giao tiếp 1 wire khoảng cách tối đa laˋ 300m.Mong nhận được giải đáp của các anh.
tuanbo555 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời

Ðiều Chỉnh
Xếp Bài

Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


Múi giờ GMT. Hiện tại là 06:46 AM.


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam