Necesito información del DS18b20

Hola amigos, me gustaria obtener información del integrado ds18b20 ya que lo quiero utilizar para conectarlo a un pic 16f628a y obtener la medición digital de temperatura, cualquier información que me puedan pasar seria de nucha ayuda.
Gracias
Esteban
 
Hola amigos, me gustaria obtener información del integrado ds18b20 ya que lo quiero utilizar para conectarlo a un pic 16f628a y obtener la medición digital de temperatura, cualquier información que me puedan pasar seria de nucha ayuda.
Gracias
Esteban

Hola tengo un código que funciona utilizando un Ds18B20 con un PIC16F887 pero en lenguaje CCS. Mi siguiente paso el leer una cadena de 5 termómetros donde tu te encuentras, y a una distancia de 20 m entre cada uno, en el documento de Dallas no es muy clara la información, espero alguien pueda apoyarme. Tengo la teoría que utilizando este código solo necesito leer la dirección de cada termómetro.

Te dejo mi código solo busca el compilador CCS funciona muy bien y se puede simular en Proteus 7 y 8

#include <16f887.h>
#FUSES NOWDT,INTRC_IO, NOPUT, NOPROTECT, NOBROWNOUT, NOMCLR, NOLVP, NOCPD
#use delay(clock=4000000)
#include <lcd.c>
#include "ONEWIRE.h"

float GRADOS;

void main() {
lcd_init();
printf(lcd_putc,"\fTemp DS18B20");
delay_ms(1000);

while(1){
GRADOS=ds1820_read();
lcd_gotoxy(2,2);
printf(lcd_putc,"%3.1f oC",GRADOS);
delay_ms(1000);
}
}


la librería onewire que utilice:

//Archivo onewire para enfocado a un
//Termometro DS18B20 .

#define ONE_WIRE_PIN PIN_A1

void onewire_reset();
void onewire_write(int8 data);
int onewire_read();
float ds1820_read();

void onewire_reset() {
output_low(ONE_WIRE_PIN); // pull the bus low for reset
delay_us(500);
output_float(ONE_WIRE_PIN); // float the bus high
delay_us(500); // wait-out remaining initialisation window
output_float(ONE_WIRE_PIN);
}

void onewire_write(int8 data) {
int8 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.
}
}

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;
}

float ds1820_read() {
int8 busy=0, temp1, temp2;
signed int16 temp3;
float result;
onewire_reset();
onewire_write(0xCC); //Skip ROM, address all devices
onewire_write(0x44); //Start temperature conversion
while(busy == 0) //Wait while busy (bus is low)
busy = onewire_read();
onewire_reset();
onewire_write(0xCC); //Skip ROM, address all devices
onewire_write(0xBE); //Read scratchpad
temp1 = onewire_read();
temp2 = onewire_read();
temp3 = make16(temp2, temp1);
result = (float) temp3 / 16.0; //Calculation for DS18B20
delay_ms(200);
return(result);
}
 
Atrás
Arriba