Nesse exemplo mostro a solução de um problema que eu tive em um projeto que é o tempo de conversão dos DS18S20 que gira em torno de 700ms, mas como eu não podia ficar aguardando todo esse tempo fiz a solução que consiste em iniciar a conversão e aguardar a finalização para ler o valor já convertido.

Usar no Proteus 7.10 ou superior.


Fazer o download:[Linguagem C] Lendo o Sensor Ds18s20


Segue o código:

[sections] [section title=”Esquema Elétrico”]
[Linguagem C] Lendo o Sensor Ds18s20
[Linguagem C] Lendo o Sensor Ds18s20
[/section]

[section title="Código Fonte"]

/*
DATEK Tecnologia Eletrônica Ltda.

********************************************************************************
PROGRAMA EXEMPLO: Mostrar como ler o sensores de temperatura DS18S20.
OBJETIVO: Aprender como ler o sensores de temperatura DS18S20.
AUTOR: Fabio Mulero.[fabio@datek.com.br]
********************************************************************************
MICROCONTROLADOR: PIC18F4620.

PLACA DE DESENVOLVIMENTO: SIMULAÇÃO NO PROTEUS

SOFTWARE: MikroC PRO for PIC Versão: 6.0

********************************************************************************
*/
//### DIRETIVAS DE PROGRAMA ####################################################
#include "built_in.h"

//### DEFINES E MACROS #########################################################
// Constantes
#define NAO 0
#define SIM 1
#define DESLIGA NAO
#define LIGA SIM
#define FALSO NAO
#define VERDADEIRO SIM
#define SAIDA NAO
#define ENTRADA SIM
// Macros

//### DECLARAÇÃO DE ALIASES DOS PINOS ##########################################
//--- Configuração dos pinos do LCD --------------------------------------------
// CONFIGURAÇÃO DOS PINOS DO LCD.
sbit LCD_RS at RD1_bit;
sbit LCD_EN at RD0_bit;
sbit LCD_D7 at RD6_bit;
sbit LCD_D6 at RD5_bit;
sbit LCD_D5 at RD4_bit;
sbit LCD_D4 at RD3_bit;

// DIREÇÃO DOS PINOS.
sbit LCD_RS_Direction at TRISD1_bit;
sbit LCD_EN_Direction at TRISD0_bit;
sbit LCD_D7_Direction at TRISD6_bit;
sbit LCD_D6_Direction at TRISD5_bit;
sbit LCD_D5_Direction at TRISD4_bit;
sbit LCD_D4_Direction at TRISD3_bit;

//################## PROTOTIPOS DE FUNÇÃO ######################################
void Inicializa_PIC();
unsigned char Leitura_Temperatura(unsigned char Canal,unsigned int *Valor,unsigned char *contTemperatura);
void MostraTemperatura(unsigned char Linha,unsigned char Coluna,int Temperatura,unsigned char CasasDecimais,unsigned char Separador);

//################## VARIAVEIS GLOBAIS #########################################

/* ROTINA PARA TRATAMENTO DE INTERRUPÇÕES*/
//=== ROTINA PARA TRATAMENTO DE INTERRUPÇÕES ===================================
void interrupt()
{
}

//################## FUNÇÃO MAIN() #############################################
void main()
{
   unsigned char cTemp1,cTemp2,cTemp3,cTemp4;
   unsigned int iTemp1,iTemp2,iTemp3,iTemp4;
   Inicializa_PIC();
   while(1)
   {
      if(Leitura_Temperatura(0,&iTemp1,&cTemp1)) // Executa a leitura
      {
         MostraTemperatura(1,1,iTemp1,1,'.'); // Mostra no LCD
      }
      if(Leitura_Temperatura(1,&iTemp2,&cTemp2)) // Executa a leitura
      {
         MostraTemperatura(2,1,iTemp2,1,'.'); // Mostra no LCD
      }
      if(Leitura_Temperatura(2,&iTemp3,&cTemp3)) // Executa a leitura
      {
         MostraTemperatura(3,1,iTemp3,1,'.'); // Mostra no LCD
      }
      if(Leitura_Temperatura(3,&iTemp4,&cTemp4)) // Executa a leitura
      {
         MostraTemperatura(4,1,iTemp4,1,'.'); // Mostra no LCD
      }
   }
}

//################## FUNÇÕES AUXILIARES ########################################
void Inicializa_PIC()
{
   TRISA = 0xff;
   TRISB = 0x00;

   CMCON = 0x07; // Desabilita comparadores

   //--------------------------------------
   // Desabilita todas as interrupções
   //--------------------------------------
   INTCON = 0; // Desabilita GIE, PEIE, TMR0IE,INT0IE,RBIE
   INTCON2 = 0xF5;
   INTCON3 = 0xC0;
   IPEN_bit = DESLIGA; // Desabilita niveis de prioridade nas interrupções
   PIE1 = 0;
   PIE2 = 0;
   PIR1 = 0;
   PIR2 = 0;
   RBPU_bit = 1; // PULLUP Interno do PORTB Desligado

   Lcd_Init(); // Inicializa LCD.
   Lcd_Cmd(_LCD_CLEAR); // Apaga display.
   Lcd_Cmd(_LCD_CURSOR_OFF); // Desliga cursor.
   // Config. LCD no modo 4 bits
}

void MostraTemperatura(unsigned char Linha,unsigned char Coluna,int Temperatura,unsigned char CasasDecimais,unsigned char Separador)
{
   char txt[8],cont=0;
   IntToStrWithZeros(Temperatura, txt); // Converte o valor da temperatura em texto
   // for para inserir o ponto decimal no local correto
   for(cont=0;cont<9;cont++) { if(cont==((sizeof(txt)-3)-CasasDecimais)) // Tamanho da matriz - (ponto+sinal+terminador de string) { txt[cont]=Separador; // Insere separador break; // Finaliza for } else { txt[cont]=txt[cont+1]; // Desloca caractere para a esquerda } } Lcd_Out(Linha,Coluna,"Temp:"); // Escreve no LCD Lcd_Out_CP(txt); // Escreve no LCD o valor convertido Lcd_Out_CP(" C"); // Escreve no LCD } unsigned char Leitura_Temperatura(unsigned char Canal,int *Valor,unsigned char *contTemperatura) { unsigned char v1,v2,v3; int Valor1; if((*contTemperatura)++==0) { Ow_Reset(&PORTC, Canal); // Sinal de reset Ow_Write(&PORTC, Canal, 0xCC); // Comando SKIP_ROM Ow_Write(&PORTC, Canal, 0x44); // Comando CONVERT_T } else if(*contTemperatura>5) // Tempo para executar a conversão
   {
      *contTemperatura=0;
      Ow_Reset(&PORTC, Canal); // Sinal de reset
      Ow_Write(&PORTC, Canal, 0xCC); // Comando SKIP_ROM
      Ow_Write(&PORTC, Canal, 0xBE); // Comando READ_SCRATCHPAD
      v1 = Ow_Read(&PORTC, Canal); // Parte Baixa
      v2 = Ow_Read(&PORTC, Canal); // Parte Alta
      if((v1==0xff)&&(v2==0xff)) // Caso esteja sem o sensor
      {
         *Valor = 0; // Zera o Valor
         return 1;
      }
      v3 = v1>>1; // Divide por 2
      Valor1= (v1&1)?5:0; // Verifica se 0.0 ou 0.5
      Valor1+=v3*10; // Soma valor inteiro e multiplica por 10 para ser inteiro EX: 27.5 fica 275.
      Valor1*=(v2!=0)?-1:1; // Verifica se é negativo
      *Valor = Valor1; // Pega valor convertido na variável
      return 1; // Indica que a conversão está OK
   }
   Delay_us(120);
   return 0; // Indica que a conversão ainda não está finalizada
}



[/section]
[/sections]


Obrigado e até o próximo post.

DATEK Tecnologia Eletrônica
[Linguagem C] Lendo o sensor DS18S20
Tags:                                 

Deixe uma resposta

%d blogueiros gostam disto: