Ambiente de desenvolvimento para microcontroladores PIC
Ambiente de desenvolvimento para a plataforma Arduino
ORIENTAÇÕES DE ESTUDO E OBJETIVOS DA AULA VIRTUAL Nº 04 – Plano de Ensino Estácio
Assistir à aula em vídeo intitulada IDE, COMPILADOR E SIMULADOR PARA
MICROCONTROLADORES PIC, disponível no link: https://youtu.be/NsoyEZB5dPs
Estudar o conteúdo on-line intitulado MICROCONTROLADORES - CAP. 1 e 2,
disponível no link: https://www.ufsm.br/unidades-universitarias/ctism/cte/wp- content/uploads/sites/413/2018/12/05_microcontroladores.pdf IDE, compilador e simulador O que é um IDE? Integrated Development Environment ou Ambiente de Desenvolvimento Integrado É um programa de computador que reúne características e ferramentas de apoio ao desenvolvimento de software com o objetivo de agilizar este processo. Normalmente, uma IDE é composta de: • Editor de Programas • Compilador • Linker • Loader • Depurador IDE Os IDEs modernos incluem muitas ferramentas. Para chamá-lo de IDE, deve-se incluir pelo menos um editor de texto (para digitar seu programa), algum gerenciamento de projeto e ferramenta de compilação para executar seu programa sem sair do IDE.
O IDE moderno também pode incluir ferramentas de depuração,
ferramentas de cobertura de código, ferramentas de gerenciamento de versão, ferramentas automatizadas de ajuda e documentação, editores de recursos gráficos e muitas outras ferramentas úteis. IDEs recomendadas Compilador Compilação é processo de tradução do código fonte escrito para um código de máquina, de alto nível para baixo nível.
A compilação é feita por um software especial conhecido como
compilador.
C, Python, Java são uma linguagens de alto nível e precisam de um
compilador para convertê-lo em um código executável e para que o programa possa ser executado em uma máquina ou microcontrolador. Compilador Como todos os outros microcontroladores, o microcontrolador PIC pode ser programado usando linguagem de montagem (assembly). Para melhor rendimento e mais rapidez na conclusão de projetos, usa-se linguagens de alto nível, como C. Muitos compiladores de linguagens de alto nível estão disponíveis para programar um microcontrolador PIC como MikroC, MPLAB XC8, C-Tech C, além do compilador CCS C que usaremos. CCS significa Custom Computer Services, uma empresa de soluções para microcontroladores PIC. O CCS C foi um dos primeiros e é um dos melhores compiladores para iniciantes, pois inclui muitas bibliotecas integradas que permitem programar um microcontrolador PIC sem profundo conhecimento de sua arquitetura interna. Simulador Existem diversas definições para a simulação, dentre elas podemos citar a de Pegden (1990) que diz “a simulação é um processo de projetar um modelo computacional de um sistema real e conduzir experimentos com este modelo com o propósito de entender seu comportamento e/ou avaliar estratégias para sua operação”.
Usaremos simuladores ao longo desta disciplina por não estarmos presentes em um
laboratório físico. Exemplos de Simuladores para microcontroladores: -> PICsimLab (https://sourceforge.net/projects/picsim/) -> Tinkercad (https://www.tinkercad.com/) PICsimLab O PICsimLab é um acrônimo de PIC Simulator Laboratory, um simulador de placas de desenvolvimento da família PIC, desenvolvido pelo professor Luis Claudio Gambôa Lopes do CEFET/MG. Inicialmente suportando apenas uma placa de desenvolvimento com o PIC16F628A, a versão atual pode simular 4 placas com vários periféricos e vários microcontroladores PIC, como o PIC16F877A/18F452. A arquitetura do simulador permite a fácil implementação de elementos externos na linguagem C. Ciclo de desenvolvimento As tarefas típicas para desenvolver uma aplicação com microcontroladores em sistemas embarcados são: 1)Criar a arquitetura de alto nível. A partir dos recursos e do desempenho desejados, decidir qual dispositivo microcontrolador é mais adequado para a aplicação, projetando o circuito de hardware associado. Depois de determinar quais periféricos e pinos controlam o hardware, escrever o firmware - o software embutido que controlará os aspectos de hardware do aplicativo incorporado.
2)Compilar, montar e conectar o software usando o assembler e/ou compilador e mais um
linker para converter o programa (códigofonte) em "zeros e uns", o código de máquina para os microcontroladores PIC, que fica disponível em um arquivo .hex. Este código de máquina acabará se tornando o firmware (o código programado no microcontrolador). Montadores e compiladores Uma ferramenta de linguagem, como um montador, que é diretamente traduzível em código de máquina, ou um compilador que permite uma linguagem mais natural para a criação de programas, deve ser usada para escrever e editar o código. No nosso caso utilizaremos o compilador CCS C dentro da IDE MPLAB. Montadores e compiladores ajudam a tornar o código compreensível, permitindo que rótulos de função identifiquem rotinas de código com variáveis que possuem nomes associados ao seu uso e com construções que ajudam a organizar o código em uma estrutura. Última etapa 3) Teste de código ou depuração. Normalmente, um programa complexo não funciona exatamente da maneira como foi imaginado, e os "bugs" precisam ser removidos para obter resultados adequados. O depurador permite que se veja os "zeros e uns" executados, relacionados ao código-fonte escrito, com os símbolos e nomes das funções do seu programa. A depuração permite que se experimente o código para ver o valor das variáveis em vários pontos do programa e para fazer verificações, alterando os valores das variáveis e percorrendo as rotinas. Mas nem sempre se possui uma ferramenta de depuração integrada, o que conduz a soluções alternativas para testar o código O que fazer então? Para desenvolver e depurar aplicativos embarcados sem uma ferramenta especial, é preciso de uma maneira de baixar o programa para o microcontrolador, ou para simulador. Nos primórdios do desenvolvimento de software de microcontroladores, o que significa os anos 70 e início dos anos 80, esse era frequentemente o método escolhido. Ferramentas de depuração eram raras e, para novas arquiteturas, muitas vezes inexistentes. Em consequência, o programa era frequentemente desenvolvido, gravado em uma EPROM e testado no hardware de destino. A depuração, inevitável em aplicações complexas, podia feita com equipamentos de medição externos, como analisadores lógicos, ou realizada através do uso mais ou menos criativo dos elementos de saída no microcontrolador. Por exemplo, ligados às portas podem existir alguns LEDs para a saída de estados, que podem ser usados para a saída de depuração durante a fase de testes. Através deles o desenvolvedor visualiza o fluxo do programa, indicando se o programa atingiu, e em que ordem atingiu, determinadas funções ou endereços de memória. Microcontrolador PIC16F628A O microcontrolador PIC16F628A faz parte de uma subfamília que inclui também os modelos PIC16F627A e PIC16F648A. As características de arquitetura seguem as encontradas em microprocessadores RISC. Utiliza a arquitetura Harvard, na qual o programa e os dados são acessados em memórias separadas, utilizando barramentos separados. ]Isso melhora a largura da banda, em comparação com a arquitetura tradicional Von Neumann, na qual o programa e os dados são acessados em uma mesma memória. A separação das memórias de programa e de dados permite ainda que as instruções sejam dimensionadas em palavras com largura diferente de 8 bits. Microcontrolador PIC16F628A Os códigos operacionais das instruções do PIC16F628A possuem largura de 14 bits, tornando possível que todas as instruções sejam constituídas de apenas uma única palavra. Um barramento de acesso à memória de programa com 14 bits de largura busca uma instrução de 14 bits em um ciclo único. Um pipeline de dois estágios sobrepõe a busca e a execução das instruções. Consequentemente, todas as 35 instruções (em assembly) são executadas em um único ciclo, com exceção do desvio na execução do programa. Unidade Lógica Aritmética (ALU) do PIC16F628A
O PIC16F628A contém uma Unidade Lógica Aritmética (ALU) e um
registrador de trabalho de 8 bits. A ALU é uma unidade aritmética de propósito genérico e tem capacidade de executar operações de adição, subtração, deslocamento, bem como operações lógicas. Um diagrama de blocos simplificado é apresentado na figura a seguir: PIC16F628A Pinagem do microcontrolador PIC16F628A A figura mostra a pinagem do microcontrolador PIC16F628A com as diferentes funções que podem assumir, detalhadas na tabela a seguir. Memória do PIC16F628A Dois tipos de memória de dados são fornecidos. A memória de dados não-volátil EEPROM (128 x 8 - 224 posições de 8 bits) é oferecida para armazenamento de dados por longos períodos, como por exemplo valores de calibração, dados de tabelas de consulta, ou quaisquer outros dados que podem requerer uma atualização periódica no campo. Estes tipos de dados não são perdidos quando a energia é interrompida. A outra memória de dados fornecida é a memória de dados regular RAM (224 x 8 – 224 posições de 8 bits). A memória de dados regular RAM é oferecida para o armazenamento temporário de dados durante a operação normal. Os dados são perdidos quando a energia é desligada. A memória de programação é do tipo Flash (2048 x 14 – 2048 posições de 14 bits). São 16 pinos de entrada e saída (mais dois para alimentação e terra) em duas portas (PORTA e PORTB na figura 1) que podem assumir diferentes funções dependendo dos bits de configuração. Vamos Programar um microcontrolador PIC16F628A? OLÁ MUNDO??? Este programa executa uma tarefa clássica na iniciação de estudos com microcontroladores, o piscar de um led ligado a um pino. (RB0) O esquema dado na figura exemplifica as ligações esperadas por este programa. Neste esquema, além do led ligado ao pino 6, temos o cristal oscilador (XT) que será usado para sincronizar a execução do programa. O programa é apresentado está no próximo slide. Exemplo de Código fonte: #include #fuses XT #use delay( clock=4MHz ) void main () { while (1) { output_high(PIN_B0); delay_ms(1000); output_low(PIN_B0); delay_ms(1000);} } Estrutura do programa: Olá Mundo(Pisca Led) #include <16F628A.h> - Definições do microcontrolador PIC16F628A. Incluindo este arquivo é possível usar as diretivas e funções que são descritas abaixo, como #fuses, output_high, PIN_B0 etc. #fuses XT Os fuses são bits de configuração. No projeto de software embutido existem algumas configurações para cada microcontrolador usado no projeto, como o tipo de oscilador interno/externo, se será usado um cronômetro de monitoramento ou não (watchdog), se haverá um pino de reinicialização ou não, e assim por diante. Essas configurações são controladas por meio de registros específicos. Neste exemplo, o parâmetro XT determina que será usado um cristal externo para se determinar o clock do programa, o valor do oscilador para o sincronismo do programa. O valor deste está determinado na linha seguinte - #use delay( clock=4MHz), onde se instrui o compilador a usar uma função delay (atraso) com clock de 4MHz Estrutura do programa: Olá Mundo(Pisca Led) void main () - Função principal, existente em todo programa em C.
while (1) - Repetição (loop) infinito. Esta estrutura é essencial para
programas embutidos em microcontroladores. Nestes é preciso garantir que o programa será executado de forma repetida, em loop infinito, e a estrutura while garante isso com o parâmetro (1) passado. Também poderia ser usado o parâmetro TRUE, pois no arquivo de definições 16F628A.h o valor 1 é atribuído a constante TRUE.
output_high(PIN_B0) e output_low(PIN_B0) - Respectivamente atribui um
valor lógico alto e baixo no pino de nome RB0 (pino 6 da figura 2). A ligação conforme a figura 3 permite que o led apague e acenda.
delay_ms(1000) - Estabelece um atraso na execução da próxima instrução,
no caso no valor de 1000 ms (1 segundo). Isto irá permitir o efeito de apagar e acender o led ligado ao pino RB0 com este intervalo Ambiente de desenvolvimento para a plataforma Arduino Ambiente de desenvolvimento para a plataforma Arduino Compreender o básico da arquitetura de microcontroladores da plataforma Arduino. • Criar os primeiros programas em C para microcontroladores da plataforma Arduino. • Desenvolver projetos dentro de um ambiente de programação para plataforma Arduino. • Simular código em C para a plataforma Arduino. Arduino O Arduino é uma plataforma de código aberto usada para construir projetos de eletrônica. Consiste de uma placa de circuito programável, onde está o microcontrolador, e um software, ou IDE, usado para escrever e fazer upload de código do computador para a placa física. O IDE do Arduino usa uma versão simplificada do C, facilitando o aprendizado do programa, o que tornou a plataforma bastante popular entre as pessoas que estão começando com a eletrônica. História Criada em 2005 por um grupo de pesquisadores italianos, a plataforma foi criada com o objetivo de disponibilizar um dispositivo barato e fácil de programar, sendo dessa forma acessível a estudantes e projetistas amadores. Com o conceito de hardware livre, ideia onde qualquer um pode montar, modificar e personalizar as placas Arduino a partir do hardware básico, a plataforma se popularizou e ganhou seguidores e desenvolvedores que disponibilizam inúmeros recursos de hardware e bibliotecas para a programação facilitada dos sistemas. Arduino A programação facilitada na plataforma Arduino é um dos motivos para a grande adoção do seu uso, não pela linguagem de programação, que é a mesma C usada por outras plataformas, mas pela grande quantidade de código disponível para várias funcionalidades.
A IDE do Arduino é repleta de bibliotecas com funções para programar
as placas e facilitar a integração de periféricos (shields) que são acoplados à mesma Arduino Uno Existem diversas variedades de placas Arduino. O modelo mais popular, Arduino Uno R3, é uma placa baseada no microcontrolador ATmega328 do fabricante Atmel. Possui 14 pinos de entrada/saída digital, 6 entradas analógicas (usadas para medir tensão, de sensores, por exemplo), um cristal oscilador de 16MHz, uma conexão USB, uma entrada de alimentação, um botão de reset etc. A figura 1 mostra a placa Arduino Uno com indicações numéricas que são detalhadas a seguir Arduino UNO Alimentação • Alimentação (USB / Conector de alimentação) Toda placa Arduino precisa de uma maneira de estar conectada a uma fonte de energia. O Arduino UNO pode ser alimentado por um cabo USB vindo do seu computador ou uma fonte de alimentação de parede (como esta) que é terminada em um conector de alimentação. Na foto acima, a conexão USB é marcada com (1) e o conector de alimentação está marcado com (2). A conexão USB também é usada para carregar o código na placa Arduino. IDE do Arduino, quando reconhece uma placa acoplada ao computador, permite fazer o descarregamento do código compilado na mesma. Pinagem Pinos (5V, 3.3V, GND, analógico, digital, PWM, AREF): Os pinos Arduino Uno são os lugares onde você conecta os fios para construir um circuito. Eles geralmente têm receptáculos de plástico preto que permitem que você conecte um fio direto na placa. O Uno tem vários tipos diferentes de pinos, cada um deles rotulado na placa e usado para diferentes funções. • GND (3): abreviação de ?Ground?. Existem vários pinos GND no Arduino Uno, qualquer um dos quais pode ser usado para aterrar o circuito. • 5V (4) e 3.3V (5): Fica claro que o pino de 5V fornece 5 volts de energia, e o pino de 3,3V fornece 3,3 volts de energia. A maioria dos componentes simples usados com o Arduino Uno funciona em 5 ou 3.3 volts. • Analógico (6): A área dos pinos sob a etiqueta "Analog In" (A0 até A5 na UNO) são pinos de entrada analógica. Esses pinos podem ler o sinal de um sensor analógico (como um sensor de temperatura) e convertê-lo em um valor digital que podemos ler e usar no programa. • Digital (7): Em frente aos pinos analógicos estão os pinos digitais (0 a 13 na UNO). Esses pinos podem ser usados tanto para entrada digital (como dizer se um botão é pressionado) quanto para saída digital (como alimentar um LED) • PWM (8): Você deve ter notado o til (~) ao lado de alguns dos pinos digitais (3, 5, 6, 9, 10 e 11 no UNO). Esses pinos funcionam como pinos digitais normais, mas também podem ser usados para algo chamado PWM (Pulse Width Modulation, modulação por largura de pulso). • AREF (9): representa a referência analógica. Na maioria das vezes você pode deixar este pino sozinho. Às vezes, é usado para definir uma tensão de referência externa (entre 0 e 5 Volts) como o limite superior para os pinos de entrada analógica. • Botão de reset (10): Apertar este botão irá conectar temporariamente o pino de reset ao terra e reiniciar qualquer código que esteja carregado no Arduino. LED indicador de energia: Há um pequeno LED ao lado da palavra "ON" (11). Este LED deve acender sempre que você conectar o Arduino Uno a uma fonte de energia. LEDs TX, RX e L: TX é a abreviação de transmitir e RX de receber. Essas marcações aparecem um pouco na eletrônica para indicar os pinos responsáveis pela comunicação serial. No nosso caso, existem dois lugares no Arduino UNO, onde TX e RX aparecem - uma vez pelos pinos digitais 0 e 1, e uma segunda vez ao lado dos LEDs indicadores TX e RX (12). Esses LEDs nos darão algumas indicações visuais sempre que o Arduino estiver recebendo ou transmitindo dados. O led L, logo acima destes, está ligado ao pino 13 e é usado para programas de teste iniciais, como foi visto no roteiro híbrido. Arduino Uno Circuito Integrado principal: O Circuito Integrado (13) é o microcontrolador ATmega328, "cérebro" do Arduino Uno.
Regulador de tensão: O regulador de tensão (14) não
é algo que se pode interagir no Arduino. Mas é potencialmente útil saber que está lá e para o que serve. O regulador de tensão faz exatamente o que diz - controla a quantidade de tensão que é colocada na placa do Arduino. Ele irá afastar uma tensão extra que pode prejudicar o circuito. Claro, ele tem seus limites, por isso não conecte o Arduino a algo maior que 20 volts. Análise do primeiro programa para Arduino No ambiente de programação para Arduino, um programa, chamado de sketch, apresenta duas funções básicas: setup() e loop().
A função setup() é chamada quando um programa começa a
rodar. É usada para inicializar as variáveis, os tipos dos pinos, declarar o uso de bibliotecas, entre outros. Esta função será executada apenas uma vez após a placa Arduino ser ligada ou reiniciada.
Após criar uma função setup(), a função loop() executa
sempre o mesmo bloco de código, continuamente, permitindo ao programa fazer mudanças e responder às interações com o exterior da placa. Análise do primeiro programa para Arduino No Arduino Uno, os 14 pinos digitais podem ser utilizados como uma entrada ou uma saída digital utilizando-se as funções pinMode(), digitalWrite(), e digitalRead().
Abaixo uma descrição destas funções, como usadas no código
acima:
pinMode(13, OUTPUT) - configura o pino 13 como saída.
digitalWrite(13, HIGH) - ajusta o pino 13 para nível alto.
delay(1000) - espera 1000 ms antes de executar a próxima linha de
código Análise do primeiro programa para Arduino No ambiente de programação para Arduino, um programa, chamado de sketch, apresenta duas funções básicas: setup() e loop().
A função setup() é chamada quando um programa começa a
rodar. É usada para inicializar as variáveis, os tipos dos pinos, declarar o uso de bibliotecas, entre outros. Esta função será executada apenas uma vez após a placa Arduino ser ligada ou reiniciada.
Após criar uma função setup(), a função loop() executa
sempre o mesmo bloco de código, continuamente, permitindo ao programa fazer mudanças e responder às interações com o exterior da placa. Fazendo Leituras com Arduino A função digitalRead() é usada da seguinte forma:
digitalRead(pino);
- Lê o valor de um pino digital especificado, ALTO ou BAIXO.
Se o pino não estiver conectado a nada, o digitalRead () pode retornar ALTO ou BAIXO, e isso pode mudar aleatoriamente. Fazendo Leitura da temperatura com Arduino Questões sugeridas(AURA) Para sedimentar o aprendizado do conteúdo híbrido, é sugerido que os alunos desenvolvam mais exemplos com o Simulador Tinkercad. 1. Crie um novo projeto no Tinkercad com a placa Arduino Uno, assim como feito no conteúdo online do roteiro híbrido desta aula. Monte um esquema como dado na figura abaixo. a. Faça um programa que acenda o led L da placa (ligado ao pino 13) quando o botão estiver apertado, e apague o led L quando este botão não estiver pressionado: b. Altere o programa para que o intervalo de liga e desliga do led L seja alterado entre 1 seg. e 0,5 seg. quando se aperta o botão. c. Pense agora em como alterar o período de liga e desliga do led L entre quatro valores: 0,25 seg, 0,5 seg, 0,75 seg e 1 seg. Certifique-se https://www.tinkercad.com/ que ao iniciar o programa o led esteja apagado e que um dos estados seja este ao apertar o botão repetidas vezes.