


























Estude fácil! Tem muito documento disponível na Docsity
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Prepare-se para as provas
Estude fácil! Tem muito documento disponível na Docsity
Prepare-se para as provas com trabalhos de outros alunos como você, aqui na Docsity
Encontra documentos específicos para os exames da tua universidade
Prepare-se com as videoaulas e exercícios resolvidos criados a partir da grade da sua Universidade
Responda perguntas de provas passadas e avalie sua preparação.
Ganhe pontos para baixar
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Apostila detalhada sobre microcontroladores Freescalle
Tipologia: Notas de estudo
1 / 34
Esta página não é visível na pré-visualização
Não perca as partes importantes!



























Atualmente um grande número de microcontroladores, integrados em diversos equipamentos, exercem um papel importante no dia a dia das pessoas. Despertar ao som de um CD Player programável, tomar café da manhã preparado por um microondas digital, e ir ao trabalho de carro, cuja injeção de combustível é microcontrolada, são apenas alguns exemplos. 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 (1997), uma residência típica americana possui 35 produtos baseados em microcontrolador. Estima-se que, em 2010, em média uma pessoa interagirá com 250 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 de funcionalidade. 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, detetores 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 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.
Um microcontrolador é um sistema computacional completo, no qual estão incluídos uma CPU ( Central Processor Unit ), memória de dados e programa, um sistema de clock, portas de I/O ( Input/Output ), além de outros possíveis periféricos, tais como, módulos de temporização e conversores A/D entre outros, integrados em um mesmo componente. 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 seqüê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
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á de alguma forma de 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 seqüê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 seqüê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. 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 da 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 a seguir apresenta a interface dos principais dispositivos que compõem um sistema microprocessado através de um barramento de dados. 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 seqüê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 a seguir. Esta arquitetura de processador será utilizada como modelo neste documento.
Registradores da CPU : A CPU08 contém 5 registradores como apresentado na figura anterior. 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 é freqüentemente chamado de modelo de programação. O acumulador , também chamado de registrador A, é freqüentemente utilizado para armazenar um dos operandos ou o resultado de operações. 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. 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. 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 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. A instruções de desvio usam estes bits de estado para tomar suas decisões. 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 BGT, BGE, BLE, e BLT. 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 ADD e ADC. O bit H é importante nas operações aritméticas codificadas em binário (BCD). A instrução DAA utiliza o estado dos bits H e C para determinar o fator de correção apropriado. 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 setado, 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 8o^ bit do registrador que contém o resultado. 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
2.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 seqüência pré-determinada. Uma fonte de clock de alta freqüência (normalmente derivada de um cristal ressonador conectado a CPU) é utilizada para controlar o sequeciamento das instruções da CPU. Normalmente as CPUs dividem a freqüência básica do cristal por 2 ou mais para chegar ao clock do barramento interno. Cada ciclo de leitura ou escrita a memória é executado em um ciclo de clock do barramento interno, também denominado ciclo de barramento ( bus cycle ). 2.3. Memória 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 2n^ posições de memória (p.ex.: um sistema com 14 linhas pode acessar 2^14 = 16384 endereços). Entre os diversos tipos de memória encontram-se: 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). 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). EPROM ( Erasable and Programmable Read-Only Memory ) – Memória ROM programável e apagável. O conteúdo dessa memória pode ser apagado com luz ultravioleta, e posteriormente, reprogramado com novos valores. As operações de apagamento e programação podem ser realizadas um número limitado de vezes depois que o circuito integrado for fabricado. Da mesma forma que a ROM, o conteúdo é mantido na ausência de energia (memória não volátil). OTP ( One Time Programmable ) – Memória programável uma única vez. Semelhante à EPROM quanto a programação, mas que não pode ser apagada. EEPROM ( Electrically Erasable and Programmable Read-Only Memory ) – Memória ROM programável e apagável eletricamente. Pode ter seu conteúdo alterado através da
utilização de sinais elétricos convenientes. Tipicamente, um endereço de uma EEPROM pode ser apagada e reprogramada até 100.000 vezes. FLASH – Memória funcionalmente semelhante a EEPROM, porém com ciclos de escrita bem mais rápidos. I/O ( Input/Output ) – Registradores de controle, estado e sinais de I/O são um tipo especial de memória porque a informação pode ser sentida (lida) e/ou alterada (escrita) por dispositivo diferentes da CPU. 2.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 (GND ou VSS ) indica o nível lógico 0 e o sinal de fonte positiva, que tipicamente é +5VDC (VDD ) indica o nível lógico 1 (atualmente os microcontroladores começaram a reduzir a tensão de VDD 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. Alguns dispositivos de entrada traduzem as tensões do sinal para níveis compatíveis com VDD e VSS. Outros dispositivos de entrada convertem os sinais analógicos em sinais digitais (valores binários formados por 0s e 1s) que a CPU pode entender e manipular. Alguns microcontroladores incluem circuitos conversores analógicos/digitais (ADC) encapsulados no mesmo componente. 2.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. Se necessário, outros circuitos podem alterar os níveis de tensão VDD e VSS nativos da CPU em outros níveis.
Os microcontroladores normalmente são classificados em famílias, dependendo da aplicação a que se destinam. A partir da aplicação que a família de microcontroladores se destina, um conjunto de periféricos específicos é escolhido e integrado a um determinado microprocessador. Estes microprocessadores normalmente operam com barramentos de 8, 16 ou 32 bits, e apresentam arquiteturas RISC (R educed Instruction Set Computer ) ou CISC ( Complex Instruction Set Computer ). Alguns exemplos de microcontroladores que utilizam microprocessadores com arquitetura RISC são o PIC ( Microchip ) e o MSP430 ( Texas Instruments ). Já o MC68HC08 e HCS08 ( Freescale ) e o 8051 (Intel) são exemplos de microcontroladores que utilizam arquitetura CISC. Apesar da classificação dos microcontroladores em famílias, existem periféricos necessários a praticamente todas as aplicações, que são a memória de dados e a memória de programa. A memória de dados mais utilizada é a RAM ( Random Access Memory ), que é uma memória volátil, ou seja, não preserva o seu conteúdo sem uma fonte de alimentação. Recentemente as memórias de programa sofreram uma grande mudança. A alguns anos atrás as memórias de programa mais utilizadas eram a ROM ( Ready-Only Memory ) e a EPROM ( Erasable Programmable Read-Only Memory ). O grande problema da utilização de tais memórias era a falta de praticidade durante o desenvolvimento de um sistema embarcado. Com a popularização das memórias FLASH e, ainda, devido a facilidade de utilização, cada vez mais os microcontroladores tendem a ser produzidos com esta memória, em substituição a ROM e a EPROM. Importante lembrar que a praticidade da memória FLASH se deve a esta memória ser uma variação das EEPROM ( Electrically - Erasable Programmable Read-Only Memory) que permitem que múltiplos endereços sejam apagados ou escritos com sinais elétricos. A seguir serão apresentadas as características e aplicações dos principais periféricos encontrados em microcontroladores, tais como: portas de entrada e saída, temporizadores, portas de comunicação serial e conversores Analógico-digitais (A/D).
3.1 Temporizadores Um microprocessador deve possuir um relógio. O relógio pode ser implementado por um cristal oscilador que sincroniza todo o funcionamento do microprocessador, controlando o tempo de cada um dos eventos relacionados aos dispositivos integrados a ele. Os temporizadores utilizam a base de tempo do relógio para poder implementar contagens de tempo bem específicas e configuráveis. Estes utilizam contadores, incrementados na mesma base de tempo do relógio. Desta forma é possível descrever tempo em número de ciclos de um relógio. Por exemplo, imagine um microprocessador utilizando um relógio de 20 MHz. O período relativo a esta freqüência é 50 ns. Podemos representar então um tempo de 1ms através de períodos de 50ns, obtendo o valor de
Figura – Registrador TSC Abaixo serão descritos as funções de cada um dos bits deste registrador: TOF ( Timer Overflow Flag ): Este bit de escrita/leitura torna-se é setado quando o registrador contador (TCNT) atinge o valor do registrador de módulo de contagem (TMOD), condição essa que indica o estouro da contagem de tempo. O procedimento correto para limpar esta indicação é ler o registrador TSC e escrever um “0” lógico para o bit TOF; 1 = O módulo temporizador atingiu o valor desejado 0 = O módulo temporizador não atingiu o valor desejado TOIE ( Timer Overflow Interrupt Enable Bit ): Este bit de escrita/leitura habilita a interrupção do temporizador quando o bit TOF for setado. 1 = Interrupção do temporizador ativa 0 = Interrupção do temporizador desabilitada TSTOP ( Timer Stop Bit ): Este bit de escrita/leitura para o incremento do contador de tempo. 1 = Contador de tempo parado 0 = Contador de tempo ativo TRST ( Timer Reset Bit ): Levar este bit de escrita para nível lógico 1 irá iniciar o contador de tempo com zero e colocar o divisor de base de tempo para o estado inicial, ou seja, divisão por 1. 1 = Pré-Escala de base de tempo e contador iniciados com o valor “0”; 0 = Sem efeito
PS[2:0] ( Prescaler Setect Bits ) – Bits de pré-escala da base de tempo. Estes bits de escrita/leitura selecionam um dos sete possíveis valores de divisão da base de tempo do relógio para utilização como base de tempo do temporizador. PS2 PS1 PS0 Base de tempo do temporizador 0 0 0 Clock de barramento interno / 1 0 0 1 Clock de barramento interno / 2 0 1 0 Clock de barramento interno / 4 0 1 1 Clock de barramento interno / 8 1 0 0 Clock de barramento interno / 16 1 0 1 Clock de barramento interno / 32 1 1 0 Clock de barramento interno / 64 1 1 1 Não disponível TCNT ( Timer Count Registers ): Estes registradores são somente de leitura e contém o valor mais significativo (TCNTH) e menos significativo (TCNTL) do contador do temporizador. A leitura do registrador mais significativo deve ser realizada primeiro. Figura – Registrador TCNTH e TCNTL. TMOD ( Timer Module Registers ): Estes registradores de escrita/leitura contém o valor do módulo da contagem do temporizador. Quando os registradores de contagem (TCNT) atingem o valor dos registradores de módulo (TMOD), o bit TOF torna-se nível lógico “1” e os registradores de
Assembly: MOV #$7D,TMODH CLR TMODL ; Configuração do registrador TSC: ; Divisão por 1, timer ativo com interrupção do temporizador habilitada. ; TOF TOIE TSTOP TRST Reservado PS2 PS1 PS ; 0 1 0 0 0 0 0 0 MOV #$40,TSC “c”: TMOD = 32000; /*Configuração do registrador TSC: Divisão por 1, timer ativo com interrupção do temporizador habilitada. TOF TOIE TSTOP TRST Reservado PS2 PS1 PS 0 1 0 0 0 0 0 0 */ TSC = 0x40; Para demonstrar um caso onde se faz necessário a divisão da base de tempo, o temporizador será configurado utilizando um relógio de 3,2 MHz para obter a base de tempo de 100ms. Período relativo a base de tempo: Período^ =^
6
− 9 Cálculo do valor de módulo de tempo: Módulo^ =^
− 3 312,5× 10 − 9
Para representar 320000 é necessário mais do que os 16 bits disponíveis. Desta forma se faz necessário a divisão da base de tempo. Dividindo 320000 pelo maior valor possível em 16 bits, encontramos 4,88. Assumimos então o próximo valor válido de divisão, ou seja, oito, como fator de divisão da base de tempo. Fator de divisão da base de tempo: Fator^ =^
E, recalculando os valores de configuração: Período relativo a base de tempo: Período =
6 8
− 6
Cálculo do valor de módulo de tempo: Módulo^ =^
− 3 2,5× 10 − 6
Sendo 40000 um valor válido em 16 bits, a configuração do temporizador em linguagem “c” é apresentada abaixo: “c”: TMOD = 40000; /*Configuração do registrador TSC: Divisão por 8, timer ativo com interrupção do temporizador habilitada. TOF TOIE TSTOP TRST Reservado PS2 PS1 PS 0 1 0 0 0 0 1 1 */ TSC = 0x43; Obs: Devemos lembrar que o código contido nas interrupções deve ser o menor possível, com o intuito de evitar que o tempo de execução deste código seja superior ao tempo da próxima interrupção. Por exemplo, se configurarmos a interrupção do temporizador para ocorrer a cada 100μs, o tempo de execução do código contido nesta interrupção não deve ser superior a esta base de tempo. Exemplo de utilização da interrupção do temporizador (esta interrupção é conhecida como interrupção de estouro de tempo): Assembly: ; Interrupção do temporizador. TOVER: BCLR 7,TSC ; Limpa a flag da interrupção do temporizador INC I ; Incrementa uma variável qualquer RTI ; Retorna da interrupção “c”: // Interrupção do temporizador interrupt void tover(void) { TSC_TOF = 0; // Limpa a flag da interrupção do temporizador i++; // Incrementa uma variável qualquer } // Retorna da interrupção