COMO USAR O CI DS1620 DALLAS COM MICROCONTROLADORES PIC



Muitas vezes precisamos colher a temperatura de um determinado local ou mesmo equipamento para um posterior processamento. Muitos são os dispositivos disponíveis no mercado que poderiam atender a esta solicitação. Um deles é o termômetro digital Dallas DS1620. Como aplicar este CI em conjunto com um microcontrolador PIC16F628 Microchip, é o objetivo deste artigo.



O CI DS1620

O CI DS1620, da Dallas Semicondutores, é um termômetro digital e termostato de excelente precisão para uso nos mais variados ambientes. Abaixo listo algumas de suas características:

- Não requer componentes externos;
- Alimentação entre 2,7 e 5,5 VDC
- Capacidade de mensurar temperaturas entre -55°C a +125°C em incrementos de 0,5°C (equivalente Fahrenheit: -67°F a +257°F em incrementos de 0,9°F);
- Leitura em 9 bits;
- Conversão (temperatura->word) feita em 1 segundo (máx.);
- Operação com controle através de uma CPU (microcontrolador) externa ou ainda stand alone (independente);
- Valores para configuração para termostato definidos pelo usuário;
- Memória para setup do tipo não-volátil (EEPROM);
- Comunicação via tri-wire serial (CLK, DO, /RST);
- Encapsulamento 8 pinos DIP (300-mil) ou SOIC (208-mil).


Obs.: o pino DQ, no texto é tratado como DO

Na figura acima você tem a disposição dos pinos do DS1620 para a versão DIP com 8 pinos e na tabela abaixo temos a descrição destes pinos.

Tabela – Descrição dos pinos para DS1620

Pino Nome Descrição
1 DO Entrada e saída dos dados para comunicação 3-Wire
2 CLK/CONV Entrada Clock para comunicação 3-Wire ou habilitação para conversão em modo stand alone
3 RST Entrada Reset para comunicação 3-Wire
4 GND Terra
5 TCOM Saída Trigger combinado para temperatura alta e baixa
6 TLOW Saída Trigger para temperatura baixa
7 THIGH Saída Trigger para temperatura alta
8 VDD Alimentação (3V – 5V +/- 10%)

Os pinos DO, /RST e CLK são utilizados para a comunicação 3-Wire com um microcontrolador, por exemplo, ou ainda com um “gravador” para os registros internos do DS1620, no caso da utilização do mesmo no modo termostato stand-alone.

Os pinos TCOM, TLOW e THIGH podem ser utilizados como “alarmes” para as temperaturas máximas e mínimas, configuradas pelo usuário, tanto em modo CPU (com microcontrolador externo) ou stand-alone (termostato independente).

O pino TCOM é ligado (levado a “1” lógico) sempre que a temperatura medida ficar acima da temperatura configurada no registrador TH, permanecendo assim até que a mesma caia abaixo desta. O mesmo também é levado ao estado lógico “1” caso a temperatura medida seja menor que a temperatura configurada no registrador TL.

Já o pino THIGH é levado ao estado lógico “1”, sempre que a temperatura medida for igual ou exceder a temperatura configurada no registrador TH. O pino TLOW opera de maneira similar, porém observando o registrador TL. Neste caso, sempre que a temperatura for igual ou inferior ao valor configurado no registrador TL, o pino será levado ao estado lógico “1”.

Na figura abaixo temos o registrador de configuração e status do DS1620. A descrição de cada um dos bits pode ser vista na tabela maix abaixo.

Tabela – Descrição dos bits do registrador de configuração e “status”

Bit Nome Descrição
7 DONE Aviso de Conversão: 1=conversão completa; 0=conversão em andamento
6 THF Temperature High Flag”. 1=temperatura medida igual ou maior ao valor estabelecido em TH. Permanece em até que seja escrito um “zero forçado” no registro ou a alimentação seja retirada. 0=temperatura abaixo do valor estabelecido em TH.
5 TLF Temperature LOW Flag”. 1=temperatura medida igual ou menor ao valor estabelecido em TL. Permanece em até que seja escrito um “zero forçado” no registro ou a alimentação seja retirada. 0=temperatura acima do valor estabelecido em TL
4 NVB No Volatile Busy Flag”: 1=escrita na EEPROM em andamento. 0=memória não ocupada.
1 CPU Tipo de uso: 0=modo “stand alone” com pino de CLK/CONV ativando a conversão (necessário RST em low). 1=modo “CPU” externa com comunicação “3-Wire”
0 1SHOT One-Shot Mode”: 1=uma única conversão quando comunicação iniciada (seqüência correta do protocolo). 0=conversão em modo continuo

Obs.: Os bits 0 e 1 (1SHOT e CPU, respectivamente) estão alocados na EEPROM interna do DS1620 e saem de fabrica ambos configurados com o nível lógico “0”. Os bits 2 e 3 têm seus níveis lógicos mantidos em 1 e 0, respectivamente e não possuem função estabelecida no registrador.

Agora que falamos sobre a pinagem e o registrador de configuração e status, podemos falar sobre os comandos existentes para o controle do DS1620. O controle é feito através de comandos por meio da comunicação 3-Wire que será discutida mais à frente. Na tabela abaixo você tem estes comandos.

Tabela – Comandos válidos para o DS1620

Instrução Descrição Valor Tratamento no DS1620
Comandos para conversão de temperatura
Read Temperature” Lê valor no registrador da última conversão AAH leitura
Read Counter” Lê valor que resta no contador A0H leitura
Read Slope” Lê valor no acumulador A9H leitura
Start Convert T” Inicia uma conversão de temperatura EEH ação
Stop Convert T” Para uma conversão de temperatura em andamento 22H ação
Comandos para controle do termostado
Write TH” Escreve o valor da temperatura limite desejada no registrador TH 01H escrita
Write TL” Lê o valor da temperatura limite estabelecida no registrador TH 02H escrita
Read TH” Escreve o valor da temperatura limite desejada no registrador TL A1H leitura
Read TL” Lê o valor da temperatura limite estabelecida no registrador TL A2H leitura
Write Config” Escreve byte no registrador de comando/configuração 0CH escrita
Read Config” Lê byte do registrador de comando/configuração ACH leitura

Obs.: Os dados lidos podem ter o formato de um “byte” (8 bits) quanto de uma “word” (16 bits – geralmente o DS1620 comporta apenas 9 bits em seus principais registradores)



COMUNICAÇÃO 3-WIRE PARA O DS1620

O nome 3-Wire reflete diretamente o tipo de comunicação que temos neste componente: uma comunicação do tipo serial síncrona, com três fios: Dados (DO), clock (CLK) e reset (RST). Neste tipo de comunicação o elemento de controle, o mestre, é responsável pela geração do clock de sincronismo e também o controle do reset. No caso do DS1620, o mesmo é feito levando o pino RST ao nível lógico “0”. Quando isto acontece, seu pino de dados é levado ao estado tri-state (alta impedância).

Na figura abaixo temos o gráfico que demonstra os tempos para a transferência de dados entre o DS1620 e um microcontrolador (microcontrolador lendo os registradores do DS1620).

E na figura baixo você pode ver o gráfico que demonstra os tempos para a transferência de dados entre um microcontrolador qualquer e o CI (microcontrolador escrevendo nos registradores do DS1620).

Nota: Os valores máximos, mínimos e médios para os tempos informados em ambos os gráficos devem ser consultados no datasheet do componente que pode ser obitido aqui.

Sempre que desejamos escrever um determinado dado nos registradores do DS1620, devemos iniciar a comunicação com o comando Write Config (0CH). Após receber este byte o DS1620 aguardará o próximo dado, que pode ser tanto um outro comando para configuração, quanto um dado para os registradores TH, TL, ou outro e neste caso os mesmos possuem de 8 a 9 bits.

Para a leitura a situação não é diferente. Primeiro devemos inserir o comando pertencente ao protocolo que informa ao DS1620 que desejamos ler um determinado registrador e em seguida aguardar o dado, que pode ser tanto um byte (como o caso do registrador de configuração/status) ou uma word (com 9 bits de relevância) para o caso da temperatura.

A seqüência com que estes dados são inseridos ou lidos representará o sucesso no manuseio deste CI. Estudar o protocolo e compreender o formato dos registradores ajudará muito neste processo. Para complementar os seu estudos é recomendável ler o datasheet do DS1620 com muita atenção.

Um outro detalhe importante sobre os dados recebidos do DS1620, diz respeito sobre a “interpretação” da temperatura negativa. Como dito, o dado recebido tem 9 bits. O nono bit tem a função de indicar o sinal da conversão. Se o bit estiver “ligado” (estado lógico 1) a temperatura informada é negativa. Neste caso, é necessário fazer o complemento de dois dos 8 bits menos significativos do dado. Para isso, basta inverter o estado de cada bit (o que é “0” vira “1” e vice-versa) e em seguida somar um ao byte já invertido (você estudou isso em lógica digital, lembra?). Caso o nono bit seja zero, a informação (temperatura) é positiva e nenhum complemento deverá ser realizado. Para exemplificar o que foi dito, veja dois exemplos na tabela abaixo:

Tabela – exemplo de tratamento dos dados para uma correta conversão


Temperatura positiva Temperatura negativa
Temperatura Temp = +25°C
Temp = - 25°C
Dado recebido 0 00110010 1 11001110
Método de conversão Nono bit = 1? Não! Então valor é positivo

Pegue os oito primeiros bits para conversão

00110010b = 50d

50d x 0,5d = 25

Nono bit = 1? Não!

Temp = +25°C

Nono bit = 1? Sim!
Então valor é negativo

Fazer complemento de dois dos oito primeiros bits

Inverter os bits de
11001110b = 00110001b

e somar 1b = 00110010b

00110010b = 50d

50d x 0,5d = 25

Nono bit = 1? Sim!

Temp = -25°C



CIRCUITO PARA TESTES

Na figura abaixo mostro um circuito elétrico que pode ser utilizado por você em seus testes. O mesmo é bem simples e possui apenas três CIs: um microcontrolador PIC16F628-04/P Microchip (CI1), um drive MAX232 Maxim (CI3) para compatibilizar os níveis TTL/RS-232, necessário para comunicação entre o microcontrolador e o PC e o próprio termômetro digital DS1620 Dallas (CI2).

Os capacitores C1, C2 e C3 são capacitores de desacoplamento. C4 a C7 são capacitores eletrolíticos necessários para a geração dos níveis RS-232 necessários (+/- 12VDC) por parte de CI2.

R1 mantém CI3 habilitado, levando seu pino /RST ao nível lógico “1” (VDC). R4 é um resistor limitador de corrente para a comunicação entre o microcontrolador e o DS1620. O LED é apenas um efeito visual do projeto (alegoria) que pisca a uma freqüência de 1Hz (1 segundo). R3 é seu resistor limitador de corrente. JP1 permite selecionar o tipo de conversão desejada: quando aberto (RA0 em nível lógico “1” através de R2) a conversão da temperatura é feita diretamente em graus Celsius. Quando fechado (RA0 em nível lógico “0”) a conversão é feita em Fahrenheit.

A comunicação entre o microcontrolador e o PC é feita através da sua porta RS-232. Para isso será necessário montar um cabo conforme a figura abaixo. A alimentação do circuito deve ser obtida através de uma fonte com saída regulada em 5VDC e corrente mínima de 300 mA.

A montagem deste circuito pode ser feita em uma matriz de contatos ou mesmo placa padrão. Para isso será necessário algum conhecimento na interpretação de circuitos eletrônicos, porém isto não trará nenhum problema para você que se propôs a montar este teste, pois julgo que quem agora busca conhecimentos no mundo dos microcontroladores já deve possuir uma série de outros conhecimentos necessários no mundo da eletrônica geral (analógica, digital, montagens, etc).



O PROGRAMA

Mais abaixo neste site disponibilizei o programa usado nos meus testes, desenvolvido com a Linguagem C (teste_DS1620.c). Utilizei para a montagem e compilação deste exemplo o compilador PICC CCS (http://www.ccsinfo.com). A empresa CCS fornece uma versão demo que poderá ser utilizada em seus testes. Esta versão possui algumas limitações como os tipos de microcontroladores habilitados e também no tamanho máximo do programa a ser compilado, porém é uma boa alternativa para aqueles que desejam “entrar” no mundo da programação na Linguagem C, mais especificamente dedicada aos microcontroladores PIC Microchip.

O programa foi ricamente comentado para ajudar na sua compreensão. Porém a seguir falarei um pouco sobre o seu funcionamento, descrevendo um pouco mais o uso das funções incluídas no programa.

Na figura abaixo mostro o fluxograma que descreve a operação do programa desenvolvido para o exemplo proposto neste artigo. Ele começa configurando o microcontrolador: a direção dos pinos (entrada ou saída), o Watch Dog Timer – relógio cão de guarda que evita que o programa se perda e assim que o microcontrolador trave por algum motivo, o Timer0 –  responsável pela captura dos dados do DS1620 e o Timer1 – responsável pelo “piscar” do LED.

Após a configuração do microcontrolador, o programa ficará preso na função main (principal). Nesta função apenas a condição de JP1 é lida e atualizada. Nenhuma outra função é chamada neste ponto do programa, pois todas as outras funções presentes no processo são operadas por meio de interrupções. Porém antes de iniciar o “laço” principal de leitura sobre JP1, durante a configuração do microcontrolador, o termômetro digital DS1620 também é configurado através da função config_DS1620().

A cada 0,08 segundos o Timer0 causa uma interrupção na operação do microcontrolador. Neste momento o microcontrolador desvia para a função trata_int_t0() para fazer o “tratamento da interrupção”. Este tratamento conta o número de interrupções até que este seja igual a 250 (0,008 x 250 = 2). Se o valor obtido é igual a 2 (dois segundos), então o programa chama a função le_DS1620(). O dado lido é inserido na variável global dado_rec (16 bits de tamanho).

Esta função realizará a leitura do DS1620 seguindo o protocolo 3-WIRE. Após a coleta dos dados (temperatura), a conversão do mesmo é realizada de acordo com o estado de JP1. Isto é feito pela função converte(). Antes da conversão o dado é analisado para saber se não se trata de um valor “negativo” (temperatura informada abaixo dos 0°C). Se for, é providenciado um complemento de dois na mesma, conforme indicado anteriormente. Em seguida o valor é convertido para Celsius ou Fahrenheit.

A outra operação presente no programa é realizada pelo Timer1 do microcontrolador. Este timer causa uma interrupção no microcontrolador a cada 0,526 segundos. Quando isso acontece a função trata_int_t1() para o tratamento da interrupção é chamada. Esta função verifica quantas interrupções aconteceram. Se duas (2 x 0,526 = 1,052 segundos) a função troca o estado atual do LED, fazendo-o piscar na freqüência de 1 Hz.

Há no programa também uma interrupção para tratamento de um dado qualquer recebido do PC. Você notará que mesmo se o “eco” local do programa terminal utilizado para testes estiver desligado, o caracter teclado poderá ser visto na tela. Isto porque o mesmo é remetido ao microcontrolador e este ao recebê-lo, chama a função RDA_isr() cuja a única tarefa é remeter o mesmo caracter recebido de volta (eco).

Temos então três interrupções habilitadas no programa. Na linha #priority timer0, timer1, RDA inserida no começo do arquivo teste_DS1620.h, defini qual interrupção tem maior prioridade. No caso a interrupção do Timer0.

É importante salientar que a prioridade de interrupção controla apenas qual das interrupções deve ser atendida primeira caso sejam disparadas ao mesmo tempo. O Timer0 tem prioridade sobre todas as outras duas, e o Timer1 tem prioridade sobre RDA. Um outro detalhe também muito importante é que o compilador CCS insere no código final, a ser gravado no microcontrolador, comandos que permitem ligar e desligar as interrupções. Isso evita que ao atender uma determinada interrupção, o microcontrolador sofra uma segunda interrupção e assim consecutivamente. Ou seja, ao entrar em uma função de tratamento de interrupção, todas as outras (e a própria) são desabilitadas. Enquanto as operações dentro da função de tratamento de interrupção atual não se finalizarem, nenhuma outra será chamada. Agora você pode entender a importância do Watch Dog Timer. Caso algo na lógica do programa saia errado, o WDT "resetará" o microcontrolador, iniciando as operações.



TESTE E USO

Após a montagem, seja qual for o método escolhido, aconselho uma verificação minuciosa na mesma. Perder alguns “minutinhos” nesta verificação poderá evitar problemas e/ou surpresas desagradáveis. Confira tudo!

Faça o download do pacote teste_DS1620.zip mais abaixo neste site. Este pacote contém o arquivo HEX para gravar o microcontrolador. Grave este arquivo no microcontrolador.


Não entrarei nos detalhes envolvidos na programação de um microcontrolador PIC Microchip neste artigo. Acredito que o leitor que se propôs a testar o circuito aqui sugerido possui a experiência necessária na gravação do microcontrolador utilizado.

Após gravar o microcontrolador, insira-o novamente na matriz de contatos ou placa padrão, de acordo com sua montagem. Alimente o circuito. Não se esqueça de ligar o cabo de comunicação entre o PC e o circuito e executar um programa terminal como o Hyper Terminal do Windows, por exemplo. Este programa deve ser configurado para operar a uma taxa de comunicação de 9600 bps, 8 bits de dados, 1 stop bit, sem paridade e sem qualquer controle de fluxo. Com JP1 aberto (RA0 = 1), o dado enviado terá o formato apresentado como segue:

TEMP-> XX,XX°C [LF][CR]

Com JP1 fechado (RA0 = 0), o dado enviado terá o formato apresentado como segue:

TEMP-> XX,XX°F [LF][CR]

Obs.: [LF][CR] representam line feed (alimentação de linha) e carriage return (retorno de carro, respectivamente. Estes dois caracteres permitem que o terminal mostre uma amostra por linha.



CONCLUSÃO

Neste artigo tentei desvendar o uso de um componente bastante interessante, o termômetro digital DS1620. Muitos projetos podem ser feitos a partir do mesmo. Espero poder colaborar, sempre que possível, com a sua “biblioteca” particular. Bons testes e até a próxima!



DOWNLOADS

- Circuito elétrico
- Pacote com código fonte e arquivo HEX
- Lista de materiais



Copyright deste conteúdo reservado para Márcio José Soares e protegido pela Lei de Direitos Autorais LEI N° 9.610, de 19 de Fevereiro de 1998. É estritamente proibida a reprodução total ou parcial do conteúdo desta página em outros pontos da internet, livros ou outros tipos de publicações comerciais ou não, sem a prévia autorização por escrito do autor.