Baixe o app para aproveitar ainda mais
Prévia do material em texto
I II Sumário 1. SISTEMAS EMBARCADOS ....................................................................................................................... 1 1.1 Tipos de aplicações de sistemas embarcados ........................................................................... 2 1.2 Modos de funcionamento de sistemas embarcados ................................................................ 3 1.3 O que é desejável em um sistema embarcado? ....................................................................... 4 1.4 Exemplos de aplicações embarcadas ........................................................................................ 5 1.5 Aplicações embarcadas em chips .............................................................................................. 6 2 HISTÓRICO DOS SISTEMAS EMBARCADOS .................................................................................................. 9 3. ORGANIZAÇÃO DE UM SISTEMA COMPUTACIONAL BÁSICO ........................................................................ 12 3.1 Unidade Central de Processamento (CPU) .............................................................................. 14 3.2. Sistema de Clock ..................................................................................................................... 21 3.3. Tipos de Memória .................................................................................................................. 21 3.4. Sinais de Entrada .................................................................................................................... 23 3.5. Sinais de Saída ........................................................................................................................ 23 3.6. Códigos de operação (opcodes) ............................................................................................. 23 3.7. Mnemônicos das instruções e assembler .............................................................................. 24 3.8. Interrupções ........................................................................................................................... 24 3.9 Pipeline .................................................................................................................................... 25 3.10. CISC × RISC ............................................................................................................................ 25 3.11 Interfaces ............................................................................................................................... 26 3.12 Comunicação Serial ............................................................................................................... 26 4. MICROCONTROLADORES X MICROPROCESSADORES ................................................................................. 28 4.1 Firmware ................................................................................................................................. 29 4.2 Montadores e Compiladores ................................................................................................... 30 4.3 Periféricos Internos dos Microcontroladores ......................................................................... 31 III 4.3.1 Portas de I/O ..................................................................................................................... 31 4.3.2 Timer / Counter (Temporizador / Contador) .................................................................... 32 4.3.3 Watchdog Timer (WDT) .................................................................................................. 32 4.3.4 Módulo PWM ................................................................................................................... 33 4.3.5 EEPROM Interna ............................................................................................................. 33 4.3.6 Interfaces Seriais USART, SPI e I 2 C ............................................................................... 33 4.3.7 Controlador de LCD ......................................................................................................... 34 4.3.8 Conversor Analógico para Digital (ADC) ........................................................................ 34 5. ARDUINO .......................................................................................................................................... 35 5.1 Instalação do Software ............................................................................................................ 36 5.2 Primeiro projeto ...................................................................................................................... 37 5.3. PRIMEIRO PROJETO ................................................................................................................ 38 5.4 Alimentação do circuito .......................................................................................................... 40 5.5 Bibliotecas e Shields ................................................................................................................ 41 5.6 Integração com o PC ............................................................................................................... 42 5.7 Portas analógicas e digitais ..................................................................................................... 43 5.7.1 Portas digitais ................................................................................................................... 43 5.7.1 Portas analógicas .............................................................................................................. 46 IV Índice de Figuras Figura 1. Vários sistemas embarcados em um automóvel, se comunicando por barramento CAN. ... 5 Figura 2. Diagrama em blocos do μC MC68HC908RF2, da Freescale. ............................................ 6 Figura 3. Diagrama de bloco de um sistema ..................................................................................... 12 Figura 4. Interação da CPU e outros componentes computacionais. ................................................ 14 Figura 5. Principais componentes de um sistema microprocessado. ................................................. 16 Figura 6. Componentes da CPU08. ................................................................................................... 17 Figura 7. Registrador A. .................................................................................................................... 18 Figura 8. Registrador H:X. ................................................................................................................ 18 Figura 9. Registrador CCR. ............................................................................................................... 19 Figura 10. Registrador Stack Point. .................................................................................................. 20 Figura 11. Microcontroladores permitem criar equipamentos menores e mais baratos. ................... 29 Figura 12. Foto do hardware de um Arduino Duemilanove. ............................................................. 35 Figura 13. Arduino IDE versão 18 rodando no Ubuntu GNU/Linux 10.10. ..................................... 38 Figura 14. (a) LED apagado (b) LED aceso. ..................................................... 39 Figura 15. Utilizando um LED externo para o exemplo Blink. ......................................................... 40 Figura 16. Arduino alimentado por uma bateria de 9V. .................................................................... 41 Figura 17. Arduino Duemilanove com shield Ethernet. .................................................................... 42 Figura 18. Portas digitais do Arduino, de 13 a 0. ..............................................................................44 Figura 19. Esquema elétrico ligando um botão ao Arduino. ............................................................. 45 Figura 20. Portas analógicas do Arduino, de 0 a 5. ........................................................................... 46 Figura 21. Circuito com LDR e LED. ............................................................................................... 47 1 1. SISTEMAS EMBARCADOS Alguma vez você já se deu conta que o microondas de sua casa tem uma capacidade computacional maior do que tinha o projeto Apolo, que levou o homem a lua? Uma tendência que se observa é que cada vez mais inteligência será adicionada aos equipamentos do dia-a-dia. E ao contrário do que alguns filmes de ficção científica previam, como em “2001 – Uma odisséia no espaço” e seu supercomputador Hall, o controle, as decisões e o gerenciamento não serão concentrados em um único computador central, mas serão distribuídos entre todos os elementos de um ambiente. Embarcar inteligência em equipamentos é a tendência futura. Um sistema embarcado (ou sistema embutido) é um sistema microprocessado no qual o computador é completamente encapsulado ou dedicado ao dispositivo ou sistema que ele controla. Diferentemente de computadores de propósito geral, como o computador pessoal, um sistema embarcado realiza um conjunto de tarefas predefinidas, geralmente com requisitos específicos. Já que o sistema é dedicado a tarefas específicas, através de engenharia pode-se otimizar o projeto reduzindo tamanho, recursos computacionais e custo do produto. Em geral tais sistemas não podem ter sua funcionalidade alterada durante o uso. Caso queira-se modificar o propósito é necessário reprogramar todo o sistema. O usuário final não terá acesso ao programa que foi embutido no dispositivo, mas poderá interagir com o equipamento através de interfaces como teclados, displays, etc. desde que o sistema tenha sido projetado para tanto. Voltando ao exemplo do forno de microondas, ao pressionar uma tecla como PIPOCA, um sistema interno deve saber ajustar a potência correta, selecionar e medir o tempo em que o forno deve ficar acionado e emitir um sinal quando a tarefa for concluída. Para executar esta simples operação, o “cérebro” do forno deve receber sinais de sensores como o da porta, para saber se a mesma foi realmente fechada, fazer acionamento do equipamento de potência, calcular o tempo da operação, acionar o motor que fará a rotação do prato, permitir que o usuário interrompa a operação a qualquer tempo, atualizar o display, medir quanto tempo se passou desde o início da operação e assim por diante. http://pt.wikipedia.org/wiki/Microprocessador http://pt.wikipedia.org/wiki/Computador http://pt.wikipedia.org/wiki/Computador_pessoal http://pt.wikipedia.org/wiki/Computador_pessoal http://pt.wikipedia.org/wiki/Engenharia 2 Diferente dos computadores, que rodam sistemas operacionais como base para que outros aplicativos diversos sejam instalados e utilizados (cada um para uma aplicação diferente), os sistemas embarcados são construídos para executar apenas uma tarefa pré- determinada. Muitas vezes não tem flexibilidade (de software e de hardware) que os permita fazer outra tarefa qualquer que não sejam aquelas para qual foram desenhados e desenvolvidos. A única flexibilidade permitida e desejada é no caso de um upgrade de novas versões, fazendo com que o sistema possa ser reprogramado, geralmente com correções ou novas funções que o tornam melhores. Mas isto sempre é feito pelos fabricantes e quase nunca pelos usuários finais. Há então a necessidade de um “cérebro” que gerencie todo o funcionamento deste sistema. Um microprocessador ou microcontrolador é a opção ideal para esta função, já que ambos têm capacidade de fazer a leitura de sinais externos, executar programas com as tarefas a serem feitas, processar os sinais e enviar para atuadores os resultados esperados. Quem programa e desenvolve sistemas embarcados costuma pensar neles como entradas, saídas, processamento, memórias, ambiente onde será utilizado, etc. Já o usuário final se preocupa apenas em como utilizar este sistema e o que ele agrega de valor a um produto, em termos de redução de custos, aumento de funcionalidade, aumento de desempenho e assim por diante. As principais características de um sistema embarcado estão relacionados com a sua capacidade computacional e na sua independência de operação. Outros aspectos relevantes são referentes aos tipos de sistemas, modos de funcionamento e itens desejados em aplicações embarcadas, que serão abordados nas próximas subseções. 1.1 Tipos de aplicações de sistemas embarcados De modo geral, podem ser divididos os tipos de aplicações de sistemas embarcados em quatro grandes grupos: Propósito geral: são as aplicações mais parecidas com os computadores de mesa, mas em embalagens embarcadas. Nelas costuma haver grande interação entre os usuários e o sistema, geralmente através de terminais de vídeo ou monitores. Como exemplo tem-se os videogames, os conversores de TV a cabo, caixas de bancos, entre outros. 3 Sistemas de controle: controles em malha fechada com realimentação em tempo real. Geralmente são as aplicações mais robustas, com placas dedicadas e múltiplos sensores de entrada e saída. Muitas vezes fornecem pouca interação com o usuário, mostrando sinalizações através de LEDs. Usados nos motores de automóveis, processos químicos, controle de voo, usinas nucleares, entre outros. Processamento de sinais: onde envolve um grande volume de informação a ser processada em curto espaço de tempo. Os sinais a serem tratados são digitalizados através de conversores Analógico/Digital, processados, e novamente convertidos em sinais analógicos por conversores Digital/Analógico. Caso de tratamento de áudio, filtros, modens, compressão de vídeo, radares e sonares, entre outros. Comunicações e redes: chaveamento e distribuição de informações. Sistemas de telefonia e telecomunicações e internet. 1.2 Modos de funcionamento de sistemas embarcados Os dois modos de funcionamento dos sistemas embarcados, apresentados abaixo, são determinantes para saber como programar o dispositivo e como será seu funcionamento e comportamento na aplicação para o qual foi desenhado. Reativo: o funcionamento se dá como resposta a eventos externos, que podem ser periódicos (caso de sistemas rotacionais ou de controles de laço (loop)) ou assíncronos (pressionamento de um botão por parte do usuário). Há, então, uma necessidade de entrada de dados para que aconteçam as ações de funcionamento. Geralmente não há limite de tempo para que os sinais de entrada sejam acionados, pois dependem da interação com o usuário ou com o processo ao qual é destinado. Porém, a saída, função do sinal de entrada, deve ser realizada exatamente após os sinais de entrada começar a atuar. Controle em tempo real: existem limites de tempo para executar cada tarefa (leitura de sensor, emissão de sinais para um atuador, atualização de display, etc.). Por isso mesmo, nem sempre tempo real é igual ao modo mais rápido de executar uma tarefa. Estes modos de operação, por serem cíclicos, não dependem da entrada se sinais para executar as atividades, sendo capaz de tomar decisões referentes a ausência dos mesmo. Os sistemas de tempo real são classificados em: 4 o Soft Real Time: As tarefas podem ser executadas em um intervalo de tempo específico, sem consequências graves se este limite de tempo não for cumprido. Um exemplo é um sistema bancário, onde apenas uma mensagem de erro aparecerá se determinada tarefa não for realizada dentro do tempo pré-determinado. A maior preocupação durante a programação dos dispositivos é relativa à repetição de procedimentos que podem ter seu prazo estourado e sobre as mensagens de alerta ao usuário. o Hard RealTime: As tarefas devem ser executadas em um tempo específico, com consequências graves se qualquer tarefa falhar. Como exemplo pode-se pensar nos sistemas de controle de um avião, onde uma falha pode resultar em queda e perdas de vidas. A maior preocupação durante a programação dos dispositivos é relativa a ter sempre sistemas redundantes (duplicados) que empeçam ou alertem imediatamente caso algum processo falhe ou não seja executado dentro do tempo pré-determinado. 1.3 O que é desejável em um sistema embarcado? As características mais desejadas em sistemas embarcados são: Tamanho e peso: sempre os menores possíveis. Com a crescente miniaturização dos equipamentos eletroeletrônicos, os itens tamanho e peso são fatores decisivos na competitividade de um produto. Sem contar os custos envolvidos no envio de equipamentos grandes e pesados, já que um usuário pode adquirir um sistema embarcado em qualquer parte do mundo. Consumo de energia: quanto maior for a autonomia do sistema e menor for sua necessidade de recarga ou troca de sistema de alimentação, mais competitivo será o produto, sem contar que as atuais legislações referentes ao consumo de energia preveem a necessidade cada vez maior de eficiência energética. Robustez do equipamento: muitos sistemas embarcados são projetados para trabalhar em ambientes com condições adversas (vibrações, calor, poeira, variações na tensão de alimentação, interferências eletromagnéticas, raios, umidade, corrosão, etc). É necessário resistir bravamente a todas estas interferências e sobreviver. 5 1.4 Exemplos de aplicações embarcadas Os sistemas embarcados estão a nossa volta e estamos de certo modo tão envolvidos por eles que nem nos damos conta de que determinado dispositivo trata-se de um sistema embarcado. Existe uma área da ciência da computação especializada em estudar estes conceitos chamados de computação ubíqua. Alguns exemplos que podem ser citados, com suas respectivas características são: Aplicações embarcadas no setor automotivo - Um veículo top de linha é um excelente exemplo de um complexo sistema literalmente “embarcado”. Centenas de sensores fornecem informações sobre todo o funcionamento do veículo. Várias unidades de processamento independentes atuam em regiões diferentes e se comunicam entre si, captando os sinais destes sensores e fazendo com que as ações referentes a cada caso sejam tomadas. Esta comunicação geralmente se dá através de redes cujo protocolo CAN tem se tornado o padrão. Isto acontece desde a central que memoriza a posição dos bancos, espelhos, volante, etc. para cada usuário do veículo até a central que gerencia o funcionamento do motor. Esta rede de comunicação, além de permitir total interação entre as diferentes áreas internas do veículo, faz com que haja uma grande diminuição da fiação interna, já que todos os elementos se conectam a rede por apenas dois fios, que constituem um barramento de comunicação. A Figura 1 ilustra esta situação. Figura 1. Vários sistemas embarcados em um automóvel, se comunicando por barramento CAN. 6 1.5 Aplicações embarcadas em chips Está se tornando cada vez mais comum o surgimento de chips que são um sistema inteiro em uma única pastilha, também conhecidos como SoC (Systems on Chip). É o caso de microcontroladores que já tem embutidos sensores (temperatura, pressão, etc.), transmissores (RF), interfaces gráficas para displays, etc. Como exemplo é mostrado na Figura 2 o diagrama em blocos do microcontrolador MC68HC908RF2, da Freescale, que já tem uma unidade transmissora e receptora de RF. Isto permite montar um sistema embarcado que se comunique sem fios com outros elementos, criando uma rede wireless. Figura 2. Diagrama em blocos do μC MC68HC908RF2, da Freescale. 7 O mercado de microcontroladores apresenta-se em franca expansão, ampliando seu alcance principalmente em aplicações residenciais, industriais, automotivas e de telecomunicações. Segundo dados da National Semiconductor, uma residência típica americana possuía 35 produtos baseados em microcontrolador em 2005. Estima-se que, em 2015, em média uma pessoa interagirá com 350 dispositivos com microcontroladores diariamente. Em um passado recente, o alto custo dos dispositivos eletrônicos limitou o uso dos microcontroladores apenas aos produtos domésticos considerados de alta tecnologia (televisão, vídeo e som). Porém, com a constante queda nos preços dos circuitos integrados, os microcontroladores passaram a ser utilizados em produtos menos sofisticados do ponto de vista da tecnologia, como máquinas de lavar, microondas, fogões e refrigeradores. Assim, a introdução do microcontrolador nestes produtos cria uma diferenciação e permite a inclusão de melhorias de segurança e novas funcionalidades. Alguns mercados chegaram ao ponto de tornar obrigatório o uso de microcontroladores em determinados tipos de equipamentos, impondo um pré-requisito tecnológico. Muitos produtos que temos disponíveis hoje em dia, simplesmente não existiriam, ou não teriam as mesmas funcionalidades sem um microcontrolador. É o caso, por exemplo, de vários instrumentos biomédicos, instrumentos de navegação por satélites, detectores de radar, equipamentos de áudio e vídeo, eletrodomésticos, entre outros. Entretanto, o alcance dos microcontroladores vai além de oferecer algumas facilidades. Uma aplicação crucial, onde os microcontroladores são utilizados, é na redução de consumo de recursos naturais. Existem sistemas de aquecimento modernos que captam a luz solar e, de acordo com a demanda dos usuários, controlam a temperatura de forma a minimizar perdas. Um outro exemplo, de maior impacto, é o uso de microcontroladores na redução do consumo de energia em motores elétricos, que são responsáveis pelo consumo de aproximadamente 50% de toda eletricidade produzida no planeta. Portanto, o alcance dessa tecnologia tem influência muito mais importante em nossas vidas, do que se possa imaginar. O universo de aplicações dos microcontroladores, como já mencionado, está em grande expansão, sendo que a maior parcela dessas aplicações é em sistemas embarcados. A expressão “sistema embarcado” (do inglês embedded system) se refere ao fato do 8 microcontrolador ser inserido nas aplicações (produtos) e usado de forma exclusiva por elas. Como a complexidade desses sistemas cresce vertiginosamente, o software tem sido fundamental para oferecer as respostas às necessidades desse mercado. Tanto é, que o software para microcontroladores representa uma fatia considerável do mercado de software mundial. Segundo Edward Yourdon (consultor na área de computação, pioneiro nas metodologias de engenharia do software e programação estruturada) a proliferação dos sistemas embarcados, juntamente com o advento da Microsoft, são os responsáveis pela retomada do crescimento da indústria de software nos Estados Unidos da América. 9 2 HISTÓRICO DOS SISTEMAS EMBARCADOS Nos primeiros anos dos computadores digitais na década de 1940, os computadores eram por vezes dedicados a uma única tarefa. Eram, entretanto, muito grandes para serem considerados embarcados. O conceito de controlador programável foi desenvolvido algum tempo depois. O primeiro sistema embarcado reconhecido foi o Apollo Guidance Computer, desenvolvido por Charles Stark Draper no MIT. O computador de guia, que operava em tempo real, era considerado o item mais arriscado do projeto Apollo. O uso de circuitos integrados monolíticos para reduzir o tamanho e peso do equipamento aumentou tal risco. O primeiro sistema embarcado de produção em massa foi o computador guia do míssil nuclear LGM-30 Míssil Minuteman, lançado em 1961. Ele possuía um disco rígido para a memória principal. Quando a segunda versão do míssil entrou em produção em 1966, o computador guia foi substituído porum novo, que constituiu o primeiro uso em grande volume de circuitos integrados. A tecnologia desse projeto reduziu o preço de circuitos integrados como o NAND de mil para três dólares americanos cada, permitindo seu uso em sistemas comerciais. Desde suas primeiras aplicações na década de 1960, os sistemas embarcados vêm reduzindo seu preço. Também tem havido um aumento no poder de processamento e funcionalidade. Em 1978 foi lançada pela National Engineering Manufacturers Association a norma para microcontroladores programáveis. Em meados da década de 1980, vários componentes externos foram integrados no mesmo chip do processador, o que resultou em circuitos integrados chamados microcontroladores e na difusão dos sistemas embarcados. Com o custo de microcontroladores menor que um dólar americano, tornou-se viável substituir componentes analógicos caros como potenciômetros e capacitores por eletrônica digital controlada por pequenos microcontroladores. No final da década de 1980, os sistemas embarcados já eram a norma ao invés da exceção em dispositivos eletrônicos. Não é exagero dizer que o microprocessador e o microcomputador revolucionaram a indústria eletrônica e tiveram um enorme impacto em diversos aspectos de nossas vidas. O http://pt.wikipedia.org/wiki/D%C3%A9cada_de_1940 http://pt.wikipedia.org/wiki/Apollo_Guidance_Computer http://pt.wikipedia.org/wiki/Charles_Stark_Draper http://pt.wikipedia.org/wiki/MIT http://pt.wikipedia.org/wiki/Tempo_real http://pt.wikipedia.org/wiki/Projeto_Apollo http://pt.wikipedia.org/wiki/Circuito_integrado http://pt.wikipedia.org/wiki/Circuito_integrado http://pt.wikipedia.org/wiki/Produ%C3%A7%C3%A3o_em_massa http://pt.wikipedia.org/wiki/LGM-30_M%C3%ADssil_Minuteman http://pt.wikipedia.org/wiki/1961 http://pt.wikipedia.org/wiki/Disco_r%C3%ADgido http://pt.wikipedia.org/wiki/1966 http://pt.wikipedia.org/wiki/NAND http://pt.wikipedia.org/wiki/USD http://pt.wikipedia.org/wiki/D%C3%A9cada_de_1960 http://pt.wikipedia.org/wiki/1978 http://pt.wikipedia.org/w/index.php?title=National_Engineering_Manufacturers_Association&action=edit&redlink=1 http://pt.wikipedia.org/wiki/D%C3%A9cada_de_1980 http://pt.wikipedia.org/wiki/Chip http://pt.wikipedia.org/wiki/Microcontrolador http://pt.wikipedia.org/wiki/Potenci%C3%B4metro http://pt.wikipedia.org/wiki/Capacitor 10 desenvolvimento de Circuitos Integrados (CI’s) de altíssima densidade reduziu tão drasticamente o tamanho e o custo dos microcomputadores que os projetistas rotineiramente consideram utilizar suas capacidades e versatilidade em uma grande variedade de produtos e aplicações. Apesar de focarmos nos microcontroladores, a maioria dos conceitos e ideias se aplica aos computadores de todos os portes. Para ilustrar o aspecto operacional diverso dos microcontroladores, utilizaremos como exemplo um bastante conhecido: o Intel 8051. A família 8051 representa na verdade uma ramificação da árvore da família dos microprocessadores. Conforme a tecnologia de microprocessadores e microcomputadores evoluiu, desde os 4 bits (Intel 4004) no início dos anos 1970 para os processadores de 8 bits (8008, 8080, 8085, 6800, 6502, Z80 etc.), no final dessa mesma década as aplicações se dividiram em ramos distintos. Um destes ramos foi a infância dos computadores pessoais. Estes computadores, baseados em microprocessadores, pretendiam ser ferramentas versáteis que poderiam carregar e executar vários programas, tais como processadores de texto, planilhas, banco de dados e jogos. Eles poderiam ser facilmente programados pelo usuário para realizar o que ele imaginasse. Os descendentes de 16 e 32 bits (8086, as séries 80x86 e 680x0) simplesmente evoluíram a partir daí. A arquitetura básica do microprocessador não mudou substancialmente desde os primeiros sistemas, embora a velocidade e a quantidade de memória endereçada diretamente tenham aumentado significativamente. O segundo ramo que se desenvolveu a partir de 1970 foi à utilização dos computadores baseados em microprocessadores como unidade de controle embutida num produto comercial. Este tipo de microcomputador é construído com os mesmos elementos de um computador pessoal, mas é programado apenas uma vez pelo fabricante. Deste modo, ele passa sua “vida” realizando tarefas específicas das funcionalidades do produto o qual ele faz parte, tais como esperar que teclas sejam pressionadas ou ligar e desligar dispositivos tais como luzes, motores, campainhas, dentre outros. A família 8051 se enquadra nesta categoria, geralmente conhecida como microcontroladores dedicados. Esta família de dispositivos foi desenvolvida no início dos anos 1980 juntamente com o 68HC11, mas as aplicações desses dispositivos de 8 11 bits orientados para controle se tornaram tão difundidas que eles ainda são utilizados nos dias atuais. Muitas versões diferentes do 8051 original foram desenvolvidas com características especiais, mas elas ainda utilizam o mesmo conjunto básico de instruções e a arquitetura do original. Muitos outros microcontroladores, mais complexos e de maior poder de processamento, foram desenvolvidos para aplicações que exigem mais do que a capacidade de um computador de oito bits, a exemplo, em aplicações para processamento de algoritmos e realização de cálculos complexos em alta velocidade e em tempo real como modens, controle e acionamento de motores, dentre outros. Para estas aplicações, foram desenvolvidos os DSCs (acrônimo inglês para “Controladores Digitais de Sinais”) e os DSPs (acrônimo inglês para “Processadores Digitais de Sinais”). 12 3. ORGANIZAÇÃO DE UM SISTEMA COMPUTACIONAL BÁSICO Um microcontrolador é um sistema computacional completo, no qual estão incluídos uma CPU (Central Processor Unit – Unidade Central de Processamento), memória de dados e programa, um sistema de clock, portas de I/O (Input/Output – Entrada/Saída), além de outros possíveis periféricos, tais como, módulos de temporização e conversores A/D (Analógico/Digital) entre outros, integrados em um mesmo componente. Figura 3. Diagrama de bloco de um sistema As partes integrantes de qualquer computador, e que também estão presentes, em menor escala, nos microcontroladores são: Unidade Central de Processamento (CPU). Sistema de clock para dar sequência às atividades da CPU. Memória para armazenamento de instruções e para manipulação de dados. Entradas para interiorizar na CPU informações do mundo externo. Saídas para exteriorizar informações processadas pela CPU para o mundo externo. Programa (Firmware) para definir um objetivo ao sistema. 13 Além do Microprocessador, o sistema básico mostrado na Figura 3 possui os seguintes elementos: Interrupções: são sinais de entrada oriundos do meio externo que fazem com que o processamento corrente seja interrompido e em seu lugar seja executada uma sub-rotina específica para o tratamento da interrupção, denominada ISR (Interrupt Service Routine). Ao finalizar a ISR o processamento retorna para o ponto onde havia sido interrompido. Gerador de Reset: responsável por inicializar o sistema (inicializar os estados iniciais dos I/Os, variáveis, periféricos, registradores, etc.). O reset pode ocorrer ao ligar, quando da queda ou flutuações no sinal de alimentação, pelo programa sendo executado no microcontrolador, ou intencionalmente pelo próprio usuário (por meio de um pino ou botão de reset). Gerador de Clock: é um circuito eletrônico constituído de um oscilador encarregado de gerar os pulsos digitais necessários à execução e ao sincronismo do sistema. Um sistema computacional é um sistema digital combinacional e sequencial (síncrono e assíncrono), daí a necessidade do gerador de clock (relógio). Memória de Programa: memória onde o microprocessador busca as próximas instruções a serem executadas. O ciclo de busca de instruções pelo hardware do microprocessador é denominado fetch cycle. Em sistemas dedicados, costuma-se utilizar memórias ROM, embora em alguns casos memórias RAM também sejam utilizadas (ambas as memórias serão abordadas com mais detalhes a seguir). Memória de Dados: memória onde o microprocessador lê e escreve dados temporários (resultados de operações e cálculos) durante a operação normal. Geralmente é do tipo volátil, embora memórias não voláteis possam ser utilizadas. Seleção de Endereços e Chip Selects: lógica combinacional para escolher qual memória ou periférico o microprocessador irá utilizar para escrita ou leitura de dados. Arquitetura de barramentos: a arquitetura de barramentos define que cada um dos vários módulos constituintes de um sistema deve estar conectado aos outros por meio de um conjunto de linhas de sinais elétricos que conduzem informações com características comuns, denominadas Barramento, dessa forma, recebem ao mesmo tempo os mesmos sinais. 14 Os Barramentos estão agrupados conforme a natureza do dado que transportam. Se as linhas de um determinado barramento transportam dados manipuláveis, são conhecidas como Barramento de Dados, se transportam dados que definem a origem ou o destino da informação, no caso, memórias ou I/Os, são denominadas Barramento de Endereços, e se transportam sinais de gerenciamento do controle de acessos (leitura, escrita, habilitação de memórias ou I/Os), são denominados Barramento de Controle. Se um sistema possui um único barramento de cada tipo (um de dados, um de endereços e um de controle), ele possui uma arquitetura de barramento Von Neumann, e se o sistema possui mais de um barramento de um mesmo tipo (por exemplo, dois barramentos de dados distintos), ele possui uma arquitetura de barramento Harward. As vantagens da utilização da arquitetura de barramentos residem na redução do número de conexões entre os módulos de um sistema e a facilidade de inclusão de um novo módulo ao mesmo. 3.1 Unidade Central de Processamento (CPU) A unidade central de processamento é composta por uma unidade lógica aritmética (ULA), por uma unidade de controle e por unidades de memória especiais conhecidas por registradores. A Figura 4 apresenta um diagrama de blocos com uma possível interface entre a CPU e os outros dispositivos. Figura 4. Interação da CPU e outros componentes computacionais. 15 A unidade de memória permite armazenar grupos de dígitos binários que podem representar instruções que o processador irá executar ou dados que serão manipulados pelo processador. A unidade de entrada consiste em todos os dispositivos utilizados para obter informações e dados externos ao processador. A unidade de saída consiste em dispositivos capazes de transferir dados e informações do processador para o exterior. A ULA é a área de uma CPU na qual as operações lógicas e aritméticas são realizadas sobre os dados. O tipo de operação realizada é determinada pelos sinais da unidade de controle. Os dados a serem operados pela ULA podem ser oriundos de uma memória ou de uma unidade de entrada. Os resultados das operações realizadas na ULA podem ser transferidos tanto para uma memória de dados como para uma unidade de saída. A função da unidade de controle é comandar as operações da ULA e de todas as outras unidades conectadas a CPU, fornecendo sinais de controle e temporização. De certa maneira, a unidade de controle é como um maestro que é responsável por manter cada um dos membros da orquestra em sincronismo. Essa unidade contém circuitos lógicos e de temporização que geram os sinais apropriados necessários para executar cada instrução de um programa. A unidade de controle busca uma instrução na memória enviando um endereço e um comando de leitura para a unidade de memória. A palavra da instrução armazenada na posição de memória é transferida para um registrador conhecido por registrador de instruções (RI) da unidade de controle. Essa palavra de instrução, que está em código binário, é então decodificada pelos circuitos lógicos na unidade de controle para determinar a instrução que está sendo invocada. A unidade de controle usa essa informação para enviar os sinais apropriados para as unidades restantes a fim de executar a operação específica. Essa sequência de busca de um código de instrução e de execução da operação indicada é repetida indefinidamente pela unidade de controle. Essa sequência repetitiva de busca/execução continua até que a CPU seja desligada ou até que o reset seja ativado. O reset sempre faz a CPU buscar sua primeira instrução no programa. Uma CPU, também conhecida por processador, repete indefinidamente as mesmas operações básicas de busca e execução. Naturalmente, os diversos ciclos de execução serão diferentes para cada tipo de instrução à medida que a unidade de controle envia sinais diferentes para as outras unidades de execução de uma instrução em particular. 16 Um registrador é um tipo de memória de pequena capacidade porém muito rápida, contida na CPU, utilizado no armazenamento temporário de dados durante o processamento. Os registradores estão no topo da hierarquia de memória, sendo desta forma o meio mais rápido e de maior custo para armazenar um dado. Cada registrador de um processador possui uma função especial. Um dos mais importantes é o contador de programa (program counter – PC), que armazena os endereços dos códigos das instruções à medida que são buscadas na memória. Outros registradores são utilizados para realizar funções como: armazenamento de códigos de instrução (RI), manutenção dos dados operados pela ULA (acumulador), armazenamento de endereços de dados a serem lidos na memória (ponteiro de dados), além de outras funções de armazenamento e contagem. Todos os processadores possuem um registrador em especial muito utilizado chamado de acumulador ou registrador “A”. Ele armazena um operando para quaisquer instruções, lógica ou matemática. O resultado da operação é armazenado no acumulador após a instrução ser executada. Para que exista comunicação entre as unidades que formam um processador devemos definir uma forma de conexão entre estas unidades. Em um processador tradicional com arquitetura Von Neuman este meio é o barramento de dados. A largura do barramento de dados em bits é o que determina o número de bits para um dado processador. A Figura 5 apresenta a interface dos principais dispositivos que compõem um sistema microprocessado através de um barramento de dados. Figura 5. Principais componentes de um sistema microprocessado. 17 A CPU é o centro de todo sistema computacional, e não é diferente quando se trata de microcontroladores. O trabalho da CPU é executar rigorosamente as instruções de um programa, na sequência programada, para uma aplicação específica. Um programa computacional (software) instrui a CPU a ler informações de entradas, ler e escrever informações na memória de dados, e escrever informações nas saídas. O diagrama de blocos simplificado da CPU presente nos microcontroladores da família HC08, também denominado de CPU08, é apresentado na Figura 6. Figura 6. Componentes da CPU08. As principais funções de cada um dos componentes da CPU08 serão apresentadas a seguir: Unidade Lógica/Aritmética (ULA): A ULA é utilizada para realizar operações lógicas e aritméticas definidas no conjunto de instruções da CPU. Vários circuitos implementam as operações aritméticas binárias decodificas pelas instruções e fornecem dados para a execução da operação na ULA. A maioria das operações aritméticas binárias são baseadas em algoritmos de adição e subtração (adição com o valor negativo). A multiplicação é realizada através de uma série de adições e deslocamentos coma ULA sob controle lógico da CPU. Controle da CPU: O circuito de controle da CPU implementa o sequenciamento de elementos lógicos necessários para a ULA realizar as operações requisitadas durante a execução do programa. O elemento central da seção de controle da CPU é o decodificador de instruções. Cada opcode (código de instrução) é decodificado para determinar quantos 18 operandos são necessários e qual sequência de passos será necessária para completar a instrução em curso. Quando uma instrução é executada completamente, o próximo opcode é lido e decodificado. Registradores da CPU: A CPU08 contém 5 registradores como apresentado na Figura 6. Os registradores da CPU são memórias especiais que não fazem parte do mapa de memória. O conjunto de registradores da CPU é frequentemente chamado de modelo de programação. O acumulador, também chamado de registrador A, é frequentemente utilizado para armazenar um dos operandos ou o resultado de operações (Figura 7). Figura 7. Registrador A. O registrador H:X é um registrador de 16 bits de índice que possibilita ao usuário endereçar indiretamente o espaço de memória de 64Kbytes. O byte mais significativo do registrador de índice é denominado H e o byte menos significativo é denominado X (Figura 8). Sua principal função é servir de apontador para uma área na memória onde a CPU irá carregar (ler) ou armazenar (escrever) informação. Quando não estiver sendo utilizado para apontar um endereço na memória, ele pode ser utilizado como registrador genérico. Figura 8. Registrador H:X. O registrador Program Counter (PC) é usado pela CPU para controlar e conduzir ordenadamente a busca do endereço da próxima instrução a ser executada. Quando a CPU é energizada ou passa por um processo de reset, o PC é carregado com o conteúdo de um par de endereços específicos denominados vetor de reset (reset vector). O vetor de reset contém o endereço da primeira instrução a ser executada pela CPU. Assim que as instruções são executadas, uma lógica interna a CPU incrementa o PC, de tal forma que ele sempre aponte para o próximo pedaço de informação que a CPU vai precisar. O número de 19 bits do PC coincide exatamente com o número de linhas do barramento de endereços, que por sua vez determina o espaço total disponível de memória que pode ser acessada pela CPU. O registrador Condition Code (CCR) é um registrador de 8 bits que armazena os bits de estado (flags) que refletem o resultado de algumas operações da CPU. As instruções de desvio usam estes bits de estado para tomar suas decisões. A Figura 9 apresenta a estrutura do CCR. Figura 9. Registrador CCR. A descrição dos bits do registrador de condição é apresentada abaixo: V (Bit de Overflow) - A CPU leva o bit de overflow para nível lógico alto quando houver estouro no resultado de uma operação em complemento de 2. O bit V é utilizado pelas instruções de desvios condicionais. H (Bit de Half-carry) - A CPU leva o bit de half-carry para nível lógico alto quando ocorrer estouro entre os bits 3 e 4 do acumulador durante as operações de adição. I (Máscara de Interrupções) - Quando o bit I está em nível lógico alto, todas as interrupções são mascaradas (desabilitadas). As interrupções são habitadas quando o bit I é levado a nível lógico baixo. Quando ocorre uma interrupção, o bit que mascara as interrupções é automaticamente levado a nível lógico alto. Depois que os registradores da CPU são armazenados na pilha este bit volta ao nível lógico baixo. Se uma interrupção ocorrer enquanto o bit I estiver ativado, seu estado será guardado. As interrupções são atendidas, em ordem de prioridade, assim que o bit I for a nível lógico 0. A instrução retorno da interrupção (RTI) retorna os registradores da CPU da pilha, e restaura o bit I no seu estado de nível lógico 0. Após qualquer reset, o bit I é colocado em nível lógico alto e só pode ser limpo por uma instrução de software (CLI). N (Bit Negativo) - A CPU coloca o bit N em nível lógico alto quando uma operação aritmética, lógica ou de manipulação de dados produzir um resultado negativo. Corresponde ao 8 o bit do registrador que contém o resultado. 20 Z (Bit Zero) - A CPU leva o bit Z para nível lógico alto quando uma operação aritmética, lógica ou de manipulação de dados produzir um resultado igual a 0. C (Bit Carry/Borrow) - A CPU coloca o bit C em nível lógico alto quando uma operação de adição produzir um valor superior a 8 bits ou quando uma subtração necessitar um empréstimo. Algumas operações lógicas e as instruções de manipulação de dados também podem modificar o estado do bit C. O Stack Pointer (SP) (Figura 10) é um registrador cuja função é apontar para a próxima localização disponível (endereço livre) de uma pilha (lista de endereços contíguos). A pilha pode ser vista como um monte de cartas empilhadas, onde cada carta armazena um byte de informação. A qualquer hora, a CPU pode colocar uma carta nova no topo da pilha ou retirar uma carta do topo da pilha. As cartas que estão no meio da pilha não podem ser retiradas até que todas que estejam acima dela sejam removidas primeiro. A CPU acompanha o efeito da pilha através do valor armazenado no SP. O SP sempre aponta para a localização de memória disponível para se colocar a próxima carta (byte). Figura 10. Registrador Stack Point. Normalmente, a CPU usa a pilha para guardar os endereços de retorno e o contexto, isto é, os registradores da CPU, na ocorrência de uma exceção (interrupção ou reset). Durante um reset, o Stack Pointer contém o endereço 0x00FF. A instrução RSP (Reset Stack Pointer) carrega o byte menos significativo com 0xFF e o byte mais significativo não é afetado. Quando a CPU insere um novo dado na pilha, automaticamente o SP é decrementado para o próximo endereço livre. Quando a CPU retira um dado da pilha, o SP é incrementado para apontar para o dado mais recente, e o valor do dado é lido nesta posição. Quando a CPU é energizada ou passa por um processo de reset, o SP aponta para um endereço específico na memória RAM (no caso dos microcontroladores HC08 e HCS08 = 0x00FF). A CPU08 possui modos de endereçamento indexado com offsets de 8 ou 16 bits do SP para acesso de variáveis temporárias inseridas na pilha. A CPU utiliza o conteúdo do registrador SP para determinar o endereço efetivo do operando. 21 Embora o endereço inicial do SP seja 0x00FF, a localização da pilha é arbitrária e pode ser realocada pelo usuário em qualquer lugar na RAM. Movimentar o SP para fora da página de acesso direto (0x0000 a 0x00FF) permitirá que este espaço de memória seja utilizado para modos de endereçamento mais eficientes. 3.2. Sistema de Clock Todo sistema computacional utiliza um clock para fornecer a CPU uma maneira de se mover de instrução em instrução, em uma sequência pré-determinada. Uma fonte de clock de alta frequência é utilizada para controlar a sequencia das instruções da CPU. O clock nada mais é que um sinal encarregado de oferecer a referência do sincronismo para todo o sistema, onde a cada intervalo de tempo fixo é gerado um pulso digital, podendo ser um circuito multivibrador estável, um circuito oscilador RC ou um oscilador baseado em um cristal de quartzo como elemento ressonante, sendo este último o mais empregado. O Ciclo de Instrução está diretamente relacionado ao clock do sistema. É definido como a quantidade “n” de pulsos de clock necessários para se executar uma instrução (a cada “n” clocks é efetuado uma instrução). Como resultado, a frequência de execução de instruções é inferior a frequência do sinal de clock. O ciclo de instrução especifica uma unidade de desempenho de microcontroladores muito utilizada: o MIPS (Milhões de Instruções por Segundo). 3.3. Tipos de Memória As memórias são unidades de armazenamento que garantem a integridade de uma informação de forma a poderser recuperada no futuro. Podemos pensar na memória como sendo uma lista de endereços postais, onde o conteúdo de cada endereço é um valor fixo de 8 bits (para CPU de 8 bits). Se um sistema computacional tem n linhas (bits) de endereços, ele pode endereçar 2 n posições de memória (p.ex.: um sistema com 14 linhas pode acessar 21 4 = 16.384 endereços). De uma forma geral, as memórias estão classificadas em duas importantes categorias: RAM e ROM. RAM (Random Access Memory) – Memória de acesso aleatório. Pode ser lida ou escrita pela execução de instruções da CPU e, normalmente é utilizada para manipulação de dados pela CPU. O conteúdo é perdido na ausência de energia (memória volátil). As RAMs 22 são memórias de alta velocidade utilizadas para registrar informações durante a execução de um programa. São divididas em dois grupos: as Dinâmicas, baseadas em capacitores e as Estáticas, baseadas em circuitos flip-flops. ROM (Read-Only Memory) – Memória apenas de leitura. Pode ser lida, mas não é alterável. O conteúdo deve ser determinado antes que o circuito integrado seja fabricado. O conteúdo é mantido na ausência de energia (memória não volátil). Os tipos de memória ROM mais populares são: a) OTP (One-Time Programmable): são memórias que só podem ser programadas (gravadas) uma única vez. Caso seja programada (gravada) com dados incorretos, os mesmos não poderão ser apagados e a memória não poderá ser reprogramada, estando o componente inutilizado para sempre. Em contrapartida, essas memórias possuem baixo custo, assim, são utilizadas no produto final. b) EPROM (Erasable and Programmable Read-Only Memory): diferentemente do tipo anterior, esta permite ser apagada e reprogramada, desta forma, é ótima para ser utilizada no desenvolvimento de produtos. Seu custo é razoável (um pouco maior que a OTP), permitindo que o componente acompanhe o produto final. O procedimento para apagar a EPROM consiste na exposição à luz ultravioleta por 10 a 20 minutos, por isso o seu invólucro (encapsulamento) possui uma “janela” transparente de tamanho igual ou superior a pastilha de silício do chip. Uma vez gravada, a janela deverá ser coberta com um adesivo opaco, evitando a exposição à luz do sol, uma vez que a componente ultravioleta da luz poderá apagar alguns dados, corrompendo-os. c) EEPROM ou E2PROM (Electrically Erasable Programmable Read-Only Memory): esta tecnologia permite apagar os dados (bits individuais) por meio de sinais elétricos. Para apagar uma EEPROM coloca-se nos seus pinos uma tensão elétrica superior à convencional de trabalho (geralmente 5 volts). Em frações de segundo a memória estará apagada e pronta para nova gravação; d) FLASH: Esta tecnologia é muito empregada atualmente, pois com um pulso elétrico de curto período em determinados pinos é possível apagar a memória diretamente do circuito (excelente para ser utilizada na fase de desenvolvimento, já que não é necessária a remoção do chip), com a diferença em relação à EEPROM de se apagar uma sequência de bytes. Seu custo é razoavelmente favorável, podendo acompanhar o produto final. 23 3.4. Sinais de Entrada Dispositivos de entrada fornecem informação para a CPU processar, vindas do mundo externo. A maioria das entradas que os microcontroladores processam são denominadas sinais de entrada digitais, e utilizam níveis de tensão compatíveis com a fonte de alimentação do sistema. O sinal de 0V (0 volts ) indica o nível lógico 0 e o sinal de fonte positiva, que tipicamente é +5V (5 volts) indica o nível lógico 1 (atualmente os microcontroladores começaram a reduzir a tensão para valores na faixa dos +3V. Naturalmente que no mundo real existem sinais puramente analógicos (com uma infinidade de valores) ou sinais que utilizam outros níveis de tensão. Logicamente, que é necessário realizar a conversa dos sinais analógicos para digitais. Alguns microcontroladores incluem circuitos conversores analógicos/digitais (ADC) encapsulados no mesmo componente. 3.5. Sinais de Saída Dispositivos de saída são usados para informar ou agir no mundo exterior através do processamento de informações realizados pela CPU. Circuitos eletrônicos, algumas vezes construídos no próprio microcontrolador, podem converter sinais digitais em níveis de tensão analógicos. 3.6. Códigos de operação (opcodes) Os programas usam códigos para fornecer instruções para a CPU. Estes códigos são chamados de códigos de operação ou opcodes. Cada opcode instrui a CPU a executar uma sequência específica para realizar sua operação. Microcontroladores de diferentes fabricantes usam diferentes conjuntos de opcodes porque são implementados internamente por hardware na lógica da CPU. O conjunto de instruções de uma CPU especifica todas as operações que podem ser realizadas. Opcodes são uma representação das instruções que são entendidas pela máquina, isto é, uma codificação em representação binária a ser utilizada pela CPU. Mnemônicos são outra representação para as instruções, só que agora, para serem entendidas pelo programador. 24 3.7. Mnemônicos das instruções e assembler Um opcode como 0x4C é entendido pela CPU, mas não é significativo para nós humanos. Para resolver esse problema, um sistema de instruções mnemônicas equivalentes foram criadas (Linguagem Assembly). O opcode 0x4C corresponde ao mnemônico INCA, lê-se “incrementa o acumulador”, que é muito mais inteligível. Para realizar a tradução de mnemônicos em códigos de máquina (opcodes e outras informações) utilizados pela CPU é necessário um programa computacional chamado assembler (compilador para linguagem Assembly). Um programador utiliza um conjunto de instruções na forma de mnemônicos para desenvolver uma determinada aplicação, e posteriormente, usa um assembler para traduzir estas instruções para opcodes que a CPU pode entender. 3.8. Interrupções Como mencionado anteriormente, interrupção é um sinal do hardware oriundo de um evento externo ao sistema, que provoca um desvio da execução normal do programa principal para um endereço da memória de programa onde se encontra uma sub-rotina específica para o tratamento do referido evento. As estruturas de interrupção são utilizadas para que a CPU tome conhecimento de eventos de alta prioridade para o programa, sem a necessidade de o programa principal ter de monitorá-los periodicamente e com isso não perder tempo com processamentos desnecessários. São exemplos de eventos externos que geram interrupções: (i) finalização de uma conversão de um sinal analógico para digital; (ii) a recepção de um byte pela porta serial; (iii) o estouro de contagem de um temporizador; (iv) a transição de nível de uma entrada digital, como o pressionamento de uma tecla; dentre outros. Quando ocorre um evento de interrupção, a instrução em execução é completada, o conteúdo do PC (ou equivalente) é armazenado na pilha e o programa é desviado para um endereço conhecido como vetor de interrupção. O vetor de interrupção pode ser fixo ou configurável, dependendo da arquitetura do microprocessador ou microcontrolador. No vetor de interrupção, o usuário deverá dotar o programa de uma instrução de desvio para uma sub-rotina denominada ISR (Interrupt Service Routine), escrita por ele mesmo, específica para o tratamento do evento da interrupção. Antes do tratamento dentro da ISR, o conteúdo de algumas variáveis de 25 programa e registradores que serão alterados pela ISR mas que precisam ter o mesmo conteúdo após a execução da mesma, é guardado, procedimento denominado “salvamento de contexto”. Após o tratamento, o contexto é recuperado e posteriormente o conteúdo do PC na pilha. O retorno ao ponto do programa principal em que havia sido interrompido é então efetuado, retornando assim ao fluxo normal de execução. As interrupções podem ser mascaráveis (habilitadas ou desabilitadas pelo programado usuário) ou não mascaráveis, não podendo ser desabilitadas, como o caso do evento de Reset, sendo este também uma interrupção. As interrupções podem ter mais de um vetor de interrupção, podem também ter sua prioridade definida pelo hardware do microcontrolador ou pelo próprio usuário caso mais de uma interrupção esteja habilitada e ocorram simultaneamente em um dado momento. Por exemplo, os microcontroladores 8051 possuem interrupções com estrutura nesting, onde uma interrupção pode interromper outra já sendo atendida, desde que tenha maior prioridade, já no PIC a prioridade pode ser definida pelo usuário via software. 3.9 Pipeline Outro conceito importante é o Pipeline, o qual significa aproveitamento do tempo ocioso do processador. Nas arquiteturas sem Pipeline, o processador não executa nenhuma instrução enquanto está buscando a próxima na memória de programa. Com a utilização do Pipeline, enquanto o microcontrolador está executando uma instrução, um sistema interno do hardware do processador já efetua, ao mesmo tempo, a busca e a decodificação da próxima instrução, mantendo o processador preparado para a próxima. Assim, é possível reduzir a quantidade de ciclos de instruções necessárias à busca, decodificação e execução de instruções, aumentando a velocidade de processamento. A exceção ocorre no caso em que o código efetua um salto, onde o Pipeline perde o sincronismo e, com isso, requerendo mais de um ciclo de instrução graças a necessidade de uma nova busca de instruções. 3.10. CISC × RISC O número de instruções que o hardware de um microcontrolador ou microprocessador foi projetado para decodificar e executar define sua arquitetura como sendo do tipo CISC ou RISC. Um microcontrolador CISC, do acrônimo inglês para 26 Complex Instruction Set Computer, ou Computador com Conjunto de Instruções Complexo, é capaz de decodificar um grande número de instruções. Enquanto que um microcontrolador RISC, do acrônimo inglês para Reduced Instruction Set Computer, ou Computador com Conjunto de Instruções Reduzido, é capaz de decodificar um reduzido número de instruções. Em outras palavras a arquitetura RISC, possui a quantidade nos set de instruções significativamente inferiores à arquitetura CISC. A título de ilustração, o microcontrolador 8051 possui uma arquitetura CISC, pois possui um conjunto de instruções (set de instruções) de mais de 120, enquanto que os microcontroladores da Microchip, a família PIC, possui em torno de 35 instruções apenas, enquadrando-o na categoria RISC. A vantagem de arquitetura RISC reside na simplificação das estruturas internas no projeto do hardware do microcontrolador, aumentando sua velocidade e reduzindo seu custo. Em contrapartida, este benefício acaba por dificultar o desenvolvimento por parte dos programadores, pois estes têm um número limitado de instruções disponíveis para elaboração do código. Pequenas e simples operações requerem para serem feitas um grande número de passos, o que aumenta o tamanho do código. 3.11 Interfaces Os dispositivos que fazem parte das unidades de entrada e saída são chamados de periféricos porque são externos ao resto do sistema. O aspecto mais importante dos periféricos está relacionado com a Interface. Em computadores, a Interface é definida como a transmissão digital de informação entre um computador e seus periféricos de modo compatível e sincronizado. Ela é constituída de circuitos eletrônicos (hardware), que compatibilizam a natureza dos sinais elétricos, e um programa apropriado de gerenciamento da comunicação (software), denominado driver de dispositivo (device driver) no caso dos computadores pessoais. 3.12 Comunicação Serial Com a intenção de reduzir a quantidade de conexões ou fios necessários à troca de dados entre dois dispositivos, foi desenvolvido um método diferenciado ao tradicional modo paralelo. Considere a seguinte situação: necessita-se trocar um byte inteiro para um periférico. Seria necessário no mínimo de 8 condutores elétricos para um transporte 27 paralelo. Se a distância é pequena a alternativa é viável. Quando este mecanismo é utilizado para uma distância significativa, além da grande quantidade de fios, alguns bits poderão chegar atrasados em relação aos demais, corrompendo a informação. O mesmo ocorre se a frequência de tráfego dos dados for alta (em torno de MHz ou GHz), pois devido ao acoplamento eletromagnético, os sinais de um condutor poderão interferir nos demais ou sofrer interferência dos mesmos, corrompendo novamente a informação. Assim, como alternativa para solucionar esses problemas, foi desenvolvida a comunicação serial. Nesta, os bits de uma palavra são conduzidos individualmente num único condutor elétrico por vez. 28 4. MICROCONTROLADORES X MICROPROCESSADORES Existe uma diferença substancial entre microcontroladores e microprocessadores. O Microprocessador é implementado em um chip (pastilha de silício), e contem uma unidade lógica e aritmética (ULA), registradores internos e uma unidade de controle (UC) para a movimentação interna e externa dos dados. Todos os componentes trabalham em conjunto para o gerenciamento do hardware, popularmente atribuído ao chip o nome de CPU. Por possuir poucos elementos internos (ULA, UC e Registradores), um sistema microprocessado (computadorizado) necessita de uma série de dispositivos para operar, como memórias (ROM e RAM), linhas de barramento, linhas de controle, interfaces de I/Os (Inputs / Outputs). Estes últimos permitem a CPU se comunicar com os periféricos externos de entrada (teclado, mouse, etc.) e de saída (monitor, impressora e outros). Contrariamente, o Microcontrolador equivale a um sistema microprocessado completo incluído em um único invólucro (chip), desenvolvido graças ao crescimento da tecnologia de integração, que tornou possível fabricar um dispositivo que contivesse, além do microprocessador, todos os periféricos necessários integrados. Assim, um Microcontrolador é, de uma forma simplificada, “um microcomputador em um único chip”. Ele pode conter, como ressaltado anteriormente, diversos periféricos como memórias internas de dados e de programa, portas de acesso a dispositivos de I/O, PWM (Pulse Width Modulation) e até conversores de Analógico/Digital e Digital/Analógico. Apesar de geralmente os microcontroladores serem menos poderosos que a maioria dos microprocessadores (em termos de processamento, memória e velocidade), a depender da aplicação há uma excelente vantagem em se utilizar microcontroladores em detrimento dos microprocessadores. Isto se explica pelo número reduzido de componentes necessários para o desenvolvimento de novos equipamentos, uma vez que microcontroladores requerem um espaço físico na placa eletrônica muito menor, possibilitando assim a redução do custo (Figura 11). Além disso, a maioria dos microcontroladores são mais robustos que os microprocessadores, sendo aptos para o desenvolvimento de equipamentos e sistemas 29 autônomos para o trabalho em campo, em meio a umidade, o calor, as intempéries e interferências eletromagnéticas. Figura 11. Microcontroladores permitem criar equipamentos menores e mais baratos. A Tabela 1, apresenta alguns exemplos comerciais de Microprocessadores e Microcontroladores. Microprocessador Fabricante Z80 Zilog 6502 Motorola/Frescale 8086, 80286, 80386, 80486 (PC AT), Pentium, Atlhon Intel/AMD Microcontroladores Fabricante PIC16F84, PIC16F877, PIC18F452, PIC10F200... Microchip MSP430F149, MSP430F123, MSP430F122, MSC1211... Texas Instruments 68HC908AP16, 68HC08GP32A, MM908E621... Freescale AT89C51, AT89C2051, AT89C51SND2C... Atmel Tabela 1. Exemplos de Microprocessadores e Microcontroladores. Nas próximas subseções serão apresentados os principais conceitos que envolvem os Microcontroladores e Microprocessadores. 4.1 Firmware Conceitualmente,Firmware é um tipo de software (programa) voltado a aplicações específicas. Ele é executado por microcontroladores ou microprocessadores em sistemas 30 embarcados, para gerenciamento do hardware do sistema. Por exemplo, o programa sendo executado por um microcontrolador de um forno microondas conduz à interpretação dos dados da IHM (Interface Homem-Máquina) e a tradução dos sinais internos para a IHM, permitindo a comunicação do equipamento com o usuário e o controle do aquecimento e preparo do alimento. Em suma, o corpo (hardware) do forno microondas (motores, caixa, teclados, displays, LED’s, etc.) não é suficiente para o ele ser o que é. O Firmware para um forno microondas é o que o faz funcionar como tal. Para o desenvolvimento do Firmware são necessários montadores e compiladores e a carga do Firmware na memória de programa dos microcontroladores é feita pelos chamados gravadores. 4.2 Montadores e Compiladores Montadores são programas que traduzem um código escrito por um ser humano (programador ou usuário), em um código binário (de máquina). No caso dos computadores pessoais, ele gerará um código executável. E no caso de microcontroladores, este código poderá ser gravado no microcontrolador. Os montadores utilizam linguagens de nível mais baixo, mas ainda interpretáveis pelo seres humanos, não sendo exatamente o código binário. O código escrito pelo usuário utiliza comandos documentados pelo próprio fabricante do microcontrolador utilizado, denominados Mnemônicos, que representam os códigos binários das instruções (movimentação de dados – MOV, soma – ADD, etc.). O Assembly é uma linguagem de nível mais alto que a de máquina (código binário) que se utiliza dos Mnemônicos na composição do chamado código fonte do programa. Este código fonte será transformado em código objeto (object code), sendo o Firmware gravado na memória de programa do Microcontrolador. O montador para linguagem Assembly é denominado Assembler. O cuidado para não confundir os termos deve ser tomado. Já os Compiladores são programas que traduzem um código escrito por um ser humano (programador ou usuário), em um código de nível mais baixo, para posteriormente efetuar a montagem, ou seja, a geração do código binário (de máquina). No caso dos computadores pessoais, ele gerará um código executável. E no caso de microcontroladores, este código poderá ser gravado no microcontrolador. O código escrito pelo usuário para compiladores utiliza sintaxes documentadas pelo próprio fabricante do compilador. Os 31 compiladores trabalham com as chamadas linguagens de médio ou alto nível, que permitem um maior grau de abstração, a exemplo, as linguagens C e Java. O Software destinado à concepção de Firmwares para microcontroladores e executado em computadores pessoais (desktops ou notebooks), que possuem recursos de desenvolvimentos integrados, é denominado IDE (acrônimo inglês para Integrated Development Environment ou, em português, Ambiente Integrado de Desenvolvimento). Estes recursos podem ser: um editor de códigos fonte; um compilador; um montador e linkeditor (ligador de códigos objeto); um depurador; um simulador; e até um uploader (programa para dar carga de um Firmware na memória de programa do microcontrolador). São exemplos de IDE’s: o MPLAB IDE para microcontroladores PIC, da Microship; o Code Composer Studio, para DSP’s e microcontroladores MSP430 da Texas Instruments; o KEIL para 8051; dentre outros. 4.3 Periféricos Internos dos Microcontroladores A diferença básica entre o microprocessador e o microcontrolador é que, neste último, além da CPU, existem, na mesma pastilha de silício, módulos de hardware que constituem recursos adicionais de iteração com o meio externo, conhecidos como periféricos internos. Abordaremos a seguir alguns periféricos internos que podem ser encontrados nos microcontroladores comerciais. 4.3.1 Portas de I/O Diferentemente dos sistemas com microprocessadores, nos microcontroladores os circuitos eletrônicos que constituem as Portas de I/O, abordadas anteriormente, já estão embutidas no chip, sendo um dos módulos periféricos internos. Em alguns microcontroladores, estas portas possuem capacidade suficiente para alimentar cargas consideráveis, como vários LED’s e lâmpadas, estes normalmente com consumo de corrente muito superiores aos Circuitos Integrados (CI’s) digitais convencionais. As Portas de I/O são um dos periféricos básicos dos microcontroladores, ou seja, um dos periféricos mínimos que com certeza pode ser encontrado nos microcontroladores (dificilmente seria fabricado um microcontrolador sem Portas de I/O). 32 4.3.2 Timer / Counter (Temporizador / Contador) O Timer / Counter (Temporizador / Contador) é, juntamente com as Portas de I/O, outro módulo básico de um microcontrolador. Sua função é a criação de bases de tempo precisas para a geração de eventos periódicos com frequência fixa, ou a contagem de eventos externos. É um módulo de grande utilidade, podendo ser utilizado para, por exemplo, o controle de motores de passo, a “piscagem” de LEDs, a emulação de encoders para servo motores, a geração de frequências fixas de amostragem de sinais analógicos, dentre outras aplicações. 4.3.3 Watchdog Timer (WDT) O Watchdog Timer (WDT) é um módulo básico de segurança normalmente presente na maioria dos microcontroladores, uma vez que estes podem ser utilizados no desenvolvimento de sistemas e equipamentos eletrônicos autônomos para operação contínua. Uma das suas características é o fato de possuir um clock próprio para operar de forma independente do resto do sistema. Foi concebido para evitar o congelamento (“travamento”) do processamento sendo executado pelo microcontrolador. Esta “trava” pode ocorrer por motivos diversos, desde interferências eletromagnéticas (principalmente em ambientes industriais) ou até mesmo a falha na execução do programa. Em microcontroladores sem este módulo, a única solução para o retorno ao funcionamento normal seria aplicar um Reset ao sistema, ou por um sinal externo ou queda na alimentação (desligar e religar o sistema). Seu princípio de funcionamento se baseia no reset periódico do seu valor de contagem. Caso não seja feito, sua contagem vai a overflow (estoura) e ele gera um sinal (pulso) de Reset para a CPU, reiniciando-a. Dessa forma, em diversos pontos dentro do programa em execução uma instrução de Reset do módulo do WDT deverá ser executada, reiniciando a contagem do módulo. Caso a CPU trave em algum ponto do programa (por exemplo, em um loop infinito), o reset do WDT não ocorrerá e ao estourar a contagem o WDT reiniciará a CPU gerando um pulso de Reset para a mesma. 33 4.3.4 Módulo PWM PWM (Pulse Width Modulation) é uma forma de modulação em que são gerados pulsos digitais em uma frequência fixa onde a largura destes é variada, dessa forma, varia- se o valor médio do sinal sobre a carga continuamente. Um Circuito de geração de sinais PWM é encontrado em alguns microcontroladores como periférico interno. Graças à existência desse módulo no microcontrolador, sem circuitos adicionais como um Conversor Digital para Analógico (DAC), o usuário poderá gerar sinais analógicos a partir de uma saída digital (por exemplo, na regulagem contínua do brilho de lâmpadas incandescentes). Outra grande aplicação comercial é o desenvolvimento de inversores para no-breaks ou para conversores de frequência monofásicos e trifásicos para o acionamento e controle de motores de indução. 4.3.5 EEPROM Interna Abordada anteriormente, uma memória EEPROM pode existir como periférico interno em alguns microcontroladores comerciais, para utilização como memória de armazenamento de dados de configuração de equipamentos, sem a necessidade de um chip externo ao microcontrolador. Os microcontroladores Microship PIC16F877A e PIC16F84 possuem esseperiférico. 4.3.6 Interfaces Seriais USART, SPI e I 2 C É comum a presença de periféricos internos em microcontroladores que implementem alguns padrões de comunicação serial. Os mais encontrados são: USART (Universal Synchronous / Assyncronous Receiver / Transmitter), para comunicação com computadores pessoais utilizando a porta serial COM RS:232; SPI (Serial Peripheral Interface) para comunicação serial full-duplex (transmissão e recepção simultâneas) com CI’s externos, como memórias EEPROM e RTCs (Real Time Clock), por meio dos 4 sinais: MCLK (Marter Clock), MOSI (Master Output - SlaveInput), MISO (Master Input – Slave Output) e CS (Chip Select); I2C, uma forma de comunicação serial half-duplex (transmissão e recepção sequenciais) a 2 fios constituindo um barramento para comunicar dispositivos (CI’s). Essa 34 interface pode operar ou como transmissão ou recepção, a depender do dispositivo, por meio dos sinais Serial Data (SDA) e Serial Clock (SCL). 4.3.7 Controlador de LCD Devido à utilização frequente de LCD’s (Liquid Cristal Displays, ou em português, Mostradores de Cristal Líquido) de 16 colunas e 2 linhas em IHM’s (como as utilizadas em telefones públicos), fabricantes incorporaram em alguns de seus microcontroladores comerciais periféricos que auxiliam a comunicação com esses dispositivos, facilitando o desenvolvimento do Firmware de novos equipamentos. 4.3.8 Conversor Analógico para Digital (ADC) Muitos dos melhores microcontroladores atuais possuem internamente um recurso do módulo de conversão de sinais analógicos externos para um sinal o qual o microcontrolador possa interpretar, ou seja, digital. Este recurso é o Conversor Analógico para Digital (ADC) interno. Neste conversor, cada nível da variável analógica (normalmente tensão elétrica, podendo também ser uma corrente elétrica), há uma representação binária equivalente (digital). Ele torna-se bastante útil no desenvolvimento de sistemas de controle quando da necessidade de adquirir sinais de sensores, como por exemplo, em um sistema de controle de temperatura a entrada do ADC é utilizada como entrada para os sensores de temperatura. 35 5. ARDUINO Arduino 1 é um projeto que engloba software e hardware e tem como objetivo fornecer uma plataforma fácil para prototipação de projetos interativos, utilizando um microcontrolador. Ele faz parte do que chamamos de computação física: área da computação em que o software interage diretamente com o hardware, tornando possível integração fácil com sensores, motores e outros dispositivos eletrônicos. A parte de hardware do projeto, uma placa que cabe na palma da mão (Figura 12), é um computador como qualquer outro: possui microprocessador, memória RAM, memória cash (para guardar o software), temporizadores, contadores, dentre outras funcionalidades. Atualmente, o projeto está na versão Uno, apesar de muitos Arduinos encontrados hoje serem da versão Duemilanove (2009, em italiano), que possui um clock de 16MHz, 2kB de memória RAM, 32kB de memória cash, 14 portas digitais e 6 entradas analógicas. Figura 12. Foto do hardware de um Arduino Duemilanove. A principal diferença entre um Arduino e um computador convencional é que, além de ter menor porte (tanto no tamanho quanto no poder de processamento), o Arduino utiliza dispositivos diferentes para entrada e saída em geral. Por exemplo: em um PC utilizamos 1 http://www.arduino.cc/ 36 teclado e mouse como dispositivos de entrada e monitores e impressoras como dispositivos de saída; já em projetos com o Arduino os dispositivos de entrada e saída são circuitos eletricos/eletrônicos. Como a interface do Arduino com outros dispositivos esta mais perto do meio físico que a de um PC, podemos ler dados de sensores (temperatura, luz, pressão etc.) e controlar outros circuitos (lâmpadas, motores, eletrodomésticos, etc), dentre outras coisas que não são possíveis serem obtidos diretamente com um PC. A grande diferença com relação ao uso desses dispositivos, no caso do Arduino, e que, na maior parte das vezes, nós mesmos construímos os circuitos que são utilizados, ou seja, não estamos limitados apenas a produtos existentes no mercado: o limite é dado por nosso conhecimento e criatividade. O melhor de tudo nesse projeto e que seu software, hardware e documentação são abertos. O software é livre (GNU GPL 2 ), o hardware é totalmente especificado (basta entrar no site e baixar os esquemas) , a documentação está disponível em Creative Commons 3 e os usuários podem colaborar (seja escrevendo documentação, seja traduzindo) através da wiki. 5.1 Instalação do Software Para criar um projeto com o Arduino, basta comprar uma placa que custa em torno de 30 dólares no exterior e por volta de R$100 no Brasil, fazer download da interface integrada de desenvolvimento (IDE) (Figura 13) e ligar a placa a porta USB do PC. Como qualquer computador, o Arduino precisa de um software para executar comandos. Esse software será desenvolvido na Arduino IDE em um PC, utilizando a linguagem C++. Após, é necessário escrever o código, compilar e então fazer o envio da versão compilada para a memória cash do Arduino, através da porta USB. A partir do momento que o software é gravado no Arduino não precisamos mais do PC. O Arduino, como é um computador independente, consegue sozinho executar o software criado, desde que seja ligado a uma fonte de energia. As IDEs disponíveis estão listadas a seguir: Ubuntu GNU/Linux (http://www.arduino.cc/playground/Linux/Ubuntu). Outras distribuição GNU/Linux (http://www.arduino.cc/playground/Learning/ Linux). 2 http://www.gnu.org/licenses/gpl.html 3 http://creativecommons.org/licenses/ 37 Microsoft Windows (http://www.arduino.cc/en/Guide/Windows). Apple Mac OS X (http://www.arduino.cc/en/Guide/MacOSX). 5.2 Primeiro projeto Quando aprendemos uma linguagem de programação nova, geralmente o primeiro exemplo é um hello world. Como o Arduino não possui um display padrão, nosso primeiro exemplo é fazer um LED piscar e assim chamaremos o programa de blink. Nosso LED ficará aceso durante um segundo e apagado durante outro segundo e então recomeçará o ciclo. O código é apresentado a seguir: void setup() { pinMode(13, OUTPUT); } void loop() { digitalWrite(13, HIGH); delay(1000); digitalWrite(13, LOW); delay(1000); } Chamamos um código feito para Arduino de sketch e o salvamos em um arquivo com a extensão .pde. Com nosso sketch pronto, bastará conectar o Arduino na porta USB e clicar no botão upload (segundo, da direita para a esquerda destacado na Figura 13. Após o processo, será vista a mensagem Done uploading na IDE e será possível rodar o sketch no Arduino, ou seja, o LED acenderá e apagará, de 1 em 1 segundo. Veremos na próxima subseção a explicação do processo. 38 Figura 13. Arduino IDE versão 18 rodando no Ubuntu GNU/Linux 10.10. 5.3. PRIMEIRO PROJETO O Arduino possui 14 portas digitais, que podem ser utilizadas como entrada ou saída. Nesse caso, vamos utilizar a porta de número 13 como saída, dessa forma, podemos controlar quando a porta ficará com 5V ou quando ficará com 0V. Internamente o Arduino possui um LED conectado a porta 13 e desta forma é possível ver a execução do software descrito anteriormente. Para que o software funcione corretamente no Arduino, é necessário criar duas funções específicas: setup e loop. A função setup é executada assim que o Arduino executa a sua inicialização, já a função loop será executada continuamente até que o Arduino seja desligado. Como as portas digitais são de entrada ou saída, definimos dentro da função setup que a porta 13 é uma porta de saída. Isso é possível chamando a função pinMode, contida
Compartilhar