Firtec

Trabajando con XC8 y el sensor Dallas DS18B20.

Este trabajo compilado con XC8 para un PIC18F4620, mide la temperatura con un sensor DS18B20 muestra la temperatura en una pantalla 16x2 y también envía por la UART el dato de temperatura.
En este ejemplo podemos encontrar rutinas para el envío de cadenas y manejo de la UART de un PIC18, las funciones para otros sensores como el DS18x20 y el manejo del una pantalla LCD 16x2.

 En particular hay dos funciones interesantes de comentar, la función que envía cadenas almacenada en la memoria de programa.

 

1
2
3
4
5
6
7
8
9
void xputrsUSART(const char *data)
{
  while(*data != '\0')
  {  
    while(BusyUSART());
    putcUSART(*data);
	*data++;
  }
}

 

 Donde vemos que la función no tiene argumento de retorno pero si de trabajo, un puntero del tipo char declarado const que apuntará a la cadena contenida en memoria de programa.
Un bucle que se repite mientras el carácter null no sea encontrado, este carácter no será transmitido por la UART.
Otro bucle while() es el encargado de recorrer la cadena enviando carácter por carácter esperando que el buffer del transmisor esté vacío, luego incrementa la dirección del puntero hasta que el bucle principal encuentre la marca del fin de cadena.
La función que envía cadenas desde la RAM es igual a la anterior solo que el puntero es del tipo char ya que apunta a la memoria RAM.

 

1
2
3
4
5
6
7
8
9
void xputsUSART(char *data)
{
  while(*data != '\0')
  {  
    while(BusyUSART());
    putcUSART(*data);
	*data++;
  }
}

 

El funcionamiento de esta función es idéntico al anterior.

El archivo principal quedaría de esta forma:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
void main(void){
float Grados=0; 	// Variable para contener el dato temperatura
char TempStr[5];	// String para convertir el dato en caracteres
 
OpenUSART (USART_TX_INT_OFF & 	// TX sin interrupción
           USART_RX_INT_OFF &	// RX sin interrupciónes
           USART_ASYNCH_MODE &	// Modo asincrónico
           USART_EIGHT_BIT &	// Modo alta velocidad
           USART_BRGH_HIGH, 64);// 19200 baudios a 20Mhz
 
lcd_init();	 //Inicializa el LCD
xputrsUSART("\n\r\nFirtec Data Logger Remoto de Temperatura");
xputrsUSART("\n\rFirmware revision v1.0\n\r");
lcd_putrs(" Iniciando....");
delay(5000);  // Espera 5 segundos para empezar a medir la temperatura.
lcd_gotoxy(2,1);
lcd_putrs("SENSOR DS18B20"); 
lcd_gotoxy(1,2);
lcd_putrs("Temperatura:    ");
 
while(1){
  Convert_Temperature();	
   Grados = Read_Temperature_DS18B20();
    sprintf(TempStr,"%2.1f", Grados);
     lcd_gotoxy(13,2);     
      lcd_puts(TempStr);
       xputrsUSART("\n\rCelsius: ");
        xputsUSART(TempStr);
         delay(1000);
 }
}

 

 

 El proyecto completo para MPLAB X lo puedes descargar desde este link

.