COMUNICAÇÃO MICROWIRE COM MICROCONTROLADOR PIC UTILIZANDO A LINGUAGEM "C"
Medidas Analógicas com CI externo - ADC0831


Todos aqueles habituados com os microcontroladores PIC sabem que muitos modelos hoje em dia possuem um conversor analógico digital (ADC) interno. Porém alguns outros modelos, considerados “simples”, mas presentes em muitas aplicações não possuem este recurso. Neste artigo demonstrarei como é fácil aplicar um CI externo com função ADC a um microcontrolador PIC Microchip muito difundido e bastante utilizado, o PIC16F628A.



A COMUNICAÇÃO MICROWIRE

A comunicação MICROWIRE foi definida pela National Semicondutores. O protocolo MICROWIRE é basicamente um subsistema extraído de outro protocolo, o SPI (Serial Peripheral Interface). Ambos os protocolos são do tripo serial síncrono, ou seja, além das linhas de dados na comunicação, há uma linha de “clock” para sincronizar a comunicação. Veja a figura abaixo.



Formato do protocolo MICROWIRE

O protocolo MICROWIRE permite uma comunicação full-duplex (comunicação bi-lateral) com apenas três “fios”. Estes três “fios” são definidos como:

SO – Serial Out – saída de dados
SI – Serial In – entrada de dados
SK – Serial Clock – “clock” de sincronismo

Além da comunicação full-duplex também é possível, com este protocolo, implementar uma pequena rede tipo Single Master – Multiple Slaves (Um mestre – vários escravos). Está rede serve apenas para integração de periféricos (dispositivos escravos) em uma placa ou mais de um determinado projeto. A distância máxima permitida entre o elemento “Mestre” e o elemento “Escravo” não deve ser superior a 50 cm, para evitar perdas. O número de “fios” ou pinos de I/O de um microcontrolador necessários para a montagem da rede é calculada com a seguinte fórmula:

onde,

W => “wires” (fios ou pinos de I/O);
n => número de escravos aplicados na rede.

Para compreender melhor as ligações referentes a esta rede, observe a figura abaixo.


Veja que agora, acrescentou-se mais um pino aos três já existentes. O pino CS (Chip Select) permite selecionar qual “escravo” deseja-se obter ou enviar informações.

Um outro detalhe sobre uma rede MICROWIRE diz respeito ao clock de sincronismo. Este é sempre gerado pelo elemento “mestre” presente na rede.

A velocidade de comunicação no protocolo MICROWIRE está intimamente ligada ao clock de sincronismo, e este geralmente tem seu valor máximo fixado em 400 KHz, dependendo do dispositivo. Calculando o período obtemos 2,5 x 10-6 segundos.

Observando a figura mais acima, que demonstrou o protocolo MICROWIRE, pode-se notar que são precisos 8 pulsos de clock para enviar ou receber um byte completo. Considerando um clock de 400 kHz, tem-se uma velocidade de 400 Kbps (bits por segundo) ou 50 KBps (bytes por segundo). Se estivermos lidando com aplicações que dependam de um baixo trafego de dados, a velocidade é muito boa. Apenas para efeito de comparação, a Internet hoje utiliza modens que permitem conexões de até 115 Kbps para conexões discadas (mas que raramente superam 56 Kbps) e até 4 Mbps para conexões ADSL (banda larga), dependendo da operadora e tipo do contrato fechado pelo usuário junto a essa.

Obs.: A maioria das redes ADSL tipo home (conexão banda larga doméstica) trabalham com velocidades da ordem de 512 Kbps a 1 Mbps.

No exemplo a ser demonstrado neste artigo, utilizei um clock de 10 x 10-6 segundos. Este período é mais que adequado à maioria dos periféricos MICROWIRE encontrados atualmente no mercado. Trabalha-se assim com velocidades da ordem de 100 Kbps ou 12,5 KBps.

Apenas para completar as informações já passadas, se você quiser conhecer um pouco mais sobre as empresas que empregam a MICROWIRE, alem da própria National Semicondutores, existem outras como a Microchip e Fairchild utilizando a MICROWIRE em suas memórias seriais.



O CI ADC0831

Como dito anteriormente, existem muitos tipos de periféricos disponíveis hoje no mercado que fazem uso da comunicação MICROWIRE. Um deles é o conversor analógico digital AD0831 da National Semicondutores. Este componente permite “converter” uma grandeza analógica aplicada a sua entrada em um “valor” binário correspondente, a ser entregue em sua saída. Na figura mais abaixo você tem a disposição dos pinos do ADC0831. Suas principais características são:

- Um canal AD (entrada);
- Resolução – 8 bits;
- Erro de +/- ½ LSB e +1 LSB;
- Alimentação: 5VDC;
- Consumo de 3 mA em 5VDC;
- Tempo de conversão: 32 us;
- Comunicação MICROWIRE;
- Fácil integração com microcontroladores;
- Possibilidade de operação stand allone;
- Referência proporcional ou com 5 VDC;
- Não requer ajustes externos para “zero” ou “escala máxima”;
- Pinos de I/O compatível com lógica TTL;




Aconselho o interessado em conhecer um pouco mais sobre as possibilidades deste componente, consultar seu datasheet encontrado gratuitamente na Internet. 

Obs.: A National Semicondutores disponibiliza uma linha bastante interessante de ADCs. A versão ADC0838 por exemplo, tem as mesmas características do ADC0831, porém com 8 entradas ADs disponíveis. Uma pesquisa no site da empresa poderá trazer muitas informações interessantes sobre outros ADCs.



O CIRCUITO DE TESTES

Na figura abaixo é dado um circuito elétrico para testes.




A proposta deste teste é fazer com que o ADC0831 (CI2) realize as conversões de um sinal analógico com variação entre 0 a 5VDC e as entregue a um microcontrolador PIC16F628A (CI1) através de uma pequena rede MICROWIRE. O microcontrolador por sua vez remeterá a conversão a um PC qualquer, através da porta RS-232. A “remessa” de dados é feita a cada um segundo.

Uma outra possibilidade disponível no circuito é o formato dos dados a serem remetidos. Estão previstos dois formatos básicos:

- byte obtido diretamente no ADC0831 (0 a 255);
- valor convertido para escala 0-5VDC.

Esta seleção é feita através de JP1. Com o mesmo aberto o dado enviado será previamente convertido entre 0 e 5VDC. Já com JP1 fechado, o dado a ser enviado será exatamente o obtido do ADC0831 (byte entre 0 e 255). Desta forma o circuito apresenta-se de uma forma bastante didática.

O circuito contem basicamente três CIs; CI1, CI2 e CI3. CI1 é o microcontrolador PIC16F628 da Microchip que trabalhará como o “mestre” na rede MICROWIRE gerarando o clock necessário para comunicação e colhendo o byte resultante da conversão AD e enviando este através da porta serial RS-232. CI2 é um ADC0831 National Semicondutores, já apresentado neste artigo. CI3 é bastante como e trata-se do drive MAX232 para comunicação RS-232. Este CI permite compatibilizar os níveis de tensão TTL das I/Os do microcontrolador com os níveis de tensão presentes na porta RS-232 de um PC (geralmente da ordem de +/- 12 VDC).

O LED D1 pisca a uma freqüência de aproximadamente 1 Hz (1 segundos). O resistor R3 é o limitador de corrente para D1. Esta “alegoria” presta-se apenas para informar o usuário sobre o funcionamento correto de CI1.

O resistor R1 tem a função de manter CI2 no modo “não selecionado”. Apenas quando o pino de I/O RB0 vai a nível lógico “0” CI2 é selecionado. Usando este recurso, conforme explicado você poderá montar uma pequena rede MICROWIRE de periféricos. Um outro ADC poderia ser incluso ou ainda uma pequena memória serial como a 93AA46C Microchip. Tudo dependerá da aplicação desejada.

O jumper JP1 seleciona o tipo de dado, conforme já detalhado. A comunicação entre o microcontrolador e o PC é feita através da porta RS-232. Para isso será necessário montar um cabo conforme a figura abaixo.




Os capacitores C1 e C2 são capacitores de desacoplamento e preferencialmente não devem ser omitidos. 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 deve ser feita em uma matriz de contatos ou mesmo placa padrão. Para isso será necessário algum conhecimento na interpretação de circuitos, porém isto não trará nenhum problema para aquele que se propor a montar este teste, pois eu acredito que se você já tem o conhecimento necessário sobre microcontroladores, também já tem uma série de outros pré-requisitos (conhecimentos) necessários no mundo da eletrônica.



O PROGRAMA

Neste site, mais abaixo em downloads, eu disponibilizei o programa montado na Linguagem C (teste_adc0831.c) que deverá ser utilizado neste teste. Utilizei para a montagem e compilação deste exemplo o compilador PICC CCS . A empresa CCS fornece uma versão demo que poderá ser utilizada por você 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 aquele que deseja “entrar” no mundo da programação dos microcontroladores PIC Microchip usando a Linguagem C.

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 das funções incluídas no programa.

Na figura abaixo temos o fluxograma que descreve a operação do programa desenvolvido para o exemplo proposto neste artigo. Ele começa por inicializar 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 – interrupção responsável pela captura dos dados do ADC0831 e o Timer1 – interrupção responsável pelo “piscar” do LED.


Após a inicializaçã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. Todas as outras funções presentes no processo são operadas por meio de interrupções.

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,08 x 125 = 2). Se o valor obtido é equivalente a 2 segundos, então o programa chama a função le_ADC0831. Esta função realizará a leitura do ADC0831 seguindo o protocolo MICROWIRE. Após a coleta dos dados, o estado de JP1 é analisado e se necessário a conversão do valor obtido é realizada através do calculo: Valor convertido = valor obtido no ADC x 0,0196. Em seguida o valor é remetido para o PC através da função printf.

A outra operação presente no programa é realizada pelo Timer1 do microcontrolador. Este 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, descrita anteriormente.

Temos no programa também uma interrupção para tratamento de um dado qualquer recebido do PC. Você notará que se o “eco” local do programa terminal utilizado para testes estiver desligado, o caracter teclado poderá ser visto. Isto porque o mesmo é remetido ao microcontrolador que 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 programa, está definida qual interrupção tem maior prioridade, que no caso, a interrupção do Timer0.

É importante salientar que a prioridade de interrupção controla apenas qual das interrupções deve ser atendida primeiro, caso mais de uma seja disparada ao mesmo tempo. A interrupção do Timer0 tem prioridade sobre todas as outras duas e a doTimer 1 tem prioridade sobre a int RDA. Um outro detalhe também muito importante é que o compilador CCS insere no código final, a ser gravado no microcontrolador, funções que permitem ligar e desligar as interrupções de forma global. 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ê entende 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, recomendo uma verificação minuciosa na mesma. Mesmo tratando-se de uma montagem experimental simples, não é incomum que ocorram alguns "enganos" na mesma. Perder alguns “minutinhos” nesta verificação, poderá evitar problemas e/ou surpresas desagradáveis. Confira tudo!

Faça o download do pacote disponível mais abaixo para gravar o microcontrolador. Grave o arquivo HEX no microcontrolador.

Não entrarei nos detalhes envolvidos na programação de um microcontrolador PIC Microchip neste artigo. Acredito que quem se propõe a testar um circuito como o aqui sugerido já possui a experiência necessária com a 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 e alimente o circuito (+5VDC). Gire P1 para obter a variação de valores entre 0 e 5VDC. Não se esqueça de ligar o cabo de comunicação entre o PC e o circuito e executar no PC 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.



CONCLUSÃO

Neste artigo tentei desvendar o protocolo MICROWIRE e suas características principais. Como você pôde observar, o uso deste protocolo é bem simples e não requer muitos requisitos. Um outro detalhe importante também é que você, de "quebra" ainda aprendeu a utilizar um conversor AD externo. Assim, microcontroladores que não possuem internamente este tipo de periférico não serão mais um problema, já que agora podem contar com mais este recurso. As informações aqui presentes avançam e se “entrelaçam”. Essa é uma realidade inevitável. Aconselho sempre a todos que estudem sempre. Valorizem a teoria e a pratica e evitem, ao máximo, o "Control Chup" (famoso Ctrl V, Ctrl C). Nada se aprende apenas com a "cola" de um programa. É preciso estudá-lo e compreender o seu funcionamento. E sempre, sempre mesmo, adaptá-lo as suas reais necessidades!!! Espero colaborar cada vez mais com a “biblioteca” particular de cada um, sempre com novas informações. Bons testes e até a próxima!



DOWNLOADS:

- Circuito elétrico usado nos testes
- Desenho do cabo de comunicação entre circuito e PC
- Pacote com código fonte e arquivo HEX para gravar o microcontrolador
- 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.