Prévia do material em texto
MICROPROCESSADORES Maikon Lucian Lenz Fundamentos de microcontroladores Objetivos de aprendizagem Ao final deste texto, você deve apresentar os seguintes aprendizados: � Caracterizar microcontroladores e microprocessadores. � Identificar famílias de microcontroladores. � Analisar aplicações de microcontroladores. Introdução A eletrônica digital permitiu maiores flexibilidade e eficiência às técnicas de automação, controle e processamento. Surgem, com isso, os micro- processadores, de operação programável e baixo consumo, os quais evoluem, tornando-se cada vez mais rápidos e poderosos. Ao mesmo tempo, são disponibilizados dispositivos de menor capacidade, mas inte- grados a um conjunto de outros que permitem menor complexidade de desenvolvimento: os microcontroladores. Estes possuem um processador integrado, mas também memórias, temporizadores, circuitos de oscilação e outros tantos comuns a uma vasta gama de projetos, mas que teriam de ser inseridos e controlados diretamente pelo programador caso fosse utilizado um microprocessador diretamente. Ambos os dispositivos, no entanto, muito se assemelham na forma de programação. Os microcon- troladores são classificados em famílias, associando componentes com características comuns, o que facilita o aprendizado do desenvolvedor e a escolha do dispositivo. As aplicações são muitas e, a cada nova geração de microcontroladores, a taxa de processamento e os módulos dedicados integrados ao dispositivo aumentam, permitindo o desenvolvimento de equipamentos mais eficientes e de menor custo. Características de microcontroladores e microprocessadores A programação tem início com a invenção de máquinas de tear programáveis que utilizavam cartões perfurados para mudar a sua operação. Esse método de programação foi utilizado durante muitos anos e, assim como os sistemas modernos, utiliza o sistema binário de dados. No caso dos cartões, cada bit era expresso por uma posição perfurada ou não do cartão (Figura 1). A po- sição e a sequência com que eram lidas determinava a operação da máquina (PEREIRA, 2002). Figura 1. Máquina de tear programável por meio de cartão perfurado. Fonte: Stephen Barnes/Shutterstock.com. As primeiras máquinas programáveis operavam de forma mecânica e, por isso, costumavam ser muito mais volumosas que as de função equivalente nos dias de hoje. Mesmo os procedimentos de programação e leitura do código expresso no cartão perfurado poderiam ser problemáticos. A programação dificilmente poderia ser alterada ou atualizada sem que fosse reescrita por completo. Já a execução incluía todos os problemas decorrentes de um pro- cesso mecânico convencional, como quantidade de esforço elevado e desgaste Fundamentos de microcontroladores2 físico tanto da máquina quanto dos cartões que poderiam ocasionar falhas na operação (PEREIRA, 2002). A eletrônica digital permite a mudança de paradigma com uso de ele- mentos de memória, primeiramente, com válvulas termiônicas e, mais tarde, com componentes transistorizados. O avanço da eletrônica digital diminuiu consideravelmente o tamanho e a quantidade de energia utilizada nas má- quinas programáveis de uma maneira geral. Com a redução do consumo e a miniaturização, o incremento na capacidade de processamento cresce de forma exponencial, permitindo a resolução de problemas mais complexos com sistemas cada vez mais acessíveis. A Figura 2, a seguir, mostra uma comparação da diferença de tamanho entre uma única válvula termiônica e um circuito integrado de um microcontrolador que possui milhares de tran- sistores internamente. Figura 2. Válvula termiônica comparada a um microcontrolador contendo milhares de transistores. Cada transistor substituiria uma válvula. Fonte: realist2000/Shutterstock.com. O primeiro microprocessador comercial, fruto da miniaturização dos componentes eletrônicos, foi apresentado pela Intel em 1969. Ele trabalhava com dados de 4 bits de tamanho e podia executar um conjunto de 46 diferentes instruções (PEREIRA, 2002). 3Fundamentos de microcontroladores A função de um microprocessador é processar os dados recebidos com base na sequência de instruções que lhe foram atribuídas pelo programador. Assim, ele deve ser dinâmico o suficiente para executar diferentes tipos de operações e em sequências aleatórias definidas pelo programador. O microprocessador, no entanto, requer o auxílio de outros componentes para armazenar dados temporários e seu próprio código, controlar o fluxo de dados nos barramentos, produzir o clock de operação que ditará o ritmo de funcionamento das instruções e outros componentes mais específicos, como periféricos para controle de entrada e saída de dados, temporização, geração e análise de sinal, entre outros (PEREIRA, 2002). Assim, para que um microprocessador possa operar normalmente, é necessária a presença de outros componentes atuando em conjunto. Já um microcontrolador costuma ter menor poder de processamento, compensado pela disponibilidade integrada de elementos que o permitam funcionar sem a adição, em muitos casos, de outros componentes. A estrutura do microcontrolador contém (PEREIRA, 2002): � memória volátil para manipular e armazenar dados em tempo de processamento; � memória não volátil para receber as instruções do programador e per- mitir que o microcontrolador, uma vez programado, tenha o código à sua disposição a qualquer momento; � gerador de clock interno (ainda que muitas versões permitam o uso de cristais externos para obter maior estabilidade ou níveis de frequência diferentes dos disponibilizados); � uma série de elementos que facilitam a integração do microcontrolador com outros componentes, seja para comunicação, tratamento de sinal analógico, geração de sinal, entre outros. Os microcontroladores ganharam mercado a partir da década de 1980, pois, apesar do menor nível de processamento, permitem o desenvolvimento de projetos de sistemas embarcados mais simples de maneira mais rápida e confiável. A opção se dá pela relação de custo-benefício de cada projeto, já que, em muitos casos, o volume de processamento de um microprocessador pode ser desnecessário, enquanto que muitos periféricos podem ser de grande serventia. O microcontrolador pode ser compreendido como um computador simples, enquanto o microprocessador é apenas uma parte desse computador, essencial a todos eles, mas insuficiente para operar sozinho. Fundamentos de microcontroladores4 A forma como uma máquina é programada depende das características construtivas e da sua natureza de operação. Um computador mecânico demandará indicadores mecânicos para compreender a sequência de operações a serem executadas, e todo o processamento do código até o ajuste dos atuadores da maneira esperada será mecânica. É o caso da máquina de tear do cartão perfurado. Já um computador eletrônico faz uso de sinais elétricos para acionar ou não partes do circuito interno que desencadearão uma sequência de operações lógicas que devem resultar na atuação esperada do mecanismo. No entanto, muitos computadores, já na era da tecnologia digital, foram programa- dos por meio de cartões perfurados. É claro que, nesse caso, um dispositivo teria de converter a presença física de uma perfuração ou não, em cada posição do cartão, para pulsos elétricos que seriam armazenados nas memórias eletrônicas. Famílias de microcontroladores Os primeiros microcontroladores foram desenvolvidos com base na estrutura do 8080 da Intel, que deu origem, também, aos processadores modernos e, talvez, a uma das famílias mais importantes de processador até aqui. Esse processador tinha endereços de memória de 16 bits, o que permitia armazenar e processar dados com valores inteiros entre 0 e 65.535. Valores negativos ou números com vírgula necessitam de uma representação diferenciada, dividindo cada endereço de memória em sinal ou parte inteira e parte real (PEREIRA, 2002). A quantidade de modelos diferentes desenvolvidosfoi tão grande que os microcontroladores passaram a ser classificados em famílias. Assim, é possível compreender, pelo menos parcialmente, a estrutura de um microcontrolador, sua capacidade e seu modo de operação simplesmente sabendo a que família ele pertence. A família MCS-51, por exemplo, foi uma das mais utilizadas no passado e nasce com o desenvolvimento do modelo 8051, baseado nos processadores 8080 da Intel (PEREIRA, 2002). Outras famílias de microprocessadores famosos incluem ARM, AVR, PIC, dsPIC e outros. Dentro dessas, há subdivisões em famílias menores e uma ampla quantidade de modelos para uma delas. 5Fundamentos de microcontroladores O PIC é um dos mais difundidos: � possui vasta documentação e referências bibliográficas; � apresenta ambientes de programação simples e estrutura de operação/ construção padronizada, que facilita a migração do código para outros modelos dentro da mesma família; � atende a mercados de entrada e de baixo custo com grande poder de processamento. Os microcontroladores PIC utilizam arquitetura Harvard, que separa a memória de programa em que constam as instruções programadas da memória de dados, que armazena os valores utilizados por periféricos, registradores e variáveis. As instruções apresentam formato padronizado com um código de operação (OPCODE) seguido de bits de configuração/modificação, quando existirem, e, por último, valores literais ou endereços de memória/registrador. A lista de instruções pode ser subdividida em (MICROCHIP, 2003): � operações orientadas a bytes — que manipula registrador inteiros; � operações orientadas a bits — sendo as mais comuns para teste ou modificação de bits específicos de um registrador; � operações envolvendo literais — normalmente um número a ser utili- zado em conjunto com o registrador acumulador (registrador W) e de controle como saltos de memória e chamadas de função. A quantidade e o tamanho da palavra utilizada nas instruções variam para cada família. Alguns microcontroladores possuem maior quantidade de instruções ou endereços maiores de memória e necessitam de mais bits para comportar isso. A família PIC16, por exemplo, utiliza um tamanho de palavra para as instruções de 14 bits (Figura 3) (MICROCHIP, 2003). Fundamentos de microcontroladores6 Figura 3. Formato de instruções da família PIC16. Fonte: Adaptada de Microchip (2003). Operações orientadas a bytes de registradores 13 8 7 6 0 13 8 7 0 13 11 10 0 Operações orientadas a bits de registradores Instruções CALL e GOTO especi�camente Operações literais e de controle Geral 13 10 9 7 6 0 OPCODE f(registrador#) d = 0 para registrador W como destino b = posição de 3 bits d = 1 para registrador f como destinor f = endereço do registrador de 7 bits f = endereço do registrador com 7 bits k = valor qualquer de 8 bits k = valor qualquer de 11 bits d OPCODE f(registrador#)b (BIT #) OPCODE K (literal) OPCODE K (literal) Atualmente, a Microchip, fabricante dos microcontroladores PIC, dispo- nibiliza microcontroladores em estruturas de 8, 16 e 32 bits. Dentro dessa estrutura, destacam-se as famílias: PIC10, PIC12 e PIC16; PIC18, PIC24 e dsPIC (na maioria de 16 bits); e PIC32 (MICROCHIP, 2019a). Os modelos são nomeados, primeiramente, segundo a família e, na se- quência, com caracteres que individualizem suas características — algumas delas são referências diretas a algum tipo de estrutura presente no mesmo. Por exemplo, o PIC16F877A difere radicalmente do PIC24HJ256GP206. O primeiro trabalha com dados de 8 bits, possui diversos encapsulamentos diferentes, mas oferece, no máximo, 44 pinos. Entre as características desta- cadas pelo fabricante, estão (Figura 4a) (MICROCHIP, 2003): 7Fundamentos de microcontroladores � clock de até 20 MHz; memória de programa de até 8 mil instruções (cada uma delas com 14 bits); � memória RAM de 368 bytes; � pinagem compatível com as famílias PIC16C e PIC16F; � três temporizadores (sendo um de 16 bits); � módulo gerador de PWM — pulse width modulation (modulação por largura de pulso); � conversor de sinal analógico-digital com 8 canais com resolução de 10 bits cada; � módulos de comunicação serial síncrona do tipo SPI e também I²C; � módulo de comunicação serial assíncrona do tipo USART; Já o PIC24HJ256GP206 trabalha com (Figura 4b) (MICROCHIP, 2009a): � dados de 16 bits, com 64 pinos; � clock de até 80 MHz; � memória de programa 256 kb; � memória RAM de 16 kb; � oito módulos PWM; � nove temporizadores de 16 bits e outros 4 de 32 bits; � 18 canais de conversão analógica-digital com resolução de 12 bits; � até oito saídas PWM simultâneas; � dois módulos de comunicação SPI, USART e I²C cada. Figura 4. (a) PIC16F877A; (b) PIC24HJ256GP202. Fonte: (a) Microchip (2019b) e (b) Microchip (2019c). Fundamentos de microcontroladores8 A diferença obviamente não ficará apenas pelos recursos oferecidos, mas também no preço e na praticidade de desenvolvimento. Todas essas característi- cas podem ser encontradas no datasheet (documento técnico), que é equivalente ao manual do componente eletrônico. No caso dos microcontroladores, toda a estrutura física, interna e externa, é bem-detalhada, para especificar tamanho, condições adequadas ou limites de operação, além da forma como o elemento opera e pode ser programado, de como utilizar as instruções disponíveis para processamento e como utilizar os diversos periféricos de funções específicas disponíveis com o microcontrolador. Esse documento é normalmente dispo- nibilizado no site do fabricante e é o guia de referência para seu trabalho. Aplicações de microcontroladores A grande vantagem de se ter um pequeno computador com acesso a suas funções e estruturas mais básicas é a possibilidade de se criar um produto ou uma solução de baixo custo, que podem ser produzidos em larga escala e facilmente embarcados. Um computador moderno tem uma taxa de processamento muitas vezes maior que um simples microcontrolador. No entanto, o computador consome uma parcela significativa dos seus recursos, gerindo o sistema operacional e outras ferramentas que permitem a interação em alto nível para possibilitar que o desenvolvedor utilize os recursos disponíveis de maneira facilitada, enquanto o sistema operacional gerencia a maior parte do hardware (WEBER, 2012). Por exemplo, ao mesmo tempo em que o usuário pode estar utilizando um aplicativo de desenho, guiando o cursor por meio da tela para colorir da forma como deseja aquela imagem, o sistema operacional e as estruturas mais básicas do processador estarão monitorando os sinais de entrada do mouse e do teclado, orientando a exibição de cada pixel na tela com a cor e a posição adequadas, enviando e recebendo dados por meio da rede, controlando a velocidade da ventoinha que refrigera o processador para que o nível de ruído e a temperatura atinjam o melhor desempenho possível, gravando e lendo dados da memória RAM para executar cada um desses procedimentos e, até mesmo, do disco rígido para salvar automaticamente ou não o estado em que se encontra o desenho naquele momento em um arquivo. Aliás, o simples ato de buscar arquivos em um computador já pode ser traduzido em uma série de procedimentos menores, nenhum deles visíveis ao operador da máquina, mas que precisam passar pelo processador (PINHEIRO, 2012). 9Fundamentos de microcontroladores Em um microcontrolador também é possível implementar pequenos sis- temas operacionais e desenvolver soluções mais genéricas que se utilizem do sistema operacional existente para reduzir a complexidade de programação, garantindo, mesmo assim, seu funcionamento. O mais comum, no entanto, é programar os microcontroladores para finalidades específicas. Nesse caso, cada movimentação de dados e o próprio controle dos periféricos serão de responsabilidade do programador. A vantagem é que todo poder de proces- samento pode ser dedicado ao seu projeto, o que garante boa otimizaçãoe, principalmente, menor custo de produção, apesar da maior dificuldade de desenvolvimento. Mas de que forma um microcontrolador pode ser programado? A resposta requer um breve conhecimento de eletrônica, em especial de eletrônica digital. Todos os efeitos eletromagnéticos derivam das propriedades elétricas das cargas, essencialmente da mais básica delas: cargas opostas se atraem, e cargas iguais se repelem. Esses efeitos podem ser controlados por resistores, capacitores, indutores, diodos, transistores, cada qual com intenções e com- portamentos diferentes quando na presença de um sinal elétrico. Um resistor, por exemplo, pode ser utilizado para limitar a corrente elétrica (movimento das cargas) e, indiretamente, para dividir a tensão elétrica (a força que impulsiona as cargas) entre dois ou mais elementos do circuito. Já um transistor, elemento de maior importância para eletrônica digital, tem como finalidade controlar a quantidade de corrente possível em um circuito a partir de um sinal de entrada em outro. Assim, ele pode ser utilizado como um amplificador de sinal ou como uma chave eletrônica, permitindo ou impedindo a corrente elétrica. Uma vez que os componentes eletrônicos não são ideais ou perfeitos, os desgastes durante a transmissão e manipulação de sinais elétricos podem interferir na qualidade e intensidade deles. Em muitas aplicações, a intenção direta é justamente essa, porém, no processamento e na transmissão de in- formações, a exatidão das informações, representadas por pulsos elétricos, é de fundamental importância. Assim, por mais que seja possível a construção de computadores analógicos, eles dificilmente serão tão precisos quanto os modelos digitais que restringem os níveis elétricos a dois valores apenas: aqueles mais próximos do valor máximo de tensão, dito nível lógico alto; ou aqueles mais próximos do valor mínimo, dito nível lógico baixo. A grande vantagem de se interpretar a informação de forma rígida (0 ou 1; mínimo ou máximo; falso ou verdadeiro) é que a precisão é facilmente controlada. Ou seja, por mais que uma determinada combinação de pulsos elétricos passe por um meio ruidoso e cheio de interferências externas, ou que a queda de tensão na linha seja grande devido à distância elevada entre os dois Fundamentos de microcontroladores10 componentes que se comunicam, dentro de determinados limites, nenhuma diferença será notada na informação. Adotando uma tensão abaixo de 2 V como sendo nível lógico baixo e acima de 3 V como sendo nível lógico, não há só grande margem para falhas, interferências e desgastes, mas também uma região (entre 2 e 3 V) de segurança para evitar confusões. Perde-se muito em resolução, mas se ganha em exatidão e precisão, o que é primordial quando se trabalha com números e dados exatos. Do contrário, qual seria a relevância de se criar uma calculadora em que nem sempre o resultado da soma de 2 mais 2 fosse 4? Teria pouca ou nenhuma serventia. Logo, a menor unidade de informação em um sistema de eletrônica digi- tal é o bit (do sistema binário de numeração), que compreende apenas duas possibilidades: 0 ou 1. Como já foi dito anteriormente, 0 é apenas um símbolo para o nível lógico baixo, independentemente do valor exato de tensão dele. Isso vale para o 1, apenas um símbolo para o nível lógico alto. Números e informações maiores podem ser expressos utilizando o sistema binário da mesma forma que o sistema decimal: adicionando mais dígitos toda vez em que forem necessários valores maiores, tendo cada dígito um peso maior que seu predecessor. Assim, o número 172 pode ser expresso pelo seu equivalente binário de 8 bits: 1010 11002. Qual a conexão disso com os transistores na eletrônica? Cada transistor pode estar em condução ou não, permitindo ou bloqueando o pulso elétrico e, sob determinadas circunstâncias, funcionar como uma memória, ainda que, na prática, o mais adequado seja utilizar elementos mais complexos, compostos de vários transistores, resistores e diodos para armazenar um único bit, como as portas lógicas que permitirão uma estabilidade maior de trabalho (TOCCI; WIDMER; MOSS, 2011). Programar, nesse caso, nada mais é que escrever a sequência correta de 0 s e 1 s nos endereços corretos de memória. A função do processador é varrer esses endereços, organizar sua estrutura interna para processar os dados que possam se fazer presentes na mesma memória de programa, na memória RAM, ou em demais periféricos, e, até mesmo, em outros pinos do microcontrolador. Mas tudo se resume à manipulação de 0 s e 1 s (WEBER, 2012). A combinação de portas lógicas fundamentais pode criar funções lógicas mais complexas e, até mesmo, produzir operações aritméticas de soma e subtração que, por sua vez, podem ser associadas para criar contadores que, alimentados com um circuito oscilador estável, servirão de elemento de tem- porização, e assim sucessivamente (TOKHEIM, 2013). Saber programar é saber fornecer as instruções corretas e na ordem correta para que o dispositivo de processamento seja capaz de executar aquilo que você espera do equipamento. 11Fundamentos de microcontroladores No datasheet dos microcontroladores PIC, sempre se faz presente a tabela com instruções disponíveis. Nela, você encontra o nome dado à função e como ele pode ser expresso no ambiente de desenvolvimento fornecido pelo fabri- cante, mas também de que forma o ambiente de desenvolvimento traduzirá a palavra utilizada pelo programador para uma sequência binária a ser gravada na memória do microcontrolador. Esse processo é conhecido por compilação e busca traduzir a linguagem de programação utilizada pelo usuário para a compreendida pela máquina. Ele ainda pode passar por vários níveis, mas, em última instância, quando se está programando um microcontrolador dire- tamente, o resultado será sempre uma sequência de 0 s e 1 s, adequadamente posicionados na memória do microcontrolador pelo compilador, para que o componente opere da maneira ordenada. Perceba, ainda, que não há qualquer avaliação qualitativa por parte do am- biente de desenvolvimento. O que estiver redigido, desde que utilizando termos e sintaxe adequados para aquele compilador, será traduzido para linguagem de máquina (WEBER, 2012) e gravado por meio de uma comunicação entre sua máquina e um equipamento de gravação, normalmente conectado pela USB do computador utilizado pelo programador e ligado nos pinos detalhados no datasheet do microcontrolador como pinos de programação (Figura 5) (MICROCHIP, 2009b). Figura 5. Exemplo de uso do gravador modelo PICKit3 conectado pela USB ao computador e com os pinos de saída (1 a 6) no microcontrolador PIC18F45K20 embutido em um kit de depuração. Fonte: Adaptada de Microchip (2009b). Fundamentos de microcontroladores12 Na lista de instruções dos microcontroladores, uma tabela discrimina a sequência binária que ordena determinado processamento. Junto dela, está o nome pelo qual o comando pode ser referenciado no ambiente de desen- volvimento, conhecido por “mnemônico” e visa a facilitar a leitura e escrita pelo programador, visto que escrever apenas em termos de 0s e 1s é pouco compreensível. No Quadro 1, a seguir, constam alguns exemplos de instruções existentes no PIC16F877A, com a forma de escrita mnemônica, seguidos de modificações do comando, como endereços de memória/registradores envolvidos, posição binária da operação ou configuração do comando, além do equivalente binário que será gerado após a tradução do compilador. Fonte: Adaptado de Microchip (2003). Mnemônico Descrição Compilação ADDWF f, d Soma os valores do registrador W com o registrador f. O resultado é armazenado no registrador W se d = 0, ou no registrador f se d = 1. 00 0111 dfff ffff BTFSC f, b Testa se o valor do bit da posição b do registrador f é 0. Em caso verdadeiro, pula uma linha de instrução na execução do programa. 01 10bb bfff ffff GOTO k Muda o endereço atual de memória de programa em execuçãopara o endereço especificado por k. 10 1kkk kkkk kkkk Quadro 1. Exemplos de Instruções do PIC16F877A Ao concluir a programação, o usuário pode ordenar a gravação do código no microcontrolador. Nesse momento, o ambiente de desenvolvimento ordena que um segundo programa execute a compilação desse código, que consiste em avaliar se a sintaxe está correta e traduzir a sequência de mnemônicos e demais dados para a sequência binária a ser gravada na memória de programa do microcontrolador. Essa linguagem direta, que traduz um mnemônico di- retamente para a sequência binária, é normalmente conhecida por linguagem de máquina. 13Fundamentos de microcontroladores No datasheet do primeiro microprocessador comercial, o Intel i4004, constam 46 instruções. Para realizar a operação de soma aritmética entre dois valores de diferentes endereços de memória, pode-se utilizar a função de mnemônico ADD. Apesar de operar com apenas 4 bits, o i4004 demanda instruções de 8 bits e, para tanto, que sejam divididas em duas etapas. O mnemônico ADD, segundo o datasheet, é traduzido para a sequência 1000 XXXX2, em que XXXX corresponde ao endereço de memória de um dos números a ser somado, enquanto o outro número corresponde ao já armazenado no registrador conhecido por acumulador. Assim, antes que se possa somar dois endereços de memória, é necessário que um deles seja enviado ao registrador acumulador primeiramente. Nesse caso, deve-se utilizar outra instrução antes da soma em si: a instrução LD, traduzida para 1010 XXXX2, em que XXXX novamente corresponde ao endereço de memória do dado, agora, a ser carregado da memória para o acumulador. Utilizando um ambiente de desenvolvimento capaz de compilar para o i4004, a soma dos valores dos endereços de memória 1 e 2 ficaria assim: LD 1 ADD 2 Repare que, além do mnemônico, foram adicionados os valores de memória, já que o compilador necessita saber de que forma completar a tradução do mnemônico para a segunda metade que é variável em ambos os casos. O código compilado resultaria em: 1010 0001 1000 0010 Ao processar isso, o microcontrolador carregaria o valor do endereço 1 de memória para o acumulador, somaria o valor do endereço 2 de memória com o valor do acu- mulador e armazenaria o resultado no próprio acumulador. É comum referir-se diretamente ao código de máquina como ASSEMBLY. Entretanto, apesar de ser a linguagem padrão de programação de baixo nível, na maioria dos casos, e de existir forte correlação entre eles, o ASSEMBLY é uma linguagem de programação padronizada e indiferente ao modelo ou dispositivo a ser programado. Deve, portanto, ser utilizado por um ambiente de desenvolvimento que seja capaz de efetuar o processo de compilação para traduzir do ASSEMBLY para cada linguagem de máquina específica. Fundamentos de microcontroladores14 MICROCHIP. [Site]. 2019a. Disponível em: https://www.microchip.com/wwwproducts/ en/PIC16F877A. Acesso em: 01 jul. 2019. MICROCHIP. PIC16F877A. 2019b. Disponível em: https://www.microchip.com/wwwpro- ducts/en/PIC16F877A. Acesso em: 01 jul. 2019. MICROCHIP. PIC16F87XA data sheet. 2003. Disponível em: http://ww1.microchip.com/ downloads/en/DeviceDoc/39582b.pdf. Acesso em: 01 jul. 2019. MICROCHIP. PIC24HJ256GP206. 2019c. Disponível em: https://www.microchip.com/ wwwproducts/en/PIC24HJ256GP206. Acesso em: 01 jul. 2019. MICROCHIP. PIC24HJXXXGPX06/X08/X10 data sheet. 2009a. Disponível em: http://ww1. microchip.com/downloads/en/DeviceDoc/70175H.pdf. Acesso em: 01 jul. 2019. MICROCHIP. PICkitTM 3 programmer/debugger user’s guide. 2009b. Disponível em: http:// ww1.microchip.com/downloads/en/DeviceDoc/PICkit_3_User_Guide_51795A.pdf. Acesso em: 01 jul. 2019. PEREIRA, F. Microcontroladores PIC: técnicas avançadas. São Paulo: Érica, 2002. PINHEIRO, F. A. C. Elementos de programação em C. Porto Alegre: Bookman, 2012. TOCCI, R. J.; WIDMER, N. S.; MOSS, G. L. Sistemas digitais: princípios e aplicações. 11. ed. São Paulo: Pearson, 2011. TOKHEIM, R. Fundamentos de eletrônica digital: sistemas sequenciais. 7. ed. Porto Alegre: AMGH, 2013. (Série Tekne, v. 2).. WEBER, R. F. Fundamentos de arquitetura de computadores. 4. ed. Porto Alegre: Bookman, 2012. (Livros Didáticos Informática UFRGS). Leituras recomendadas PEREIRA, F. Microcontroladores PIC 18 detalhado: hardware e software. São Paulo: Érica, 2010. SOUZA, D. J. Desbravando o PIC. 6. ed. São Paulo: Érica, 2003. 15Fundamentos de microcontroladores