You are on page 1of 31

APOSTILA DE MICROCONTROLADORES

Sumário
Capítulo 1 – Introdução ............................................................................................................. 1 1.1 - Microcontroladores....................................................................................................... 1 1.2 - Unidade de Memórias ................................................................................................... 2 1.3 - Conversores D/A ........................................................................................................... 3 1.4 - Arquitetura de Microcontroladores .............................................................................. 3 1.5 - Conjunto de instruções RISC / CISC ............................................................................... 4 Capítulo 2 - Estrutura Interna.................................................................................................... 5 2.1 - Características do Microcontrolador PIC16F84A .......................................................... 5 2.2 - Significado dos pinos ..................................................................................................... 5 2.3 - Entradas e saídas (Input/Output).................................................................................. 6 2.4 - Unidade Central de Processamento.............................................................................. 6 2.5 - Unidade Lógica Aritmética (ALU) .................................................................................. 7 2.6 - Memória de Programa .................................................................................................. 7 2.7 - Memória de dados (RAM) ............................................................................................. 8 2.8 - Memória EEPROM ....................................................................................................... 13 2.9 - Clock / ciclo de instrução ............................................................................................ 13 2.10 - Reset.......................................................................................................................... 15 2.11 - Interrupções .............................................................................................................. 16 2.12 - Contadores (Temporizador TMR0)............................................................................ 19 Capítulo 3 - Conjunto de Instruções ........................................................................................ 21 3.1 - Transferência de dados ............................................................................................... 21 3.2 - Lógicas e aritméticas ................................................................................................... 21 3.3 - Operações sobre bits .................................................................................................. 22 3.4 - Direção de execução de um programa ....................................................................... 22 3.5 - Período de execução da instrução .............................................................................. 23 3.6 - Listagem das palavras ................................................................................................. 23 Capítulo 4 - Linguagem de Programação em Assembly .......................................................... 25 Capítulo 5 - Linguagem de Programação em C ....................................................................... 27 5.1 - Comandos da Linguagem C ......................................................................................... 28 5.2 - Operadores lógicos e aritméticos da linguagem C ...................................................... 28

htm MICROCHIP (PIC) .intel.       ATMEL . podendo ser alimentados por baterias e pilhas comuns. estudaremos o Microcontrolador do fabricante Microchip. impressoras e calculadoras. basicamente todos possuem uma estrutura muito similar.www. Existe uma infinidade de utilizações para os Microcontroladores.Capítulo 1 – Introdução 1. portões eletrônicos. módulos de temporização.ti. Portas de entrada e saída (I/O). Figura 1 . memória RAM (Random Access Memory). ROM (Read Only Memory). modelo 16F84A que pode ser substituído pelo novo modelo PIC16F627.com MITSUBISHI . Podemos encontrar no mercado diversas marcas de Microcontroladores. Um exemplo simples é uma automação residencial. que é totalmente compatível.mitsubishichips. É comum encontramos em centrais de alarme. controle de injeção eletrônica dos carros. o Microcontrolador é um sistema computacional completo inserido em um único CI – Circuito Integrado.microchip. controle e instrumentação.www. São dispositivos que consomem pouca energia.www. onde será possível programar determinados horários para acender ou apagar as luzes. medir o consumo de energia e monitorar abertura de portas. Wi-Fi ou USB.www.com TEXAS INSTRUMENTS .Microcontrolador Microchip 16F84A 1 .Microcontroladores Desenvolvidos para ampla aplicação em dispositivos eletrônicos.com/design/embcontrol/index.atmel.com Nesse curso.philips.www. conversores analógico/digital e até mesmo conversores de rede Ethernet.com INTEL (80C51) .www. Podem ser utilizados para automações de processos.com PHILIPS . São componentes de baixo custo e compactos. Ele possui CPU.1 .

também é possível escrever num endereço da memória (introduzir um conteúdo na gaveta). Barramento de Controle e Barramento de Dados. A maneira mais fácil de explicar é descrevê-la como uma grande prateleira cheia de gavetas. A linha de controle é usada do seguinte modo: se r/w=1. Isto é feito utilizando uma linha adicional chamada linha de controle. Basta saber a designação da gaveta e o seu conteúdo será conhecido. nós obtemos o conteúdo desse endereço. A memória é o primeiro elemento. caso contrário é executada uma operação de escrita no endereço de memória. Isto significa que precisamos selecionar o endereço desejado (gaveta) e esperar que o conteúdo desse endereço nos seja apresentado (abrir a gaveta).Memória RAM Os componentes de memória são exatamente a mesma coisa. Se numerarmos as gavetas de modo a elas não se confundirem umas com as outras.ler/escrever.Unidade de Memórias A memória é a parte do microcontrolador cuja função é guardar dados. então o seu conteúdo será facilmente acessível. 2 . Figura 2 . Nós iremos designar esta linha por R/W (read/write) . A memória é o conjunto de todos os locais de memória (gavetas) e endereçamento nada mais é que selecionar um deles. é executada uma operação de leitura. Para um determinado endereço. são eles: Barramento de Dados. as memórias possuem apenas três barramento distintos.1. Além de ler de um local da memória (ler o conteúdo da gaveta). Basicamente. Dois novos conceitos foram apresentados: endereçamento e memória. mas precisamos de mais alguns para que o nosso microcontrolador possa trabalhar.2 .

termo que pode ser encontrado na literatura sobre computadores. onde a Unidade Central de Processamento é interligada a memória por um único barramento. claro. O sistema é composto por uma única memória. eles devem ser convertidos num formato que possa ser compreendido pelo microcontrolador. Figura 4 .3 .1. uma maior velocidade de funcionamento. é possível um maior fluxo de dados através da unidade central de processamento e. Este bloco vai ser responsável pela conversão de uma informação de valor analógico para um número binário e pelo seu trajeto através do bloco do CPU.Arquitetura de Microcontroladores A arquitetura de um sistema digital define como são as partes que compõem o sistema.Conversores A/D Como os sinais dos periféricos são substancialmente diferentes daqueles que o microcontrolador pode entender (0 e 1). Figura 3 . Nessa arquitetura a Unidade Central de Processamento é interligada a memória de dados e a memória de programa. O PIC tem uma arquitetura Harvard. de modo a que este o possa processar de imediato.Arquiteturas 3 . Podemos encontrar também a arquitetura de Von Neuman. a memória de dados está separada da memória de programa.Conversor A/D 1. onde são armazenados dados e instruções.4 . Na arquitetura de Harvard. Esta tarefa é executada por intermédio de um bloco destinado à conversão analógica-digital ou com um conversor A/D. Assim.

4 .1.Conjunto de instruções RISC / CISC Os microcontroladores com a arquitetura Harvard são também designados por "Microcontroladores RISC". exceto no caso de instruções de salto e de chamadas de subrotinas. Os microcontroladores com uma arquitetura Von-Neumann são chamados por “microcontroladores CISC”. mais precisamente 35. Como o PIC16F84A é um microcontrolador RISC. disso resulta que possui um número reduzido de instruções. RISC significa Computador com um Conjunto Reduzido de Instruções (Reduced Instruction Set Computer). O nome CISC deriva de Computador com um Conjunto Complexo de Instruções (Complex Instruction Set Computer). Todas estas instruções são executadas num único ciclo.5 . Mais a frente será abordada no tópico “Conjunto de Instruções” cada instrução detalhadamente.

SMD é uma abreviatura para Surface Mount Devices (Dispositivos de Montagem em Superfície).capacidade de 1024 instruções para memória de programa flash.Capítulo 2 .1 . o que sugere que os pinos não precisam de passar pelos orifícios da placa em que são inseridos. .Significado dos pinos O PIC16F84 tem um total de 18 pinos.Estrutura Interna 2.35 instruções RISC A seguir o diagrama de esquemático do microcontrolador PIC 16F84A. têm o seguinte significado: Pino 1 2 3 Nome Função RA2 Bit 2 da porta A RA3 Bit 3 da porta A RA4 Bit 4 da porta A Obervação Não tem função adicional Não tem função adicional O T0CKI que funciona como entrada para o 5 . mas.Características do Microcontrolador PIC16F84A O Microcontrolador PIC16F84A possui as seguintes características: .18 pinos. É mais frequentemente encontrado no tipo de encapsulamento DIP18. podendo ter até 13 entradas e saídas (I/O).2 . DIP é uma abreviatura para Dual In Package (Invólucro em duas linhas).64 Bytes de memória EEPROM.Pinos do Microcontrolador Microchip 16F84A 2.68 Bytes de memória RAM. também pode ser encontrado numa cápsula SMD de menores dimensões que a DIP. .1 contador (timer) de 8 bits. . quando se solda este tipo de componente. Os pinos no microcontrolador PIC16F84. Figura 5 . . .Unidade Lógica Aritmética (ULA) .

decodificar essa instrução e. Cada porta possui pinos de acesso aos periféricos.3 .Unidade Central de Processamento A unidade central de processamento (CPU) é o cérebro de um microcontrolador. Como falado anteriormente. Exemplo: Ao configurar o pino 2 da porta B (PORTB2) como saída. receberemos o valor binário “0” 2. interliga todas as partes do microcontrolador de modo que este se comporte como um todo. devem ser configuradas ao desenvolver o programa. Uma das suas funções mais Figura 6 . quando o bit valer “1” a saída passará a ter o valor de 5 Volts. é possível também configurar o pino como entrada. e ao inserir 0 Volts. nesse caso.Unidade Central de Processamento 6 . executá-la.4 . Essa parte é responsável por extrair a instrução. A unidade central de processamento. Essas entradas e saídas são formadas por 2 Port’s: PortA e PortB.temporizador também usa este pino 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 Entrada de reset e entrada de tensão de MCLR programação Vpp do microcontrolador Vss Terra (ponto negativo da alimentação) RB0 Bit 0 da porta B RB1 Bit 1 da porta B RB2 Bit 2 da porta B RB3 Bit 3 da porta B RB4 Bit 4 da porta B RB5 Bit 5 da porta B RB6 Bit 6 da porta B RB7 Bit 7 da porta B Vdd Alimentação positiva do chip OSC2 Conexão do oscilador OSC1 Conexão do oscilador RA0 Bit 0 da porta A RA1 Bit 1 da porta A Não tem função adicional Não tem função adicional INT – Entrada de interrupção por borda Não tem função adicional Não tem função adicional Não tem função adicional Não tem função adicional Não tem função adicional Não tem função adicional Não tem função adicional Não tem função adicional Não tem função adicional Não tem função adicional Não tem função adicional Não tem função adicional 2. Quando o bit valer “0” a saída será 0 Volts. podendo ser utilizadas para entrada/saída geral.Entradas e saídas (Input/Output) O microcontrolador estudado nessa matéria possui até 13 entradas e saídas. finalmente. ao ligar uma tensão de 5 Volts no pino o endereço passara a ter o valor binário “1”.

as instruções assumem um claro significado como é o caso por exemplo de MOVLW 0x20. Os bus de dados e o de endereços permitem-nos fazer isso. esta forma escrita de uma instrução tem que ser traduzida numa série de zeros e uns que é o ‘opcode’ (operation code ou código da operação).6 . para que um microcontrolador possa entendê-las. o CPU. é responsável pela execução de operações de adição. e diversos cálculos. seguramente. O código da instrução extraído da memória de programa. Esse é um tipo de memória não volátil (não perde os dados na ausência de energia). 2. O PIC16F84 contém uma unidade lógica aritmética de 8 bits e registros de uso genérico também de 8 bits. Nas instruções só com um operando. se conclui que. Contudo. um dos operandos é o conteúdo do registro W ou o conteúdo de um dos outros registros. A cada uma das instruções do repertório do microcontrolador.Unidade Lógica Aritmética Esses registros podem ser “Registros de Uso Genérico” (General Purpose Registers – GPR) ou “Registros com funções especiais” (Special Function Registers – SFR). Quando o programador escreve um programa. Estas ações. decodificar as instruções do programa. tem que ser decodificado pela unidade central de processamento (CPU). ela é gravada quando o 7 .Memória de Programa A memória de programa do PIC é do tipo EEPROM (ElectricallyErasable Programmable Read-Only Memory). subtração. deslocamento (para a esquerda ou para a direita dentro de um registro) e operações lógicas. corresponde um conjunto de ações para realizar.Unidade Lógica Aritmética (ALU) A unidade lógica aritmética (ALU – Arithmetic Logic Unit). Figura 7 . podem envolver transferências de dados de um local de memória para outro. Esta passagem de uma palavra escrita para a forma binária é executada por tradutores Assembler (ou simplesmente Assembler). tem que estar ligado a todas as partes do microcontrolador. pelo que. 2. de um local de memória para as portas.importante é.5 .

8 . Essa memória pode ser apagada e regravada através de tensão elétrica. Essa memória é um array de instruções. o que pode ser feito no próprio circuito de operação de leitura.PIC é programado. Registradores Especiais e Registradores de uso geral.7 . desde que o hardware esteja projetado para tal tarefa. Utilizamos a memória de programa para armazenar as instruções que o PIC ira executar. ou seja. 2. mas ela também pode ser utilizada como expansão da memória de dados. 1 Byte em cada endereço. Memórias voláteis são as que requerem energia para manter a informação armazenada. serve para guardar as variáveis e os registradores de configuração utilizados pelo programa. onde cada instrução é carregada através do endereço armazenado no “Contador de Linha de Programa” em Inglês Program Counter (PC).Memória de dados (RAM) A memória de dados volátil conhecida como memória RAM. A memória do PIC é uma memória que armazena dados de 8 bits. totalizando 68 Bytes. o PIC 16F84A possuí 68 endereços reservados para o usuário. Essa memória pode ser dividida em dois grupos.

Carry de dígito (DC) e Z (zero) no registro de estado .1 . Quando são executadas operações lógicas ou aritméticas como é o caso da adição. Esses registradores são escritos e lidos idos tanto pelo usuário quanto pelo hardware.7.STATUS. São responsáveis pela configuração de muitas funções e para a utilização de todos os periféricos. Dependendo da instrução a ser executada. pode pode modificar os valores bits do Carry (C). a ALU controla o estado dos bits (que constam do registro de estado – STATUS). a ALU.Registradores Especiais Os registradores especiais. 9 . denominados SFRs (Special Functions Registers) são utilizados pelo microcontroladores para a execução do programa ograma e processamentos da ULA.Figura 8 .Memória RAM 2.

quando um valor mais pequeno é subtraído de um valor maior e toma o valor ‘0’ (reset) quando um valor maior é subtraído de um menor. quando o microcontrolador entra no regime de baixo consumo / pouco trabalho. Este bit pode também ser posto a ‘1’.2. 1= resultado igual a zero 0= resultado diferente de zero bit 3 PD (Bit de baixa de tensão – Power Down) Este bit é posto a ‘1’ quando o microcontrolador é alimentado e começa a trabalhar. 1= Ocorreu um transporte no bit mais significativo 0= Não ocorreu transporte no bit mais significativo O bit C é afectado pelas instruções ADDWF. no caso de ocorrer um impulso no pino RB0/INT. uma variação nos quatro bits mais significativos da porta B.Registro especial STATUS bit 0 C (Carry) Vai um/Transporte Este bit é afetado pelas operações de adição. Este bit toma o valor ‘1’ quando o resultado da operação lógica ou aritmética executada é igual a 0. ADDLW. DC assinala um transporte do bit 3 para o bit 4 do resultado. subtração e deslocamento. Toma o valor ‘1’ (set). bit 1 DC (Digit Carry) Vai um/Transporte de dígito Este bit é afetado pelas operações de adição.1. 1= Ocorreu um transporte no quarto bit mais significativo 0= Não ocorreu transporte nesse bit O bit DC é afectado pelas instruções ADDWF.7. Ao contrário do anterior. 1 = depois de ter sido ligada a alimentação 0 = depois da execução de uma instrução SLEEP 10 . SUBLW e SUBWF. quando um valor mais pequeno é subtraído de um valor maior e toma o valor ‘0’ quando um valor maior é subtraído de um menor. depois de um reset normal e depois da execução da instrução CLRWDT.1 . subtração. bit 2 Z (bit Zero) Indicação de resultado igual a zero. ADDLW. Este bit toma o valor ‘1’. SUBLW e SUBWF. ou quando é completada uma operação de escrita na DATA EEPROM ou ainda pelo watchdog. A instrução SLEEP põe este bit a ‘0’ ou seja.

não é usado. como oitavo bit 1 = bancos 2 e 3 0 = bancos 0 e 1 (endereços de 00h a Ffh) O registro de estado (STATUS). Os bancos de memória serão discutidos com mais detalhe posteriormente. PS2 (bits de seleção do divisor Prescaler) Estes três bits definem o fator de divisão do prescaler. é preciso mais um bit para poder endereçar todos os 256 registros do PIC16F84. depois de a alimentação ser ligada e depois da execução das instruções CLRWDT e SLEEP. 11 .1. estado de RESET (TO. dispõem somente de sete bits para este fim. DC. O bit é posto a ‘0’ quando o watchdog consegue chegar ao fim da sua contagem (overflow = transbordar). No caso do PIC16F84. PS1. RP1. então não é possível escrever nestes três bits. DC ou C. Como as instruções que endereçam diretamente a memória. transborda do Watchdog Este bit é posto a ‘1’. Z). Considerando que a seleção do banco de memória é controlada através deste registro. ele tem que estar presente em todos os bancos.bit 4 TO Time-out . RP0). Aquilo que é o prescaler e o modo como o valor destes três bits afetam o funcionamento do microcontrolador será estudado na seção “Contadores (Temporizador TMR0)”. Se o registro STATUS for o registro de destino para instruções que afetem os bits Z. de maior capacidade. o que indica que qualquer coisa não esteve bem. mas pode ser necessário no caso de outros microcontroladores PIC. RP1. PD) e os bits para seleção do banco de memória (IRP. 1 = não ocorreu transborda 0 = ocorreu transborda bits 5 e 6 RP1:RP0 (bits de seleção de banco de registros) Estes dois bits são a parte mais significativa do endereço utilizado para endereçamento direto. 2. contém o estado da ALU (C. 01 = banco de registros 1 00 = banco de registros 0 bit 7 IRP (Bit de seleção de banco de registros) Este bit é utilizado no endereçamento indireto da RAM interna.7.2 – Registro especial OPTION bits 0 a 2 PS0.

1 = impulsos externos 0 = ¼ do clock interno bit 6 INDEDG (bit de seleção de borda de interrupção) Se esta interrupção estiver habilitada. 1 = prescaler atribuído ao watchdog 0 = prescaler atribuído ao temporizador TMR0 bit 4 T0SE (bit de seleção de borda ativa em TMR0) Se for permitido aplicar impulsos em TMR0. a partir do pino RA4/TOCK1. 1 = borda de subida 0 = borda de descida bit 7 RBPU (Habilitação dos pull-up nos bits da porta B) Este bit introduz ou retira as resistências internas de pull-up da porta B. 12 . Esta fonte pode ser o clock do microcontrolador (frequência de clock a dividir por 4) ou impulsos externos no pino RA4/T0CKI. 1 = resistências de “pull-up” desligadas 0 = resistências de “pull-up” ligadas 2. é possível definir o borda que vai ativar a interrupção no pino RB0/INT.7. este bit determina se os impulsos ativos são os impulsos ascendentes ou os impulsos descendentes.bit 3 PSA (Bit de Atribuição do Prescaler) Bit que atribui o prescaler ao TMR0 ou ao watchdog. 1 = borda descendente 0 = borda ascendente bit 5 TOCS (bit de seleção de fonte de clock em TMR0) Este pino escolhe a fonte de impulsos que vai ligar ao temporizador.2 – Registradores para uso geral Os registradores de uso geral são destinados ao armazenamento de variáveis definidas pelo usuário para serem escritas e lidas.

o circuito interno do microcontrolador divide o sinal de clock em quatro fases. que mesmo após retirarmos a bateria de um carro. Se considerássemos que um microcontrolador era um relógio de sala. é antecedida pela extração da instrução que está na linha seguinte. O clock do oscilador. podemos observar a relação entre o ciclo de instrução e o clock do oscilador (OSC1) assim como as fases Q1-Q4. é quem dá o sinal de partida para o microcontrolador e é obtido a partir de um componente externo chamado “oscilador”. 2.8 . Estes quatro pulsos perfazem um ciclo de instrução (também chamado ciclo de máquina) e durante o qual uma instrução é executada. Q1. A execução de uma instrução. No diagrama em baixo. Um exemplo de aplicação seria um odômetro de um veículo.Clock / ciclo de instrução O relógio (clock).Memória EEPROM O PIC possui uma memória interna não volátil e pode ser usada para armazenar informações que devem sobreviver ao desligamento do microcontrolador. podia comparar-se à alimentação elétrica. O contador de programa (Program Counter ou PC) guarda o endereço da próxima instrução a ser executada. O código da instrução é extraído da memória de programa em Q1 e é escrito no registro de instrução em Q4. a força usada para dar corda ao relógio. faz-se entre as fases Q1 e Q4 seguintes.2. Essa informação pode ser facilmente recuperada posteriormente. ele não perde quantos quilômetros ele já rodou.Ciclos da CPU 13 . aqui.9 . Figura 9 . é ligado ao microcontrolador através do pino OSC1. Q2. Q3 e Q4 que não se sobrepõem. A decodificação e execução dessa mesma instrução. o nosso clock corresponderia ao pêndulo e emitiria um ruído correspondente ao deslocar do pêndulo. Também.

se o PC não tiver que apontar para o endereço seguinte na memória de programa. escrevendo a instrução no registro de instrução (Instruction Register – IR). porque a instrução vai ter que ser processada de novo. mas. Q3 e Q4. para efeitos práticos. de modo a evitar qualquer interferência nas linhas que ligam o oscilador ao microcontrolador. mas sim para outro (como no caso de saltos ou de chamadas de subrotinas). é feita num ciclo de instrução.9. Quando projetamos um dispositivo. tem a designação RC. Isto é importante.Gerador de Clock – Oscilador O circuito do oscilador é usado para fornecer um relógio (clock).3 . 2. cada instrução demora um ciclo de instrução a ser executada. a regra é colocar o oscilador tão perto quanto possível do microcontrolador. A extração do código de uma instrução da memória de programa.2. Existem situações em que o cristal e capacitores estão contidos no mesmo encapsulamento. Contudo. No entanto. desta vez.9. Este elemento tem três pinos com o pino central ligado à massa e os outros dois pinos ligados aos pinos OSC1 e OSC2 do microcontrolador.9. se o oscilador for uma resistência em série com um capacitor. O ciclo de chamada começa na fase Q1. 2. ao microcontrolador. a partir do endereço correto. é também o caso do ressonador cerâmico abaixo representado.Tipos de osciladores O PIC16F84 pode trabalhar com 4 (quatro) configurações de oscilador. ou seja.2 .1 . porque há necessidade de optar entre os diversos tipos de oscilador. 14 . O oscilador de cristal está contido num invólucro de metal com dois pinos onde foi escrita a frequência de oscilação do cristal. Dois capacitores cerâmicos devem ser ligados cada um dos pinos do cristal à terra. então deverá considerar-se que a execução desta instrução demora dois ciclos. são feitos no ciclo de instrução seguinte. Q2. Uma vez que as configurações com um oscilador de cristal é o mais utilizado. podemos considerar que. devido à sobreposição – pipelining (o microcontrolador ao mesmo tempo que executa uma instrução extrai simultaneamente da memória o código da instrução seguinte). Quando o oscilador é de cristal. vamos mencionar aqui. Isto acontece. se a instrução provocar uma mudança no conteúdo do contador de programa (PC). a designação da configuração é de XT. sendo mais comum a utilização da configuração XT.Pipelining Cada ciclo de instrução inclui as fases Q1. enquanto que a sua decodificação e execução. O clock é necessário para que o microcontrolador possa executar um programa ou as instruções de um programa.

De modo que o seu funcionamento normal seja restabelecido. a frequência de trabalho do microcontrolador é a do oscilador dividida por 4. para testar ou sincronizar outros circuitos lógicos pertencentes ao sistema. isto significa que todos os seus registros vão conter valores iniciais pré-definidos. 15 .10 . mas. quando ocorre uma interrupção por parte de outro dispositivo. Uma resistência como esta. Esta resistência deve ter um valor entre 5 e 10K. o pino MCLR tem que ser ligado através de uma resistência ao lado positivo da alimentação. também pode ser usado. é chamada “resistência de pull up”.Figura 10 .Clock dividido por 4 2. é preciso fazer o reset do microcontrolador. Na prática isto significa que às vezes o microcontrolador pode comportar-se de um modo inadequado em determinadas condições indesejáveis. ou quando se quer que o microcontrolador esteja pronto para executar um programa. pode ser usada. Figura 11 .Reset O reset é usado para colocar o microcontrolador num estado conhecido. De modo a prevenir a ocorrência de um zero lógico acidental no pino MCLR (a linha por cima de MCLR significa o sinal de reset é ativado por nível lógico baixo).Cristal oscilador / Ressonador Cerâmico Qualquer que seja o oscilador que se utilize. correspondentes a uma posição inicial. cuja função é conservar uma determinada linha com nível lógico alto. A frequência de oscilação dividida por 4 também é fornecida no pino OSC2/CLKOUT e. O reset não é usado somente quando o microcontrolador não se comporta da maneira que nós queremos.

Ao contrário dos registros normais.Interrupção 16 . Esta é uma parte muito importante. o microcontrolador continua com o programa principal. são desconhecidos durante o restabelecimento da alimentação. o que faz com que o programa comece a ser executado a partir da primeira instrução deste. os conteúdos destes registros.11 . Geralmente.Reset ligado no +5V (configuração PULL-UP) Durante um reset. os SFRs (registros com funções especiais) são reiniciados com um valor inicial pré-definido. qualquer que seja a tarefa que o microcontrolador esteja executando no momento. os locais de memória da RAM (registros) não são alterados.Figura 12 . porque fornece a ligação entre um microcontrolador e o mundo real que nos rodeia. Figura 13 . Depois de este subprograma ter sido executado. o valor zero (0000).Interrupções As interrupções são um mecanismo que o microcontrolador possui e que torna possível responder a alguns acontecimentos no momento em que eles ocorrem. é introduzir no contador de programa (PC). Um dos mais importantes efeitos de um reset. a partir do local em que o tinha parado. mas mantêm-se inalterados durante qualquer outro reset. 2. enquanto o microcontrolador roda um subprograma que é a rotina de atendimento ou tratamento de interrupção. cada interrupção muda a direção de execução do programa. Ou seja. suspendendo a sua execução.

ocorra. 5. 6 e 7 do porta B. mesmo no caso de elas não serem permitidas. ascendente ou descendente é definida através do bit INTEDG do registro OPTION). o programa deve pôr este bit a ‘0’ bit 3 RBIE (bit de habilitação de interrupção por variação no porta B) Permite que a interrupção por variação dos níveis lógicos nos pinos 4. 5. afim de que a próxima interrupção possa ser detectada. bit 2 T0IF (Flag de interrupção por transborda de TMR0) O contador TMR0.11.Registro especial INTCON bit 0 RBIF (flag que indica variação no porta B) Bit que informa que houve mudança nos níveis lógicos nos pinos 4. ele toma nota de pedidos específicos. 1= o contador mudou a contagem de FFh para 00h 0= o contador não transbordou Para que esta interrupção seja detectada. 17 . alterando o nível lógico de alguns dos seus bits. O subprograma de atendimento desta interrupção.1 . O papel do INTCON é permitir ou impedir as interrupções e. deve repor este bit a ‘0’. 2.O registro que controla as interrupções é chamado INTCON e tem o endereço 0Bh. 1= habilita a interrupção por variação dos níveis lógicos 0= inibe a interrupção por variação dos níveis lógicos A interrupção só pode ocorrer se RBIE e RBIF estiverem simultaneamente a ‘1’ lógico. transbordou. o bit INTF é posto a ‘1’ (o tipo de sensibilidade. 1= pelo menos um destes pinos mudou de nível lógico 0= não ocorreu nenhuma variação nestes pinos bit 1 INTF (flag de interrupção externa INT) Ocorrência de uma interrupção externa 1= ocorreu uma interrupção externa 0= não ocorreu uma interrupção externa Se um impulso ascendente ou descendente for detectado no pino RB0/INT. 6 e 7 do porta B.

serão ignorados. Interrupção em TMR0 causada por transborda do temporizador 3. bit 5 T0IE (bit de habilitação de interrupção por transborda de TMR0) bit que autoriza a interrupção por transborda do contador TMR0. 18 . 1= interrupção autorizada 0= interrupção impedida A interrupção só pode ocorrer se TOIE e TOIF estiverem simultaneamente a ‘1’ lógico. RB5. a interrupção pode ocorrer. 1= interrupção habilitada 0= interrupção inibida Se EEIE e EEIF (que pertence ao registro simultaneamente a ‘1’. EECON1) estiverem bit 7 GIE (bit de habilitação global de interrupção) bit que permite ou impede todas as interrupções 1= todas as interrupções são permitidas 0= todas as interrupções impedidas O PIC16F84 possui quatro fontes de interrupção: 1. todas os pedidos de interrupção pendentes. Quando a instrução que faz GIE= 0 é executada (GIE = 0 impede todas as interrupções). Fim de escrita na EEPROM 2. Um habilita a interrupção e o outro avisa quando a interrupção ocorre. Interrupção externa no pino RB0/INT do microcontrolador De um modo geral.bit 4 INTE (bit de habilitação da interrupção externa INT) bit que permite uma interrupção externa no bit RB0/INT. 4. 1= interrupção externa habilitada 0= interrupção externa impedida A interrupção só pode ocorrer se INTE e INTF estiverem simultaneamente a ‘1’ lógico. Existe um bit comum a todas as interrupções chamado GIE que pode ser usado para impedir ou habilitar todas as interrupções. na EEPROM) bit que habilita uma interrupção quando uma operação de escrita na EEPROM termina. bit 6 EEIE (bit de habilitação de interrupção por escrita completa. de tal maneira que a execução de uma parte crítica do programa não possa ser interrompida. Interrupção por alteração nos pinos RB4. cada fonte de interrupção tem dois bits associados. simultaneamente. RB6 e RB7 do porta B. Este bit é muito útil quando se está escrevendo um programa porque permite que todas as interrupções sejam impedidas durante um período de tempo.

. 4. todas as interrupções permitidas). no contador de programa. deve agora ser zerado. pertencente ao registro OPTION. Trata-se de um contador de 8 bits incrementado internamente pelo ciclo de máquina ou por um sinal externo (borda de subida ou descida). Cabe ao programador resetar o bit “T0IF” na rotina de interrupção. 255. é possível definir o borda ativo do sinal (ascendente ou descendente). o endereço de retorno é guardado na pilha e.. o temporizador é um registro cujo valor está continuamente a ser incrementado a cada ciclo até 255.. 3. o bit “T0IF” do registro “INTCON” é setado. cabe ao programados utilizá-la para executar alguma rotina. Caso o ciclo de máquina seja de 1us. 0. cada incremento do Timer corresponderá a um intervalo de 1us. para que uma nova interrupção possa ser detectada.. senão. ele pode assumir 256 valores distintos (0 até 255). sendo esta opção feita por software durante a programação.. 19 .. O incremento do temporizador é feito em simultâneo com tudo o que o microcontrolador faz.Esquema de funcionamento das Interrupções As interrupções que estão pendentes e que são ignoradas. .Figura 14 . A escolha entre uma destas opções é feita no bit T0CS. Fisicamente. antes do regresso ao programa principal. Quando a interrupção é atendida. o bit que por ter sido posto a ‘1’ permitiu a interrupção. quaisquer interrupções adicionais sejam inibidas. 2. 3.12 . de tal modo que. Além do oscilador de clock do microcontrolador. 1. a rotina de interrupção irá ser automaticamente processada novamente.Contadores (Temporizador TMR0) O PIC possuí internamente um recurso de hardware denominado Timer0. é que a resposta a uma interrupção começa! Depois que a interrupção foi processada. são processadas quando o bit GIE é igual a ‘1’ (GIE= 1. que vai incrementar o valor do temporizador. Sempre que ocorre uma transição de 255 para 0.. o conteúdo do temporizador pode também ser incrementado através de um clock externo ligado ao pino RA4/T0CKI. etc. Se as interrupções estiverem ligadas. chegado a este número. ele começa outra vez de novo: 0. 2. é escrito 0004h – somente depois disto. o bit GIE é zerado. 1. Como o contador possui 8 bits. 2. Se for selecionado o clock externo.

através do registro especial (SFR) chamado OPTION_REG.Caso sejam necessário intervalos de tempos maiores para o mesmo Ciclo de Máquina. Neste caso. utilizamos o recurso de PRE-SCALE. significa que só após 256 pulsos de clock é que o conteúdo do temporizador é incrementado de uma unidade. O maior divisor possível é 256. PS2 0 0 0 0 1 1 1 1 PS1 0 0 1 1 0 0 1 1 PS0 0 1 0 1 0 1 0 1 TMR0 (PSA=0) 1:2 1:4 1:8 1:16 1:32 1:64 1:128 1:256 20 . O PRE-SCALE do Timer0 é configurado durante a programação.

A instrução CLRF escreve a constante 0 no registro ‘f’ e CLRW escreve a constante 0 no registro W. com uma única excepção: uma vez que a subtração é executada como uma adição com um número negativo. Estas últimas instruções. nós temos que escrever o programa que o microcontrolador vai executar. DC e Z. Por outras palavras. Para que um microcontrolador cumpra a sua tarefa. A instrução SWAPF troca o nibble (conjunto de 4 bits) mais significativo com o nibble menos significativo de um registro.1 . ou. 21 . complemento (COMF) e rotações (RLF e RRF).Conjunto de Instruções O microcontrolador não é como qualquer outro circuito integrado. apenas suportam a subtração e a adição. simplicidade de arquitetura e compacidade de código. Quando saem da cadeia de produção. o que não é o caso dos microcontroladores. tal como a grande maioria dos outros microcontroladores. A lógica dentro do PIC tem a capacidade de executar as operações AND. caso em que apenas a flag do zero é afetada) . rodam o conteúdo do registro através desse registro e do flag C de uma casa para a esquerda (na direção do bit 7). O conjunto completo compreende 35 instruções e mostra-se na tabela que se segue. comporta-se inversamente no que diz respeito à subtração. ocorre entre o registro de trabalho (W) e um registro ‘f’ que representa um qualquer local de memória na RAM interna (quer se trate de um registro especial ou de um registro de uso genérico). estão prontos para serem introduzidos nos dispositivos. ou para a direita (na direção do bit 0). 3.2 .Transferência de dados A transferência de dados num microcontrolador. 3. à cópia de um dado do registro W na RAM e à cópia de um dado de um registro da RAM no registro W (ou nele próprio. As primeiras três instruções (observe a tabela seguinte) referem-se à escrita de uma constante no registro W (MOVLW é uma abreviatura para MOVa Literal para W). é posta a ‘1’ se a operação é possível e posta a ‘0’ se um número maior tiver que ser subtraído de outro mais pequeno. nós temos que lhe dizer exatamente o que fazer.Lógicas e aritméticas De todas as operações aritméticas possíveis. Uma razão para este pequeno número de instruções resulta principalmente do fato de estarmos a falar de um microcontrolador RISC cujas instruções foram otimizadas tendo em vista a rapidez de funcionamento. a maioria dos circuitos integrados. O bit que sai do registro é escrito no flag C e o conteúdo anterior deste flag.Capítulo 3 . passando o primeiro a ser o menos significativo e o outro o mais significativo do registro. por outras palavras. são afectados conforme o resultado da adição ou da subtração. os microcontroladores PIC. é escrito no bit situado do lado oposto no registro. EX-OR. o flag C (Carry). OR. O único inconveniente. é que o programador tem que dominar a técnica “desconfortável” de fazer o programa com apenas 35 instruções. Os bits ou flags C.

o CPU primeiro lê o byte completo. ela é executada do seguinte modo.3 . é escrita no registro W uma constante definida pelo operando da instrução. A maior parte das vezes. Também quando a interrupção tem início. adiciona a posição na tabela e que está escrita em W. nós obtemos o endereço real do dado da tabela na memória de programa. escreve o byte completo no mesmo lugar. a constante ‘k2’ estará no registro W. nós chamamos o subprograma que contém a tabela. usando a instrução CALL.Operações sobre bits As instruções BCF e BSF põem a ‘0’ ou a ‘1’ qualquer bit de qualquer posição da memória. exceto que.4 . põe a ‘1’ o bit GIE (habilitação global das interrupções). são membros da tabela. A tabela pode apresentar-se como um subprograma que consiste numa série de instruções ‘RETLW k’ onde as constantes ‘k’. No exemplo anterior. a seguir. altera o valor de um bit e. Não é fornecida uma capacidade automática de armazenamento do registro de estado. Esta instrução. Os saltos condicionais estão sintetizados em duas instruções: BTFSC e BTFSS. somente o valor do contador de programa é posto no cimo da pilha.Direção de execução de um programa As instruções GOTO. A instrução ‘RETLW k’ é idêntica à instrução RETURN. Consoante o estado lógico do bit do registro ‘f’ que está a ser testado. ao regressar de um subprograma. nós vamos ter no registro W o conteúdo do membro da tabela endereçado. Apesar de parecer uma operação simples. após o retorno do subprograma. ao endereço do início da tabela e que está no registro PCL. usamo-las determinando a posição do dado na nossa tabela adicionando-a ao endereço em que a tabela começa e. F RETLW k RETLW k1 RETLW k2 : : RETLW n Nós escrevemos a posição de um membro da nossa tabela no registro W e. A primeira linha do subprograma ‘ADDWF PCL. então. 3. RETFIE (RETurn From Interrupt – Interrupt Enable ou regresso da rotina de interrupção com as interrupções habilitadas) é um regresso da rotina de interrupção e difere de RETURN apenas em que.3. a instrução seguinte no programa é ou não executada. f’. é lido o dado nesse local (que está situado normalmente na memória de programa). Quando regressamos do subprograma. a diferença é que a pilha é independente da RAM interna e é limitada a oito níveis. 22 . automaticamente. Quando a interrupção começa. este bit é automaticamente reposto a ‘0’. MAIN LOOKUP MOVLW 2 CALL LOOKUP ADDWF PCL. permite-nos implementar facilmente listagens (também chamadas tabelas de lookup). assim. CALL e RETURN são executadas do mesmo modo que em todos os outros microcontroladores.

DC. d ADDLW k ADDWF f.(3:0) -> f(3:0). d Descrição Transferência de dados Move literal para W k -> W Move W para f W -> f Move f para W f -> W Limpa W 0 -> W Limpa f 0 -> f Troca os nibbles em f f(7:4). 2 1. 3. k -> W XOR W com f W . k -> W AND W com f W . Nestes casos. Quatro oscilações de clock perfazem um ciclo de instrução. 2 1.(7:4) Lógicas e Aritméticas Adiciona literal a W W + k -> W Adciona f a W W + f -> d Subtrai W de literal k – W -> W Subtrai W de f f – W -> W AND literal com W W .XOR. excepto as instruções de ramificação condicional se a condição for verdadeira. d SUBLW k SUBWF f. Z C. d COMF f. Z C. d RRF f. d RLF f. Z Z Z Z Z Z Z Z Z C C Z 1.6 . 2 1.OR.3. DC. DC. 2 1. 2 1.1 -> d Roda f para a esquerda com o Carry Roda f para a direita com o Carry Complementa f /f -> d Operações com bits Flag CLK 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 Notas Z Z Z 1. 2 1. d IORLW k IORWF f. Se estivermos a usar um oscilador com 4MHz de frequência. f -> d Incrementa f f + 1 -> d Decrementa f f . Z C. 2 C.Período de execução da instrução Todas as instruções são executadas num único ciclo. 2 1. 2 1. no caso de uma ramificação condicional de 2ms. d XORLW k XORWF f. f -> d XOR literal com W W .AND. ou se o conteúdo do contador de programa for alterado pela instrução. k -> W OR W com f W . DC. f -> d OR literal com W W . o tempo normal de execução de uma instrução será de 1ms e. d CLRW CLRF f SWAPF f. 2 1. a execução requer dois ciclos de instrução e o segundo ciclo é executado como sendo um NOP (Nenhuma Operação). 2 23 . d ANDLW k ANDWF f. d INCF f.5 .XOR.OR. d DECF f.Listagem das palavras f qualquer local de memória num microcontrolador W registro de trabalho b posição de bit no registro ‘f’ d registro de destino label grupo de oito caracteres que marca o início de uma parte do programa (rótulo) TOS topo da pilha [] opcional <> grupo de bits num registro Mnemônico MOVLW k MOVWF f MOVF f. 2 2 1.AND.

b BTFSC f. b BTFSS f. *3 Se o PC for modificado ou se resultado do teste for verdadeiro. /PD /TO. /PD *1 Se o porta de entrada/saída for o operando origem. 24 . 1 -> TO. 3 1. d GOTO k CALL k RETURN RETLW k RETFIE NOP CLRWDT SLEEP Bit b de f = 0 Bit b de f = 1 0 -> f(b) 1 -> f(b) Direcionamento de Programa Salte se f(b) = 0 Se f(b) = 0 Salte se f(b) = 1 Se f(b) = 1 Decremente f. salte se 0 Pule para o endereço k k -> PC Chame subrotina PC -> TOC. 2 1. *2 Se esta instrução for executada no registro TMR0 e se d=1. salte se 0 f + 1 -> d. salte se 0 f – 1 -> d. d INCFSZ f. 2. k -> W Retorno de interrupção TOS -> PC. b DECFSZ f. 1 -> PD Entrar no modo 'SLEEP' 0 -> WDT. 2 3 3 1. b BSF f. é lido o estado dos pinos do microcontrolador. 1 -> TO. o prescaler atribuído a esse temporizador é automaticamente limpo. 2.BCF f. a instrução é executada em dois ciclos. 0 -> PD 1 1 1(2) 1(2) 1(2) 1(2) 2 2 2 2 2 1 1 1 1. 3 /TO. salte se 0 Incremente f. 1 -> GIE Outras instruçoes Nenhuma operação Wachtdog = 0 0 -> WDT. k -> PC Retorno de subrotina TOS -> PC Retorno com literal em W TOS -> PC.

necessariamente utilizamos essas instruções fielmente.INC> .Escreve o valor informado no registro W MOVWF TRISA .Capítulo 4 . Quando utilizamos a linguagem de programação em Assembly. list p = pic16f84 . “Isso não é obrigatório”. (ponto e virgula) é ignorado pelo compilador #include <P16F84. Vetor de Reset .Carrega o valor 0 no PC (Program Counter) STATUS.Move o valor de W p/ o registro TRISA para configurar o PINO 1 da PORTA como saída 25 . Vimos anteriormente várias instruções que são utilizadas para programação do microcontrolador. uma analogia seria um computador sem um Sistema Operacional (Windows ou Linux). Abaixo um exemplo de um programa simples que liga um Led conectado na porta RA0 quando pressionamos o botão conectado na porta RB0. isso significa que após cada comando foi informado o que o comando realiza.Tudo que é escrito após o sinal .Carrega o valor 1 no registro RP0 MOVLW B'11111110' . Recomendo que sempre faça o mesmo eu seus programas.carrega a biblioteca do PIC informado ORG BSF 0X00 .  Todas as linhas do programa foram comentadas.Linguagem de Programação em Assembly Quando compramos um Microcontrolador de nada ele serve se não for programado. RP0 . Figura 15 – Diagrama esquemático do exemplo. mas ajudará no seu aprendizado. Esse programa foi escrito no compilador “MPASM™ Assembler” que é incorporado no Proteus ISIS.

pula p/ a Subrotina LIGA_LED PORTA.BCF BCF STATUS. RP0 . ignora a próxima linha) LIGA_LED .Carrega 0 para o primeiro bit da porta A (desligando o LED) REPETE .Volta para a Subrotina REPETE Vantagens e desvantagens da Linguagem Assembly (Baixo Nível):  Maior Eficiência.Volta para a Subrotina REPETE LIGA_LED .0 .  Maior Velocidade de Execução. Se executado.0 .Carrega 1 para o primeiro bit da porta A (ligando o LED) REPETE .Carrega 0 para o primeiro bit da porta A (desligando o LED) REPETE .  Baixa Portabilidade.0 .0 .Subrotina chamada REPETE BTFSS GOTO BCF GOTO PORTB.Carrega o valor 0 no registro RP0 PORTA. 26 .  Alta Complexidade.verifica se o bit 0 da porta B vale 0 (se não vale.Subrotina chamada LIGA_LED BSF GOTO END PORTA.

CCS. Eficiência Considerável. etc. Simular e Compilar programas das famílias 12. Relembrando. utilizamos o próprio Proteus ISIS para escrever o programa. Existe no mercado vários compiladores para desenvolvimento de programas na Linguagem C como Hi-Tech. Agora utilizaremos um compilador chamado “PIC C Compiler”. mas ajudará no seu aprendizado.  Todas as linhas do programa foram comentadas. percebemos que é muito mais simples escrever um programa na Linguagem C. Ele utiliza uma linguagem mais amigável chama “Linguagem C”. isso significa que após cada comando foi informado o que o comando realiza. os comentários devem escrito após as // (barras duplas). Vantagens e desvantagens da Linguagem C (Alto Nível):     Programação Estruturada (funções). Maior Portabilidade. Diferente do compilador Assembly. 27 .. Recomendo que sempre faça o mesmo eu seus programas. “Isso não é obrigatório”. Abaixo será exibido o mesmo exemplo do capítulo anterior. “O exemplo liga um Led conectado na porta RA0 quando pressionamos o botão conectado na porta RB0.Capítulo 5 .. Adotamos para nosso curso esse compilador por ser bastante poderoso e fácil de trabalhar (permite Editar. agora escrito na Linguagem C. 16 e 18 da Microchip) além de também possuir uma vasta biblioteca de controle de periféricos dos Microcontroladores.Linguagem de Programação em C Como vimos anteriormente. PICmicro C. Se compararmos o programa acima com a Linguagem Assembly. Maior velocidade na criação de novos projetos.

Executa o conteúdo caso seja verdadeiro. delay_ms() Atraso no programa em milissegundos.Subtração -. set_tris_X(config) output_bit(pino. o comando é repetido. enable_interrupts(GLOBAL) Ativa a chave geral das interrupções.Comandos da Linguagem C Abaixo uma tabela dos principais comandos. output_high(pino) Coloca o pino indicado em nível lógico alto. while() Enquanto a condição for verdadeira. 5.5.2 .é equivalente a X = X .Operadores lógicos e aritméticos da linguagem C                     + Adição ++ Incremento da variável indicada ( D++ é equivalente a D = D + 1) . estado) if() Configura os pinos da porta X como entrada ou saída.Decremento da variável indicada ( X-. output_low(pino) Coloca o pino indicado em nível lógico baixo.1) Multiplicação / Divisão (parte inteira da divisão para variáveis inteiras) % Resto da divisão (se for divisão de inteiros) ^ Exponencial < Comparador lógico “menor que” > Comparador lógico “maior que” <= Comparador lógico “menor ou igual que” >= Comparador lógico “maior ou igual que” == Comparador lógico “igual a” (*) != Comparador lógico “diferente de” && AND lógico ou relacional (todas as condições verdadeiras) || OR lógico ou relacional (uma das condições é verdadeira) ! NOT lógico ou relacional (vê se a condição é TRUE ou FALSE) & AND binário (bit a bit nas variáveis) | OR binário (bit a bit nas variáveis) ~ NOT binário (inverte o estado de cada bit da variável) 28 . tecla = input(pin_d2) Lê o nível lógico do pino d2 e copia para a Variável “tecla”.1 . Coloca o pino indicado em nível lógico 1 ou 0. Comando de decisão.