lunes, 26 de noviembre de 2012

Sensor de temperatura DS18B20

Probé este sensor de temperatura y me encantó. Es fácil integrarlo a un diseño donde se quiera medir la temperatura ya que emplea solo un pin para comunicarse con el microcontrolador, adémás de los 5V de alimentación y tierra.
El único componente externo que hay que conectarle al bus de datos es una resistencia pull-up de 4,7K (según hoja de datos), cuando hice la prueba contaba con una de 5,6K y funcionó bien.
El rango de temperatura que maneja este sensor es de -55 a 125º C y el encapsulado es TO-92.
El microcontrolador empleado para la prueba es el 16F886, el programa fue escrito en C con el compilador CCS y los driver para este sensor fueron encontrados en el foro oficial de CCS.
Lo que hay que cambiar en el driver 1wire.c es el pin que van usar en el microcontrolador, ya que viene configurado para el pin C5.
La imagen es a modo de ilustración.

Descargar el programa.
Tema tratado en foro

lunes, 17 de septiembre de 2012

Envío de datos desde el puerto serie del pic a una planilla de Excel.

Utilizando Hyperterminal y creando un archivo CSV (comma separates value)  se puede usar Excel para abrirlo y tener de forma tabulada la información que se envía desde el pic.
La forma de hacerlo es la siguiente: en Hyperterminal se debe abrir Transfer-> Capture Text y se renombra captura.csv, por ejemplo.
Para que el pic mande informacion a columnas distintas se deben separar con comas, o punto o punto y coma, en mi caso uso punto y coma, hay que probar cual da resultado .

Por ejemplo para formar dos columnas Tiempo y Tension en el pic se escribe el siguiente codigo:


printf("Tiempo)");
putc(0x3B); //valor hexadecimal del caracter punto y coma
printf("Tension\r")

El programa que uso para el ejemplo esta escrito usando el compilador CCS, y mide la tensión de un potenciometro convirtiéndola a digital.


void main()
{
   int16 q;
   int16 p=0;
   setup_adc_ports(AN0);
   setup_adc(ADC_CLOCK_INTERNAL);
printf("Tiempo");
putc(0x3B);//envia punto y coma
printf("Tension\r");
for(;;){
   set_adc_channel(0);  
   delay_us(20);
   q=read_adc();
printf("%4ld",p++);//p se incrementa cada un segundo y se envia por usart
putc(0x3B);
printf("%4ld\r",q);//q contiene el valor del convertidor ana / dig
delay_ms(1000);
   }
}