1 wire con C18

Hola amigos

Estoy tratando de hacer funcionar el protocolo 1wire en C18 y la verdad me tiene a mal traer el asunto.
Alquien ha hecho algo de esto o tiene información para tirarme una idea de como implementarlo en C18.
El controlador que estoy usando es el PIC18F4550 con el MPLAB y el compilador es C18 V3.0

Desde ya muchas gracias.

Matias
 
Hola Borgo
Estoy tratando de hacer funcionar el DS18B20 en C18. Las rutinas que encuentro en la red son para otros compiladores como CCS pero nada para C18 lo que mas se parece es HiTech pero no logro hacerlo funcionar.
Si me podes tirar una línea de algun link donde investigar muy agradecido.

Matias Villemur
 
Hi Matias
Bueno si el C18 no tiene librerias para el DS1820 pero te paso el codigo de como hacerlo funcionar tu ves como lo ajustas a tus necesidades, ojo es para un cristal de 20Mhz.
En realidad esto funciona con cualquier cosa 1Wire es cosa de adaptarlo, el mismo código lo he usado en botones por ejemplo y sin problemas, si te fijas estan las dos rutinas para el 1820 y el 18B20.
Te adjunto tambien los archivos completos.

Suerte en tu proyecto.(y)
Código:
Codigo://////////////////////////////////////////////////////

#include <delays.h>
#include "1wire.h"

#define Pin_LOW		PORTAbits.RA4=0; TRISA = 0b00000000;
// Pin RA4 esta en 0 y es salida
#define Pin_Entrada	TRISA = 0b00010000;	
// Pin RA4 es entrada y con nivel alto puesto por la resistencia 4,7K					
#define Pin_Lee		PORTAbits.RA4;
// Pin donde esta conectado el sensor (pin6 de pic18F4550)

extern unsigned char puntero_array;
extern unsigned char ROM_DATA [9];

/***************************** Reset_1Wire *****************************/
/*Esta función inicializa el buz 1wire */
/*Argumentos: ninguno */
/*Retorna: 0 si todo OK */
/***********************************************************************/
int Reset_1wire(void)
{
	int result=1;
	Pin_LOW
	Delay10TCYx(250);	// 500uS. El pin RA4 baja al menos 480 uS
	Pin_Entrada; 		// Coloca RA4 como entrada, resit.de 4k7 pone el pin en alto
	Delay10TCYx(30);	// 60uS. Entre 15 y 60uS, DS1820 pone el pin en 0
	result = (int)Pin_Lee // Lee el estado del pin
	Delay10TCYx(120); 	// 240uS. Espera para asegurar el estado del pulso de presencia
	return (result);	// 0 = DS1820 Encontrado!!!
}
/*********************** Escribir_Bit() ******************************/
/* Esta función escribe un bit en el sensor. */
/* Argumentos: Un bit (El bit a escribir en el bus 1-wire) */
/* Retorna: nada  */
/***********************************************************************/
void Escribir_Bit(int bit)
{
	if (bit)  // Escribe un '1'
	{
		Pin_LOW		// RA4 baja para generar la ventana de tiempo
		Delay10TCYx(3);	// 5uS.
		Pin_Entrada	// Libera el pin para que la resit de 4.7k ponga un 1
		Delay10TCYx(30);// 60uS. Espera para asegurar el bit en el DS1820
	}
	else
	{	      		// Escribe un '0'
		Pin_LOW		// RA4 baja para generar la ventana de tiempo
		Delay10TCYx(30);// 60uS. El pin en 0 escribe en el bus un 0
		Pin_Entrada	// Libera RA4 que pasa a 1 por la resist. de 4.7k
	}
	Delay10TCYx(5);		// 10uS Tiempo de recuperación
}

/*********************** Leer_Bit() ******************************/
/* Esta función lee un bit desde el sensor. */
/* Argumentos: ninguno */
/* Retorna: El estado del bit en el pin DQ del sensor  */
/***********************************************************************/
int Leer_Bit(void)
{
	int result=0;

	Pin_LOW			// RA4 Baja 
	Delay10TCYx(3);		// 5uS espera
	Pin_Entrada	    	// Libera RA4 para generar la ventana de de tiempo de lectura
	Delay10TCYx(3);		// 5uS Espera para validar la ventana de lectura
	result = (int)Pin_Lee 	// Lee el bus 1-wire
	Delay10TCYx(30);      	// 60uS. Espera para completar la ventana de tiempo
  	return (result);      	// Retorna el bit 
}

/*********************** Escribir_Byte() ******************************/
/* Esta función escribe un byte en el sensor. */
/* Argumentos: byte (El byte a escribir en el bus 1-wire) */
/* Retorna: nada  */
/***********************************************************************/
void Escribir_Byte(int data)
{
	int loop;
	// Bucle para escribir cada bit  del byte
	for (loop = 0; loop < 8; loop++)
	{
		Escribir_Bit(data & 0x01);
		data >>= 1;
	}
}

/*********************** leer_Byte() **********************************/
/* Esta función lee 8 bit´s desde el sensor 1-wire.    */
/* Argumentos: ninguno */
/* Retorna: 8 bit´s (1-byte) los datos desde el sensor */
/***********************************************************************/
int Leer_Byte(void)
{
	int loop, result=0;
	for (loop = 0; loop < 8; loop++)
	{
		result >>= 1;
		if (Leer_Bit())
		result |= 0x80;
	}
	return result;
}

/*********************** Medir_Temperatura() ***************************/
/* Esta función inicia la conversión para medir la temperatura. */
/* Argumentos: ninguno */
/* Retorna: nada */
/***********************************************************************/
void Medir_Temperatura(void)
{
	Reset_1wire();		    // Reset del bus
    ENVIAR_ROM_CODE();              // Envía el código ROM
	Escribir_Byte(0x44);	    // Iniciar Conversión
    while(Leer_Bit() == 0);         // Termino de Medir??? 
	Reset_1wire();		    // Reset del bus
}

/*********************** Leer_DS18S20() ***************************/
/* Esta función lee la temperatura de un sensor DS1820. */
/* Argumentos: ninguno */
/* Retorna: La temperatura con signo */
/***********************************************************************/
float Leer_DS18S20(void)
{
	unsigned char get[10];
	int k, temp;
	float ftemp;
    ENVIAR_ROM_CODE();		// Envía el código ROM
	Escribir_Byte(0xBE);	// Lee Scratch Pad
	for (k=0; k<9; k++)		// Lee 9 bytes desde scratchpad
		get[k]=Leer_Byte();
	temp = get[0];			// Carga los 8 bits menos significativos
	if (get[1] > 0x80)		// Bit del signo seteado si temp es negativa
		temp = temp * -1;
	ftemp = temp;
    return (ftemp/2);
}
/*********************** Leer_DS18B20() ***************************/
/* Esta función lee la temperatura de un sensor DS18B20. */
/* Argumentos: ninguno */
/* Retorna: La temperatura con signo */
/***********************************************************************/
float Leer_DS18B20(void)
{
	unsigned char get[10];
	int k;
	long temp;
	float ftemp;
    ENVIAR_ROM_CODE();			// Envía el código ROM
	Escribir_Byte(0xBE);		// Lee scratch pad
	for (k=0; k<9; k++)		// Lee 9 bytes desde scratchpad
		get[k]=Leer_Byte();
	temp = get[1] & 0x7;		
	temp = temp << 8;					
	temp = (temp | get[0]);					
	if (get[1] > 0x80)						
		temp = temp * -1;
	ftemp = temp;
    return (ftemp/16);
}
/********************** ENVIAR_ROM_CODE *************************/
/* Esta función envía los 64 bit's del ROM CODE */
/* Argumentos: Ninguno */
/* Retorna: Nada */
/****************************************************************/
void ENVIAR_ROM_CODE(void){
Reset_1wire();
	Escribir_Byte(0x55);
puntero_array=0;
for(puntero_array=0;puntero_array<=7;puntero_array++){
Escribir_Byte(ROM_DATA[puntero_array]);
 }  
}
fin de codigo///////////////////////////////////////////////////////////////////
 

Adjuntos

  • 1wire_C18.zip
    2.3 KB · Visitas: 279
Última edición por un moderador:
Muchas gracias Borgo!!!
Acabo de compilar lo que has posteado y una vez ajustado a lo que tengo armado salio funcionando de primera!!!!!! :aplauso:
Hace dos semanas que andaba tras de este asunto, realmente muchas gracias.

Muchas gracias!!!

Matias
 
Hola que tal Borgo, vi una propuesta tuya de la libreria del sensor DS18B20 para C18, yo he estado intentando hacer trabajar este sensor sin exito, solo que yo estoy utilizando C de ccs y no C18, la pregunta es si tendrás la libreria de este sensor para ccs ya que he utilizado algunas que andan en la red, consiguiendo que la lcd me muestre 0.00 ya que no esta funcionando correctamente.

Saludos.
 
yo necesito realizar lo mismo que el pero no se como realizar la conversion analogica y tamben la lcd me muestra un valor que no es a no se si la ecuacion que coloque es la incorrecta ayuda por favor.. y para ello estoy utlizando ccs en proteus.. este es el programa

#include <16f877.h>
#device adc=10
#fuses XT,NOWDT
#use delay(clock=4000000)
#include <math.h> //Necesaria para los cálculos matemáticos
#include <lcd.c>

void main() {
float tv,tr,temp,y; //Variables de ecuación
int16 value;
lcd_init();
setup_port_a( ALL_ANALOG );
setup_adc( ADC_CLOCK_INTERNAL );
set_adc_channel( 0 );
delay_us(10);
do {
value = Read_ADC();
tv = 5.0 * value / 1024.0;
tr = tv * 10000.0 / (5.0 - tv);
y = log(tr/20000.0);
y = (1.0/298.15) + (y *(1.0/4050.0));
temp=1.0/y;
temp = temp -273.15;
printf(lcd_putc,"\nT = %04.2fC", temp);
} while (TRUE);
}
 
Última edición:
hola borgo.

mira estoy utilizando las librerias que tienes, solo que le he cambiado para el pic18f2420, al momento de compilarlo me ha dado el siguiente error.

Error - could not find definition of symbol 'puntero_a' in file './1wire.o'.

No se la verdad que es lo que estoy haciendo mal de antemano gracias.
 
1Wire
hola borgo.

mira estoy utilizando las librerias que tienes, solo que le he cambiado para el pic18f2420,lo anterior ya trabaja con uno, lo que nesesito es trabajar con tres lo que quiero saber es que en tu codigo cuando declaras las variables externas, la pregunta es que valores tomas con essas variables
 
Hola, quiero implementar una red de sensores de temperatura DS18S20, consiguiendo llegar a simular en proteus solamente un sensor y que este se muestre en una display LCD. Esto es debido a que no entiendo como funciona realmente el Search ROM. ¿Alguien me podría ayudar con esto, mediante algún programa de ejemplo o alguna explicación básica?

El programa está creado en MPLAB X y C18, usando un PIC18F4550.

Gracias y un saludo de antemano.
 
Atrás
Arriba