Site hosted by Angelfire.com: Build your free website today!

 

Sistemas de visualização em LedArray usando microcontroladores PIC 16F84A

Por Luis Rodrigo Szabo

Introdução

Quando desenvolvemos algo utilizando microcontroladores ou mesmo microprocessadores, e isso envolve algum tipo de interface entre o usuário e o sistema, a primeira coisa que surge em nossas mentes é: como será a interface com o usuário? Como será a leitura dos dados? E como o usuário irá entrar os dados no sistema?

Logo somos facilmente levados a pensar em displays de sete segmentos, displays de cristal líquido ou displays LCD inteligentes onde podemos escrever caracteres numéricos facilmente com precisão numérica de várias casas decimais.

No entanto nem sempre os usuários preferem esse método. Por que alguns ainda preferem dispositivos analógicos utilizando ponteiros ou sistemas com leds em linha? A resposta é simples: porque em certos casos a precisão não é tão relevante quanto o tempo de resposta, ou em outros casos a variação rápida de um determinado valor causa dúvidas quanto a leitura. Nesse casos se torna mais interessante o uso de dispositivos de leitura menos precisos em casas decimais.

Caso Prático

Um caso prático onde usei um sistema de visualização por leds em linha foi num manômetro de baixa pressão utilizado para determinar a pressão inspiratória e expiratória enviada para o paciente em um ventilador mecânico usado em CTI's, e que, infelizmente, não saiu do protótipo. A idéia desse manômetro era tornar a leitura semelhante a dos manômetros mecânicos que usam ponteiros. Foi usado para este projeto um microcontrolador PIC16F84A facilmente encontrado no mercado, que possui apenas 13 portas para multiplexar 40 leds e ler um conversor AD serial, posteriormente foi possível inserir um teclado com até 8 teclas, 1 buzzer, 1 solenóide e a possibilidade de ligar até 6 leds adicionais. Você poderia pensar " é muita coisa para um microcontrolador tão pequeno!". Realmente o ideal seria utilizar um microcontrolador com mais portas, onde poderíamos ter mais portas disponíveis para os dispositivos. Mas através de técnicas de  multiplexação e utilização de alguns integrados TTL ou HCMOS comuns foi possível expandir em muito a capacidade de um simples microcontrolador.

Outros exemplos de utilização de LedArrays

  • VU's para sistemas de áudio

  • Medidores de rotação para carros

  • Manômetros

Multiplexando 40 leds com 8 portas

Usando um demux 74LS138 é possível acender 8 seqüências de 5 leds o que proporciona 40 leds de resolução

O software funciona da seguinte forma: Utilizou-se oito portas do microcontrolador sendo que 5 delas para enviar os dados e 3 portas para a seqüência codificada que é decodificada pelo 74LS138. Programa-se o timer para ligar cada seqüência de 5 leds a cada 1ms assim tem-se o sistema atualizado a cada 8ms como nosso olho não percebe tal variação temos a sensação de um sistema contínuo. Abaixo temos alguns trechos do código assembler da rotina update bar 

UpdateBar

movlw 0x01
movwf PCLATH
incf TempD,W      ;incrementa TempD em W 
xorlw 0x09        ;compara com 9
btfsc STATUS,Z    ;
clrf TempD        ;se for igual limpa TempD
incf TempD,F      ;senão incrementa TempD
movf TempD,W      ;Carrega tempD em W
call MuxTable     ;chama tabela
movwf TempC       ;retorna valor da tabela em grava em TempC
movlw FirstBar    ;
xorwf TempC,W     ;compara MUX de FirstBar com TempC
btfsc STATUS,Z    ;
goto UpdateFirst  ;se igual vai para UpdateFirstBar
movlw SecondBar   ;senão compara como SecondBar
xorwf TempC,W     ;...
btfsc STATUS,Z    ;
goto UpdateSecond ;
movlw ThirdBar    ;
xorwf TempC,W
btfsc STATUS,Z
goto UpdateThird...


UpdateFirst

movlw 0x06        ;movimenta ultimo valor da primeira...
subwf LedBar,W    ;...barra e compara com LedBar
btfsc STATUS,C    ;se >= vai para FullBar
goto FullBar      ;
movf LedBar,W     ;senão carrega valor de LedBar em W
sublw 0x05        ;subtrai do ultimo valor da primeira Barra
goto DisplayOut   ;vai para Display OUT

UpdateSecond

movlw 0x0B        ;movimenta o ultimo valor da segunda...
subwf LedBar,W    ;...barra e compara com LEDBAR
btfsc STATUS,C    ;se >= vai para... 
goto FullBar      ;...FullBar
movlw 0x06        ;senão compara com o primeiro valor...
subwf LedBar,W    ;da segunda barra se < vai para... 
btfss STATUS,C    ;
goto ZeroBar      ;...ZeroBar
movf LedBar,W     ;senão carrega valor de LedBar em W
sublw 0x0A        ;subtrai do ultimo valor da primeira Barra
goto DisplayOut   ;vai para DisplayOUT


UpdateThird

movlw 0x10
subwf LedBar,W....

FullBar

movlw 0x06      ;carrega 0 em W
goto DisplayOut ;vai para DisplayOut

ZeroBar

movlw 0x05      ;carrega 5 em W
goto DisplayOut ;vai para DisplayOut

 

LedTable
addwf PCL,F
retlw B'00011111'    ;0
retlw B'00011110'    ;1
retlw B'00011100'    ;2
retlw B'00011000'    ;3
retlw B'00010000'    ;4
retlw B'00000000'    ;5
retlW B'00011111'    ;6

MuxTable
addwf PCL,F
retlw B'00000000'    ;0
retlw B'00000000'    ;1
retlw B'10000000'    ;2
retlw B'01000000'    ;3
retlw B'11000000'    ;4
retlw B'00100000'    ;5
retlw B'10100000'    ;6
retlw B'01100000'    ;7
retlw B'11100000'    ;8

Inserindo um conversor AD ao nosso projeto

O ideal em um sistema onde precisamos de um conversor AD é utilizar um PIC 16C71 que possui o conversor AD no próprio microcontrolador.

Outra opção está em inserir um conversor AD em nosso sistema de forma bastante econômica utilizando-se um conversor serial, da família ADC083x que possui de 1 a 8 portas analógicas. A figura abaixo mostra um exemplo de utilização baseado no ADC0832 com 2 canais analógicos, é possível configurar a leitura para 2 canais independentes ou 1 canal diferencial, e cuja leitura de cada canal é configurada pelo pino DI do conversor, a leitura se da de forma síncrona, ou seja, depende do sinal de um clock enviado ao conversor. 

Existem outras alternativas, que vão depender do tipo de sinal e da velocidade de conversão, existem no mercado conversores tensão / freqüência, ou conversores VF, como o AD654 da Analog Devices para sinais que não necessitam  de velocidade.

Tabela de configuração dos canais no modo entrada normal

 

End. de MUX Canal
SGL  /DIF ODD /SIGN 0 1
1 0 +  
1 1   +

 

Tabela de configuração dos canais para o modo diferencial

End. de MUX Canal
SGL /DIF ODD /SIGN 0 1
0 0 + -
0 1 - +

 

Abaixo temos um exemplo de rotina para a leitura do ADC0832 para o canal 0 em modo entrada normal

LeADC

movf PORTA,w
movwf TempF
clrf ADCresult
bcf PORTA,ADCCS    ;ativa /CS inicalizando a conversão
movlw .8           ;Seta o numero de bits para ler em = 8 +1 start
movwf ADCCTR       ;carrega no registrador de contagem
bsf PORTA,ADCDI    ;start count
nop
call Clock         ;clock
bsf PORTA,ADCCLK   ;configura como saída simples
bcf PORTA,ADCDI    ;configura para ler o canal 0
bcf PORTA,ADCCLK   ;
call Clock         ;clock

Get_One_Bit

call Clock         ;clock 
bcf STATUS,C       ;limpa Carry Bit
btfsc PORTA,ADCDO  ;checa valor do bit na saida do ADC
bsf STATUS,C       ;bit é um ... seta carry bit e roda
rlf ADCresult,F    ;bits para esquerda a partir do carry em ADResult
decfsz ADCCTR,F    ;decrementa Bit Counter
goto Get_One_Bit
bsf PORTA,ADCCS
movf TempF,W
movwf PORTA

;LIMITA max leitura < 255 bytes
movlw .248         ;Limita leitura do ADC para 248 prevenindo
subwf ADCresult,w  ;um overflow na tabela
btfss STATUS,C
goto ConvertBar    ;Se valor <249 retorna
movlw .248         ;senão limita o valor em 248
movwf ADCresult

Clock

bsf PORTA,ADCCLK
nop
bcf PORTA,ADCCLK
return

Rotina para conversão dos dados lidos pelo ADC0832 para leds

Para que a rotina Updatebar possa saber quantos leds são necessários acender precisa converter o dado lido pelo conversor ADC em número de leds acesos. É possível fazer o cálculo matematicamente, ou seja, através de uma expressão ou através de uma tabela. Fazendo-se através de uma expressão temos  possibilidade de economizar memória de programação mas aumentamos o processamento, se usarmos uma tabela, utilizamos 256 bytes de memória, que é considerável se tivermos apenas 1024 bytes de memória programável, mas é possível economizar em processamento e além do mais podemos utilizar uma tabela adequando valores para sensores de resposta não linear, ou seja, podemos linearizar uma leitura não linear. No exemplo abaixo temos o uso de uma tabela.

ConvertBar
movlw HighTable    ;carrega banco 3 no PCLATH
movwf PCLATH       ;
movf ADCresult,W   ;carrega ADCresult em W
call ConvertTable  ;chama tabela de conversão
movwf LedBar       ;salva valor retornado em LedBar
clrf PCLATH        ;carrega banco 0 no PCLATH
return

ConvertTable

    addwf PCL,F
    retlw .0 ;0 
    retlw .0 ;1 
    retlw .0 ;2 
    retlw .0 ;3 
    retlw .1 ;4 
    retlw .1 ;5 
    retlw .1 ;6 
    retlw .1 ;7 
    retlw .1 ;8 
    retlw .1 ;9 
    retlw .2 ;10 
    retlw .2 ;11 
    retlw .2 ;12 
    retlw .2 ;13 
    retlw .2 ;14 
    retlw .2 ;15 
    retlw .3 ;16 
    retlw .3 ;17 
    retlw .3 ;18 
    retlw .3 ;19 
    retlw .3 ;20 
    retlw .3 ;21 
    retlw .4 ;22 ...

... retlw .39 ;240 
    retlw .39 ;241 
    retlw .39 ;242 
    retlw .39 ;243 
    retlw .39 ;244 
    retlw .40 ;245 
    retlw .40 ;246 
    retlw .40 ;247 
    retlw .40 ;248 

Listagem Completa do programa e diagrama

Programa LEDARRAY

Diagrama do circuito em formato CKT(CircuitMaker)

 

[Home] - [Projetos] - [Downloads] - [News] - [Links] - [Currículo]