MICROCONTROLADORES - BÁSICO PIC – Microchip
Bento Alves Cerqueira Cesar Filho - R 1.0 - NOV/07 1/23
1. Introdução As circunstâncias que se apresentam hoje no campo dos microcontroladores têm os seus primórdios no desenvolvimento da tecnologia dos circuitos integrados. Este desenvolvimento tornou possível colocar centenas de milhares de transistores num único chip. Isso constituiu um pré-requisito para a produção de microprocessadores, e os primeiros computadores foram construídos adicionando periféricos externos tais como memória, linhas de entrada e saída, temporizadores e outros. Um crescente aumento do nível de integração permitiu o aparecimento de circuitos integrados contendo simultaneamente processador e periféricos. Foi assim que apareceu o primeiro chip contendo um microcomputador e que mais tarde haveria de ser designado por microcontrolador.
2. História O primeiro microprocessador foi desenvolvido por uma então pequena empresa chamada Intel (acrônimo de Integrated Electronics) nos primórdios dos anos 1970. O cliente era uma companhia japonesa de nome Busicon, que não comprou a idéia. Como a Intel teve que arcar com os custos do desenvolvimento e não tinha um cliente que comprasse o produto, resolveu colocá-lo no mercado como um sistema microprocessador de “uso geral” (ou, como chamam em ingles, “general purpose”) para aplicações onde componentes discretos de lógica digital eram empregados. O componente foi um sucesso e logo a Intel desenvolveu um novo microprocessador de 4 bits chamado 4004. Em 1974, um microprocessador mais poderoso de segunda geração (denominado 8008) foi anunciado e fornecido como um componente simples, que foi rapidamente seguido pelo Intel 8080. Ambos, o 8008 e o 8080 eram alimentados a partir de uma fonte de 5 VCC, usando tecnologia N-MOS. No mesmo período, a Motorola lançou o seu primeiro microprocessador, denominado 6800, que possuia um processador de 8 bits com a mesma capacidade de processamento do Intel 8080. Nesta ocasião, a arquitetura interna usada no Intel 8080 e no Motorola 6800 eram muito diferentes. O Intel 8080 utilizava uma arquitetura de registros AX, BX, CX, DX e HL, todos de 16 bits porém, capazes de serem utilizados como pares de registros de 8 bits, isto é, o registro AX poderia ser usado como dois registros separados – AH e AL – onde AH era a parte alta (H = high) do byte do registro AX, e AL era a parte baixa (L = low) do byte do registroAX. Desta forma, os registros de 16 bits AX, BX, CX, DX e HL poderiam ser utilizados como AH, AL, BH, BL, CH, CL, DH, DL, H e L, todos de 8 bits. O Intel 8080 possuia o mapa de I/O (Input/Output – Entrada/Saída) separado da memória de dados. Isto significa que, para comandar entrada/saída do dispositivo, instruções especiais deveriam ser implementadas tais como IN para instrução de entrada e OUT para instrução de saída. O acesso à memória de dados (que possuia um mapa diferente), utilizava a instrução MOV. O Motorola 6800 utilizava o que se chamava de “Memory Mapped I/O” (memória mapeada como I/O), o que significa que tanto a memória de dados quanto de Entrada/Saída dividiam o mesmo mapa. O conjunto de registros era muito menor, consistindo em dois acumuladores de 8 bits (A e B) e um registro indexador de 16 bits chamado X. Estes registros podem suportar uma gama de modos de enderaçamento totalmente voltados para um número pequeno de registros (o que torna a programação também mais simples). Para se ter acesso a dados da memória ou das Entradas/Saídas é necessário utilizar uma instrução do tipo LDAA; para escrever dados na memória ou nas Entradas/Saídas é necessário utilizar uma instrução do tipo STAA. O acesso ao registro X deverá ser via suas próprias instruções, isto é, LDX e STX. Intel e Motorola mantiveram as diferenças fundamentais na arquitetura de seus processadores mesmo nos modelos mais modernos. Bento Alves Cerqueira Cesar Filho - R 1.0 - NOV/07 2/23
No caso dos processadores desenvolvidos pela Intel, o modelo 8080 evoluiu no modelo 8085 (também com registros de 8 bits como no modelo 8080) até o processador de terceira geração (com registro de 16 bits), o modelo 8086 que, na sua forma de pseudo-16 bits 8088, foi empregado na construção dos primeiros IBM PC (IBM Personal Computer). O modelo 8088 era o modelo 8086 com um barramento de dados de 8 bits, o que tornava fácil a interligação com os dispositivos de 8 bits existentes naquela ocasião. Na sequencia, foram seguidos pelos modelos 80286, 80386 (com processador de 32 bits), e o 80486, chegando aos modelos Pentium (com processadores de 64 bits) exitentes atualmente. A família 80x86 e Pentium foram desenvolvidos para aplicações em computadores pessoais e possuem um vasto mapa de memória. Os processadores da Motorola seguiram caminho semelhante com o modelo 6800 que foi substituído pelo 6809 (8 bits), o 68000 (16 bits), os 68010,68020 e 68030, utilizados em muitas estações de trabalho e principalmente no modelos Apple MAC. O núcleo do processador Intel 8080 foi utilizado na linha de microcontroladores 8048 e 8051, que sobrevive até os dias atuais. A Intel, hoje, desenvolve uma gama de microcontroladores muito mais complexa que os modelos básicos originais. Motorola seguiu pelo mesmo caminho com os microcontroladores baseados no modelo 6800 (6805,6808 e 6811, utilizado atualmente). Logo, muitos dos atuais microcontroladores são originários nas famílias 8080 e 6800. Outros fabricantes, como a Rockwell que produziu microprocessadores com arquitetura 6800 (6502), enquanto que a Zilog desenvolveu o famoso Z80 (com arquitetura 8080). O desenvolvimento dos modelos mais recentes de microcontroladores utilizando a arquitetura Harvard e o uso de Instruções Reduzidas (RISC – Reduced Instruction Set Computers) levou aos componentes comercializados pela Microchip (PIC), Motorola (MSP), STMicroelectronics (ST7) e outros. Este texto foi escrito em JUL/2005. O futuro vai, com certeza, aumentar esta história.
Bento Alves Cerqueira Cesar Filho - R 1.0 - NOV/07 3/23
3. Microprocessador versus Microcontrolador Um microcontrolador difere de um microprocessador em vários aspectos e o mais importante, é a sua funcionalidade. Para que um microprocessador possa ser usado, outros componentes devem ser adicionados, tais como memória e componentes para receber e enviar dados (Entradas/Saídas). Em resumo, isso significa que o microprocessador é o verdadeiro coração do computador.
Fig. 3.1 - Estrutura básica do microprocessador
A fig.3.1 mostra a interconexão entre o microprocessador e a unidade externa de memória. Se houver a inclusão de unidades de Entrada/Saída (I/O), novos componentes e interconexões deverão ser acrescentadas. Por outro lado, o microcontrolador foi projectado para ter tudo num só. Nenhum outro componente externo é necessário nas aplicações, uma vez que todos os periféricos necessários já estão contidos nele.
Fig.3 2 - Estrutura básica do microcontrolador
A fig.3 2 mostra a estrutura interna de um microcontrolador (não expandido) contendo todas as interfaces e memórias necessárias dentro de um único encapsulamento, reduzindo drásticamente o número de componentes externos na aplicação. Bento Alves Cerqueira Cesar Filho - R 1.0 - NOV/07 4/23
4. O que é um Microcontrolador Um microcontrolador é um computador em um único chip otimizado para controlar dispositivos externos enfatizando a auto-suficiencia e baixo custo. Inclui um núcleo contendo a Unidade Central de Proceessamento (CPU – Central Processing Unit), memória de programa normalmente do tipo Flash, memória para dados dos tipos RAM e EEPROM, um ou mais temporizadores, entrada/saídas para ligação com elementos periféricos externos, tudo isto dentro de um único circuito integrado. A fig. 4.1 mostra esquematicamente os dispositivos normais no interior de um microntrolador comercial:
Fig. 4.1 – Microcontrolador – Arquitetura Interna
Na sequencia, vamos descrever os diversos elementos do microcontrolador: 4.1. Memória Memória é a parte do microcontrolador que tem a função de guardar dados. Pode-se imaginar que uma memória é como um armário com diversas gavetas onde, em cada gaveta sãoguardadas diversas informações. Se identificarmos cada gaveta do armário com um nome específico e único para cada uma, então o conteúdo de cada gaveta será conhecido através do nome daquela gaveta. As memórias são componentes semelhantes ao armário - para um determinado endereço, é possível obter o conteúdo deste endereço portanto, uma memória nada mais é do que o conjunto de todos os locais de memória (gavetas) e endereçamento nada mais é que seleccionar um deles. Isto significa que precisamos seleccionar o endereço desejado (gaveta) e esperar que o conteúdo desse endereço seja apresentado (abrir a gaveta). Além de ler um local de memória (ler o conteúdo da gaveta), também é possível escrever num endereço de memória (introduzir um conteúdo na gaveta). Isto é feito utilizando uma linha adicional chamada linha de controle. Bento Alves Cerqueira Cesar Filho - R 1.0 - NOV/07 5/23
A fig. 4.2 mostra um diagrama simplificado de memória. Para uma entrada específica, obtem-se uma saída correspondente. A linha R/W (read/write - ler/escrever) é utilizada do seguinte modo: R/W = 1 - operação de leitura – lê o conteúdo da localização da memória R/W = 0 - operação de escrita – escreve um conteúdo na localização da memória
Fig. 4.2 – Exemplo de Memória
A memória de um controlador utiliza 3 tipos básicos: Memória de Programa: armazena o programa que o controlador utiliza quando em operação. Esta memória é do tipo FLASH, isto é, mesmo quando o dispositivo for desligado da fonte de alimentação, os dados armazenados nesta memória não são perdidos (apagados). Permite ser apagada e gravada inúmeras vezes (cerca de 10.000 ciclos de gravação) o que torna seu uso de extrema importancia em microcontroladores. RAM (Randomic Access Memory): armazena os registros especiais bem como os resultados das operações realizadas pelo programa. Uma vez desligada a fonte de alimentação, os valores contidos nesta memória são perdidos (apagados). EEPROM (Electrally Erasable Programable Read Only Memory): os registros que não devem ou não podem ser perdidos quando a fonte é desligada são armazenados neste tipo de memória, que só pode ser gravada/apagada mediante comandos específicos. 4.2. Unidade Central de Processamento (CPU) Admitindo que existam 3 localizações de memória em um bloco específico para que se possa ter a capacidade de realizar operações de somar, multiplicar, dividir, subtrair e mover os seus conteúdos de um local de memória para outro, este bloco recebe o nome de "Central Processing Unit" (CPU) ou Unidade Central de Processamento, e os locais de memória nela contidos chamam-se registros, conforme se pode ver na fig. 4.3.
Bento Alves Cerqueira Cesar Filho - R 1.0 - NOV/07 6/23
Fig. 4.3 – Exemplo de CPU
Os registros são locais de memória cujo papel é ajudar a executar as várias operações matemáticas ou quaisquer outras operações com dados, quaisquer que sejam os locais em que estes se encontrem. 4.3. Barramento de Comunicação (Bus) Com dois blocos independentes (Memória e CPU), existe a necessidade de interligação entre eles para que, por exemplo, uma operação que some os conteúdos de dois locais da memória e guarde o resultado em outro local da memória seja realizada, isto é, precisa de um caminho através do qual os dados possam passar de um bloco para outro. Esta interligação é designada Barramento (Bus) que corresponde a um grupo de 8, 16 ou mais condutores que interliga elétricamente um bloco a outro. Existem dois tipos de barramento: Barramento de dados: interliga todos os blocos dentro do microcontrolador, o número de linhas depende do comprimento da palavra de dados (. Barramento de endereços: interliga a CPU com a Memória, o número de linhas depende da quantidade de memórias que devem ser endereçadas. A fig.4.4 mostra a conexão entre a Memória e a CPU utilizando barramentos para ganhar funcionalidade.
Fig.4.4 – Barramento interligando CPU com Memória
Bento Alves Cerqueira Cesar Filho - R 1.0 - NOV/07 7/23
4.4. Entrada/Saída (I/O – Input/Output) A Entrada/Saída (I/O) é a porta de comunicação do microcontrolador com o mundo exterior. São designadas como PORT e podem reunir, de acordo com o modelo do controlador, diversas funções: -
Entrada Digital Saída Digital Entrada e Saída Digital Entrada Analógica Entrada/Saída de Comunicação Serial Outras de diversas aplicações e complexidades
Física e elétricamente, o PORT está conectado com os pinos de conexão do circuito integrado logo, os circuitos externos podem enviar sinais e informações ao microcontrolador bem como receber sinais e informações do microcontrolador. Um PORT funciona como uma posição de memória, isto é, é possível realizar uma operação de escrita bem como realizar uma operação de leitura desta posição de memória. Como está interligado ao exterior pelos pinos do circuito integrado, o resultado das operações permitem controlar dispositivos externos e ler o estado dos dispositivos externos. A fig.4.5 mostra o diagrama simplificado de uma unidade de I/O para comunicação com o mundo externo ao microcontrolador.
Fig.4.5 – Diagrama Simplificado da Unidade I/O
I/O digitais são comumente agrupadas no comprimento equivalente de um registro de 8 bits, que corresponde a um PORT, que pode ser configurado tanto como entrada como saída. Existem exceções, que dependem do tamanho e da capacidade do microcontrolador onde um PORT pode conter apenas 1 bit, 4 bits ou 6 bits, considerando os modelos de média capacidade.
Bento Alves Cerqueira Cesar Filho - R 1.0 - NOV/07 8/23
A fig.4.6 mostra um diagrama lógico simplificado do circuito de entrada, enquanto a fig.4.7 mostra um diagrama lógico simplificado do circuito de saída de um microcontrolador típico.
Fig.4.6 – Diagrama Simplificado de Entrada
Fig.4.7 – Diagrama Simplificado de Saída
4.5. Comunicação Serial Os microcontroladores mais modernos costumam incluir dentro do circuito integrado um sistema de comunicação serial completo. Este sistema permite que haja um caminho simples para que o equipamento possa conversar tanto com outros controladores quanto com computadores. Os fabricantes já incluem, dentro do maquinário de comunicação, o protocolo de transmissão e recepção de tal forma que o usuário não necessita de estudos mais profundos da forma como os dados (ou registros) são transmitidos/recebidos, apenas entender como colocar/retirar de um local apropriado (definido pelo fabricante) o dado e colocá-lo na memória para utilização. Normalmente são previstas duas linhas independentes de comunicação a partir de dois pinos específicos: Tx – para transmissão de dados Rx – para recepção de dados A linha de transmissão é elétrica e físicamente independente da linha de recepção, o que permite transmitir um dado e receber outro simultaneamente. Este tipo de comunicação chama-se “full-duplex”, e os dados são transmitidos/recebidos na forma serial (os bits trafegam pela linha um após o outro). Eventualmente pode existir uma terceira linha para sincronizar a comunicação entre os divesos dispositivos existentes na rede. Nesta opção, um dispositivo opera como “Master” (Mestre) enquanto os demais como “Slave” (Escravo).
Bento Alves Cerqueira Cesar Filho - R 1.0 - NOV/07 9/23
Fig.4.8 – Diagrama Simplificado do Módulo de Comunicação Serial
4.6. Temporizador ou Contador Livre Os microcontroladores possuem um registro cujo valor numérico incrementa automáticamente uma unidade em intervalos de tempo definidos. Portanto, este registro pode ser utilizado como uma base de tempo precisa e independente de um programa específico para que seja realizado, podendo ser considerada a mais poderosa ferramenta existente em um controlador. O entendimento do correto funcionamento deste temporizador ou contador livre permite controle sobre variáveis cíclicas tais como sinais de tensão senoidal da rede de energia que devem ser sincronizados com elementos de controle (Triac) para acionmentos externos. A fig.4.9 mostra o diagrama simplificado do temporizador onde se pode visualizar um sinal de saída de controle.
Fig.4.9 – Diagrama Simplificado do Temporizador ou Contador Livre
4.7. Conversor Analógico-Digital (ADC) Nem sempre os sinais que o microcontrolador deve ler são sinais simples do tipo liga/desliga (um/zero), que são os únicos sinais que são processados na CPU. Sinais continuamente variáveis (analógicos) devem ser convertidos em um padrão (digital) que a CPU pode compreender e processar. Esta conversão é realizada por um ADC (Analogo to Digital Converter – Conversor Analógico – Digital) e a maioria dos microcontroladores possuem ao menos 4 canais de utilização em um ADC interno. A fig.4.10 mostra o diagrama simplificado do ADC de um controlador:
Fig.4.10 – Diagrama Simplificado do Conversor Analógico – Digital (ADC)
Bento Alves Cerqueira Cesar Filho - R 1.0 - NOV/07 10/23
5. Arquitetura 5.1. Máquina von Neumann No começo dos anos 1950, John von Neumann propos o conceito de computador com programa armazenado, que veio a ser o fundamento dos processadores mais modernos atualmente. Na Máquina von Neumann o programa e os dados ocupam a mesma memória e utilizam o mesmo barramento de comunicação. O tamanho da palavra utiliada para a instrução é o mesmo tamanho do dado, isto é, 8 bits. Para a realização de uma operação, o processador lê uma instrução para, na sequencia, movimentar o dado na memória até a posição solicitada pela instrução. Enquanto o dado não ocupar a posição da memória, o processador não pode ler a instrução seguinte, uma vez que a atualização dos endereços ocorre passo a passo. Consequentemente, a sequencia lógica de processamento consiste em: -
ler instrução movimentar dado ler instrução movimentar dado
e assim sucessivamente. Logo, pelo barramento de comunicação circulam dados e instruções alternadamente. 5.2. Máquina Harvard O conceito Harvard é mais recente que o von Neumann e surgiu da necessidade de aumentar a velocidade dos processadores sem aumentar significativamente seu tamanho ou oscilador. Para tanto, foram alocadas duas áreas de memória – uma para armazenar o programa e outra para armazenar os dados. Ao mesmo tempo, dividiu-se os barramento de comunicação de tal forma que em um barramento circula somente dados enquanto no outro circula somente endereços. Esta separação permitiu que o tamanho da palavra não ficasse limitado a apenas 8 bits, aumentando para 14 bits dividido em OPCODE (código operacional), que especifica o tipo de instrução e um ou mais operadores (colocado nos 6 bits mais signficativos), enquanto os demais 8 bits armzenam o dado. Como o número de bits reservados para a instrução é pequeno, o número de instruções para operar um microcontrolador também é pequeno. A fig.5.1 mostra um diagrama comparativo entre as duas máquinas:
Fig.5.1 – Comparação entre Arquiteturas
Bento Alves Cerqueira Cesar Filho - R 1.0 - NOV/07 11/23
5.3. RISC/CISC RISC (Reduced Instruction Set Computer) – Computador com Conjunto Reduzido de Instruções: este tipo de processador é construído em arquitetura Harvard onde uma palavra de 14 bits reúne tanto a instrução quanto o dado a ser operado. A grande característica desta arquitetura está no reduzido número de instruções empregado na programação, o que torna o conjunto extremamente rápido. Os microcontroladores existentes no mercado atualmente são construídos dentro desta arquitetura. CISC (Complex Instruction Set Computer) – Computador com Conjunto Complexo de Instruções: este tipo de processador é construído em arquitetura von Neumann onde uma palavra de 8 bits é utilizada para a instrução e outra palavra de 8 bits é utilizada para conter dado. O conjunto de instruções é bastante grande, podendo atingir 250 tipos diferentes. Se por um lado a programação fica mais difícil, por outro a capacidade de resolução gráfica e matemática é mais poderosa. Os processadores existentes nos modernos computadores de mercado atualmente são construídos dentro desta arquitetura. 5.4. Clock - Ciclo de Instrução (Ciclo Q – Q Cycle Activity) Para que um microcontrolador possa operar, é necessário que haja uma base de tempo constante e independente de forma que os sinais digitais no interior da memória e da CPU sejam enviados e recebidos corretamente. Esta base de tempo é fornecida por um oscilador onde, a cada ciclo, um evento é realizado. A velocidade de realização destes eventos depende da velocidade do oscilador, isto é, da sua frequencia. Como este oscilador fornece a base de tempo de funcionamento dos dispositivos eletronicos, recebe o nome técnico de CLOCK (relógio). Portanto, como em cada ciclo de clock uma instrução é realizada, surge o termo Ciclo de Instrução (Tcy) ou Ciclo de Máquina (CM). Nos microcontroladores com arquitetura RISC, cada Ciclo de Instrução (Tcy) compreende 4 ciclos Q (Q1 a Q4) onde cada ciclo Q corresponde ao mesmo tempo de um período do clock (Tosc) que equivale ao tempo/designação para Decodificação, Leitura, Processamento do Dado, Escrita etc., de acordo com a fig.5.2:
Fig.5.2 – Ciclo Q
Os quatro ciclos Q que formam um ciclo de instrução (Tcy) podem ser generalizados como segue: Q1: Decodificação da Instrução Q2: Ciclo de Leitura de Instrução Q3: Processamento do Dado Q4: Ciclo de Escrita da Instrução Bento Alves Cerqueira Cesar Filho - R 1.0 - NOV/07 12/23
Internamente na CPU existe um registro cuja função é contar as linhas de programa. Este registro é chamado de PC (Program Counter) e é incrementado de uma unidade sempre em Q1. Uma instrução é chamada da memória sempre no ciclo Q1 e escrita em um registro no ciclo Q4. A decodificação (ou interpretação) e execução desta instrução serão feitas entre os próximos ciclos Q1 e Q4. A fig.5.3 mostra a relação entre o Ciclo de Instrução e o clock (OSC1) bem como os ciclos internos de Q1 a Q4. O Contador de Programa (PC) guarda o endereço da próxima instrução:
Fig.5.3 – Clock – Ciclo de Instrução
5.5. Fluxo de Instruções/Pipelining Como foi visto anteriormente, um Ciclo de Instrução consiste de 4 ciclos Q (Q1, Q2, Q3 e Q4). A busca de uma instrução ocupa um ciclo enquanto decodificar e executar a instrução ocupa outro ciclo. Entretanto, devido ao “pipelining”, cada instrução é efetivamente executada em um ciclo. Se uma instrução provoca um desvio (por exemplo, GOTO), um ciclo extra é necessário para completar a instrução (devido a alteração no PC - Program Counter). A instrução busca (fetch) começa quando o PC é incrementado em Q1. No ciclo de execução (execute), a instrução buscada é colocada dentro do Registro de Instrução (Instruction Register - IR) no ciclo Q1. Esta instrução é decodificada e executada durante os ciclos Q2, Q3, e Q4. A memória de dado é lida durante Q2 (ler operando) e escrito durante Q4 (escreve destino) A fig.5.4 mostra a operação do pipeline de dois estágios para a sequencia de instruções indicada:
Fig.5.4 – Fluxo de Instrução - Pipelinig
Tcy0: a primeira instrução (MOVLW 55h) é buscada na memória de programa (Fetch 1). Tcy1: a primeira instrução é executada (Execute 1) enquanto a segunda instrução (MOVWF PORTB) é buscada (Fetch 2). Tcy2: a segunda instrução é executada (Execute 2) enquanto a terceira instrução (CALL SUB_1) é buscada (Fetch 3). Bento Alves Cerqueira Cesar Filho - R 1.0 - NOV/07 13/23
Tcy3: a terceira instrução (CALL SUB_1) é executada (Execute 3) enquanto a quarta instrução (BSF PORTA, BIT3) é buscada (Fetch 4). Quando a terceira instrução é completada, a CPU força o endereço da quarta instrução a ser colocado no Stack (registros que armazenam os endereços de retorno dos desvios) e modifica o valor do PC para o endereço SUB_1. Isto significa que a instrução que foi buscada na memória durante o Tcy3 (no caso Fetch 4) teve que ser “descarregada” do pipeline. Tcy4: a quarta instrução é “descarregada” (uma NOP – No Operation – é realizada) e a instrução existente no endereço SUB_1 (Instruction @ address SUB_1) é buscada (Fetch SUB_1). Tcy5: a quinta instrução é executada (Execute SUB_1) e a instrução do endereço SUB_1 + 1 (Fetch SUB_1 + 1) é buscada Um método útil de demonstração é a analogia com uma lavanderia. Vamos considerar que existem quatro cargas de roupa suja que precisamos lavar, secar, passar e dobrar. Nós podemos colocar a primeira carga na lavadora por 30 minutos, secar por 40 minutos e levar 20 minutos para passar e dobrar as roupas. Então colocamos a segunda carga para lavar, secar, passar e dobrar, e assim sucessivamente para a terceira e quarta carga de roupa. Considerando que iniciamos o trabalho de lavanderia às 18:00 h (na fig. 5.5, equivalente a 6 PM), e procuramos realizar o serviço da maneira mais eficiente possível, só conseguiremos terminar o serviço à meia-noite.
Fig.5.5 – Fluxo de Serviços no formato Sequencial
Entretanto, uma forma mais eficiente de resolver o problema seria colocando a segunda carga de roupa suja na lavadora quando a primeira carga estiver limpa e rodando alegremente na secadora. Então, quando a primeira carga estiver sendo passada e dobrada, a segunda carga estará secando e a terceira poderá ser incluída no “pipeline” da lavanderia. Usando este método, o nosso serviço termina por volta das 21:30 h., como pode ser observado na fig. 5.6.
Bento Alves Cerqueira Cesar Filho - R 1.0 - NOV/07 14/23
Fig.5.6 – Fluxo de Serviço no formato Pipelinig
Bento Alves Cerqueira Cesar Filho - R 1.0 - NOV/07 15/23
6. Estrutura 6.1. Diagrama de Blocos de um Microcontrolador A fig.6.1 mostra o Diagrama de Blocos de um microcontrolador completo com todas as possibilidades de acessórios e dispositivos periféricos que podem ser estruturados no interior do dispositivo.
Fig.6.1 – Diagrama de Blocos
Bento Alves Cerqueira Cesar Filho - R 1.0 - NOV/07 16/23
6.2. Unidade Central de Processamento (CPU)/Unidade Lógica-Aritmética (ALU) A Unidade Central de Processamento (CPU – Central Processing Unit) pode ser considerada como o “cérebro” do controlador e é responsável por buscar a instrução correta para execução, decodificar esta instrução e executá-la. A CPU interliga todas as partes do microcontrolador como se fosse uma única peça. A função mais importante realizada pela CPU é decodificar as instruções do programa. Quando um programador escreve um programa, as instruções escritas têm o formato semelhante a: MOVLW 0x20 O formato literal é bastante claro e simples para a compreensão humana, mas é completamente imcompreensível para o microcontrolador. Para que o microcontrolador entenda a instrução neste formato, é necessário que um “tradutor” reescreva a instrução no formato literal para o formato de uma sequencia de “zeros” e “uns” (código binário – único formato que o microcontrolador consegue ler) chamado de “opcode”. A tradução do formato literal para o formato binário é feita por um programa residente normalmente chamado de “compilador”, que contém as correlações de código (ou dicionário) para reescrever no formato binário todas as instruções, variáveis, constantes etc.. Portanto, a instrução buscada na memória de programa é decodificada pela CPU em um conjunto de ações que executam a tarefa designada pela instrução. Como as instruções podem conter outros comandos que podem requerer diferentes transferencias de dados de uma memória para outra, da memória para os PORTs de I/O ou ainda executar alguns cálculos, é necessário que a CPU esteja conectada com todas as partes do microcontrolador a partir de barramentos de dados e de endereços. Algumas vezes a CPU trabalha em conjunto com a Unidade Lógica e Aritmética (ALU) para completar a execução de instruções que envolvem operações aritméticas e lógicas. 6.3. Unidade Lógica-Aritmética (ALU) Muitas das instruções da memória de programa operam na memória de dados. Para operar a memória de dados existe a Unidade Lógica-Aritmética (ALU – Arithmetic-Logic Unit), que realiza as operações de lógica e aritmética e controla os bits de status da memória. A execução de algumas instruções força tais bits a assumir um estado dependendo do valor do resultado (por exemplo, um determinado bit de um registro de controle assume valor 1 quando a execução de uma instrução apresentar resultado nulo). Nos microcontroladores, a ALU emprega registros de 8 bits e é capaz de realizar operações de soma, subtração, deslocamento e operações lógicas (booleanas) utilizando um registro de trabalho (registro W) e qualquer outro registro (arquivo ou constante numérica). A fig.6.2 mostra o diagrama simplificado do fluxo de informações da ALU e do registro W:
Bento Alves Cerqueira Cesar Filho - R 1.0 - NOV/07 17/23
Fig.6.2 – Fluxo de Informações na ALU
6.4. Memória - Organização Existem dois blocos de memória nos microcontroladores : - Memória de programa - Memória de dados A estrutura Harvard permite que o acesso à memória de programa seja independente do acesso da memória de dados logo, cada bloco tem seu próprio barramento e o acesso a cada bloco pode ocorrer simultaneamente durante o mesmo ciclo do oscilador (clock). 6.4.1. Memória de programa Nos microcontroladores mais modernos, a memória de programa é construída no formato FLASH, que permite um número bastante elevado de ciclos de gravação utilizando-se apenas de sinais elétricos. Este tipo de memória facilita tanto o trabalho de desenvolvimento (onde as diversas versões de um programa podem ser gravadas até atingir o funcionamento ótimo), quanto à evolução natural da aplicação em um dispositivo (possibilita a gravação de uma versão mais avançada em um equipamento já em operação). Os microcontroladores usualmente possuem um contador de programa PC com capacidade para endereçar até 8k (8.000) posições de memória. Como todas as instruções utilizam uma única palavra (ou uma única posição de memória), um dispositivo com esta capacidade pode conter até 8k instruções, o que torna bem simples determinar qual o modelo mais adequado para a utilização. A memória de programa é dividida em 4 páginas, cada uma com capacidade de 2k posições de memória. Dependendo do modelo de microcontrolador utilizado, apenas parte desta memória pode ser implementada. Logo, o usuário deve ler o manual técnico do modelo pretendido para saber o tamanho e distribuição da memória de programa.
Bento Alves Cerqueira Cesar Filho - R 1.0 - NOV/07 18/23
A fig.6.4 mostra o mapa da memória de programa genérica. Observar que os endereços da memória são mostrados em numeração hexadecimal. Mesmo durante um programa, os endereços que são informados ao programador serão sempre neste formato, uma vez que ocupam comprimento menor que nos formatos binário ou decimal.
Fig.6.4 – Mapa Memória de Programa Genérico
Como mostra a fig.6.4, algumas informações e referencias devem ser detalhadas, como segue: 6.4.1.1. Vetor de Reset (Reset Vector) O Vetor de Reset identifica a primeira posição, ou o endereço inicial, da memória de programa (0h) portanto, o local onde se inicia o programa inserido pelo usuário. Quando o microcontrolador é energizado e após a estabilização do seu oscilador (clock), o programa começa por esta posição de memória. Se o microcontrolador já estiver operacional e ocorrer um reset (forçado por ação externa ou pelo programa), o contador de programa PC é forçado a zero, a execução do programa é redirecionada para este endereço de memória e o microcontrolador reinicia novamente, inclusive com paginação de memória, dados e constantes iniciais. Todas as informações existentes até o instante do reset são perdidas. 6.4.1.2. Vetor de Interrupção (Interrupt Vector) Uma das mais poderosas ferramentas existentes dentro de um microcontrolador é a Interrupção, isto é, um desvio forçado por alteração de estado de algum bit preparado para ocorrer em situações especiais pelo programador. Quando uma interrupção ocorre, o contador de programa PC é forçado a assumir o valor 04h. A partir deste endereço, o programa inicia o Tratamento de Interrupção (ISR – Interrupt Service Routine) de acordo com as necessidades da aplicação do controlador.
Bento Alves Cerqueira Cesar Filho - R 1.0 - NOV/07 19/23
6.4.1.3. Contador de Programa (Program Counter – PC) O Contador de Programa (PC) especifica o endereço de busca na memória da instrução para execução. O incremento ou modificação dos valores do PC é feito automáticamente pela CPU (hardware) em função das necessidades impostas pelo programa. Se não houver nenhuma instrução de desvio, o incremento é automático no ciclo Q1. Se houver uma instrução de desvio (GOTO), então o novo valor será colocado no PC de acordo com as premissas de endereçamento vindas da CPU. O comprimento do registrodo PC é normalmente de 13 bits. Os primeiros 8 bits (de 0 a 7) compreendem o registro PCL (low byte – byte baixo) e são acessíveis diretamente, isto é, podem ser lidos e/ou escritos pelo programa. Os últimos bits (de 8 a 12) compreendem o registro PCH (high byte – byte alto) e não são diretamente acessíveis, isto é, sómente podem ser lidos e/ou escritos através de outro registro, o registro PCLATH (Program Counter Latch High). 6.4.1.4. Stack O Stack contém os endereços de retorno dos desvios (sub-rotinas) ou interrupções requisitadas. Permite uma combinação de até 8 desvios, isto é, permite até o máximo de 8 desvios de sub-rotina e interrupção. O registro de Stack não faz parte da memória de programa ou da memória de dados, e também não é possível ler ou escrever nestes registros. O valor do registro PC é colocado no Stack quando uma instrução CALL é executada ou quando uma interrupção provoca um desvio (sempre que uma interrupção é chamada, a Rotina Principal é interrompida no ponto em que se encontra e força um desvio para o Vetor de Interrupção). O valor do registro PC retorna do Stack quando uma das instruções de retorno (RETURN, RETLW ou RETFIE) é executada. Observar que os valores do registro PC são colocados seqüencialmente dentro do Stack à medida que os desvios ocorrem. Após oito valores do registro PC serem colocados dentro do Stack, o nono valor sobreescreve o primeiro armazenado, o décimo sobre-escreve o segundo armazenado e assim sucessivamente. Os demais registros existentes não são modificados.A fig.6.5 mostra o procedimento de escrita dos endereços dentro do Stack:
Fig.6.5 – Sequencia de Entrada de Registros no Stack
Observações: 1. Não existe bit indicando a situação do Stack (overflow ou underflow). 2. Não existem instruções ou mnemonicos para acionar os valores no Stack – somente a CPU pode fazer estas ações. 3. A perda de valores do Stack por overflow (excesso) implica em erro durante a execução do programa, uma vez que foi perdido um endereço de retorno. Bento Alves Cerqueira Cesar Filho - R 1.0 - NOV/07 20/23
6.4.2. Memória de Dados A memória de dados é formada por Registros de Função Especial (SFR – Special Function Register) e por Registros de Uso Geral (GPR – General Purpose Register). A memória de dados é formada por bancos cujo acesso é feito a partir de bits de controle existentes em um registro especial (SFR) chamado Status. Como os valores são gravados em memória RAM, ao iniciar a operação do microcontrolador todas as posições estarão no nível “0” (zero) logo, é necessário que o programa do usuário coloque os valores adequados em cada registro (na forma de constantes) para o correto funcionamento do dispositivo. Se ocorrer o desligamento da fonte do controlador, os valores armazenados serão perdidos. No caso de um comando de Reset (interno ou externo) os valores existentes na memória de dados não sofrem alteração. No entanto, como esta ação depende do modelo do dispositivo, é necessário que o usuário leia o manual do modelo específico para a correta programação. A fig.6.6 mostra o mapa genérico da memória de dados. Observar que este mapa varia conforme o modelo do microcontrolador (ver Notas).
Fig.6.6 – Mapa da Memória de Dados Bento Alves Cerqueira Cesar Filho - R 1.0 - NOV/07 21/23
Notas: 1. Os Registros em negrito estão presentes em todos os modelos de microcontroladores. 2. Nem todas as posições de memória são implementadas portanto, são lidas pelo programa como “0” (zero). 3. Estas posições podem não ser implementadas. Dependendo do modelo do controlador, o acesso às posições não implementadas pode operar de forma diferente. Para maiores detalhes, é importante que o usuário consulte o manual do modelo específico. 4. Alguns modelos não incluem estes registros dentro do Bank0. Os modelos que incluem estes registros dentro do Bank0, são referidos como memória RAM comum. 5. Alguns modelos não possuem estes bancos implementados portanto, as posições relativas são lidas como “0” (zero). 6. Registros de Uso Geral (GPR) podem ser alocados na área de Registros de Função Especial (SFR). Para movimentar valores de um registro para outro, os valores precisam passar pelo registro W (ver ítem 6.4 e fig.6.3), o que significa que movimentar dados entre registros requer dois ciclos de máquina (2Tcy). A memória de dados é organizada em duas áreas: 6.4.2.1. Registros de Uso Geral (GPR – General Purpose Register) Esta área de registros é utilizada pelo usuário para armazenar dados ou como base de cálculos intermediários não suportados pela CPU. Na fig.6.6 corresponde à área abaixo dos Registros Especiais. 6.4.2.2. Registros de Função Especial (SFR – Special Function Register) São utilizados pela CPU e Módulos Periféricos para controlar a operação desejada do microcontrolador. Estes registros são implementados em memórias do tipo RAM estática (static RAM). Estes registros são implementados pelo fabricante de acordo com o modelo e utilidade. Em todos os casos, é possível ler e/ou escrever nestes registros tanto na forma direta quanto na forma indireta. Os Registros Especiais - SFR - podem ser divididos em dois conjuntos distintos: a) Núcleo (Core): controlam e são controlados por funções específicas do núcleo da CPU. Através dos bits destes registros é possível controlar funções dentro da CPU e, ao mesmo tempo, receber informações da CPU dos resultados obtidos. b) Periféricos: controlam e são controlados por funções externas ao núcleo, normalmente estão ligados a conexões externas ao microcontrolador. Os bits destes registros permitem receber informações das ocorrencias externas bem como tomar decisões sobre estas ocorrencias. Na fig.6.6, os Registros Especiais estão identificados pelo acrônimo que corresponde à descrição da sua função. 6.6. Conversando com o Mundo Exterior - Entrada/Saída (I/O) Digital A Entrada/Saída (I/O) de uso geral pode ser considerada como o mais simples periférico de um microcontrolador, permitindo monitorar e controlar outros dispositivos conectados a ela. Para aumentar a funcionalidade e flexibilidade do dispositivo, as Entradas/Saídas podem ser multiplexadas com outras funções alternativas, que dependem do modelo do dispositivo. Geralmente, estas funções multiplexadas não podem ser utilizadas simultaneamente com Entrada/Saída digital. Cada grupo de Entrada/Saída é controlado por um PORT que está, por sua vez, relacionado a um byte (palavra) com no máximo 8 bits. O tamanho do PORT é função do modelo do dispositivo podendo se apresentar como vários PORTs de 8 bits ou menos em um mesmo dispositivo. Bento Alves Cerqueira Cesar Filho - R 1.0 - NOV/07 22/23
Cada bit do PORT está relacionado a uma I/O que, por sua vez, corresponde a um pino externo do controlador. Logo, a direção de utilização do pino de I/O, isto é, sua utilização como Entrada (Input) ou Saída (Output) é determinada por um registro especial chamado TRIS. Consequentemente, cada bit de um PORT está relacionado a um bit de seu TRIS de controle. A seleção da direção de um pino será feita no registro TRIS da seguinte forma: - Entrada (Input) – bit igual a `1´ (um) (lembrar que o número 1 é semelhante à letra I de Input) - Saída (Output) – bit igual a `0´ (zero) (lembrar que o número 0 é semelhante à letra O de Output) A fig.6.7 mostra um PORT I/O digital típico, não considerando a enventualidade de existir outras funções multiplexadas no pino.
Fig.6.7 – Diagrama Típico de uma I/O Digital
Ler o registro PORT significa ler o estado do pino de I/O (alto -1 ou baixo -0) – observar na fig. 21 que a leitura do estado do pino é feita através de um “Schmitt trigger” ligado a um flip-flop tipo D e diretamente conectado ao barramento de dados (Data Bus). O comando (ou instrução) de leitura é feito através do RD PORT que habilita o flip-flop e a chave do buffer de conexão com o barramento de dados. Escrever no registro PORT significa ler o valor do pino, modificar o seu valor e escrever em um flip-flop do tipo D (caracterizado como Data Latch – trava de dado), o que faz com que todas as operações de escrita sejam do tipo read-modify-write (ler-modificar-escrever). Colocando um bit do registro TRIS no nível `1´ significa que a saída correspondente assume o valor de alta impedancia. Colocando um bit do registro TRIS no nível `0´ significa que o conteúdo do latch de saída será colocado no pino correspondente. O controle da função de cada pino deve estar de acordo com o modelo escolhido para a aplicação – é importante a leitura completa do manual de cada modelo em uso para a correta especificação dos pinos multiplexados. Bento Alves Cerqueira Cesar Filho - R 1.0 - NOV/07 23/23