ÍNDICE DE CONTEÚDO
Neste artigo será apresentado como ler o conversor A/D (analógico para digital) interno do microcontrolador PIC18F4550 e exibir o valor da conversão em um display LCD 16×2, os quais são periféricos amplamente aplicados em projetos envolvendo sistemas embarcados. Abordaremos como utilizar as bibliotecas disponibilizadas pelo compilador MikroC para o PIC e os registradores para configuração do conversor A/D.
Para este tutorial, serão utilizadas as ferramentas:
Obs: Foram utilizadas versões de avaliação que possuem limitações.
Criando o projeto no MikroC para PIC
Uma vez instalado o MikroC, basta abrir o programa e iniciar a criação do projeto clicando em File -> New -> New Project.
Em seguida, o programa solicitará informações referentes ao nome do projeto, microcontrolador empregado, pasta de destino dos arquivos e a frequência de trabalho, a qual deverá ser selecionada 20 MHz (20.000.000), uma vez que será utilizado um cristal oscilador externo no circuito de simulação:
Logo em seguida, caso o usuário deseje incluir algum projeto desenvolvido anteriormente, basta informar a localização do arquivo, caso contrário, apenas selecione Next. Uma vez realizada esta etapa, deve-se agora selecionar se o usuário deseja adicionar todas as bibliotecas disponibilizadas pelo MikroC selecionando a opção Include All (recomendado) ou deseja não adicionar nenhuma selecionando a opção Include None. Por fim selecione Finish para que o programa possa abrir a tela em que será desenvolvida a programação.
Selecionando fusíveis de configuração do PIC
Após criar o projeto, deve-se clicar em Edit Project para configurar adequadamente os fusíveis do microcontrolador, os quais são registradores empregados para selecionar os recursos que se deseja utilizar em relação ao hardware do dispositivo, tais como tipo de oscilador, utilização de comparadores internos, habilitação de master clear, entre outros. Neste projeto deve-se atentar-se aos fusíveis:
Fusível |
Seleção |
Descrição |
PLL Prescaler Selection |
Divide by 5 (20 MHZ oscillator input) |
Divide a frequência do oscilador por 5 (utilizado para oscilador de 20 MHZ) |
Oscillator Selection |
HS oscillator (HS) |
Oscilador High Speed externo ( 4 ~ 20 MHz) |
PORTB A/D |
Disabled |
Seleciona RB0 até RB4 como portas I/O |
MCLR Pin |
Enabled |
Habilita master clear do microcontrolador |
Biblioteca LCD
O MikroC PRO for PIC fornece uma biblioteca de comunicação de 4 bits para controle de displays LCD paralelos. Dentre as características desse recurso, sobressai-se a simplicidade e a denominação sugestiva das funções disponibilizadas. Para utilizar esta biblioteca é necessário que se configure primeiramente as I/Os empregadas para comunicação com o display, o próprio MikroC disponibiliza em sua guia Help o acesso às informações pertinentes a esta biblioteca. Para acessar esse recurso, basta pressionar F1 no teclado, clicar em Pesquisar e digitar display LCD. Uma vez realizado este procedimento, o programa listará todos os tópicos referentes a displays LCD, selecione Lcd Library.
Uma vez realizado o procedimento, será disponibilizado para o usuário as informações referentes às funções da biblioteca e a configuração das I/Os empregadas.
Serão utilizadas as configurações disponibilizadas pelo MikroC, cada linha de código em que houver um sbit termo1 at termo2, significa que está havendo uma vinculação entre o termo1 e o termo2. Por exemplo, a primeira linha de código consiste em sbit LCD_RS at RB4_bit, isso quer dizer que sempre que alguma das funções da biblioteca utilizar a palavra LCD_RS ela estará na verdade se referindo a RB4_bit, que por sua vez consiste ao acesso a um bit do registrador que altera o nível lógico de um pino PORTB (no caso). Porém, se fosse sbit LCD_RS at RC4_bit, estaríamos acessando um bit do registrador que altera o nível lógico de um pino no PORTC. Portanto consiste em “apelidos” empregados para que o código se torne mais favoravelmente interpretado por parte do usuário.
Funções da biblioteca display LCD
Vale salientar que a exibição de informações no display LCD por meio da biblioteca se dá apenas por meio de strings, dessa forma mensagens pré definidas podem facilmente serem exibidas. Todavia qualquer forma de dado que não corresponda a um caractere (char) ou uma string necessita ser convertido para posteriormente ser exibido. Consequentemente, para que seja possível exibir valores obtidos de sensores, ou contadores, haverá a necessidade de se utilizar o recurso de conversão disponibilizado pelo MikroC. Abaixo é exibida uma tabela contendo informações referentes às funções provenientes da biblioteca e das funções de conversão aplicadas no código.
Função |
Descrição |
Lcd_Init() |
Inicializa biblioteca. |
Lcd_Cmd(_LCD_CLEAR) |
Limpeza de tela do dispositivo. |
Lcd_Cmd(_LCD_CURSOR_OFF) |
Desliga cursor do display. |
Lcd_Out(linha,coluna,mensagem) |
Exibe uma mensagem ou conteúdo de uma string na linha e coluna especificada. |
Lcd_Out_Cp(mensagem) |
Exibe uma mensagem ou conteúdo de uma string na linha e coluna em que se encontra o cursor o display. |
Funções de conversão e manipulação de string
Função |
Descrição |
IntToStr(var int,string) |
Função empregada para realizar a conversão valores inteiros para strings. |
Ltrim(string) |
Função utilizada para recortar espaços vazios situados a esquerda do primeiro caractere que compõe a string. |
Biblioteca conversor A/D
O microcontrolador PIC 18F4550 dispõe de 13 entradas analógicas, em que 5 se encontram no PORTA, 5 localizadas no PORTB, das quais 4 podem ser habilitadas pelo fusível de configuração PORTB A/D, 3 localizadas no PORTE. Todas estas entradas analógicas são direcionadas para o conversor A/D de 10 bits do microcontrolador por meio do multiplexador interno, o qual seleciona o canal para obter o sinal analógico proveniente do dispositivo periférico (sensor), por meio dos bits CHS0, CHS1, CHS2, CHS3 do registrador ADCON0.
Para acessar as informações referentes à biblioteca do conversor A/D, basta repetir os passos executados para acessar as informações disponibilizadas sobre a biblioteca de manipulação de displays LCD, porém digitando ADC em pesquisar.
Funções da biblioteca de conversor A/D
A biblioteca fornecida pelo MikroC para a utilização do módulo analógico dos microcontroladores apresenta 3 funções, das quais 2 serão empregadas no projeto. Vale salientar que, embora uma das funções seja destinada à configuração do módulo analógico, haverá a necessidade de consultar o datasheet do dispositivo para consultar os registradores referentes à configuração deste recurso, uma vez que a quantidade de portas analógicas aplicadas ao projeto está em função da necessidade do usuário. Será disponibilizada abaixo uma tabela referente às funções contidas no projeto.
Função |
Descrição |
ADC_Init() |
Inicializa o módulo analógico do microcontrolador. |
ADC_Get_Sample(short canal) |
Recebe o valor analógico proveniente da porta analógica indicada pela variável “canal”, podendo ser também utilizado o respectivo número do canal.
|
Registrador ADCON1
O ADCON1 consiste em um registrador importante para a configuração do módulo analógico do microcontrolador PIC18F4550, uma vez que por meio dos bits PCFG0, PCFG1, PCFG2, PCFG3, serão selecionadas as respectivas portas configuradas como entradas analógicas. É disponibilizado no datasheet do componente uma tabela referente ao valor que os 4 bits devem assumir para configurar as portas analógicas.
No projeto em questão serão utilizadas as portas analógicas AN0, AN1 e AN2, consequentemente, observando a tabela disponibilizada abaixo. Deve-se estabelecer os bits PCFG3:PCFG0 do registrador ADCON1 como:
- PCFG0: 0
- PCFG1: 0
- PCFG2: 1
- PCFG3: 1
Obs: As entradas analógicas também devem ser configuradas como entradas digitais por meio do registrador TRIS.
Circuito utilizado para simulação
A seguir é exibido o circuito utilizado para simulação no Isis Proteus:
Montando o Circuito no Proteus
A localização dos componentes empregados na composição do circuito, consiste na tarefa inicial para viabilização da simulação. Visto que não é algo que possa se desempenhado de maneira intuitiva, será disponibilizado como realizar a busca e os respectivos termos-chave a serem utilizados.
Uma vez aberto o software ISIS Proteus, deve-se acessar o menu de busca de componentes por meio da opção Component Mode e em seguida clicar no ícone azul “P”. Um método alternativo de acesso ao menu ocorre por meio do pressionar da tecla “P”, a qual corresponde a um atalho de teclado.
Após acessar o menu de busca de componentes através dos métodos citados anteriormente, devemos agora inserir na barra de pesquisa (Keywords) os termos-chave:
Termo-chave |
Componente |
Descrição presente no Software |
Capacitor |
Capacitor cerâmico de 22pF |
Capacitor primitive |
Crystal |
Cristal oscilador externo de 20MHz |
Quartz crystal |
Resistor |
Resistor de pull up do pino MCLR |
Analog resistor primitive |
Pot |
Potenciômetros (sensores S1,S2,S3 e ajuste de contraste do display). |
High Granularity Interactive Potentiometer (Lin,Log or Antilog Law) |
Push |
Botão para reset do microcontrolador |
SPST Push Button |
PIC18F4550 |
Microcontrolador utilizado |
PIC18Microcontroller (32kB code 20488 data…) |
16×2 |
Display LCD 16×2 |
16×2 Alphanumeric LCD |
Observação: Sempre ao selecionar um componente após efetuar uma busca, deve-se atentar-se ao quesito “Preview” (prévia), localizado na parte superior direita do menu de seleção de componentes, uma vez que este parâmetro indica se o dispositivo em questão pode ser empregado em simulações, ou apenas para confecção de layouts de placas de circuito impresso.
Exemplo: Tomaremos como exemplo o amplificador operacional LM358. Após buscar o componente na barra de pesquisa do menu de seleção de componentes, será disponibilizada uma prévia indicando a sua simbologia e seu encapsulamento para confecção da placa de circuito impresso. Nesses quesitos devemos observar o “Preview” e identificar se este componente pode ser utilizado para simulação. Caso apresente “No Simulator Model”, devemos buscar na lista outro que não apresente esta característica.
Código
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
/* ============================================ || PROJETO: CONVERSOR A/D COM DISPLAY LCD || || AUTOR: ENRIQUE DOS SANTOS SOUSA || ============================================ */ // Selecionando pinos utilizados para comunicação com display LCD sbit LCD_RS at RD2_bit;// PINO 2 DO PORTD INTERLIGADO AO RS DO DISPLAY sbit LCD_EN at RD3_bit;// PINO 3 DO PORTD INTERLIGADO AO EN DO DISPLAY sbit LCD_D7 at RD7_bit;// PINO 7 DO PORTD INTERLIGADO AO D7 DO DISPLAY sbit LCD_D6 at RD6_bit;// PINO 6 DO PORTD INTERLIGADO AO D6 DO DISPLAY sbit LCD_D5 at RD5_bit;// PINO 5 DO PORTD INTERLIGADO AO D5 DO DISPLAY sbit LCD_D4 at RD4_bit;// PINO 4 DO PORTD INTERLIGADO AO D4 DO DISPLAY // Selecionando direção de fluxo de dados dos pinos utilizados para a comunicação com display LCD sbit LCD_RS_Direction at TRISD2_bit;// SETA DIREÇÃO DO FLUXO DE DADOS DO PINO 2 DO PORTD sbit LCD_EN_Direction at TRISD3_bit;// SETA DIREÇÃO DO FLUXO DE DADOS DO PINO 3 DO PORTD sbit LCD_D7_Direction at TRISD7_bit;// SETA DIREÇÃO DO FLUXO DE DADOS DO PINO 7 DO PORTD sbit LCD_D6_Direction at TRISD6_bit;// SETA DIREÇÃO DO FLUXO DE DADOS DO PINO 6 DO PORTD sbit LCD_D5_Direction at TRISD5_bit;// SETA DIREÇÃO DO FLUXO DE DADOS DO PINO 5 DO PORTD sbit LCD_D4_Direction at TRISD4_bit;// SETA DIREÇÃO DO FLUXO DE DADOS DO PINO 4 DO PORTD char pot1_string [8];// STRING PARA RECEBER O VALOR CONVERTIDO DA LEITURA DO POTENCIÔMETRO 1 char pot2_string [8];// STRING PARA RECEBER O VALOR CONVERTIDO DA LEITURA DO POTENCIÔMETRO 2 char pot3_string [8];// STRING PARA RECEBER O VALOR CONVERTIDO DA LEITURA DO POTENCIÔMETRO 3 char apagar [] = {' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '};//STRING PARA APAGAR O CONTEÚDO DAS RESPECTIVAS LINHAS unsigned int pot1 = 0;// VARIAVEL PARA ARMAZENAR O VALOR OBTIDO PELO AN0 unsigned int pot2 = 0;// VARIAVEL PARA ARMAZENAR O VALOR OBTIDO PELO AN1 unsigned int pot3 = 0;// VARIAVEL PARA ARMAZENAR O VALOR OBTIDO PELO AN2 void main() { TRISA0_bit = 1; // CONFIGURA O PINO EM QUE SE ENCONTRA A PORTA ANALÓGICA AN0 COMO ENTRADA TRISA1_bit = 1; // CONFIGURA O PINO EM QUE SE ENCONTRA A PORTA ANALÓGICA AN1 COMO ENTRADA TRISA2_bit = 1; // CONFIGURA O PINO EM QUE SE ENCONTRA A PORTA ANALÓGICA AN2 COMO ENTRADA ADCON1 = 0b00001100;//SELECIONA OS PINOS 2, 3, 4 DO PORTA COMO ENTRADAS ANALÓGICAS (AN0, AN1, AN2) ADC_Init();//INICIALIZA MÓDULO ANALGÓGICO CMCON = 0b00000111;//DESABILITA COMPARADORES INTERNOS Lcd_Init();//INICIALIZA DISPLAY LCD Lcd_Cmd(_LCD_CLEAR);//ENVIA O COMANDO DE LIMPAR TELA PARA O DISPLAY LCD Lcd_Cmd(_LCD_CURSOR_OFF);// ENVIA O COMANDO DE DESLIGAR CURSOR PARA O DISPLAY LCD while(1)//LOOP INFINITO { pot1 = ADC_Get_Sample(0);//RECEBE O VALOR DE TENSÃO DO POTENCIOMETRO NA PORTA AN0 pot2 = ADC_Get_Sample(1);//RECEBE O VALOR DE TENSÃO DO POTENCIOMETRO NA PORTA AN1 pot3 = ADC_Get_Sample(2);//RECEBE O VALOR DE TENSÃO DO POTENCIOMETRO NA PORTA AN2 IntToStr (pot1,pot1_string);//CONVERTE O VALOR DO TIPO INTEIRO OBTIDO PELO CONVERSOR AD NA PORTA AN0 PARA UMA STRING IntToStr (pot2,pot2_string);//CONVERTE O VALOR DO TIPO INTEIRO OBTIDO PELO CONVERSOR AD NA PORTA AN1 PARA UMA STRING IntToStr (pot3,pot3_string);//CONVERTE O VALOR DO TIPO INTEIRO OBTIDO PELO CONVERSOR AD NA PORTA AN2 PARA UMA STRING Ltrim(pot1_string);//REMOVE TODOS OS ESPAÇOS EM BRANCO LOCALIZADOS A ESQUERDA DO PRIMEIRO CHAR DA STRING COM O VALOR DE AN0 Ltrim(pot2_string);//REMOVE TODOS OS ESPAÇOS EM BRANCO LOCALIZADOS A ESQUERDA DO PRIMEIRO CHAR DA STRING COM O VALOR DE AN1 Ltrim(pot3_string);//REMOVE TODOS OS ESPAÇOS EM BRANCO LOCALIZADOS A ESQUERDA DO PRIMEIRO CHAR DA STRING COM O VALOR DE AN2 // Lcd_Cmd(_LCD_CLEAR); // LIMPA A TELA PARA ATUALIZAR OS VALORES Lcd_Out(1,1,"S1:");//ESCREVE A MENSAGEM POT1 NA PRIMEIRA LINHA E PRIMEIRA COLUNA DO DISPLAY LCD Lcd_Out_Cp(pot1_string);//ESCREVE O VALOR OBTIDO DO CONVERSOR A/D NA POSIÇÃO EM QUE SE ENCONTRA O CURSOR DO DISPLAY Lcd_Out(1,9,"S2:");//ESCREVE A MENSAGEM POT2 NA PRIMEIRA LINHA E DECIMA PRIMEIRA COLUNA DO DISPLAY LCD Lcd_Out_Cp(pot2_string);//ESCREVE O VALOR OBTIDO DO CONVERSOR A/D NA POSIÇÃO EM QUE SE ENCONTRA O CURSOR DO DISPLAY Lcd_Out(2,1,"S3:");//ESCREVE A MENSAGEM POT3 NA SEGUNDA LINHA E PRIMEIRA COLUNA DO DISPLAY LCD Lcd_Out_Cp(pot3_string);//ESCREVE O VALOR OBTIDO DO CONVERSOR A/D NA POSIÇÃO EM QUE SE ENCONTRA O CURSOR DO DISPLAY delay_ms(100);// AGUARDA 0,1 s } } |
Compilando o código e inserindo hex para simulação
Após utilizar o código disponibilizado, devemos compilar clicando na opção “Build” no MikroC, para que possa ser gerado o arquivo hex, o qual será inserido no microcontrolador empregado e consequentemente interpretado pelo ISIS Proteus para que a simulação possa ser executada.
Uma vez selecionada a opção “Build”, o arquivo hex será gerado na pasta em que se encontra o projeto. Pode-se verificar o endereço do arquivo utilizando:
Após localizar o arquivo, devemos importá-lo para o ISIS Proteus para efetivamente realizar a simulação. Uma vez que todos os componentes se encontrem devidamente conectados conforme o diagrama fornecido, devemos clicar no microcontrolador PIC18F4550 com o botão direito do mouse, selecionar a opção “Edit Properties”, ou acessar utilizando o atalho CTRL+E.
Devemos agora ajustar alguns parâmetros referentes ao funcionamento do microcontrolador, um deles corresponde à frequência de trabalho, a qual deve ser selecionada em função da frequência do oscilador inserido no projeto. Neste caso será configurado para 20MHz, que por sua vez corresponde à frequência do cristal oscilador utilizado na barra “Processor Clock Frequency”. Para realizar a inserção do arquivo devemos selecionar o ícone da pasta presente na barra Program File e posteriormente selecionar a pasta em que se encontra o arquivo hex.
Uma vez selecionado o arquivo hex, basta clicar no ícone “Run the simulation” localizado na parte inferior esquerda da tela, logo em seguida o software iniciará a simulação e será possível verificar os resultados obtidos.
Conclusão
A aplicação de displays LCDs em conjunto com o módulo analógico de um microcontrolador correspondem a uma alternativa simples e eficiente, uma vez que a interação do microcontrolador com os mais diversos segmentos de sensores analógicos existentes no mercado ocorre por meio do conversor A/D interno do próprio microcontrolador.
O monitoramento das grandezas mensuradas e tratadas pelo projeto ocorre por meio da exibição dos valores na tela do display, que por sua vez, embora esteja limitado pelas dimensões reduzidas, possibilita que as informações possam ser exibidas em sequência, assim possibilitando a exibição de múltiplas mensagens, as quais podem ser simultâneas ou não, em função de seus respectivos comprimentos.
Me ajudou demais, eu estava tendo dificuldades para fazer o projeto rodar no Proteus, mas com essa ajuda facilitou bastante! Parabéns pelo conteúdo!
Olá pessoal, bom dia!
Pessoal, alguém ai tem o arquivo hex. deste projeto, é estou com dificuldades para gerar o arquivo hex.
Sou iniciante e tenho muita dificuldades em programação.
Olá bom dia! Eu estou tendo dificuldades para gerar o arquivo hex, estou usando o Mikro c 7.6 vejam o erro que estou obtendo. 0 1 mikroCPIC1618.exe -MSF -DBG -pP18F4550 -DL -O11111114 -fo20 -N”B:\Projetos\adc_lcd\adc_lcd.mcppi” -SP”C:\Users\Public\Documents\Mikroelektronika\mikroC PRO for PIC\Defs\” -SP”C:\Users\Public\Documents\Mikroelektronika\mikroC PRO for PIC\uses\P18\” -SP”B:\Projetos\adc_lcd\” -IP”C:\Users\Public\Documents\Mikroelektronika\mikroC PRO for PIC\uses\P18\” “adc_lcd.c” “__Lib_Math.mcl” “__Lib_MathDouble.mcl” “__Lib_System.mcl” “__Lib_Delays.mcl” “__Lib_ADC_A_D.mcl” “__Lib_LcdConsts.mcl” “__Lib_Lcd.mcl” 0 1139 Available RAM: 2027 [bytes], Available ROM: 32768 [bytes] 0 122 Compilation Started P18F4550.c 1606 123 Compiled Successfully P18F4550.c 0 122 Compilation Started __Lib_Delays.c 172 123 Compiled Successfully __Lib_Delays.c 0 122 Compilation Started adc_lcd.c 53 324 Undeclared identifier ‘IntToStr’ in expression adc_lcd.c 54 324… Leia mais »
BOA TARDE GOSTARIA DE IMPLEMENTAR UM CONTROLE DE NIVEL DE CAIXA DAGUA COM PIC12F675 PARA MEU TCC USANDO PARA ACIONAR UMA BARRA DE LED PARA VISUALIZAÇÃO E O PIC PARA ACIONAR A BOMBA DAGUA
Boa tarde pessoal.
Fiz tudo de acordo com as instruções e funcionou bem.
Parabéns pelo projeto.
Embora ainda não tenha testado, este é um projeto interessante. Boa proposta.
As vezes as pessoas não percebem os valores embutidos em um projeto. Neste caso, conversão A/D e Acesso ao LCD. Parabéns.
Quem queira falar mais a respeito comigo pode enviar email para [email protected] Sei que parece estranho, mas leio minha inbox diariamente, também gostaria de conversar com outros autores, mas a comunicação não fica visível. Grande abraço
Fiz tudo como descrito, porem não funcionou.:
O display acende no proteus mas não escreve nada.
Olá Amigos,
O Barramento azul com fazê-lo.
obrigado.