Baixe o app para aproveitar ainda mais
Prévia do material em texto
INSTITUTO FEDERAL DE EDUCAÇÃO, CIÊNCIA E TECOLOGIA DO CEARÁ TECNOLOGIA EM MECATRÔNICA INDUSTRIAL Programação de Microcontroladores PIC em BASIC para Iniciantes: Utilizando o Proton IDE Marcelo Vieira do Nascimento de Freitas Limoeiro do Norte-CE Março de 2015 Prefácio Este trabalho é destinado a proporcionar uma noção básica sobre programação de microcontroladores PIC em linguagem BASIC. Elaborado na disciplina de Projeto Social tem como objetivo final a inclusão social daqueles que iniciam a aprendizagem na programação e utilização de microcontroladores PIC em linguagem BASIC. Será discutido questões básicas de hardware, software e assuntos correlacionados. A princípio será abordado conceitos sobre softwares utilizados na programação, compilação e simulação de programações. Em seguida será mostrado conceitos sobre microcontroladores PIC, em especial o PIC16F877A, que será o utilizado para simulações. Dado o conhecimento adquirido anteriormente se fará necessário a explanação de alguns conceitos sobre eletroeletrônica, assim auxiliando na melhor compreensão das estruturas utilizadas para o funcionamento correto dos microcontroladores. Por último será abordado a estrutura de programação em BASIC, mostrando quais são as principais funções e como elas funcionam, mostrando aplicações e exemplos. O software de programação e compilação utilizado para programação em Basic será o Proton IDE. Para a simulação será utilizado o ISIS Proteus. Vale ressaltar que apesar de apresentar conceitos básicos sobre hardware o foco deste trabalho será a apresentação de modo básico da linguagem de programação BASIC aplicado em microcontroladores PIC. Sumário 1 - SOFTWARES UTILIZADOS .............................................................................................................. 1 1.1 – ISIS PROTEUS ............................................................................................................................... 1 1.2 – PROTON IDE ................................................................................................................................. 1 1.3 – GRAVAÇÃO E COMPILAÇÃO DA PROGRAMAÇÃO ............................................................... 2 1.3.1 - Gravação de Programas Fisicamente ..................................................................................... 2 1.3.2 – Gravação de Programas por simulação ................................................................................. 3 2 - O PIC 16F877A ..................................................................................................................................... 4 3 - CONCEITOS BÁSICOS SOBRE ESTRURAS INTERNAS DOS MICROCONTROLADORES .... 7 3.1 - Memórias........................................................................................................................................ 7 3.2- Unidades de memória ..................................................................................................................... 7 3.3 – Memória de Programa (FLASH) .................................................................................................. 8 3.4 – Memória de Dados (RAM) ............................................................................................................ 8 3.5 - Registo ............................................................................................................................................ 8 3.6 - SFR – Registo de Função Especial ................................................................................................. 8 3.7 - Portas de Entrada/Saída – I/O ....................................................................................................... 9 3.8 - Interrupções ................................................................................................................................... 9 3.9 - CPU – Unidade Central de Processamento ................................................................................... 9 3.10 - Oscilador ...................................................................................................................................... 9 3.11 - Arquitetura Interna ....................................................................................................................10 4 - CONCEITOS DE ELETRÔNICA ......................................................................................................11 4.1 – Oscilador Externo ........................................................................................................................11 4.2 – Estado Lógico de pinos I/O ..........................................................................................................12 4.3 – Optoacopladores ...........................................................................................................................12 4.4 - PWM .............................................................................................................................................13 4.5 – Analógico x Digital .......................................................................................................................14 5 – BASIC: PRINCIPAIS COMANDOS E SUAS ESTRUTURAS NO PROTON IDE .........................15 6 – EXEMPLOS E APLICAÇÕES ..........................................................................................................22 6.1 – Primeiros Programas com o PIC 16F877A ..................................................................................22 6.2.1 – Projeto 1: Fazendo um LED piscar. .........................................................................................23 6.2.2 – Projeto 2: Ligar e Desligar 2 LEDs alternadamente. ................................................................24 6.2.3 - Projeto 3: Fazer uma contagem binaria começando com 0, 1 e depois com potencias de 2 (2x) até 128......................................................................................................................................................25 6.2.4 – Projeto 4: Utilizando botões nas entradas para acionar saídas. Utilizando as instruções IF – THEN. ................................................................................................................................................26 6.2.5 - Projeto 5: Contagem de 0 a 9 com display de 7 segmentos. ......................................................28 6.2.6 - Projeto 6: Utilizando o Display de Cristal Líquido (LCD). .......................................................30 6.2.7 - Projeto 7: Utilizando conversor Analógico/Digital (A/D). ........................................................34 6.2.8 - Projeto 8: Utilizando Sensor de Temperatura para Medições. ...................................................42 6.2.9 – Projeto 9: Acionamento de Servo-Motores. .............................................................................44 6.2.10 – Projeto 10: Usando o PWM. .................................................................................................47 7 – REFERENCIAS BIBLIOGRÁFICAS ...............................................................................................49 1 1 - SOFTWARES UTILIZADOS 1.1 – ISIS PROTEUS O ISIS Proteus é um software da linha Proteus ASM capaz de simulações de diversos componentes/equipamentos eletroeletrônicos, adotando simbologias destes. De grande utilidade para aqueles que desejam realizar testes em elaborações de circuitos, auxilia na observação de características de funcionamento, parâmetros e possíveis defeitos de projeto.Este software será utilizado para a simulação de circuitos e programação do PIC, ajudando assim na observação do funcionamento destes e ainda em possíveis erros. Figura 1: Área de Trabalho do ISIS Proteus. 1.2 – PROTON IDE O Proton IDE é um programador de microcontroladores PIC muito simples e eficiente baseado na linguagem de programação BASIC. O software é poderoso a ponto de Escrever, Depurar e Compilar programas em um único ambiente de trabalho, ou seja, é composto por uma área de edição de texto onde se fará a elaboração e utilização da linguagem de programação BASIC para obtenção de algoritmos que serão inseridos no PIC, a Depuração é consiste na procura de erros ou falhas na programação que são indicadas nas linhas de comando do algoritmo e visualizadas na tela de trabalho do editor de texto para que se possa ser corrigido pelo programador e o Compilador nada mais é que uma ferramenta de conversão de linguagem de programação onde exclusivamente no Proton IDE se faz da linguagem BASIC para linguagem de máquina e assim possa ser inserido no PIC. 2 Figura 2: Área de trabalho do Proton IDE. 1.3 – GRAVAÇÃO E COMPILAÇÃO DA PROGRAMAÇÃO 1.3.1 - Gravação de Programas Fisicamente Para se carregar um programa no PIC, tem-se que usar um Gravador Programador de PIC. Porém existe uma maneira de fazer está gravação sem a necessidade de sempre ter que dispor de um Gravador. Isto se faz usando um bootloader. O bootloader é um pequeno programa que roda ao ligar o microcontrolador, fazendo tarefas de inicialização do sistema e depois rodando o programa principal. Além disso, o bootloader pode ser usado para gravar o próprio PIC através da linha série RS232 dado que esse pequeno programa controla a comunicação com o PC e transfere a informação recebida para a memória de programa do PIC. Figura 3: Gravador de PIC USB (40zif). A gravação da programação feita no Proton IDE para PIC, utilizando o Programador ou a comunicação RS232 (conexão serial), se dá pela opção Compiler and Program ou pela tecla F10. O software fará a depuração do programa a procura de algum erro na elaboração, se não encontrado nenhum erro um arquivo hexadecimal será gerado pelo compilador na pasta fonte onde o programa foi salvo. 3 Ao conectar o PIC à alimentação e ao cabo de gravação de dados e em seguida resetar o PIC, o programa é gravado e executado pelo mesmo. Figura 4: Gravação de programação no PIC. 1.3.2 – Gravação de Programas por simulação Uma forma de visualizar o funcionamento das instruções feitas no Proton IDE quando introduzidas no PIC é a simulação virtual. Para isso utilizaremos o ISIS Proteus. A simulação no ISIS Proteus se dá pela introdução do código hexadecimal no PIC virtual, presente na biblioteca do simulador. Para gerar esse código hexadecimal é só clicar em Compile no Proton IDE ou F9. Assim o código será gerado na pasta fonte onde o programa está salvo, ‘nome.hex’. Figura 5: Gerando arquivo hexadecimal do programa. Após gerar arquivo hexadecimal do programa e com o PIC introduzido no ISIS Proteus, é só dá um duplo clique no componente e na linha “Program File:” clica no ícone de uma ‘pasta’ e indicar o caminho do arquivo hexadecimal referente ao programa que se quer simular. Figura 6: Inserindo arquivo hexadecimal no PIC virtual do ISIS Proteus. 4 2 - O PIC 16F877A A escolha do microcontrolador PIC 16F877A se dá pelo fato de tal componente abranger todas as características dos demais componentes da família PIC de modo que ao aprender a utiliza-lo lhe dará meios de utilizar os demais. De modo geral os PIC são uma família de microcontroladores desenvolvido e fabricado pela Companhia Microchip Technologies Inc. De certo modo podemos comparar esses dispositivos a um computador, porém bem menores, dado que assim como estes possuem memória de programa, memória RAM entre outras coisas semelhantes. Dada suas características de funcionamento se pode assemelha-lo ao coração dos circuitos controlados, ou seja, o microcontrolador é o responsável pela operação de controle de todos os processos de um dado circuito eletrônico baseado nas instruções e rotinas que definem funções de controle. Microcontroladores x Microprocessadores: apesar de funcionamento semelhantes no funcionamento são diferentes em vários aspectos construtivos. Para se usar um microprocessador vários outros componentes externos devem ser adicionados, memória e componentes de envio e recebimento de dados. Em seu projeto o microcontrolador foi confeccionado para se ter tudo num só equipamento, não necessitando de componentes externos para seu funcionamento. A elaboração de projetos com microcontroladores requer um estudo prévio da estrutura do hardware a que se fará necessário para a confecção de programas e com isso saber qual será a função especifica de cada pino, qual dos Portes I/O (IN/OUT) será utilizado para que possam ser configurados de maneira correta e etc. Estes detalhes servirão para a correta utilização e controle de dispositivos como Botões, LCD, teclados, motores de passo, LEDs, servomotores e outros. Figura 7: PIC 16F877A com a nomenclatura de seus pinos (funções). Algumas características do componente são descritas abaixo. Microcontrolador de 40 pinos; Via de programação com 14 bits e 35 instruções; 33 portas configuráveis como entrada ou saída; 15 interrupções disponíveis; 5 Memória de programação E²PROM FLASH, que permite a gravação rápida do programa diversas vezes no mesmo chip, sem a necessidade de apaga-lo por meio de luz ultravioleta; Conversores analógicos de 10 bits (8x) e comparadores analógicos (2x); Para o melhor entendimento da identificação dos pinos do PIC será mostrado abaixo uma tabela com o significado de cada nomenclatura. Tabela 1: Identificação dos pinos e PORTs do PIC 16F877A Nome do Pino Nº Pino I/O/ P Tipo Descrição OSC1/CLKIN 13 I ST/ CMOS(4) Entrada para cristal. Entrada para osciladores externos. (híbridos ou RC) OSC2/CLKOU T 14 O - Saída para cristal. Os cristais ou ressonadores devem ser ligados ao OSC1 e OSC2. Saída com onda quadrada em ¼ da frequência imposta em OSC1 quando em modo RC. Essa frequência equivale aos ciclos de máquina internos. MCLR/Vpp 1 I/p ST Master Clear (reset) externo. O microcontrolador só funciona quando este pino encontra-se em nível alto. Entrada para tensão de programação (13V) Vss 12/3 p - GND Vdd 11/3 p - Alimentação positiva RA0/AN0 RA1/AN1 RA2/AN2/ Vref/C Vref RA3/AN3/VREF+ RA4/T0CKI/ C1OUT RA5/SS/AN4/ C2OUT 2 3 4 5 6 7 I/O I/O I/O I/O I/O I/O TTL TTL TTL TTL ST TTL PORTA (I/Os digitais bidirecionais e sistema analógico): RA0: I/O digital ou entrada analógica AN0. RA1: I/O digital ou entrada analógica AN1. RA2: I/O digital ou entrada analógica AN2 ou tensão negativa de referência analógica. RA3: I/O digital ou entrada analógica AN3 ou tensão positiva de referência analógica. RA4: I/O digital (quando saída é open drayn, isto é, não consegue impor nível alto) ou entrada externa do contador TMR0 ou saída do Comparador 1. RA5: I/O digital ou entrada analógica AN4 ou habilitação externa (Slave select) para comunicação SPI ou saída do comparador 2. RB0/INT RB1 RB2 RB3/PGM RB4 RB5 RB6/PGCRB7/PGD 33 34 35 36 37 38 39 40 I/O I/O I/O TTL/ST TTL TTL TTL TTL TTL TTL/ST TTL/ST PORTB (I/Os digitais bidirecionais). Todos os pinos deste PORT possuem pull-up interno que podem ser ligados/desligados pelo software: RB0: I/O digital com interrupção externa. RB1: I/O digital. RB2: I/O digital. RB3: I/O digital ou entrada para programação em baixa tensão (5V). RB4: I/O digital com interrupção por mudança de estado. RB5: I/O digital com interrupção por mudança de estado. RB6: I/O digital com interrupção por mudança de estado ou clock da programação serial ou pino de in-circuit debugger. RB7: I/O digital com interrupção por mudança de estado Ou data da programação serial ou pino de in-circuit Debugger. 6 RC0/T10SO/ T1CKI RC1/T10SI/ CCP2 RC2/CCP1 RC3/SCK/SCL RC4/SDI/SDA RC5/SDO RC6/TX/CK RC7/RX/DT 15 16 17 18 23 24 25 26 I/O I/O I/O I/O I/O I/O I/O I/O ST ST ST ST ST ST ST ST PORTC (I/Os digitais bidirecionais): RC0: I/O digital ou saída do oscilador externo para TMR1 ou entrada de incremento para TMR1 RC1: I/O digital ou entrada do oscilador externo para TMR1 ou entrada do Capture2 ou saídas para Compare2/PWM2. RC2: I/O digital ou entrada do Capture1 ou saídas para Compare1/PWM1. RC3: I/O digital ou entrada/saída de clock para comunicação serial SPI/I²C. RC4: I/O digital ou entrada de dados para SPI ou via de dados (entrada/saída) para I²C. RC5: I/O digital e saída de dados para SPI. RC6: I/O digital ou TX (transmissão) para comunicação USART assíncrona ou clock para comunicação síncrona. RC7: I/O digital ou RX (recepção) para comunicação USART assíncrona ou data para comunicação síncrona. RD0/PSP0 RD1/PSP1 RD2/PSP2 RD3/PSP3 RD4/PSP4 RD5/PSP5 RD6/PSP6 RD7/PSP7 19 20 21 22 27 28 29 30 I/O I/O I/O I/O I/O I/O I/O I/O TTL/ST(3) TTL/ST(3) TTL/ST(3) TTL/ST(3) TTL/ST(3) TTL/ST(3) TTL/ST(3) TTL/ST(3) PORTD (I/Os digitais bidirecionais) ou porta de comunicação paralela. RD0: I/O digital ou dado 0 (comunicação paralela). RD1: I/O digital ou dado 1 (comunicação paralela). RD2: I/O digital ou dado 2 (comunicação paralela). RD3: I/O digital ou dado 3 (comunicação paralela). RD4: I/O digital ou dado 4 (comunicação paralela). RD5: I/O digital ou dado 5 (comunicação paralela). RD6: I/O digital ou dado 6 (comunicação paralela). RD7: I/O digital ou dado 7 (comunicação paralela). RE0/RD/AN5 RE1/WR/AN6 RE2/CS/AN7 8 9 10 I/O I/O I/O TTL/ST(3) TTL/ST(3) TTL/ST(3) PORTE (I/Os digitais bidirecionais e sistema analógico): RE0: I/O digital ou controle de leitura da porta paralela ou entrada analógica AN5. RE1: I/O digital ou controle de leitura da porta paralela ou entrada analógica AN6. RE2: I/O digital ou controle de leitura da porta paralela ou entrada analógica AN7. Legenda: I = Input (entrada) O = Output (saída) I/O = Input/Output (entrada ou saída) P = Power (alimentação) - = Não-utilizado TTL = Entrada tipo TTL ST = Entrada tipo Schmitt Trigger 7 3 - CONCEITOS BÁSICOS SOBRE ESTRURAS INTERNAS DOS MICROCONTROLADORES 3.1 - Memórias Figura 8: Estrutura ilustrativa de uma memória de dados. Resumidamente uma memória é uma estrutura de armazenamento de bits em um determinado endereço de memória, onde cada endereço pode ser composto por uma quantidade definida de bits que assumem valor de 1 ou 0. Como mostra a figura 8 onde o endereço W1 é composto pelos bits de 0 a 7 (8 bits), ou seja, esse endereço pode assumir 28 resultados diferentes como resposta de saída. 3.2- Unidades de memória É usada para o armazenamento de dados. Cada endereço de memória corresponde a uma posição de memória. O conteúdo dessa posição, é conhecido através do seu endereçamento. A memória tato pode ser lida de, como pode ser escrita para. Figura 9: Alocação de dados em unidades de memorias. ROM – Read Only Memory: Apenas de Leitura, é usada para gravar permanentemente o programa a executar. OTP ROM – One Time Programmable ROM: ROM onde só se pode escrever o programa na memória apenas uma vez. UV EPROM – Ultra Violet Erasable Programmable ROM: ROM que permite apagar o programa, usando luz Ultravioleta. FLASH: O seu conteúdo pode ser escrito/apagado quase que infinitamente, usado na maioria dos microcontroladores. RAM – Random Acess Memory: Memória volátil, quando se desliga a alimentação do chip as informações desaparecem. Usada para armazenamento temporário de dados. EEPROM – Electrically Erasable Programmable ROM: ROM programável, que se pode apagar eletricamente. Seu conteúdo não é perdido ao se desligar a alimentação do microcontrolador. 8 3.3 – Memória de Programa (FLASH) Memória não volátil que serve para armazenar o programa escrito no microcontrolador. Como já citado ela pode ser limpa e escrita por várias, adequando-se ao desenvolvimento de novos programas e mudança de dispositivos. 3.4 – Memória de Dados (RAM) Usada pelo programa durante sua execução, são guardados todos os resultados intermédios ou dados temporais durante a execução do programa que não cruciais para o dispositivo. Os dados contidos nessa memoria são perdidas quando cessada a alimentação. 3.5 - Registo Um registo é um circuito eletrônico que consegue memorizar o estado de um byte. Figura 10: Estrutura de um Registo. 3.6 - SFR – Registo de Função Especial Nos microcontroladores os seus bits estão interligados fisicamente aos circuitos internos, tais como temporizadores, conversores A/D, osciladores, portas série e outros. Como um byte tem oito bits, é como se fossem oito interruptores que comandam outros pequenos circuitos dentro do chip e os SFR têm exatamente essa função de alocar 8 bits para cada tipo de aplicação existente internamente. Figura 11: SFR. 9 3.7 - Portas de Entrada/Saída – I/O São Registos ligados aos pinos do microcontrolador e são chamados de Portas ou PORT. Onde cada pino pode ser configurado como entrada ou saída através de software. Como normalmente cada porta I/O é controlado por um SFR cada bit desse registo determina o estado do pino correspondente do microcontrolador. Figura 12:SFR de PORTs I/O. 3.8 - Interrupções É uma característica do microcontrolador em que só se fará a leitura de suas entradas no momento em que elas estiverem em modo de ativação e assim poder executar uma ação. Se essa característica não fosse usada o microcontrolador ficaria a todo momento fazendo a leitura do estado da sua entrada tornando impraticável sua utilização. Essa característica é de certo modo delega pelo microcontrolador a um ‘perito’ da estrutura interna que reage ao haver necessidade. 3.9 - CPU – Unidade Central de Processamento É unidade que memoriza e controlatodos os processos dentro do microcontrolador, sendo subdividida em: Decodificador de Instruções parte eletrônica que reconhece as instruções de programa fazendo os outros circuitos funcionarem com base nisso. ALU é a Unidade Lógica e Aritmética, sendo responsável por todas as operações lógicas e matemáticas. Acumulador é um SFR responsável pela operação da ALU, usado para armazenar todos os dados de execução de uma operação e também os resultados de uso de continuação do processamento. 3.10 - Oscilador O módulo oscilador se trata de componentes que oferecem uma oscilação continua de sinal, normalmente configurado para usar um cristal de quartzo e as vezes em conjunto com um ressoador (capacitor) cerâmico para melhor estabilidade de oscilação, possibilita a operação síncrona do microcontrolador advinda dos pulsos dados pelo oscilador. A não necessidade de estabilidade de oscilação dada por uma dada aplicação abre a possibilidade de um oscilador RC (resistência/Capacitor). 10 3.11 - Arquitetura Interna É a forma de troca de informação entre o CPU e a Memória. Os microcontroladores mais modernos usam duas formas distintas de arquitetura: Von-Neumann Se tem uma única zona de memória disponível e um barramento de dados de 8 bits de modo a ser sobrecarregado por ter todos os dados trocados usando somente estas 8 linhas e isso deixa a comunicação lenta e sem eficiência. A CPU só pode ler ou escrever dados de/para a memória sendo impossível ambas ao mesmo tempo devido a utilização do barramento com os dados. Figura 13: Arquitetura von-Neumann. Harvard Os microcontroladores detentoras desta arquitetura é composto de dois barramentos, um de 8 bits que liga a CPU à RAM, e outro com várias linhas (12, 14 ou 16) ligando a CPU à ROM. Desse modo a CPU pode fazer a leitura de uma instrução ao mesmo tempo que acessa a memória de dados. Figura 14: Arquitetura Harvard. 11 4 - CONCEITOS DE ELETRÔNICA Devido à grande necessidade da utilização de estruturas e componentes de circuitos eletrônicos usado no correto funcionamento dos microcontroladores faremos aqui um estudo destes. 4.1 – Oscilador Externo É um circuito indispensável para o funcionamento do microcontrolador e que também define a velocidade a que ele vai funcionar podendo operar entre quatro opções: Oscilador LP: Oscilador de baixo consumo (Low Power); Oscilador XT: Cristal / Ressonador (Capacitor); Oscilador HS: Oscilador de alta Velocidade (High Speed); Oscilador RC: Resistencia/Condensador (Capacitor). Cada tipo de oscilador é caracterizado pela frequência de oscilação e consequentemente pelo cristal/capacitores usados como mostra a tabela 1. Tabela 2: Tipos de Osciladores e seus componentes Tipo Frequência Capacitor 1 Capacitor 2 LO 32 kHz 200 kHz 68 – 100 pF 15 – 33 pF 68 – 100 pF 15 – 33 pF XT 2 MHz 4 MHz 15 – 33 pF 15 – 33 pF 15 – 33 pF 15 – 33 pF HS 4 MHz 10 MHz 15 – 33 pF 15 – 33 pF 15 – 33 pF 15 – 33 pF Figura 15: Conexão de Osciladores com Crystal/Capacitor e outro com RC. Figura 16: Tipos de Crystal de Quartzo. 12 Esses cristais são de mesma frequência, mas diferem na sua construção e funcionamento. Em quanto o primeiro gera um trem de pulsos com 200mV em 100ns o segundo gera pulsos com 2V no mesmo período de tempo. Os pinos do cristal 2 tem as seguintes nomenclaturas: Pin 1: NC (pino sem conexão interna); Pin 7: GND; Pin 8: Saída TTL; Pin 14: +5Vdc. O oscilador externo RC tem com resultado ser mais sensível e mais econômico de todos. Sua precisão se deve a tolerância de erro dos seus componentes e a temperaturas que o podem afetar. 4.2 – Estado Lógico de pinos I/O Quando se deseja introduzir um estado logico baixo ou alto (0V ou 5V) a uma entrada através de botões de pulso temos que considerar a utilização de duas logicas de estado. Figura 17: Pinos configurados com: a) Logica Negativa e b) Logica Positiva. Lógica Negativa – nesse estado logico o Pino I/O é alimentado com tensão (5V), ao pressionar o botão de pulso a tensão estará agora sobre o resistor pois a corrente passa toda por ele e com isso o pino fica sem tensão (0V). Resumindo: inicial o pino está com tensão e ao pressionar o botão esse fica sem tensão. Lógica Positiva – nesse estado lógico o Pino I/O está sem alimentação (0V), ao pressionar o botão de pulso o pino é alimentado com tensão (5V) devido ao resistor ser um caminho menos favorável para a corrente. Resumindo: inicialmente o pino está sem tensão e ao pressionar o botão esse fica com tensão. 4.3 – Optoacopladores Os optoacopladores são componentes muito uteis quando se deseja separar a parte de comando da parte de potência de um circuito. Em uma de suas versões, se trará basicamente de um LED que ao ser acionado ilumina a base de um fototransistor, fazendo este conduza corrente entre o coletor emissor. Figura 18: Circuito utilizando optoacoplador, com saída negativa quando ativo. 13 Na configuração da figura 18, quando aplicado no pin I/O um nível lógico alto (5V) o LED do optoacoplador e o fototransistor conduzem corrente a terra e assim se tem um nível lógico baixo (0V) na Saída. Ao desativar o LED o fototransistor não conduz fazendo com que se tenha um nível lógico alto (5V) na Saída. Já na configuração da figura 19, quando aplicado um nível lógico alto (5V) no pin I/O, o LED do optoacoplador acende e o fototransistor conduz para pino de saída um nível lógico alto (5V). Porem havendo um nível lógico baixo (0V) na entrada, o fototransistor permanecerá aberto entre coletor e emissor, tendo como resultado um nível lógico baixo (0V) na Saída. Figura 19: Circuito utilizando optoacoplador, com saída positiva quando ativo. 4.4 - PWM É um recurso muito poderoso pois com ele se pode obter uma tensão analógica a partir de um sinal digital, porem sendo essa saída na verdade meramente digital, ou seja, podendo assumir os estados 0 e 1. O nome PWM é uma sigla originada do inglês (Pulse Width Modulation), que significa Modulação por Largura de Pulso. Trata-se de uma onda com frequência constante (período fixo) e largura de pulso (duty cycle) variável. Figura 20: PWM. Este é um tipo de geração de sinal muito importante, através dele é possível implementar um conversor digital analógico com um único pino do microcontrolador, uma vez que controlando a largura do pulso é possível obter uma tensão analógica variável. 14 4.5 – Analógico x Digital Sistema analógico: é um tipo de sinal contínuo que varia em função do tempo, podendo assumir qualquer valor dentro de um intervalo de máximo e mínimo. Sistema digital: é um sinal com valores discretos (descontínuos) no tempo, só podem assumir valores alto e baixo (0 ou 1, 0V ou 5V, etc.). Figura 21: Sinais digital e analógico. 15 5 – BASIC: PRINCIPAIS COMANDOS E SUAS ESTRUTURAS NO PROTON IDE VARIÁVEIS As variáveis são dados temporariamente armazenados em um programa BASIC. Elas são criadas usando a palavra-chave DIM. Como o espaço de uma memória RAM em PIC é um pouco limitado em tamanho, a escolha do tamanho certo de uma variável para uma tarefa especifica é importante. As variáveis podem ser do tipo BITS, BYTES, WORDS, DWORDS ou FLOATS. FLOAT – são variáveis que podem conter números com casas decimais podendo conter um valor ente -1e37até +1e38, mas por causa da arquitetura do compilador de 32 bits, deve-se pensar no uso de um valor máximo e mínimo entre -2147483646,999 a 2147483646,999, o que torna a mais precisa dos tipos de variáveis. Porém, mais do que o tipo DWORD, e isso tem um preço quando se faz cálculos e comparações com uma variável FLOAT, pois usará mais espaço de código dentro do PIC. DWORD – Essas variáveis podem conter um valor entre -2147483648 a 2147483647 tornando este a maior dos tipos da família de variáveis, no entanto usará mais espaço de código do PIC. WORD – Essas variáveis podem conter valores entre 0 e 65535, que normalmente é grande o suficiente para a maioria das aplicações. Ela usa bastante memória, mas não tanto como o tipo DWORD. BYTE – Podem conter um valor entre 0 e 255, sendo menor, mais rápido e mais eficiente do que os outros tipos de variáveis citado. BIT – Essas variáveis podem conter valor 0 ou 1, são criadas sempre 8 de cada vez devido ao tamanho dos registradores, portanto não se poupa espaço na RAM ao declara-la. REPRESENTAÇÕES NUMÉRICAS Binário usa o prefixo %. Exemplo: %0101; Hexadecimal usa o prefixo $. Exemplo $0A; Caracteres é um byte cercado por aspas. Ex. “a” representando o valor 97; Decimal esses valores não usam prefixo. Pontos Flutuantes são criadas usando o ponto decimal. Ex. 3.14(3,14). OPERADORES RELACIONAIS São usados para comparar dois valores. O resultado pode ser usado para tomar uma decisão sobre o fluxo do programa. Operador Relação Tipo de Expressão = Igualdade X=Y == Igualdade X==Y (mesmo que acima Igualdade) < > Desigualdade X< >Y != Desigualdade X != Y (mesmo que acima Desigualdade) < Menor que X < Y > Maior que X > Y <= Menor ou igual a X <= Y >= Maior ou Igual a X >= Y OPERADORES LOGICOS BOOLEANOS As funções IF-THEN-ELSE-ENDIF, WHILE-WEND, e REPEAT-UNTIL são as condições que suportam os operadores lógicos NOT, AND, OR e XOR. NOT – inverte o resultado de uma condição, mudando falso para verdadeiro e vice-versa. AND, OR e XOR – junta os resultados de duas condições e produz um único verdadeiro/falso resultado. 16 OPERADORES MATEMÁTICOS Addition '+'. Subtraction '-'. Multiply '*'. Multiply HIGH '**'. Multiply MIDDLE '*/'. Divide '/'. Modulus '//'. Bitwise AND '&'. Bitwise OR '|'. Bitwise XOR '^'. Bitwise SHIFT LEFT '<<'. Bitwise SHIFT RIGHT '>>'. Bitwise Complement '~'. ABS. ACOS ASIN ATAN COS. DCD. DIG. EXP LOG LOG10 MAX. MIN. NCD. POW REV. SIN. SQR. TAN DIV32. Adiciona variáveis e / ou constantes. Subtrai variáveis e / ou constantes. Multiplica variáveis e / ou constantes. Retorna os 16 bits do resultado multiplicar 16-bit. Retorna os 16 bits do meio o resultado multiplicar 16-bit. Divide as variáveis e / ou constantes. Retorna o resto da divisão um valor por outro. Retorna o bit E de dois valores. Retorna o bit OR de dois valores. Retorna o XOR bit a bit de dois valores. Desloca os bits de um valor deixou um número especificado de casas. Desloca os bits de um valor certo um determinado número de lugares. Inverte os bits em uma variável. Retorna o valor absoluto de um número. Retorna a ARC cosseno de um valor em radianos. Retorna o arco seno de um valor em radianos. Retorna o arco tangente de um valor em radianos. Retorna o cosseno de um valor em radianos. Descodificador 2 n -Alimentação de um valor de quatro bits. Retorna o dígito decimal especificado de um valor positivo. Deduzir a função exponencial de um valor. Retorna o logaritmo natural de um valor. Retorna o LOG de um valor. Retorna o máximo de dois números. Retorna o mínimo de dois números. Codificador de prioridade de um valor de 16 bits. Calcula uma variável para o poder do outro. Inverte a ordem dos menores bits em um valor. Retorna o seno de um valor em radianos. Retorna a raiz quadrada de um valor. Retorna a tangente de um valor em radianos. 15-bit divide x 31 bit. 17 DECLARE Sintaxe: [DECLARE] código da diretiva a alterar = valor da modificação Visão geral: Ajusta certos aspectos do código produzido, frequência de cristal, porta LCD e pinos de transmissão de série. Exemplo: DECLARE XTAL 4 ou DECLARE XTAL = 4 (Declara que o cristal é de 4MHz). DELAYMS Sintaxe: DELAYMS duração Visão geral: Atrasa a execução em x milissegundos (ms). Os atrasos podem ser até 65535ms (65,535 segundos) de duração. Exemplo: DELAYMS 100 (Atrasa a execução em 100ms). DEVICE Sintaxe: DEVIDE digito do dispositivo Visão geral: Informa ao compilador qual o microcontrolador PIC está sendo usado. Exemplo: DEVICE = 16F877A. DIM Sintaxe: DIM Variável {as} {Extensão ou tamanho} Visão geral: Todas as variáveis definidas pelo usuário devem ser declaradas usando a instrução DIM. Exemplo: DIM NUM AS BYTE (declara a variável NUM como sendo Byte (8bits)). END Sintaxe: END Visão geral: A declaração END faz parar a compilação de origem, e cria um loop infinito. GOTO Sintaxe: GOTO rótulo Visão geral: Ira para um rótulo definido e continua a execução de lá. Exemplo: GOTO LA (pula para a execução do rótulo LA) ... LA: (executa as instruções contidas no rótulo LA). HIGH Sintaxe: HIGH PORT ou PORT.Bit Visão geral: Coloca um PORT ou um bit em estado lógico alto. Para um PORT, isso significa preenche-lo de 1´s. Para um bit isso significa defini-lo como 1. Exemplo: HIGH PORTB.4 (Coloca o pino 4 do PORT B em nível lógico alto). 18 LOW Sintaxe: LOW PORT ou PORT.Bit Visão geral: Coloca um PORT ou um bit em estado lógico baixo. Para um PORT, isso significa preenche-lo com 0’s. Para um bit isso significa defini-lo como 0. Exemplo: LOW PORTB.4 (Coloca o pino 4 do PORT B em nível lógico baixo). SYMBOL Sintaxe: SYMBOL Nome {=} Valor Visão geral: Atribui um codinome para um registro, varável, ou valores constantes. Exemplo: SYMBOL LED =PORTB.4 (atribui ao pino 4 do PORT B o nome LED). INPUT Sintaxe: INPUT PORT ou PORT.Pin Visão geral: Faz com que um PORT especifico ou um pino seja utilizado como entrada. Exemplo: INPUT PORTA.0 (faz o pino 0 do PORT A uma entrada). OUTPUT Sintaxe: OUTPUT PORT ou PORT.Pin Visão geral: Faz com que um PORT especifico ou um pino seja utilizado como saída. Exemplo: OUTPUT PORTA.0 (faz o pino 0 do PORT A uma saída). TRIS Sintaxe: TRIS PORT ou PORT.Pin Visão geral: Configura os pinos ou PORT’s como entrada ou saída. Faz Registro de configuração I/O de PORT ou um pino especifico, que pode se dar de modo binário (8bits), hexadecimal ou decimal, sendo os dois primeiros mais comuns. 1 = Entrada 0 = Saída Exemplos: TRISA = %11110 (% para expressar a configuração em binário, desse modo o pino 0 do PORT A é configurado como saída e os pinos 1, 2, 3 e 4 como entradas). TRISA = $1E ($ para expressar a configuração em hexadecimal). TRISA = 30 (Ao converter o binário ou hexadecimal temos que o valor em decimal é 30, essas 3 formas para o compilador não será problema pois ao converte para linguagem de máquina o resultado será sempre binário em relação aos pinos do PORT configurado). FOR...NEXT...STEP Sintaxe: FOR Variável = Contagem inicial TO contagem final {STEP {+ -} incremento} Visão geral: A instrução FOR...NEXT se encarrega de fazer repetições de instruções que permanecem dentro do laço FOR...NEXT. O parâmetro STEP afeta o incremento segundoo valor declarado depois desta palavra, ao omiti-lo o incremento é de uma unidade. Exemplo: FOR i = 0 TO 9 STEP 3 NEXT 19 IF – THEN - ELSE Sintaxe: If expressão 1 {AND / OR expressão 2} Then rótulo Visão geral: Com a instrução IF – THEN podemos tomar decisões ao longo de um programa, baseado em condições específicas definidas pelo programador. Exemplo: If PORTA.0 = 1 Then PORTB.0 =1 SELECT – CASE - ENDSELECT Sintaxe: SELECT Expressão CASE Condição Instrução CASE ELSE Instrução ENDSELECT Visão geral: Avalia uma expressão então executa continuamente um bloco de código BASIC com base nas comparações, com Condição(s). Depois de executar um bloco de código, o programa continua a linha seguinte até chegar a ENDCASE. Se não houver casos verdadeiros encontrados e nem um ELSE CASE, o código levará a execução do ENDSELECT. Exemplo: SELECT VAR1 CASE 1 RESUL=1 CASE 2 RESUL=2 CASE ELSE RESUL=0 ENDSELECT ALL_DIGITAL = TRUE Visão geral: Esta instrução define todos os pinos como digitais, inclusive os analógicos. ADCON1 Visão geral: Esta instrução define a configuração de pinos como Analógicos. Exemplo: ADCON1=%10000001 o bit 7 configura a justificação, os bits 6/5/4 não tem função, 3/2/1/0 configuram os canais utilizados. EREAD Sintaxe: variável = EREAD endereço Visão geral: Ler as informações contidas na EEPROM on-board, disponível em alguns tipos de PIC. Exemplo: DIM VAR1 AS BYTE ‘uma variável é declara e o seu conteúdo é o VAR1 = EREAD 0 contido na posição 0 da memória EEPROM.’ 20 EWRITE Sintaxe: EWRITE endereço, [conteúdo] Visão geral: Escreve informações na memória eeprom on-board disponível em alguns PIC. Exemplo: EWRITE 0, [“MECATRONICA”] ‘Escreve na memória os caracteres da palavra MECATRONICA, de modo que cada letra equivale a uma posição começando de 0.’ PRINT Sintaxe: PRINT Item {, Item} Visão geral: Envia texto um módulo LCD. Item pode ser uma constante, varável, expressão, modificador ou lista de string. Os operadores modificadores não agem para modificar, mas sim para indicar o que se quer escrito no LCD. Para textos se deve seguir a tabela ASCII para caracteres especiais e entre aspas (“ texto”). Modificadores: AT – Indica a posição do curso no LCD [AT Xpos (1 to n), Ypos (1 to n)], ou seja, [PRINT AT nºlinha, nºcoluna]. CLS – Limpa o LCD. BIN{1...32} – mostra dígitos binários no display DEC{1...10} – mostra dígitos decimais no display HEX{1...8} – mostra dígitos hexadecimais no display Outros ... Exemplo: PRINT AT 1, 1, “MINHA NOTA=”, DEC 10 Este exemplo faz com que se escreva a frase “MINHA NOTA=” a partir da primeira linha e primeira coluna e após o igual, o número 10 em decimal, ficando ‘MINHA NOTA=10’ no LCD. Existe ainda comandos padronizados para controlar e manipular o LCD como mostrado abaixo na tabela 3. Tabela 3: Comandos para LCD. Comando Operação $FE, 1 Limpa o LCD e move o cursor para a posição home. $FE, 2 Move o cursor para a primeira linha da primeira coluna. $FE, $10 Move o cursor uma posição à esquerda. $FE, $14 Move o cursor uma posição a direita. $FE, $18 Desloca todo os caracteres do display a esquerda. $FE, $1C Desloca todo os caracteres do display a direita. $FE, $0C Desliga o cursor. $FE, $0E Cursor sublinhado. $FE, $0F Cursor piscando. $FE, $C0 Move o cursor para o início da segunda linha. $FE, $94 Move o cursor para o início da terceira linha. $FE, $D4 Move o cursor para o início da quarta linha. 21 ADIN Sintaxe: Variável = ADIN n°canal Visão geral: Ler o valor do conversor A/D on-board. Exemplo: VAR = ADIN 0 Coloca o valor da conversão do canal 0 na variável VAR. SERVO Sintaxe: SERVO Pino, Valor da Rotação Visão geral: Controla o centro de controle de um servo motor. Pino equivale ao pino do PORT escolhido em que o servo é conectado. Valor de Rotação é uma constante ou variável WORD dedicada ao posicionamento do motor podendo assumir valores entre 500 a 2500, sendo 1500 o valor central de posicionamento. Exemplo: SERVO PORTD.0, 1500 Posiciona o servo ligado ao pino 0 do PORT centralmente. PWM Sintaxe: PWM Pino, Nível, Ciclo Visão geral: Gera uma saída com Modulação por Largura de Pulso em pino, em seguida, retorna o pino para o estado de entrada. 22 6 – EXEMPLOS E APLICAÇÕES Fazer um programa é simplesmente elaborar uma lista de instruções para o microcontrolador executa-las sequencialmente. Ao escrever o programa se faz extrema importância que essa sequência de execução esteja bem defina para se atingir o objetivo desejado. É como uma receita de bolo: 1 – Pega os Ingredientes; 2 – Mistura os Ingredientes; 3 – Coloca a Mistura na Forma; 4 – Leva a Forma ao Forno; 5 – Tira a Forma do Forno e espera esfriar; 6 – Come o Bolo. Claramente essa seria a sequência correta de programação para se fazer um bolo. Mas e se fosse feito uma sequência como abaixo? 1 – Leva a Forma ao Forno; 2 – Come o Bolo; 3 – Tira a Forma do Forno e espera esfriar; 4 – Mistura os Ingredientes; 5 – Coloca a Mistura na Forma; 6 – Pega os Ingredientes. Certamente todas as instruções foram informadas, porém com ordenamento incorreto. Na primeira instrução se pode até levar a Forma ao Forno, mas sem a mistura dos ingredientes e assim não tem como comer o bolo antes de fazê-lo, é obvio, e isso causará um erro de execução. Por isso se faz de grande importância o conhecimento correto da sequência de instruções dada ao microcontrolador. 6.1 – Primeiros Programas com o PIC 16F877A Para se aprender a programar um microcontrolador é importante começar o assunto com exemplos práticos e simples, isso ajuda a entender como a arquitetura do PIC e as instruções do programa estão sendo usados. Os circuitos estarão baseados nos conhecimentos mostrados em páginas anteriores. Para melhorar a compreensão dos projetos que faremos na sequencia desse material, utilizaremos uma sequência simples de elaboração dos programas, como mostrado abaixo Declaração do Microcontrolador; Declaração do Oscilador; Nomear os pinos ou PORTs a serem usados; Configurar os pinos ou PORTs como entradas ou saídas; Configuração dos PORTs como Digitais ou Analogicos; Declaração de Varáveis; *Declaração de outros componentes (se necessário); Instruções e/ou rotinas. Obs.: Vale ressaltar que o Proton IDE ler as linhas de programação sequencialmente e que comentários no programa são feitos com a adição do acento grave ( ` ) à frente das palavras da linha. 23 6.2.1 – Projeto 1: Fazendo um LED piscar. Circuito Figura 22: Circuito do Projeto 1. Programa Device = 16F877A 'Declara qual o Microcontrolador Xtal 4 'Declara o Oscilador Symbol LED = PORTB.0 'Nomeia o pino 0 do PORT B como LED TRISB.0 = 0 'Declara o pino o do PORT B como saída AQUI: 'Rótulo da rotina High LED 'Coloca o LED em nível lógico Alto DelayMS 1000 'Atrasa a execução do programa em 1000ms Low LED 'Coloca o LED em nível lógico Baixo DelayMS 1000 'Atrasa a execução do programa em 1000ms GoTo AQUI 'Manda o programa executar a rotina do rótulo AQUI End 'Informa o fim do programa ComentandoDevice = 16F877A declara qual o microcontrolador usado. Xtal 4 declara qual o oscilador usado. Symbol LED = PORTB.0 nomeia o pino do PORT B como LED facilitando. TRISB.0 = 0 declara que o pino 0 do PORT B será usado como saída. AQUI: é o rótulo de uma rotina a ser executada. High LED coloca 5V no pino 0 do PORT B. DelayMS 1000 atrasa o programa em 1000 milissegundos ou 1 segundo. Low LED coloca 0V no pino 0 do PORT B. Goto AQUI faz com que a rotina do rótulo AQUI seja executada. End informa ao compilador o fim do programa. Assim o LED ascenderá, permanecendo assim por 1 segundo e apagará por mais 1 segundo até que a rotina seja repetida. 24 6.2.2 – Projeto 2: Ligar e Desligar 2 LEDs alternadamente. Circuito Figura 23: Circuito do Projeto 2. Programa Device = 16F877A 'Declara qual o Microcontrolador Xtal 4 'Declara o Oscilador TRISB = %00000000 'Declara o PORT B como saída PORTB = 0 'Coloca 0V em todos os pinos do PORT B AQUI: 'Rótulo da rotina High PORTB.0 'Coloca o 5V no pino 0 do PORT B Low PORTB.7 'Coloca o 0V no pino 7 do PORT B DelayMS 500 'Atrasa a execução do programa em 500ms Low PORTB.0 'Coloca 0V no pino 0 do PORT B High PORTB.7 'Coloca 5V no pino 7 do PORT B DelayMS 500 'Atrasa a execução do programa em 500ms GoTo AQUI 'Manda o programa executar a rotina do rótulo AQUI End 'Informa o fim do programa Comentando A maioria das instruções são bem parecidas com o do projeto 1. Neste projeto TRISB=%00000000 declara de forma binaria que todos os pinos do PORT B serão usados como saídas. PORTB=0 faz com que todos pinos do PORT B fiquem com 0V. A rotina executada dentro do rótulo AQUI: faz com que enquanto o pino 0 tenha 5V o pino 7 tenha 0V e vice-versa, de modo que na simulação da figura 23 os led’s ascendam e apaguem alternadamente, ou seja, enquanto um ascende o outro apaga e vice-versa. 25 6.2.3 - Projeto 3: Fazer uma contagem binaria começando com 0, 1 e depois com potencias de 2 (2x) até 128. Circuito Figura 24: Circuito do Projeto 3. Programa Device = 16F877A 'Declara qual o Microcontrolador Xtal 4 'Declara o Oscilador TRISB = %00000000 'Declara o PORT B como saída PORTB = 0 'Coloca 0V em todos os pinos do PORT B AQUI: 'Rótulo da rotina PORTB = %00000000 'PORT B igual a 0 DelayMS 150 'Atrasa a execução do programa em 150ms PORTB = %00000001 'PORT B igual a 1 DelayMS 150 'Atrasa a execução do programa em 150ms PORTB = %00000010 'PORT B igual a 2 DelayMS 150 'Atrasa a execução do programa em 150ms PORTB = %00000100 'PORT B igual a 4 DelayMS 150 'Atrasa a execução do programa em 150ms PORTB = %00001000 'PORT B igual a 8 DelayMS 150 'Atrasa a execução do programa em 150ms PORTB = %00010000 'PORT B igual a 16 DelayMS 150 'Atrasa a execução do programa em 150ms PORTB = %00100000 'PORT B igual a 32 DelayMS 150 'Atrasa a execução do programa em 150ms PORTB = %01000000 'PORT B igual a 64 DelayMS 150 'Atrasa a execução do programa em 150ms PORTB = %10000000 'PORT B igual a 128 DelayMS 150 'Atrasa a execução do programa em 150ms GoTo AQUI 'Manda o programa executar a rotina do rótulo AQUI End 'Informa o fim do programa 26 Comentando O que se tem de diferente nesse programa em relação aos demais é a configuração do nível lógico dos pinos do PORT B de forma binária. PORTB = %00000001 é uma forma binaria (o símbolo ‘%’ é a representação binária na programação) de indicar quais os pinos estarão com 0V ou 5V, nível lógico baixo ou alto, assim a configuração citada anteriormente faz com que o pino 0 do PORT B fique com 5V e os demais pinos do PORT fiquem com 0V, com representação decimal igual a 1. O programa faz uma contagem binaria com as saídas, de modo que comece com 0, depois 1 e em seguida faça a contagem da potencias de 2 até 128. Isto fará com que os led’s ascendam de forma crescente. ________________________________________________________________________________ ________________________________________________________________________________ ________________________________________________________________________________ ________________________________________________________________________________ ________________________________________________________________________________ ________________________________________________________________________________ ________________________________________________________________________________ ________________________________________________________________________________ ________________________________________________________________________________ ________________________________________________________________________________ ________________________________________________________________________________ ________________________________________________________________________________ ________________________________________________________________________________ ________________________________________________________________________________ ________________________________________________________________________________ ________________________________________________________________________________ 6.2.4 – Projeto 4: Utilizando botões nas entradas para acionar saídas. Utilizando as instruções IF – THEN. Circuito Figura 25: Circuito do Projeto 4. 27 Programa Device = 16F877A 'Declara qual o Microcontrolador Xtal 4 'Declara o Oscilador Symbol LED1 = PORTB.0 'Nomeia pino 0 do PORT B Symbol LED2 = PORTB.1 'Nomeia pino 1 do PORT B Symbol BOTAO = PORTD.0 'Nomeia pino 0 do PORT D TRISB = 0 'Configura o PORT B como saída TRISD.0 = 1 'Configura o pino 0 do PORT D como entrada PORTB=0 'Coloca os pinos do PORT B em nível lógico alto TEST: 'teste do botão If BOTAO = 0 Then LIGAR1 'Condição 'Se' 1 para o botão If BOTAO = 1 Then LIGAR2 'Condição 'Se' 2 para o botão LIGAR1: High LED1 'Liga LED1 Low LED2 'Desliga LED2 DelayMS 50 'Atraso de execução GoTo TEST 'Retorna para teste do botão LIGAR2: Low LED1 'Desliga LED1 High LED2 'Liga LED2 DelayMS 50 'Atraso de execução GoTo TEST 'Retonar para teste de botão End Comentando Nesta programação temos três pontos importantes a se analisar. A primeira coisa que na figura 25 se observa é o botão B1 no MCLR que servirá como reset, ou seja, numa lógica positiva que enquanto o botão B1 não for pressionado o microcontrolador não tem alimentação (0V) e consequentemente não executara nenhuma instrução, mas ao pressioná-lo uma tensão de 5V fará a alimentação e colocará o microcontrolador em funcionamento. O segundo ponto importante é o outro botão B2 no pino 0 do PORT D (configurado como entrada no TRISD.0=1 enomeado como BOTAO) que servirá como uma entrada digital (sensor) que tem a função de ligar e desligar as saídas referentes ao LED1 e LED2. A última coisa a se relatar é a utilização da instrução IF – THE dentro rótulo TEST:, que tem a função de impor uma condição de análise e de ação dentro do programa para assim saber qual a resposta a se dar dependendo do estado lógico do botão B2. ________________________________________________________________________________ ________________________________________________________________________________ ________________________________________________________________________________ ________________________________________________________________________________ ________________________________________________________________________________ ________________________________________________________________________________ ________________________________________________________________________________ ________________________________________________________________________________ ________________________________________________________________________________ ________________________________________________________________________________ 28 6.2.5 - Projeto 5: Contagem de 0 a 9 com display de 7 segmentos. Os displays que será utilizado nesta parte da programação e simulação será o Display de Leds de sete segmentos, dado que os números são compostos através de sete traços cada qual com seu respectivo Led que ao combina-los podemos formar números de 0 a 9. A figura 26, mostra como é a nomenclatura de cada traço do display. Desta forma temos um pino para controlar cada um dos segmentos (A à G). Vale ressaltar que se tem diferentes tipos desse display, mas utilizaremos um genérico, dado que essa explicação trata de uma simples explicação do seu funcionamento para que assim se possa ter a possibilidade de utiliza-lo na programação e simulação. Figura 26: Display de 7 segmentos genérico. Circuito Figura 27: Circuito do Projeto 5. 29 Programa Device = 16F877A 'Declara qual o Microcontrolador Xtal 4 'Declara o Oscilador Symbol DISPLAY = PORTB 'Nomeia pino 0 do PORT B TRISB = 0 'Configura o PORT B como saída Dim CONT As Byte 'Declara a variável CONT como Byte PORTB=0 'Coloca os pinos do PORT B em nível lógico alto INICIO: For CONT = 0 To 9 'Faz um laço com a variável CONT indo de 0 a 9 If CONT=0 Then DISPLAY=%00111111 'coloca 0 no display If CONT=1 Then DISPLAY=%00000110 'coloca 1 no display If CONT=2 Then DISPLAY=%01011011 'coloca 2 no display If CONT=3 Then DISPLAY=%01001111 'coloca 3 no display If CONT=4 Then DISPLAY=%01100110 'coloca 4 no display If CONT=5 Then DISPLAY=%01101101 'coloca 5 no display If CONT=6 Then DISPLAY=%01111101 'coloca 6 no display If CONT=7 Then DISPLAY=%00000111 'coloca 7 no display If CONT=8 Then DISPLAY=%01111111 'coloca 8 no display If CONT=9 Then DISPLAY=%01100111 'coloca 9 no display DelayMS 150 If CONT=9 Then INICIO 'Volta ao início da contagem indo de 0 a 9 Next 'continua o laço de contagem até a variável alcançar o valor final End Comentando Para essa aplicação temos uma instrução nova que a FOR – NEXT que se trata de um laço onde a variável tem uma contagem de início e um fim, sendo que a cada contagem a rotina dentro desse laço é executada até que o laço chegue à sua contagem final. A contagem no display é feita colocando 0V ou 5V nos pinos referentes a cada segmento a que se quer acionar para representar o número escolhido, onde tal procedimento é feito pela indicação do nível lógico de cada pino do PORT B nomeado como DISPLAY, de forma binaria, como por exemplo em DISPLAY=%00111111 indicando os pinos 0 a 6 como 5V e 7 a 8 como 0V, mostrando 0 no display. ________________________________________________________________________________ ________________________________________________________________________________ ________________________________________________________________________________ ________________________________________________________________________________ ________________________________________________________________________________ ________________________________________________________________________________ ________________________________________________________________________________ ________________________________________________________________________________ ________________________________________________________________________________ ________________________________________________________________________________ ________________________________________________________________________________ 30 6.2.6 - Projeto 6: Utilizando o Display de Cristal Líquido (LCD). Os LCD’s são muito mais poderosos que os displays de 7 segmentos, dado que possuem muito mais caracteres e são alfanuméricos. Porém são mais caros e com uma visualização inferior, pois os caracteres não possuem iluminação própria e são de tamanho bem reduzido. Os módulos LCD são ideais para aplicações alfanuméricas ou com gráficos. Os alfanuméricos têm disponibilidade de grande variedade de configurações, como: uma linha, duas linhas e quatro linhas sendo as mais comuns. A quantidade de colunas tem são variáveis, sendo comumente encontrada com 16, 20 e 40 colunas por linha. Como podemos ver existem muitos displays de cristal líquido (LCD) no mercado, mas utilizaremos o modelo padrão em aplicações, o de duas linhas e 16 caracteres cada uma. Uma característica importante desse display é que ele possui um drive de controle interno. Assim a comunicação será feita com ele através de uma comunicação paralela, passando comando e os caracteres que desejamos escrever, diretamente em código ASCII. Figura 28: Display LCD com 2 linhas e 16 colunas cada uma, total de 32 caracteres. Pinagem Os pinos 1 e 2 (VSS e VDD) do LCD corresponde a alimentação GND e Vdc respectivamente, onde a tensão máxima suportada é de 5 Vdc. Já o pino 3 VEE corresponde ao controle de contraste, assim um potenciômetro é conectado a ele para ter esse controle. O pino 4 ‘RS’ (Register Select) é utilizado para definir o tipo de informação passada através da comunicação paralela. Quando o RS é 0 a informação enviada é um comando ou instrução. Se RS for 1 A informação enviada é um registro de dados ou caractere alfanumérico. O pino 5 ‘R/W’ (Read/Write), é um pino utilizado para ler dados a partir da tela do LCD ou escrever uma entrada no LCD. Se R/W=0 o LCD está habilitado para se poder escrever dados na tela. Se R/W=1 o LCD habilita a leitura de seus dados. Em muitos casos esse pino não é utilizado, ficando permanentemente ligado ao Vss, assim o LCD opera somente em modo de escrita. Por isso é preciso garantir o térmico das operações internas do módulo de LCD através de tempos pré-estabelecidos. O pino 6 ‘E’ (Enable), é um pino de habilitação, ou seja, se E=0 o LCD é desativado para receber dados, mas se E=1 então o LCD é capaz de trabalhar de modo a podermos escrever ou ler dados no mesmo. Os pinos 7 a 14 (D0 a D7) equivalem ao barramento de dados paralelo. Apesar da existência de 8 vias de dados, esses displays podem operar com 4 vias (D4 a D7) já que as demais vias ficam semfunções, assim as informações são enviadas em dois pacotes de 4 bits cada um. 31 Ao se trabalhar com 8 bits, estes deverão ser conectados em um só PORT e nunca em PORTs diferentes do microcontrolador. Ao se trabalhar com somente 4 bits mais significativos do LCD, estes devem ser conectados aos quatro bits menos significativos ou aos quatro bits mais significativos do PORT escolhido. Os pinos E (pino 6) e RS (pino 4) podem ser conectados em qualquer PORT do microcontrolador. O pino R/W deve estar conectado à terra (GND) para indicar ao LCD que se está trabalhando com escrita de dados. No Proton IDE é necessário fazer algumas declarações para o uso de displays alfanuméricos para o uso do comando PRINT. 1 – DECLARE LCD TYPE 1 ou 0 - Informa ao compilador o tipo de display a ser utilizado pelo comando PRINT, se (Gráfico ou Alfanumérico) 2 – DECLARE LCD_DTPIN PORT.PIN – identifica o PORT e os pinos que as vias de dados do LCD está ligada. Por exemplo: Se utilizado uma via de dados de 8 bits o comando seria “DECLARE LCD_DTPIN PORTB.0” ou Se utilizado uma via de 4 bits seria “DECLARE LCD_DTPIN PORTB.4”. 3 – DECLARE LCD_ENPIN PORT.PIN – Identifica o PORT e o pino que a via de habilitação (enable) LCD está ligada. 4 – DECLARE LCD_RSPIN PORT.PIN – Identifica o PORT e o pino que a via RS do LCD está ligada. 5 – DECLARE LCD_INTERFACE 4 ou 8 – Informa ao compilador o tamanho da via de dados do LCD utilizada. 6 – DECLARE LCD_LINES 1, 2 ou 4 – Informa ao compilador o número de linhas do LCD utilizada. Circuito Figura 29: Circuito do Projeto 6. 32 Programa 1 Device = 16F877A Xtal 4 Declare LCD_Type 0 'Informa que o LCD é Alfanumerico Declare LCD_DTPin PORTB.4 'Informa os pinos de Dados Declare LCD_ENPin PORTB.3 'Informa o pino do Enable Declare LCD_RSPin PORTB.2 'Informa o pino RS Declare LCD_Interface 4 'Informa a quantidade de bits em um pacote de dados Declare LCD_Lines 2 ' Informa o numero de linhas do LCD Print At 1, 1, "MECATRONICA" 'Imprime no LCD Comentando Neste programa é feito os declares para o LCD funcionar com a instrução Print e depois está função imprime no LCD a mensagem ‘MECATRONICA’, o Modificador At faz com que o primeiro caractere do texto inicie na primeira linha e primeira coluna do LCD. Programa 2 Device = 16F877A Xtal 4 Dim INDICE As Byte 'declara a variável Dim CHAR As Byte 'declara a variável EWrite 0, [" IFCE LIMOEIRO "] 'coloca na memoria das pos. 0 a 16 EWrite 17, [" MECATRONICA "] 'coloca na memoria das pos. 17 a 32 Declare LCD_Type 0 'Informa que o LCD é Alfanumerico Declare LCD_DTPin PORTB.4 'Informa os pinos de Dados Declare LCD_ENPin PORTB.3 'Informa o pino do Enable Declare LCD_RSPin PORTB.2 'Informa o pino RS Declare LCD_Interface 4 'Informa a quantidade de bits em um pacote de dados Declare LCD_Lines 2 ' Informa o numero de linhas do LCD INICIO: Cls 'Limpa o LCD For INDICE = 0 To 15 CHAR = ERead INDICE 'Ler a memoria na posição INDICE e coloca em CHAR DelayMS 100 Print $FE, 14, $FE, $0C, CHAR 'Move uma pos. a direita, desliga cursor Next 'e imprime o caractere de CHAR DelayMS 300 Print $FE, 2 'Retorna inicio primeira linha For INDICE = 0 To 15 CHAR = ERead INDICE 'Ler a memoria na posição INDICE e coloca em CHAR DelayMS 100 Print $FE, $1C, CHAR 'Move os caracteres p/ direita Next DelayMS 300 33 For INDICE = 15 To 0 Step -1 CHAR = ERead INDICE DelayMS 100 Print $FE, $18, CHAR 'Move os caracteres p/ esquerda Next DelayMS 300 Print $FE, $C0 'desliga o cursor For INDICE = 17 To 32 CHAR = ERead INDICE DelayMS 100 Print $FE, 14, $FE, $0C, CHAR 'Move uma pos. direita, desl. cursor Next 'e imprime CHAR DelayMS 300 GoTo INICIO Comentando Neste programa foi usado a escrita e leitura de memória onde cada caractere dos textos equivale colocados nela equivale a uma posição. Na impressão dos caracteres no LCD, as letras foram colocadas uma de cada vez para a primeira linha, movidas da esquerda para direita e em seguida da direita para a esquerda. Depois o segundo texto foi impresso no LCD também uma letra por vez. ________________________________________________________________________________ ________________________________________________________________________________ ________________________________________________________________________________ ________________________________________________________________________________ ________________________________________________________________________________ ________________________________________________________________________________ ________________________________________________________________________________ ________________________________________________________________________________ ________________________________________________________________________________ ________________________________________________________________________________ ________________________________________________________________________________ ________________________________________________________________________________ ________________________________________________________________________________ ________________________________________________________________________________ ________________________________________________________________________________ ________________________________________________________________________________ ________________________________________________________________________________ ________________________________________________________________________________ ________________________________________________________________________________ ________________________________________________________________________________ ________________________________________________________________________________ ________________________________________________________________________________ ________________________________________________________________________________ ________________________________________________________________________________ ________________________________________________________________________________ ________________________________________________________________________________ ________________________________________________________________________________ 34 6.2.7 - Projeto 7: Utilizando conversor Analógico/Digital (A/D). O conceito de sinais analógicos e digitais foram descritos anteriormente, dado a característica do PIC só processar sinais digitais e muitas vezes termos que trabalhar com variáveis analógicas agora temos que utilizar o conversor A/D, eles são necessários para o processamento de sinais como de temperatura, corrente e tensão elétrica, posicionamento ou sinal de um sensor. Por tudo isso é que se faz importante saber suas características e seu funcionamento. Para melhor entendimento da teoria da conversão dos sinais analógicos em dados digitais, um exemplo prático com o sensor de temperatura ira nos ajudar. Sensores de temperatura fornecem informações analógicas (tensão) proporcional a temperatura, assim, para que se possa ser analisado pelo microcontrolador, se faz necessárioum conversor A/D. O PIC 16F877A possui um conversor A/D de 10 bits com 8 entradas independentes. É do tipo aproximações sucessivas. O menor passo, ou resolução, é o menor valor da grandeza analógica medica que causará mudança de leitura do estado digital pelo conversor à medida que o valor anterior é lido pelo A/D. É dado diretamente pelo seu número de bits e pode ser expresso por: 𝑟𝑒𝑠𝑜𝑙𝑢çã𝑜 = 𝑉𝑅𝐸𝐹 2𝑛 Em que VREF é uma tensão de referência e n é o número de bits do conversor. Cada um dos n bits que compõem a informação digital representa uma parcela da tensão analógica a ser convertida, de forma que a soma de todas as contribuições de cada um dos n bits forma a tensão de entrada do conversor A/D. Assim a parcela de tensão proporcional ao bit m do conversor A/D é dada por: 𝑉𝑒𝑛𝑡𝑟𝑎𝑑𝑎 = 𝑏𝑚2 (𝑚−1) 2𝑛 𝑉𝑟𝑒𝑓 Em que: bm é o valor do bit m, ou seja, 0 ou 1. Vamos supor que o A/D para o exemplo da temperatura e que seja de 4 bits, a tensão de referencia seja de 5V e o valor da conversão em binário seja 1101. A tensão de entrada, é: 𝑉𝑒𝑛𝑡𝑟𝑎𝑑𝑎 = (1𝑥23 + 1𝑥22 + 0𝑥21 + 1𝑥20) 24 (5) = 4,0625𝑉 Este valor de tensão é equivalente a uma dada temperatura, e por isso o valor convertido (1101) equivale a mesma temperatura. Assim, temos que duas conversões devem ser feitas, uma para o sinal analógico em digital e a outra de digital para a unidade desejada que representa a grandeza a ser medida como por exemplo °C. 35 Figura 30: Relação entre sinal analógico, digital e grandeza medida. Existem muitas maneiras de implementar um A/D. O estudo aqui será do sistema de conversão chamado de aproximação sucessiva. Nesse tipo de conversor, a conversão é realizada do bit mais significativo (Msb) para o menos significativo (Lsb). Dado que o Msb por se só representa metade da tensão de referência, conhecer o estado deste bit (0 ou 1) significa saber se a tensão de entrada é maior ou menor que a metade da referência. Conhecido o Msb, representa metade da metade (1/4) da tensão de referência. Assim até o Lsb. Supondo um A/D de 4 bits e Vref de 5V: Tabela 4: Valor de cada bit para o exemplo. Bit Tensão 4 (Msb) 2,5000 V 3 1,2500 V 2 0,6250 V 1 (Lsb) 0,3250 V Supondo uma tensão de entrada de 3,3V. a conversão então seria: 1 – Testa-se o bit mais significativo, ou seja, a tensão de entrada é maior do que 2,5? Sim, então este bit vale 1. 2 – Testa-se o próximo bit, ou seja a tensão de entrada é maior do que 3,75V (2,5V+1,25V)? Não, então o bit é 0. 3 – Testa o próximo bit, a tensão de entrada é maior do que 3,125V (2,5V+0,625V)? Sim, então o bit é 1. 4 – Por fim o bit menos significativo, a tensão de entrada é maior do que 3,4375V (2,5V+0,625V+0,3125V)? Não, então o bit é 0. Desse modo o valor final da conversão de 3,3V de entrada em binário é 1010. É uma forma de conversão rápida e para um conversor de n bits são necessárias interações, “que independem do valor a ser convertido”. 36 Quatro registradores controlam a operação do conversor: ADRESH – byte mais significativo da conversão; ADRESL – byte menos significativo da conversão; ADCON0 – registrador de controle 0; ADCON1 – registrador de controle 1. O conversor gera um resultado binário de 10 bits e armazena o resultado nos registros ADRESL e ADRESH. Apesar do microcontrolador possuir diversos canais analógicos, internamente só existe um sistema de conversão. Por isso, somente um canal pode ser utilizado de cada vez. Para começar a utiliza-lo temos que aprender a configurar os canais de maneira correta. Inicialmente se deve definir, conforme as necessidades do projeto, qual a quantidade de canais analógicos que serão necessários. Em um microcontrolador que possui vários canais, se pode utilizar todos ou parte deles, deixando os outros pinos configurados como I/O digitais. É impossível configurar individualmente cada canal. Existem valores padrões de configuração que devem ser respeitados. Primeiro passo é configurar os canais de entrada que serão utilizados para introduzir o sinal analógico do conversor A/D e os canais para tensões de referência. Isto se faz selecionando a combinação correspondente aos bits PCFG3, PCFG2, PCFG1 e PCFG0 do registro de controle ADCON1. Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 ADFM --- --- --- PCFG3 PCFG2 PCFG1 PCFG0 Figura 31: Dados de configuração do registrador ADCON1. Para esta configuração se deve analisar a tabela 5, que defini quais pinos do PORT A ou E serão entradas do conversor A/D. Tabela 5: Pinos de entrada analógicas e tensão de referência. PCFG3: PCFG0 AN7 RE2 AN6 RE1 AN5 RE0 AN4 RA5 AN3 RA3 AN2 RA2 AN1 RA1 AN0 RA0 VREF+ VREF- 0000 A A A A A A A A VDD VSS 0001 A A A A VREF+ A A A RA3 VSS 0010 D D D A A A A A VDD VSS 0011 D D D A VREF+ A A A RA3 VSS 0100 D D D D A D A A VDD VSS 0101 D D D D VREF+ D A A RA3 VSS 0110 D D D D D D D D VDD VSS 0111 D D D D D D D D VDD VSS 1000 A A A A VREF+ VREF- A A RA3 RA2 1001 D D A A A A A A VDD VSS 1010 D D A A VREF+ A A A RA3 VSS 1011 D D A A VREF+ VREF- A A RA3 RA2 1100 D D D A VREF+ VREF- A A RA3 RA2 1101 D D D D VREF+ VREF- A A RA3 RA2 1110 D D D D D D D A VDD VSS 1111 D D D D VREF+ VREF- D A RA3 RA2 37 Além da configuração dos pinos analógicos, conforme a tabela apresentada, não se pode esquecer de configurar os registradores TRISA e TRISE, de forma que os canais utilizados estejam ajustados para entrada (TRIS = 1). Estando o canal analógico como saída, o sistema de conversão continuará funcionando, mas os valores convertidos serão equivalentes aos níveis alto (1 = VDD) e baixo (0=VSS). Outra questão importante de se observar é o fato da utilização das tensões de referência. A conversão é feita ao se comparar a tensão do pino de entrada analógica em relação as tensões de referencia VREF + e VREF -. Assim, quando a tensão de entrada for igual a tensão VREF +, a conversão tem como resultado o valor máximo (1024) e sendo a tensão de entrada igual a VREF – o resultado será zero (0). Pode-se ter quatro tipos de referências, sendo duas internas (VDD e VSS), e duas externas, ligadas aos pinos RA2 (VREF -) e RA3 (VREF +). Ao exemplificarmos com a aplicação de uma tensão variando de 0V a 5V na entrada analógica e utilizando referencias internas onde VREF + = VDD(5V) e VREF - = VSS(0V) e em outra aplicação um sensor varia de 1V a 4V. Para que não se perca a resolução do A/D, então trabalha-se com tensões de referências externas com VREF +(RA3) = 4V e VREF – (RA2) = 1V. É importante respeitar os limites elétricos impostos a essas referências: Tabela 6: Limites elétricos. Referência Mínimo (V) Máximo (V) VREF + VDD – 2,5 VDD + 0,3 VREF - VSS – 0,3 VREF + - 2,0 (VREF + = VREF -) 2,0 VDD + 0,3 O próximo fato a ser aprendido é a importância da velocidade e consequentemente aos tempos de amostragem que devem ser respeitados para uma correta utilização do conversor A/D. Inicia-se entendo o funcionamento interno do sistema de conversão. Para se evitar problemas de ruído e varações da entrada analógica durante o processo de inversão (vale lembrar que nada é absolutamente instantâneo), Internamento o PIC utiliza uma estrutura chamada Sample and Hold (S/H), com tradução ‘amostragem e retenção’. O PIC possui internamente, um capacitor (120pF) ligado ao canal analógico em uso. Assim, ele fica carregado
Compartilhar