Baixe o app para aproveitar ainda mais
Prévia do material em texto
Tendências e Demandas em Automação Industrial Zaqueu Dacoregio Heinzen Tubarão / SC 2013 Sumário Uma breve introdução aos microcontroladores ........................................................................................... 4 Convenções ................................................................................................................................................... 5 Arquitetura interna dos microcontroladores PIC ......................................................................................... 6 Visão geral ................................................................................................................................................. 6 Ports .......................................................................................................................................................... 7 ULA (Unidade lógica e aritmética) ............................................................................................................ 8 Memória de programa .............................................................................................................................. 9 Contador de programa (Program Counter) e pilha de endereços (Stack) .............................................. 10 Registradores .......................................................................................................................................... 12 Registrador Work ou W .......................................................................................................................... 12 Registradores GPR................................................................................................................................... 12 Registradores SFR ................................................................................................................................... 14 STATUS ................................................................................................................................................ 14 OPTION ................................................................................................................................................ 16 Resistores pull-up ................................................................................................................................ 17 TRISA e TRISB ...................................................................................................................................... 19 PORTA e PORTB ................................................................................................................................... 19 Circuito de clock ...................................................................................................................................... 20 Master Clear ............................................................................................................................................ 21 Bits de configuração ................................................................................................................................ 21 Interrupções ............................................................................................................................................ 22 Interrupção externa (INT) ................................................................................................................... 24 Timer 0 (TMR0) ................................................................................................................................... 24 Timer 1 (TMR1) ................................................................................................................................... 24 Timer2 (TMR2) .................................................................................................................................... 26 Módulo CCP (Capture – Compare – PWM) ............................................................................................. 26 Modo PWM ......................................................................................................................................... 27 Memória EEPROM interna ...................................................................................................................... 28 Lista de Exercícios – Módulo 01 .............................................................................................................. 30 Linguagem Assembly................................................................................................................................... 31 Instruções Byte-Oriented ........................................................................................................................ 31 Instruções Bit-Oriented ........................................................................................................................... 33 Instruções Literais e de Controle ............................................................................................................ 34 Instrução SLEEP ................................................................................................................................... 35 Ambiente Integrado de Desenvolvimento MPLAB ................................................................................. 35 Diretiva #INCLUDE ............................................................................................................................... 37 Acesso aos Bits de Configuração ......................................................................................................... 37 Diretiva #DEFINE ................................................................................................................................. 37 Comando ORG ..................................................................................................................................... 38 Comandos CBLOCK e ENDC ................................................................................................................. 38 Comando END ..................................................................................................................................... 39 Comando EQU ..................................................................................................................................... 39 Técnicas de programação em Assembly ................................................................................................. 39 Comparação de valores....................................................................................................................... 39 Atraso (Delay) ..................................................................................................................................... 40 Debounce ............................................................................................................................................ 42 Tratamento de interrupções ............................................................................................................... 42 Timer0 ................................................................................................................................................. 43 Lista de Exercícios – Módulo 02 .............................................................................................................. 45 Linguagem C ................................................................................................................................................ 46 Variáveis .................................................................................................................................................. 47 Operadores .............................................................................................................................................49 Condicionais e laços de repetição ........................................................................................................... 50 Teste condicional if ............................................................................................................................. 50 Teste condicional if/else ..................................................................................................................... 50 Teste condicional switch/case ............................................................................................................ 51 Laço for ................................................................................................................................................ 52 Laço while ............................................................................................................................................ 52 Laço do-while ...................................................................................................................................... 53 Matrizes e vetores .................................................................................................................................. 54 Ponteiros ................................................................................................................................................. 55 Funções ................................................................................................................................................... 55 Protótipos de funções ......................................................................................................................... 56 Passagem de parâmetros e retorno de valores .................................................................................. 57 Interrupções ............................................................................................................................................ 58 Algumas bibliotecas úteis ....................................................................................................................... 58 Display LCD alfanumérico em modo 4 bits ......................................................................................... 59 Envio e recepção de caracteres via protocolo RS-232 ........................................................................ 60 Conversão A/D .................................................................................................................................... 61 Módulo PWM ...................................................................................................................................... 62 Elaborando um projeto no compilador MikroC ...................................................................................... 63 Lista de Exercícios – Módulo 03 .............................................................................................................. 67 Referências bibliográficas ........................................................................................................................... 68 Prof. Zaqueu Dacoregio Heinzen SENAI/SC Tendências e Demandas em Automação Industrial 4 Uma breve introdução aos microcontroladores A eletrônica digital foi a responsável pela modernização dos equipamentos utilizados em vários segmentos tecnológicos: aeroespacial, automobilístico, industrial, etc. As técnicas de construção de circuitos integrados possibilitaram que lógicas complexas de controle fossem realizadas por chips menores que um grão de arroz. Durante os anos setenta, surgiram os primeiros microprocessadores, capazes de realizar operações lógicas combinacionais e sequenciais de forma totalmente programável. Um microprocessador, neste caso, consistia em uma ULA (unidade lógica e aritmética) programável. O fabricante do equipamento integrava ao microprocessador uma memória de programa que indicava quais operações deveriam ser realizadas em determinada sequência, e uma memória de dados onde os resultados das operações eram armazenados. Já os microcontroladores foram desenvolvidos para conter, além da ULA, outros periféricos: memória EEPROM integrada, memória de programa, leitura de valores analógicos de tensão, módulos de comunicação de protocolos diversos (RS-232, SPI, I²C e mais recentemente USB e Ethernet), módulos de temporização e PWM (modulação por largura de pulso), tudo isto em uma única pastilha ou chip. Entre os diversos fabricantes de microcontroladores, destacam-se a Intel (fabricante dos famosos 8051), Microchip, Texas Instruments, Atmel (e a sua consagrada linha AVR). A linha PIC, da Microchip, por sua versatilidade, baixo custo e conjunto reduzido de instruções – fator este que facilita o aprendizado – foi a escolhida para este curso de microcontroladores. Conhecer o microcontrolador em seus mais diversos aspectos como tensões de alimentação, arquitetura interna, periféricos e a programação, é uma tarefa que demanda tempo e estudo. É essencial, porém, que o técnico em automação conheça estes dispositivos eletrônicos, pois podem ser utilizados na grande maioria dos projetos com redução considerável de custo quando comparado ao uso de tecnologias mais robustas, como os Controladores Lógico Programáveis e os Controladores de Processo universais. O requisito fundamental para o sucesso nesta disciplina é o estudo da eletrônica digital, pois os microcontroladores nada mais são do que circuitos digitais sequenciais e combinacionais programáveis. Outras áreas de conhecimento, como eletrônica analógica e lógica de programação, serão necessárias no decorrer do curso, por isso é importante que o leitor busque literaturas especializadas nestas áreas (No final desta apostila encontram-se as referências bibliográficas que podem ser consultadas). Bons estudos! Prof. Zaqueu Dacoregio Heinzen SENAI/SC Tendências e Demandas em Automação Industrial 5 Convenções Nesta apostila, números binários são representados nas instruções pelo prefixo b’ ou 0b, números hexadecimais pelo prefixo 0x e números decimais com prefixo d’. Caso um número não possua prefixo, subentende-se que o mesmo seja de base decimal. Termos em inglês ou termos técnicos são apresentados com estilo itálico. Subentende-se que o leitor esteja habituado às conversões de números binários em hexadecimais e/ou decimais e vice-versa. Maiores informações podem ser encontradas na bibliografia ao final do livro. Os softwares recomendados para confecção dos programas são o ambiente integrado de desenvolvimento MPLAB IDE (versão 8.73 ou superior) da Microchip®, e o compilador MikroC (versão 5.01 ou superior) do fabricante MikroElektronika®. Pode-se ainda utilizar o software ISIS, do pacote Proteus para a simulação dos exemplos. O leitor pode optar ainda pela utilização do ambiente integrado de desenvolvimento MPLABX, que pode ser utilizado em dispositivos que suportem aplicativos Java. Neste último caso, a interface gráfica é ligeiramente diferente da versão convencional do MPLAB IDE, mas os programas que podem ser desenvolvidos são idênticos para ambas as versões. As instruções e trechos de código estão formatados com letra COURIER NEW. O número que precede cada instrução indica a linha de código para facilitar a leitura. Os comentários nos trechos de código assembly são identificados pelo ponto-e-vírgula (;) e comentários no compilador MikroC são precedidos por duas barras (//). Alguns estudantes podem sentir-se mais à vontade utilizando o compilador PCW, da fabricante CCS. Em sua versão paga este compilador é muito poderoso e de fácil utilização. No entanto, devido às limitações severas da versão gratuita, foi preferida a utilização do compilador MikroC, para queo estudante possa ter acesso mais amplo em seu computador pessoal, incentivando o auto aprendizado. O livro PIC – Programação em C, do autor Fabio Pereira, é indicado para aqueles que optarem pela utilização do compilador PCW. Esta apostila está dividida em três módulos. Para cada módulo existe uma lista de exercícios, para que o aluno possa assimilar de maneira mais concisa os assuntos discutidos no decorrer dos módulos. O primeiro módulo é dedicado à arquitetura interna dos microcontroladores PIC da linha 16F. Destacam-se neste módulo as noções básicas necessárias para o entendimento posterior do raciocínio lógico que envolve os programas. O segundo módulo envolve a linguagem Assembly, sua estrutura, a criação de pequenos programas e eventuais pormenores da arquitetura que são evidenciadas durante a fase de criação do programa do microcontrolador. O terceiro módulo apresenta a linguagem C através do compilador MikroC, possibilitando ao aluno a criação de projetos muito mais complexos em um tempo muito menor do que se fossem feitos utilizando-se a linguagem Assembly. Prof. Zaqueu Dacoregio Heinzen SENAI/SC Tendências e Demandas em Automação Industrial 6 Arquitetura interna dos microcontroladores PIC Visão geral Os microcontroladores PIC são dispositivos digitais programáveis, com níveis de tensão TTL (0 a 5V). Assim como qualquer microcontrolador, os PICs são compostos por ao menos um banco de memória de programa, uma unidade de processamento e pinos de entrada e saída, além de periféricos como comparadores, USART 1 , memória EEPROM, entre outros. Vamos ver como estes blocos estão organizados dentro de um PIC muito famoso, o PIC16F628A: Figura 1 – Arquitetura interna do microcontrolador PIC16F628A Fonte: Microchip (2007) 1 Sigla para Universal Synchronous/Assynchronous Receiver and Transmitter Prof. Zaqueu Dacoregio Heinzen SENAI/SC Tendências e Demandas em Automação Industrial 7 A princípio, este diagrama parece muito complicado, certo? Mas lembre-se: só podemos utilizar da melhor maneira possível um dispositivo quando conhecemos a fundo o seu funcionamento! Ports Os ports são os grupos de pinos de entrada e saída. Nos microcontroladores PIC da série 16F, são comumente denominados como PORTx, sendo que x é uma letra que vai de A até E em alguns modelos. O microcontrolador PIC16F628A conta com o PORTA e o PORTB. Figura 2 – Pinos do microcontrolador PIC16F628A Fonte: Microchip (2007) Como você pode ver na figura 2, que demonstra os pinos físicos do microcontrolador PIC16F628A, os pinos são identificados da seguinte maneira: Port Número do pino Sigla do pino PORTA 17 RA0/AN0 18 RA1/AN1 1 RA2/AN2/Vref 2 RA3/AN3/CMP1 3 RA4/T0CKI/CMP2 4 _________________ RA5/MCLR/Vpp 15 RA6/OSC2/CLKOUT 16 RA7/OSC1/CLKIN PORTB 6 RB0/INT 7 RB1/RX/DT 8 RB2/TX/CK 9 RB3/CCP1 10 RB4/PGM 11 RB5 12 RB6/T1OSO/T1CKI/PGCC 13 RB7/T1OSI/PGD Prof. Zaqueu Dacoregio Heinzen SENAI/SC Tendências e Demandas em Automação Industrial 8 ULA (Unidade lógica e aritmética) Em circuitos digitais combinacionais, desejamos que a(s) saída(s) tenham determinado valor a partir do valor de sua(s) entrada(s). Vamos voltar a um nível de abstração bem baixo: a já conhecida porta E. Como você sabe, a porta E (cujo símbolo está representado na figura 3) realiza a operação matemática booleana S = A.B, ou seja, a saída só terá nível lógico “alto” quando as duas entradas possuírem nível lógico “alto”, caso contrário, a saída terá nível lógico “baixo”. A tabela verdade desta porta lógica está representada na figura 4. Figura 3 – Porta E Fonte: Elaboração do autor (2012) Geralmente, as operações em circuitos digitais são muito mais complexas do que uma simples porta E. Por exemplo, determinado circuito pode servir para somar duas variáveis de oito bits e apresentar o resultado na saída, junto com o “carry-out”. Se você não entendeu alguma parte da frase anterior, é hora de pegar um livro ou apostila de eletrônica digital novamente! Algumas sugestões estão relacionadas nas referências bibliográficas, ao final desta apostila. Como você deve imaginar, para compor estes circuitos mais complexos são utilizadas várias portas lógicas em conjunto. Figura 4 – Tabela verdade da porta lógica E A B S = A.B 0 0 0 0 1 0 1 0 0 1 1 1 Fonte: Elaboração do autor (2012) Uma ULA, no entanto, vai muito além de um somador! Esta unidade é o “cérebro” do microcontrolador. Ela recebe duas variáveis e realiza uma operação lógica (E, OU, XOR, etc) ou aritmética (soma, incremento, decremento, etc) – daí o seu nome – sendo que esta operação é selecionada pelo usuário em uma terceira variável de entrada. Mas como o microcontrolador recebe as variáveis de entrada e a operação a ser realizada? E em que endereço o resultado será armazenado? Esta é a tarefa da memória de programa. Prof. Zaqueu Dacoregio Heinzen SENAI/SC Tendências e Demandas em Automação Industrial 9 Memória de programa Quando queremos realizar uma operação qualquer, necessitamos saber qual será a operação, quais serão os dados de entrada e onde será armazenado o resultado. Em um microcontrolador, estas informações são armazenadas sequencialmente na memória de programa (Flash Program Memory, no diagrama). Este banco de memória, nos PICs da série 16F, possui vários endereços de 14 bits cada, sendo que até seis destes bits representam a operação a ser realizada. A partir de agora, nos referenciaremos às operações como instruções do microcontrolador. Ou seja, no máximo seis dos catorze bits de cada endereço de memória de programa referem-se à instrução que o microcontrolador irá realizar. Isto nos dá um total de 64 instruções possíveis! Na realidade, o conjunto de instruções dos microcontroladores PIC da série 16 é de 35 instruções, no total. Esta é a chamada tecnologia RISC (Reduced Instruction Set Computing), onde o fabricante minimiza o número total de operações que podem ser realizadas pelo microcontrolador. Este tipo de tecnologia facilita o aprendizado, pois o programador só necessita conhecer 35 instruções para construir seu programa. Por outro lado, qualquer operação mais complexa (como uma multiplicação, por exemplo) deve ser desenvolvida pelo programador a partir das instruções nativas. Outra tecnologia utilizada pelos fabricantes é a CISC (Complex Instruction Set Computing), que utiliza várias (tipicamente mais de cem) instruções. A desvantagem óbvia é que o programador deverá recorrer a uma tabela enorme com várias instruções disponíveis para fazer a mais simples operação, no entanto geralmente com um conjunto mais complexo de instruções é possível realizar instruções diversas sem “montá-las”, como multiplicação, divisão e até mesmo raiz quadrada ou exponenciação. A figura 4 mostra como cada valor do banco de memória de programa é utilizado. Note que existem instruções do tipo Byte Oriented, Bit Oriented e do tipo Literal/Control. Não se preocupe, quando estudarmos cada instrução veremos o que significam estes termos. Figura 5 – Instrução em um PIC da série 16 Fonte: Microchip (2007) Prof. Zaqueu Dacoregio Heinzen SENAI/SC Tendências e Demandas em Automação Industrial 10 Bom, agora que você já sabe o que é uma instrução, vamos esclarecer uma das principais características de um microcontrolador. Sempre que nos referimos a microcontroladores, dizemos que os mesmos são circuitos programáveis sequenciais. Ou seja, existe uma lista de instruções que sãorealizadas de forma sequencial pela ULA. A sequência desta lista é o próprio banco de memória do microcontrolador! No caso dos PICs da série 16, precisamos conhecer dois endereços de memória importantes. O primeiro é o endereço 0x0000, que é chamado também de vetor de reset. Quando o microcontrolador é inicializado ou reiniciado, é neste endereço que o programa irá iniciar. Poderíamos começar nosso programa sempre a partir deste endereço sem nos preocuparmos com os próximos endereços, se não fosse um pequeno detalhe: no endereço 0x0004 está localizado o vetor de interrupção. Uma interrupção, como o próprio nome diz, é uma parada abrupta no programa principal. As interrupções, claro, são programáveis, e são importantíssimas nos microcontroladores. São elas as responsáveis, por exemplo, por informar que uma conversão A/D terminou, ou que um pino teve seu estado alterado. Podemos entender, então, que uma interrupção é um evento que pode acontecer a qualquer instante no programa. Sempre que uma interrupção ocorre, o programa é desviado para o endereço 0x0004. Portanto, uma prática comum é inserir uma instrução de desvio logo no primeiro endereço de programa. Veremos como fazer isso mais adiante. Um dos principais parâmetros de um microcontrolador é a sua memória de programa, ou seja, a sua capacidade de armazenar instruções. Em um computador, estas instruções são armazenadas no disco rígido, portanto, jamais nos preocuparemos se o programa que estamos escrevendo irá ocupar 1000 instruções ou 200 instruções. Na verdade, os computadores modernos suportam programas com vários milhões de instruções! Quando nos deparamos com microcontroladores, a realidade é outra. Por exemplo, o microcontrolador PIC16F84A (modelo já obsoleto) possuía capacidade para armazenar somente 1024 palavras (1K) de programa. O já citado PIC16F628A possui capacidade para 2048 (2K) instruções, e alguns PICs mais modernos já atingiram a casa das centenas de milhares de instruções. Na maioria dos programas, principalmente se tratando de aplicações industriais simples como aquisição e envio de dados de sensores, pequenas lógicas de controle e apresentação de valores em displays, 1024 instruções são mais que suficientes. No PIC16F628A, a memória de programa vai do endereço 0x0000 até o endereço 0x07FF (em decimal, 0 a 2047). No PIC16F877A, outro microcontrolador “padrão” da série 16, os endereços iniciam em 0x0000 e vão até o endereço 0x1FFF (em decimal, 0 a 8191, totalizando 8192 instruções ou 8K). Estas informações encontram-se no datasheet do componente, ferramenta essencial para quem trabalha com eletrônica, seja digital ou analógica. Para este curso, você irá precisar dos seguintes datasheets: PIC16F877A, PIC16F628A e PIC12F675, todos disponíveis no site do fabricante (Microchip). Contador de programa (Program Counter) e pilha de endereços (Stack) O responsável por fazer o controle do endereço de programa é o Program Counter (contador de programa - PC). Este dispositivo incrementa o endereço de programa a cada quatro pulsos de clock. Supondo então um clock de 8Mhz, teremos duas instruções processadas a cada microssegundo. Com 4Mhz, teremos uma instrução a cada microssegundo, e assim por diante. O clock máximo suportado Prof. Zaqueu Dacoregio Heinzen SENAI/SC Tendências e Demandas em Automação Industrial 11 pelos PICs 16F628A, 16F877A e PIC12F675 é de 20Mhz, o que nos dá um máximo de cinco instruções por microssegundo. Um mecanismo interessante presente nos microcontroladores é a pilha de endereços (Stack). Quando o programa é desviado por algum motivo (uma interrupção, por exemplo), o microcontrolador se encarrega de salvar o endereço onde estava na pilha de endereços, para que ao término do evento de desvio ele continue de onde parou. Os microcontroladores PIC 16F não possuem uma pilha muito poderosa: podemos armazenar somente oito endereços, ou seja, não podemos fazer muitos “desvios em um desvio”, correndo o risco de retornar a um endereço totalmente equivocado, causando travamento ou alterando todo o sentido do programa. Figura 6 – Program Counter, Stack e banco de memória do PIC16F628A Fonte: Microchip (2007) Outros microcontroladores mais recentes, como os PIC18F por exemplo, possuem uma pilha com mais de trinta endereços consecutivos, aumentando consideravelmente a capacidade de fazer desvios de programas e retornar para onde estava. Em aplicações comuns não é necessário utilizar mais que um ou dois desvios consecutivos, portanto não precisamos nos preocupar muito com o tamanho da pilha. De fato, a maioria dos problemas com a pilha provém de erros na programação! Bom, você já sabe agora como o microcontrolador processa seus dados: a lista de instruções que ele irá obedecer é a memória de programa, onde estão armazenadas várias palavras em sequência. Cada palavra é composta pela instrução e por um ou mais dados de entrada, que são devidamente processadas pela ULA e apresentados na sua saída. Mas onde se localizam os valores a serem processados? E onde o resultado da ULA é armazenado? Bem, este é o papel dos registradores, e este é talvez um dos assuntos mais importantes tratando-se de microcontroladores. Você verá que a capacidade de fazer um programa com várias funcionalidades dependerá diretamente da sua capacidade de identificar e utilizar os registradores corretos. Prof. Zaqueu Dacoregio Heinzen SENAI/SC Tendências e Demandas em Automação Industrial 12 Registradores Os registradores são endereços específicos do microcontrolador destinados a memorizar dados temporários. É a famosa memória RAM do programa, onde valores são gravados a qualquer instante e se perdem após o desligamento ou reinicialização do microcontrolador. Existem três tipos distintos de registradores: o registrador Work, os registradores SFR (Specific Function Registers – Registradores de Funções Específicas) e GPR (General Purpose Registers – Registradores de propósito geral). Registrador Work ou W Este registrador também é conhecido como acumulador. Ele não possui um endereço acessível ao programador, mas é utilizado constantemente. Ele serve como dado de entrada de boa parte das instruções do microcontrolador PIC. Embora o nome não seja idêntico em outras marcas e modelos, todo microcontrolador apresenta um registrador semelhante, que é capaz de armazenar o último resultado da ULA ou outro valor temporariamente. Vamos a um exemplo bem prático: a instrução MOVLW. Decompondo esta instrução, intuitivamente veremos o que ela quer dizer: MOVer um Literal para Work. Ou seja, iremos mover um número qualquer, como por exemplo, 15, para o registrador Work. Você deve estar se perguntando: Por que isto é necessário? Bem, basta olhar no conjunto de instruções do PIC16F628A para perceber que boa parte das instruções mais complexas deve trabalhar com o registrador Work como dado de entrada. Por exemplo, se quisermos realizar uma soma, só existem dois comandos disponíveis: ADDWF e ADDLW. As duas realizam uma soma do registrador Work com outro registrador e com uma literal, respectivamente. Na verdade, você pode observar na figura 1 que o W-REG está sempre presente como dado de entrada da ULA. Este método agiliza o processamento da operação, pois só é necessário buscar um valor para colocar na ULA, o outro está sempre disponível. Alguns PICs mais recentes possuem uma instrução para somar dois registradores, mas o que esta instrução faz é na verdade as operações MOVWF e ADDWF consecutivamente, ou seja, na arquitetura dos PICs o registrador Work está sempre presente. Podemos inserir qualquer valor entre 0 a 255 neste registrador, e o valor fica salvo até que algumaoutra operação faça uso do mesmo ou aconteça reset do microcontrolador. Registradores GPR Os registradores GPR são endereços de memória RAM que podem ser utilizados pelo usuário para armazenar qualquer valor. Como a memória RAM é uma memória volátil, os valores armazenados nestes registradores são perdidos sempre que há reset no microcontrolador. Por exemplo, pode ser útil armazenar temporariamente a quantidade de peças que passaram por uma esteira e parar o processo caso a quantidade tenha superado o valor pré-ajustado. Nos microcontroladores PIC16F628A, os endereços 0x20 a 0x7F, 0xA0 a 0xFF e 0x120 a 0x17F são destinados aos registradores do tipo GPR – observe-os na figura 7. Prof. Zaqueu Dacoregio Heinzen SENAI/SC Tendências e Demandas em Automação Industrial 13 Figura 7 – Mapa de registradores do PIC16F628A Fonte: Microchip (2007) Prof. Zaqueu Dacoregio Heinzen SENAI/SC Tendências e Demandas em Automação Industrial 14 ATENÇÃO Há um conceito muito importante a ser explicado agora que você já visualizou o mapa de memória do PIC16F628A: Ele é dividido em quatro bancos de memória. Isto é necessário porque dispomos apenas de sete bits na instrução para referenciar o endereço dos registradores que serão utilizados como dado de entrada ou saída para a operação. Então, é necessário dividir a memória total em vários bancos para que o microcontrolador possa ter acesso a todos os endereços. Registradores SFR Os registradores SFR são utilizados para armazenar valores temporários que resultaram de alguma operação, interrupção ou outra função, ou como dado de entrada das mesmas. O estudo dos SFRs é muito importante, pois são eles que controlam, por exemplo, os valores dos pinos de entrada e saída dos microcontroladores, o valor a ser enviado pelo protocolo RS-232, o resultado de uma conversão A/D, o dado resultante de uma leitura na EEPROM, a configuração de um timer, etc. Vamos estudar agora os registradores mais relevantes. Os outros serão estudados no decorrer da apostila, quando for necessário. STATUS Este registrador, localizado no terceiro endereço físico de todos os bancos, recebe informações a respeito do estado do microcontrolador. Vamos verificar os bits que compõem o mesmo: Figura 8 – Registrador STATUS Fonte: Microchip (2007) Antes de continuarmos, é interessante aprender o que significa cada símbolo na figura acima. Na parte superior, podemos verificar duas informações: cada bit pode ser somente leitura (R) ou então leitura/escrita (R/W). O valor seguinte é o estado que o bit assume quando ocorre um reset. O valor “0” indica nível baixo, “1” indica nível alto e “x” indica que o valor é desconhecido. De fato, o microcontrolador “força” os valores de alguns bits de registradores que são importantes para determinadas funções na inicialização. Na parte inferior, podemos notar que lendo da esquerda para a direita iremos começar do sétimo bit (ou bit mais significativo – MSB) até o bit zero (ou bit menos significativo – LSB). É na parte central, portanto, que os bits são identificados conforme as suas funções. Conforme a figura 8, temos então os seguintes bits: Prof. Zaqueu Dacoregio Heinzen SENAI/SC Tendências e Demandas em Automação Industrial 15 Bit 7 IRP – bit de seleção de banco de memória (para endereçamento indireto) 1 = Bancos 2 e 3 (0x100 a 0x1FF) 0 = Bancos 0 e 1 (0x000 a 0x0FF) Bit 6-5 RP<1:0> - bit de seleção de banco de memória (para endereçamento direto) 00 = Banco 0 (0x00 a 0x7F) 01 = Banco 1 (0x80 a 0xFF) 10 = Banco 2 (0x100 a 0x17F) 11 = Banco 3 (0x180 a 0x1FF) Bit 4 ________ TO = bit de Time-Out 1 = Após a inicialização, instrução CLRWDT ou SLEEP 0 = Ocorreu um estouro de Watch-Dog Timer Bit 3 ________ PD = bit de Power-Down 1 = Após a energização ou a instrução CLRWDT 0 = Execução da instrução SLEEP Bit 2 Z = bit de resultado Zero 1 = O resultado de uma operação lógica ou aritmética foi zero 0 = O resultado de uma operação lógica ou aritmética foi diferente de zero Bit 1 __________________ DC = bit de Digit Carry/Borrow (instruções ADDWF, ADDLW, SUBLW, SUBWF) 1 = Ocorreu carry-out do quarto bit do resultado 0 = Não ocorreu carry-out do quarto bit do resultado Bit 0 __________________ DC = bit de Carry/Borrow (instruções ADDWF, ADDLW, SUBLW, SUBWF) 1 = Ocorreu carry-out do bit mais significativo 0 = Não ocorreu carry-out do bit mais significativo Vamos analisa-los, um por um. Primeiro, temos o bit IRP, utilizado para selecionar o banco de endereçamento indireto. O endereçamento indireto funciona da seguinte maneira: ao invés de acessar o valor de um endereço do registrador de destino, escrevemos este endereço em um registrador denominado FSR (File Select Register – não confundir com SFR!), e podemos ler ou escrever o valor do mesmo através de um segundo registrador denominado INDF. O endereçamento indireto facilita, por exemplo, a limpeza de vários endereços através de um loop de repetição. Veremos esta aplicação mais à frente. Em seguida, temos os dois bits que servem para escolher o banco de memória. Como você já sabe, temos que indicar o banco de memória em que se encontra o registrador que queremos acessar. Para fazer a seleção do banco, utilizamos os bits 6 e 5. O bit 4 (Time-out) indica se houve estouro de Watch-Dog Timer. Note que este bit é barrado, ou seja, se o mesmo possuir o valor “zero” então houve estouro. Nível alto neste bit indica que o reset foi causado pela inicialização normal, ou por uma instrução de limpeza de Watch-Dog Timer (CLRWDT) ou entrada em modo de espera (SLEEP). O terceiro bit indica que a última inicialização ocorreu normalmente (nível alto) ou antes da inicialização ocorreu uma instrução para a entrada em modo de espera (SLEEP). Os dois últimos bits são somente de leitura, ou seja, podemos apenas ler seus valores, mas não podemos modifica-los. Note também que este bit é barrado. Prof. Zaqueu Dacoregio Heinzen SENAI/SC Tendências e Demandas em Automação Industrial 16 O bit de Zero é uma ferramenta muito útil, como veremos mais à frente. Sua função é intuitiva: caso o resultado da última operação aritmética ou lógica foi igual à zero, então este bit entra em nível alto. Caso contrário, é forçado a nível baixo. O bit de Digit Carry-Out é forçado para nível alto caso o resultado de alguma das instruções ADDWF, ADDLW, SUBLW, SUBWF tenha um resultado maior que quatro bits. Por exemplo, ao somarmos o valor b’00000001’ com o valor b’00001111’, o resultado será b’00010000’. Neste caso o bit DC será levado a nível alto. O bit de Carry-Out é semelhante ao bit anterior, no entanto o mesmo funciona caso o resultado de uma operação for maior que oito bits. Desta forma, podemos literalmente trabalhar com variáveis de nove bits! Por exemplo, ao somar o valor b’11111111’ com o valor b’00000001’, o resultado seria b’111111111’, mas como só é possível armazenar oito bits, o nono bit é o próprio bit de Carry-Out. OPTION Este registrador é responsável pelas principais configurações do microcontrolador. Figura 9 – Registrador OPTION Fonte: Microchip (2007) Bit 7 ______________ RPBU = bit de habilitação dos resistores de pull-up do PORTB 1 = Resistores de pull-up internos desabilitados 0 = Resistores de pull-up internos habilitados Bit 6 INTEDG = bit de seleção de nível de borda de interrupção 0 = Interrupção nopino RB0/INT na borda de subida 1 = Interrupção no pino RB0/INT na borda de descida Bit 5 T0CS = bit de seleção de fonte de clock do Timer0 1 = Transição de clock no pino RA4/T0CKI/CMP2 0 = Clock interno Bit 4 T0SE = bit de seleção de nível de borda do clock do Timer0 1 = Incremento na descida de clock no pino RA4/T0CKI/CMP2 0 = Incremento na subida de clock no pino RA4/T0CKI/CMP2 Bit 3 PSA = bit de configuração de Prescaler 1 = Prescaler ligado ao Watch-Dog Timer 0 = Prescaler ligado ao Timer0 Bit 2-0 PS<2:0> = bits de seleção do valor do Prescaler Fonte: Microchip (2007) Prof. Zaqueu Dacoregio Heinzen SENAI/SC Tendências e Demandas em Automação Industrial 17 Resistores pull-up Conforme você aprendeu na disciplina de Eletrônica Digital, se utilizarmos uma chave mecânica (seja uma chave táctil, um fim de curso, etc) devemos colocar em paralelo com o pino de entrada do circuito integrado um resistor para “forçar” nível baixo ou nível alto quando a chave estiver aberta. Chamamos este resistor de pull-up quando o resistor está ligado ao nível alto e pull-down quando está ligado ao nível baixo. Figura 10 – Configurações Pull-Down e Pull-Up Configuração Pull-Down Configuração Pull-Up Fonte: Elaboração do Autor (2012) Para ilustrar estes conceitos, atente-se à figura 10. Note que, no caso da utilização do circuito de pull-up (b) quando a chave está fechada o pino S2 é forçado a nível baixo, e quando ela está aberta o mesmo pino é forçado a nível alto pelo resistor R1. Já no caso do pull-down (a), quando a chave está fechada o pino S2 é forçado a nível alto, e quando ela está aberta o mesmo pino é conectado ao 0V pelo resistor R1, forçando-o a nível baixo. Embora a ideia do resistor de pull-down seja mais natural (nível alto com chave pressionada e nível baixo com chave aberta), na grande maioria dos casos utiliza-se o circuito de pull-up. Isto é necessário porque normalmente os botões e chaves localizam-se a uma distância considerável do pino de entrada, muitas vezes conectadas através de fios, e o pino fica sujeito às interferências captadas no decorrer do caminho – ruídos eletromagnéticos advindos de motores, circuitos de potência e até mesmo de outros circuitos eletrônicos próximos. No caso da utilização dos resistores de pull-down, o ruído é adicionado ao 0V, o que pode fazer com que o circuito interprete que há nível alto na entrada. No caso do pull-up, o ruído é adicionado aos 5V, sendo que não há diferença para o microcontrolador pois o nível continua sendo alto com ou sem ruído. A desvantagem é que haverá uma queda de tensão caso a distância seja muito elevada, mas isto pode ser contornado utilizando-se acopladores ópticos. As duas situações estão ilustradas na figura 11. Prof. Zaqueu Dacoregio Heinzen SENAI/SC Tendências e Demandas em Automação Industrial 18 Figura 11 – Diferença, com relação ao ruído, entre as configurações pull-up e pull-down a) Configuração pull-down – Note que durante alguns instantes de tempo o ruído faz com que o microcontrolador detecte nível alto. b) Configuração pull-up – Note que o ruído não faz com que o nível deixe de ser alto. Fonte: Elaboração do autor (2012) Alguns microcontroladores PIC possuem internamente resistores de pull-up, que podem ser habilitados de maneira individual ou então em grupo. No caso do PIC16F628A, somente é possível habilitar todos os resistores de pull-up do PORTB ao mesmo tempo. Estes resistores funcionam somente quando configuramos o pino como entrada. Portanto, se habilitarmos os resistores de pull-up do PORTB mas somente um dos pinos tiver a função de entrada, então o resistor de pull-up funcionará somente neste pino. Quando utilizamos o resistor de pull-up interno, basta ligar a chave até o nível baixo (0V). Lembre-se que a lógica será inversa: nível alto para chave aberta, nível baixo para chave fechada. Figura 12 – Ligação de chave táctil com resistor de pull-up interno no pino RB0 Fonte: Elaboração do autor (2012) Fonte de ruído Prof. Zaqueu Dacoregio Heinzen SENAI/SC Tendências e Demandas em Automação Industrial 19 Caso você queira habilitar os resistores de pull-up internos, o sétimo bit do registrador OPTION deve estar desligado. Após uma reinicialização, o estado normal destes resistores é desligado. O registrador OPTION conta ainda com outros bits de configuração, que serão estudados nas seções de interrupções e Watch-Dog Timer. TRISA e TRISB Podemos configurar um pino do microcontrolador para funcionar como entrada ou como saída. O registrador responsável por esta configuração é o TRISx, sendo que “x” é a letra que representa o Port. Por exemplo, no PORTA o registrador responsável pelo controle da configuração é o TRISA, e assim por diante. Cada bit colocado em nível alto significa que o pino relacionado a este bit funciona como uma entrada, e em nível baixo funciona como uma saída. Uma dica para lembrar-se sempre do funcionamento do registrador TRIS é lembrar que “0” (nível baixo) é equivalente à letra inicial de output (saída), e “1” (nível alto) é equivalente à letra inicial de input (entrada). Figura 13 – Registradores TRISA e TRISB Fonte: Microchip (2007) Note na figura 13 que o registrador TRISA possui os bits TRISA7 até TRISA0, e por padrão todos eles estão em nível alto, ou seja, todos estão configurados como entrada. ATENÇÃO Quando configurado como saída, a corrente máxima de saída/entrada em cada pino é de 20mA. Quando configurado como entrada, deve-se tomar cuidado com o valor de possíveis resistores de pull-up ou pull- down externos, pois um valor muito baixo implica em uma alta corrente de entrada, e um valor muito alto implica em uma redução na tensão efetivamente aplicada ao pino. Normalmente utiliza-se um resistor de 10k como pull-up ou pull-down externo. PORTA e PORTB Os registradores relacionados aos Ports estão relacionados tanto à escrita – quando configurado como saída – quanto à leitura dos valores. Assim como nos registradores TRIS, existem bits individuais para cada pino. Figura 14 – Registradores PORTA e PORTB Fonte: Microchip (2007) Falando em entrada e saída, devemos ter em mãos o datasheet do componente para identificar as funções individuais de cada pino. Normalmente, tratando-se de microcontroladores, os pinos são multiplexados e possuem várias funções selecionáveis. Por exemplo: o pino RA0/AN0 possui as funções de entrada e saída digital e também pode servir como entrada para o comparador interno; o pino RB0 Prof. Zaqueu Dacoregio Heinzen SENAI/SC Tendências e Demandas em Automação Industrial 20 funciona como entrada e saída digital e também serve como pino de entrada para a interrupção externa; o pino RB1/RX/DT serve como entrada e saída digital e também serve como pino de recepção da USART ou entrada de dados de comunicação síncrona. Todas estas funções estão relacionadas no datasheet e variam de microcontrolador para microcontrolador, portanto não é necessário decorá-los. No entanto, é fundamental entender o propósito de cada função de cada pino. ATENÇÃO O pino RA5 do PIC16F628A só pode ser utilizado como entrada, e o pino RA4 do mesmo microcontrolador possui saída do tipo dreno aberto (somente liga o pino ao nível baixo, diferente dos outros tipos que possuem configuração do tipo totem-pole, possibilitando a saída tanto em nível alto quanto em nível baixo). Circuito de clock Os microcontroladores trabalham com listas de instruções, que são armazenadas na memória de programa eprocessadas pela unidade lógica e aritmética. O program counter é responsável por, sequencialmente, buscar a instrução na memória de programa e enviá-la para a ULA para ser processada. Esta busca é sincronizada pelo mecanismo de clock (relógio), que pode ser externo ou interno ao microcontrolador. Lembre-se que o tempo de cada instrução é o valor do clock/4. No caso do microcontrolador PIC16F628A, o mesmo pode utilizar tanto o clock interno de 4Mhz quanto um circuito externo de clock. Temos que nos atentar ao fato de que alguns microcontroladores, como o PIC16F877A, não possuem circuito de clock interno. Em aplicações em que funções de temporização devem ser muito precisas, o ideal é utilizar o clock externo com cristal de quartzo (ilustrado na figura 15) mesmo que o microcontrolador possua circuito de clock interno. O valor dos capacitores C1 e C2 fica em torno de 10pF a 33pF, dependendo da frequência do cristal. O datasheet fornece o valor de capacitância necessário. Figura 15 – Circuito de clock e Master Clear Fonte: Elaboração do autor (2012) Prof. Zaqueu Dacoregio Heinzen SENAI/SC Tendências e Demandas em Automação Industrial 21 Master Clear ____ O pino MCLR, quando em nível baixo, faz com que ocorra reset do microcontrolador PIC. Portanto, devemos força-lo a nível alto. Também é interessante colocar um capacitor com pequeno valor para prevenir que as oscilações do circuito de clock e/ou ruídos externos façam com que o microcontrolador seja reiniciado por este pino. Observe na figura 15 o resistor R1 e o capacitor C3. Estes valores não são críticos, no entanto deve-se lembrar de que um valor alto de resistência pode fazer com que não haja tensão suficiente no pino. Bits de configuração Algumas configurações dos microcontroladores PIC só podem ser realizadas durante a etapa de gravação do mesmo. Estas configurações são realizadas ligando ou desligando bits específicos localizados em um endereço de programa que não é acessível pelo Program Counter (no caso do PIC16F628A, o endereço é o 0x2007). A linha PIC possui bits padronizados, no entanto nem todos os modelos apresentam todos os bits de configuração. Por exemplo, para o microcontrolador PIC16F628A, o datasheet especifica os seguintes bits de configuração: Figura 16 – Bits de configuração do microcontrolador PIC16F628A Fonte: Microchip (2007) A tabela abaixo indica a função de cada bit de configuração. Sempre que você se deparar com um modelo diferente de microcontrolador, deverá procurar no datasheet os bits de configuração existentes. Bit Nome Descrição ________ ________ 13 CP Proteção da memória de programa. 1 = Proteção desligada. 0 = Proteção ligada. ____________ ________ 8 CPD Proteção da memória de dados. 1 = Proteção desligada. 0 = Proteção ligada. 7 LVP Programação em baixa tensão. 1 = Habilitada. 0 = Desabilitada. 6 BOREN Reset por brown-out. 1 = Habilitado. 0 = Desabilitado. 5 MCLRE Utilização do Master Clear no pino RA5/MCLR/Vpp. Ligado = Habilitado. 0 = Desabilitado. 4, 1-0 FOSC <2:0> 111 = Oscilador tipo RC no pino RA7. Pino RA6 funciona como saída de clock. 110 = Oscilador tipo RC no pino RA7. Pino RA6 funciona como I/O. 101 = Oscilador interno. Pino RA6 funciona como saída de clock. 100 = Oscilador interno. Pino RA6 funciona como I/O. 011 = Clock externo. Pino RA7 funciona como entrada de clock e pino RA6 como I/O. 010 = Oscilador tipo cristal de quartzo de alta velocidade externo (HS). 001 = Oscilador tipo cristal de quartzo externo (XT). 000 = Oscilador tipo cristal de quartzo externo de baixa potência (LP). Prof. Zaqueu Dacoregio Heinzen SENAI/SC Tendências e Demandas em Automação Industrial 22 _____________________ ________ 3 PWRTE Power-up Timer. 1 = Desabilitado. 0 = Habilitado. 2 WDTE Watch-dog Timer. 1 = Habilitado. 0 = Desabilitado. Interrupções As interrupções são recursos poderosos existentes em qualquer microcontrolador ou microprocessador. Como o próprio nome sugere, as interrupções paralisam a sequência de programa e deslocam o Program Counter para um endereço de programa específico. Após o término da interrupção deve haver uma instrução para que o programa retorne de onde parou. Para que isto seja possível, o último endereço de memória de programa é salvo na pilha, e com a instrução de retorno o processador busca o endereço salvo na pilha e retorna de onde parou. Figura 17 – Ciclo de interrupções ... Instrução 32 Instrução 33 Instrução 34 Instrução 35 Instrução 36 Instrução 37 Instrução 38 Instrução 39 Instrução 40 Instrução 41 Instrução 42 ... Fonte: Elaboração do autor (2012) No caso da linha de microcontroladores PIC 16F, o endereço 0x004 é reservado para o vetor de interrupções e a instrução de retorno é a RETFIE. Nos microcontroladores PIC16F, existe uma latência (atraso) de três ou quatro ciclos de clock (o número exato depende do instante em que ocorre a interrupção), desde o momento em que a interrupção acontece até que o programa seja desviado para o vetor de interrupção. Normalmente cada interrupção tem dois bits principais: o bit de enable, que habilita a interrupção, e o bit de flag, que aponta que uma interrupção ocorreu. O bit de enable pode ser colocado em nível alto ou baixo pelo programador, já o bit de flag somente pode ser forçado para nível baixo. O bit GIE, do registrador INTCON, habilita de maneira geral as interrupções. Se este bit estiver em nível baixo, nenhuma interrupção funcionará. Se estiver em nível alto, cada vez que ocorrer uma detecção o bit GIE é desligado, o endereço de programa atual é salvo na pilha e é então desviado para o endereço 0x004, mesmo que nenhuma outra interrupção específica esteja habilitada. A instrução Instrução A Instrução B Instrução C Instrução D Instrução de retorno Sinal de interrupção Vetor de interrupção Prof. Zaqueu Dacoregio Heinzen SENAI/SC Tendências e Demandas em Automação Industrial 23 RETFIE faz com que o bit GIE seja habilitado novamente, e o endereço de programa seja então desviado para onde se encontrava antes da interrupção. Várias instruções são chamadas de periféricas, e neste caso além do bit GIE devemos habilitar também o bit PEIE do registrador INTCON (nas figuras 18 e 19 as interrupções periféricas são as localizadas no canto esquerdo, note a necessidade de habilitar o bit PEIE para que a porta E envie o sinal adiante). Figura 18 – Mapa de interrupções do PIC16F628A Fonte: Microchip (2007) Figura 19 – Mapa de interrupções do PIC16F877A Fonte: Microchip (2001) A seguir veremos as interrupções mais utilizadas e os registradores que as controlam. Prof. Zaqueu Dacoregio Heinzen SENAI/SC Tendências e Demandas em Automação Industrial 24 Interrupção externa (INT) A interrupção mais simples e genérica de todas é a chamada interrupção externa, que gera o sinal para desvio de endereço quando uma mudança no estado de determinado pino é detectada. É possível configurar o nível do estado (passa de alto para baixo ou passa de baixo para alto). Nos microcontroladores PIC16F628A e PIC16F877A, o único pino que suporta esta interrupção é o pino RB0. Os registradores que controlam esta interrupção são o OPTION e o INTCON. No registrador OPTION, o bit 6 (INTEDG) seleciona o nível de detecção da borda (0 = baixo para alto, 1 = baixo para alto). No registrador INTCON, os bits 4 (INTE) e 1 (INTF) controlam, respectivamente, a habilitação e o flag desta interrupção. Esta interrupção pode fazer com que o microcontrolador saia do modo de Standby.Timer 0 (TMR0) O timer 0, presente em todos os dispositivos da linha 16F, é um temporizador/contador com resolução de oito bits. A fonte de clock deste temporizador pode ser interna ou externa – neste caso ele torna-se um contador – e é possível utilizar um fator de divisão (prescaler) para alterar a base de tempo facilmente. Para operar como timer (ou seja, fonte de clock interna), é necessário desligar o bit 5 (T0CS) do registrador OPTION. O valor do registrador TMR0 é então incrementado a cada ciclo de máquina (1μS para uma frequência de 4Mhz) caso não seja utilizado o Prescaler. Caso for conveniente, pode-se utilizar o Prescaler desligando o bit 3 (PSA) do registrador OPTION. Neste caso, haverá uma divisão da frequência de incremento por um fator configurável pelos bits 2, 1 e 0 (PS<2:0>) do registrador OPTION. Utilizando-se, por exemplo, um fator de 1:64 (bits PS<2:0> = 101) e um clock de 4Mhz teríamos uma frequência de incremento de 4.000.000 / 4 / 64 = 15625Hz (15,625Khz), ou seja, o registrador TMR0 seria incrementado a cada 64μS. Toda vez que o valor do registrador TMR0 passa de 0xFF para 0x00 o bit 2 (T0IF) do registrador INTCON é ligado, configurando uma interrupção. O Timer0 pode ser ligado ou desligado individualmente através do bit 5 (T0IE) do registrador INTCON. O Timer0 não acorda o processador do modo de Standby. Também é possível utilizar o Timer0 como contador com clock externo, para isto basta ligar o bit 5 (T0CS) do registrador OPTION e configurar o bit 4 (TRISA4) do registrador TRIS como entrada. A interrupção continua ocorrendo a partir do momento em que o valor do registrador TMR0 passa de 0xFF para 0x00. Para configurar o preset do contador, é necessário lembrar que devemos diminuir o preset do valor 256. Por exemplo, se quisermos que o flag do Timer0 seja habilitado após 30 pulsos de clock, devemos iniciar o registrador TMR0 com o valor 226 (256-30). Após os 30 pulsos, o valor passará de 255 (0xFF) para 0 (0x00) – lembre-se que o timer possui resolução de oito bits – e haverá então uma interrupção. Timer 1 (TMR1) O Timer1 é um temporizador/contador de dezesseis bits que também pode possuir fonte de clock interna ou externa. O valor do Timer1 é armazenado nos registradores TMR1H e TMR1L, que são Prof. Zaqueu Dacoregio Heinzen SENAI/SC Tendências e Demandas em Automação Industrial 25 os bytes mais significativo (parte mais alta) e menos significativo (parte mais baixa), respectivamente. O Timer1 conta com um prescaler de 1:1 até 1:8 e um aparato especial que permite a utilização de um oscilador externo, o que possibilita a geração de interrupções mesmo em modo de Standby. A interrupção ocorre quando o valor dos registradores TMR1H e TMR1L passa de 0xFFFF para 0x0000. O Timer1 é uma interrupção periférica, que não existia nos primeiros modelos da linha PIC16F. No microcontrolador PIC16F628A as interrupções periféricas são controladas através do registrador PIE1 e os flags são armazenados no registrador PIR1. Além destes dois registradores, o controle do Timer1 também utiliza o registrador T1CON, apresentado na figura abaixo. Figura 20 – Registrador T1CON Fonte: Microchip (2007) Bit 5-4 T1CKPS<1:0> = bits de seleção do valor do Prescaler 11 = Prescaler 1:8 10 = Prescaler 1:4 01 = Prescaler 1:2 00 = Prescaler 1:1 Bit 3 T1OSCEN = bit de controle do oscilador do Timer1 0 = Oscilador desligado 1 = Oscilador ligado Bit 2 ________________________ T1SYNC = bit de sincronização do clock externo do Timer1 1 = Sincronismo desligado 0 = Sincronismo ligado Obs.: Caso TMR1CS = 0 este bit é ignorado Bit 1 TMR1CS = bit de seleção de fonte de clock 1 = Clock externo na borda subida no pino RC0/T1OSO/T1CKI 0 = Clock interno Bit 0 TMR1ON = bit de habilitação do Timer1 1 = Timer1 habilitado 0 = Timer1 desabilitado Para utilizar o Timer1, devemos inicialmente configurar a fonte de clock (interna ou externa), o prescaler, e caso o clock seja interno devemos ligar o oscilador (TSOSCEN=1). Depois de configurado, devemos ligar o bit 0 (TMR1IE) do registrador PIE1 e o bit TMR1ON do registrador T1CON. Quando ocorrer a interrupção o bit 0 (TMR1IF) do registrador PIR1 será habilitado. Lembre-se que para operar este timer também devemos subtrair o valor do preset do valor 65536, e inserir o resultado nos registradores TMR1H e TMR1L. Por exemplo, se quisermos que o Timer1 estoure a cada 1000 contagens (supondo um Prescaler de 1:1), devemos carregar o valor 65436 (65536- 1000) nos registradores TMR0H e TMR0L. A “quebra” da word em dois bytes deve ser feito pelo programador. Prof. Zaqueu Dacoregio Heinzen SENAI/SC Tendências e Demandas em Automação Industrial 26 Timer2 (TMR2) O último Timer presente no PIC16F628A e PIC16F877A é o Timer2. Este timer possui resolução de oito bits, além do prescaler configurável possui também um postscaler e é utilizado geralmente para criar a base de tempo do módulo CCP quando em modo PWM. Figura 21 – Registrador T2CON Fonte: Microchip (2007) Bit 6-3 TOUTPS<3:0> = bits de seleção do Postscaler do Timer2 0000 = Postscaler 1:1 0001 = Postscaler 1:2 0010 = Postscaler 1:3 ... 1110 = Postscaler 1:15 1111 = Postscaler 1:16 Bit 2 TMR2ON = bit de habilitação do Timer2 1 = Timer2 habilitado 0 = Timer2 desabilitado Bit 1-0 T2CKPS<1:0> = bits de seleção do Prescaler do Timer2 00 = Prescaler 1:1 01 = Prescaler 1:4 1x = Prescaler 1:16 O funcionamento do Timer2 difere um pouco do Timer0 e Timer1, pois o valor de preset é inserido diretamente no registrador PR2. Toda vez que o valor do registrador TMR2 atingir o valor de PR2, o valor de TMR2 volta a zero e ocorre a interrupção. Deste modo, não é necessário subtrair o valor de preset do valor 256, como deve ser feito no Timer0. Se quisermos, por exemplo, que o Timer2 gere uma interrupção a cada 100 incrementos (supondo Prescaler e Postscaler = 1:1), basta carregar o valor 99 no registrador PR2 (lembre-se que a contagem inicia em zero). Quando o valor de TMR2 passar de 99 para 0, ocorrerá uma interrupção. Módulo CCP (Capture – Compare – PWM) Um dispositivo especial presente nos PICs é o módulo CCP. Este módulo pode realizar: Captura do período de um sinal digital periódico; Comparação dos registradores TMR1H e TMR1L com um valor pré-estabelecido; Geração de um sinal PWM. Prof. Zaqueu Dacoregio Heinzen SENAI/SC Tendências e Demandas em Automação Industrial 27 Alguns dispositivos, como o PIC16F877A, possui mais de um módulo CCP. O PIC16F628A, no entanto, possui somente um módulo. Podemos configurar este módulo para trabalhar somente em um dos modos (captura, comparação ou PWM). O modo mais utilizado em projetos de automação industrial é o PWM, portanto iremos nos ater somente a este. É recomendado, no entanto, que você pesquise na bibliografia recomendada ou no datasheet do microcontrolador que você está trabalhando o funcionamento dos outros dois módulos, em especial o modo de captura. Modo PWM O sinal do tipo PWM (Pulse Width Modulation ou Modulação por Largura de Pulso) é amplamente utilizado para controle de potência, como em inversores de frequência, controle de motores CC e cargas CC em geral. Considere um sinal digital periódico com frequência f que não varia. Alterando a duração do tempo em que o sinal permanece em nível alto o valor médio deste sinal é alterado. Sendo assim, um sinal PWM é composto por quatro parâmetros: valor de nível alto, valor de nível baixo, frequência e o tempo em que o nível é alto, também denominado Duty Cicle. Como o PIC é um dispositivo TTL, o nível alto será 5V,o nível baixo será 0V e o usuário pode alterar a frequência e o duty cicle. A frequência é controlada diretamente pelo Timer2, ou seja, sempre que quisermos utilizar o modo PWM, primeiramente devemos configurar o Timer2 para gerar a frequência do sinal. Quanto mais alta a frequência mais fácil é uma possível filtragem posterior, no entanto altas frequências podem gerar aquecimento nos dispositivos de chaveamento de potência (MOSFets, transistores, etc). ATENÇÃO Quando você utilizar um simulador para verificar o funcionamento do módulo PWM, faça a simulação com uma frequência baixa (no máximo 1Khz), pois o uso de altas frequências pode fazer com que o simulador apresente lentidão ou mesmo trave. Na prática, a frequência do módulo PWM costuma estar em torno de 5Khz. Figura 22 – Funcionamento do modo PWM nos PIC16F Fonte: Microchip (2007) Prof. Zaqueu Dacoregio Heinzen SENAI/SC Tendências e Demandas em Automação Industrial 28 Para controlar o modo PWM do módulo CCP1, utilizamos os registradores CCP1CON e CCPR1L. A resolução é de dez bits, sendo que os oito bits mais significativos (MSBs) ficam armazenados no registrador CCPR1L e os outros dois bits menos significativos (LSBs) ficam armazenados nos bits 5 e 4 (CCP1X e CCP1Y) do registrador CCP1CON, conforme a figura abaixo. Figura 23 – Estrutura do Duty Cicle do PWM do módulo CCP1 Bit 9 Bit 8 Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 Registrador CCP1RL <bits 7:0> CCP1X CCP1Y Fonte: Elaboração do autor (2012) Além do registro do PWM, são utilizados outros bits do registrador CCP1CON, que são descritos logo abaixo. Figura 24 – Registrador CCP1CON Fonte: Microchip (2007) Bit 3-0 CCP1M<3:0> = bits de seleção do modo de funcionamento do módulo CCP1 0000 = CCP1 desligado 0100 = Modo de captura a cada borda de descida 0101 = Modo de captura a cada borda de subida 0110 = Modo de captura a cada quatro bordas de subida 0111 = Modo de captura a cada dezesseis bordas de subida 1000 = Modo de comparação, liga a saída caso ocorra coincidência 1001 = Modo de comparação, desliga a saída caso ocorra coincidência 1010 = Modo de comparação, gera interrupção caso ocorra coincidência 1011 = Modo de comparação, evento de trigger especial (reset do Timer1) 11xx = Modo PWM O passo a passo para utilizar o módulo PWM é o seguinte: 1. Ajustar o período do módulo PWM utilizando o Timer2; 2. Ajustar o Duty Cicle do módulo PWM utilizando o registrador CCPR1L e os bits CCP1X e CCP1Y do registrador CCP1CON; 3. Tornar o pino RB3/CCP1 uma saída através do TRISB; 4. Habilitar o módulo PWM através do registrador T2CON, bit TMR2ON. Memória EEPROM interna Boa parte dos PICs possuem, além da memória RAM, uma memória não volátil do tipo EEPROM (Electrically Erasable and Programmable Read Only Memory). Utilizamos normalmente esta memória quando precisamos armazenar dados que não podem ser perdidos caso a alimentação do circuito seja Prof. Zaqueu Dacoregio Heinzen SENAI/SC Tendências e Demandas em Automação Industrial 29 desligada. No entanto, esta memória é extremamente lenta quando comparada à memória RAM, por isso seu uso deve ser sempre avaliado. Existem quatro registradores associados à memória EEPROM interna no caso do PIC16F628A: EECON1, EECON2, EEDATA e EEADR. No registrador EECON1 configuramos o uso da memória EEPROM interna e habilitamos uma instrução de leitura ou escrita. O registrador EEADR recebe o endereço a ser escrito/lido, e o registrador EEDATA recebe o dado a ser escrito ou o valor lido no endereço especificado. No caso de uma escrita na EEPROM devemos: 1) Armazenar o endereço de memória no registrador EEADR; 2) Armazenar o dado a ser escrito no registrador EEDATA; 3) Desabilitar as interrupções; 4) Setar o bit 3 (WREN) do registrador EECON1; 5) Escrever, em sequência, os valores 0x55 e 0xAA no registrador EECON2 (senha padrão da Microchip para não permitir escritas indevidas na EEPROM); 6) Setar o bit 1 (WR) do registrador EECON1 para iniciar a operação de escrita. 7) Aguardar até que o bit WR seja desligado (indicando o término da escrita); 8) Desligar o bit WREN para garantir a integridade da EEPROM; 9) Habilitar novamente as interrupções. No caso de uma operação de leitura, devemos: 1) Armazenar o endereço de memória no registrador EEADR; 2) Setar o bit 0 (RD) do registrador EECON1; 3) Ler o valor do registrador EEADR. Observe que uma operação de escrita na EEPROM pode demorar vários ciclos, por isso a importância de desabilitar as interrupções. ATENÇÃO Além dos módulos internos estudados até aqui, existem vários outros que serão analisados utilizando a linguagem C e o compilador MikroC, pois a dificuldade de utilização destes periféricos a nível de registradores é muito grande. Você deve, no entanto, procurar estudar estes módulos, seja com o datasheet do componente, seja com um livro sobre microcontroladores. Prof. Zaqueu Dacoregio Heinzen SENAI/SC Tendências e Demandas em Automação Industrial 30 Lista de Exercícios – Módulo 01 1) (1,0pt) Qual a função da ULA? 2) (1,0pt) O que diferencia os microcontroladores dos microprocessadores? 3) (1,0pt) Qual a diferença entre as CPUs do tipo RISC e as CPUs do tipo CISC? 4) (1,0pt) O que é um opcode? Quantos bits compõem um opcode nos microcontroladores PIC16? 5) (1,0pt) Qual a diferença entre memórias do tipo volátil das do tipo não-volátil? 6) (1,0pt) Qual a diferença entre a arquitetura Harvard e a arquitetura Von-Neumann? 7) (1,0pt) O que são as interrupções? 8) (1,0pt) Qual a vantagem da utilização de resistores Pull-Up ao invés de resistores Pull-Down? 9) (2,0pts) Pesquise em datasheets e responda: quantas palavras de programa (guardadas na memória Flash) cabem nos microcontroladores PIC16F876, PIC16F914, PIC16F74 e PIC16F84? Não será permitida a entrega dos exercícios em formato impresso. Resolver os exercícios à mão. Prof. Zaqueu Dacoregio Heinzen SENAI/SC Tendências e Demandas em Automação Industrial 31 Linguagem Assembly Já comentamos algo a respeito das instruções. Você já sabe, por exemplo, que para mover um dado de oito bits para o registrador Work, você utiliza a instrução MOVLW. As instruções também são chamadas de mnemônicos ou opcodes. Na verdade, os opcodes são traduções de códigos binários que correspondem a comandos específicos relacionados ao processamento de dados. Obviamente ninguém gosta de decorar sequências de números binários, portanto os fabricantes utilizam palavras que sejam de memorização mais fácil: é a famosa linguagem Assembly. Quando lidamos com esta linguagem, estamos trabalhando diretamente com instruções do processador, ou seja, estamos muito próximos do código binário que compõe a lista de programa. Por este motivo, diz-se que Assembly é uma linguagem de baixo nível. Não confunda baixo nível com pobreza de informação! Na verdade, por melhor que seja um programador de outras linguagens, ele dificilmente conseguirá produzir um código tão “enxuto” quanto um bom programador Assembly. Em termos de eficiência – ao nível de processamento, claro – o Assembly sempre será muito melhor que qualquer outra linguagem. Pode-se, sem problemas, estudar outras linguagens para utilizar os microcontroladores, mas o melhor entendimento é conseguido quando se conhece a fundo como o microcontrolador trabalha, e é por isso que daremos início ao estudo dos microcontroladores PIC utilizando justamente a linguagem Assembly. É interessante notar que não existem compiladores Assembly, mas sim montadores, ou seja, programas que traduzem as instruções Assembly diretamente parao código binário ou código de máquina do microcontrolador. Vamos conhecer agora as instruções que compõem a linha PIC16. Instruções Byte-Oriented Estas instruções trabalham com registradores (tanto do tipo SFR quanto GPR), realizando operações lógicas e matemáticas diversas. Na grande maioria dos casos, estas instruções seguem o seguinte padrão: 1 INSTRUÇÃO REGISTRADOR, DESTINO Sendo que o registrador é especificado com o nome do mapa de memória (OPTION, STATUS, TRISB, CMCON, etc) e o destino pode ser “0” ou “1”, sendo que “0” faz com que o resultado da instrução seja armazenado no registrador Work, e “1” faz com que o resultado seja armazenado no próprio registrador utilizado na função. Por exemplo, supondo que o valor do registrador Work seja 0x01 e o valor do PORTA seja 0x02, vamos realizar a instrução seguinte: 1 ADDWF PORTA, 0 Prof. Zaqueu Dacoregio Heinzen SENAI/SC Tendências e Demandas em Automação Industrial 32 Neste caso, o resultado da operação será 0x01+0x02 = 0x03. Este valor ficará salvo em W e o registrador PORTA não será alterado. Caso realizemos agora a seguinte operação, supondo W = 0x01 e PORTA = 0x02: 1 ADDWF PORTA, 1 Agora, o resultado da operação (0x03) será armazenado no registrador PORTA, e W continuará igual a 0x01. A tabela a seguir relaciona todas as instruções do tipo byte-oriented da linha PIC16F. Instrução e operadores Descrição Flags afetados ADDWF f,d Adiciona W com f C,DC,Z ANDWF f,d AND lógico entre W e f Z CLRF f Limpa f Z CLRW Limpa W Z COMF f,d Inverte os bits de f Z DECF f,d Decrementa f Z DECFSZ f,d Decrementa f e pula a próxima linha se resultado = zero - INCF f,d Incrementa f Z INCCFSZ f,d Incrementa f e pula a próxima linha se resultado = zero - IORWF f,d OU lógico entre W e f Z MOVF f,d Move f Z MOVWF f,d Move W para f - NOP f,d Não realiza nenhuma instrução (gasta um ciclo) - RLF f,d Rotaciona os bits de f à esquerda C RRF f,d Rotaciona os bits de f à direita C SUBWF f,d Subtrai W de f C, DC, Z SWAPF f,d Troca os nibbles de f - XORWF f,d OU Exclusivo lógico entreW e f Z Vamos então a um exemplo prático, onde será feita a configuração dos pinos do PORTB e a seguir todos eles serão colocados em nível baixo. 1 MOVLW b‟00001111‟ 2 MOVWF TRISB, 1 3 MOVLW 0x00 4 MOVWF PORTB, 1 Na primeira linha, utilizamos a instrução MOVLW, que move o valor binário 00001111 para W. Em seguida, utilizamos a instrução MOVWF, que move o valor de W (b’00001111’) para o registrador TRISB, configurando assim os pinos RB0 a RB3 como entrada e RB4 a RB7 como saída. Na terceira linha, o valor hexadecimal 00 é movido para W, e na quarta linha o valor de W é movido para o PORTB. Prof. Zaqueu Dacoregio Heinzen SENAI/SC Tendências e Demandas em Automação Industrial 33 Outra maneira de fazer a mesma operação acima é substituir a terceira e a quarta linha por uma instrução CLRF: 1 MOVLW b‟00001111‟ 2 MOVWF TRISB, 1 3 CLRF PORTB Apesar de economizar uma linha de código, devemos nos atentar que a instrução CLRF faz com que o bit Z do registrador STATUS seja afetado. Instruções Bit-Oriented Estas instruções conseguem trabalhar com registrados ao nível de bit. Elas são de grande valia para, por exemplo, verificar se determinado pino está em nível alto ou baixo, ou mesmo se alguma interrupção foi acionada. As instruções bit-oriented são estruturadas da seguinte maneira: 1 INSTRUÇÃO REGISTRADOR, BIT Onde o bit é um número de 0 a 7, ou o nome do bit caso o registrador for SFR ou mesmo se for GPR e houver declaração do nome do bit no cabeçalho do programa. Vejamos quais são as instruções bit-oriented: Instrução e operadores Descrição Flags afetados BCF f,b Limpa o bit de f - BSF f,b Seta o bit de f - BTFSC f,b Testa o bit de f, pula a próxima linha se bit = 0 - BTFSS f,b Testa o bit de f, pula a próxima linha se bit = 1 - O exemplo a seguir configura o pino RB3 como saída digital e aplica nível lógico “1” no mesmo. 1 BCF TRISB, 3 ;Configura o pino RB3 como saída 2 NOP ;Aguarda um ciclo de máquina 3 BSF PORTB, 3 ;Liga o pino RB3 Note que foi inserida uma instrução NOP, que faz com que o microcontrolador gaste um ciclo de máquina (1μs para um clock de 4Mhz). É recomendável que haja um pequeno intervalo de tempo para estabilização da saída digital antes de fazer uma escrita na mesma, e este intervalo é conseguido através da instrução NOP. As instruções BTFSC e BTFSS são utilizadas para fazer comparação. Em ambos os casos, devemos escolher um registrador e um bit do mesmo (pode ser um número ou o nome do bit, conforme estiver no datasheet; ou nas declarações, conforme veremos mais à frente). Prof. Zaqueu Dacoregio Heinzen SENAI/SC Tendências e Demandas em Automação Industrial 34 Vamos, por exemplo, configurar o PORTB e utilizar a instrução BTFSC (Bit Test F Skip if Clear - Testa o Bit do registrador F e Pula uma linha se está em nível baixo) para verificar o estado do pino RB0 e, caso seja verdadeiro, colocar nível alto no pino RB1: 1 MOVLW b‟00000001‟ ;Configura o pino RB0 como entrada 2 MOVWF TRISB, 1 ;Salva o valor de configuração 3 BTFSC PORTB,RB0 ;Verifica o estado de RB0 4 BSF PORTB,RB1 ;Caso estado = 0 irá pular esta linha 5 NOP ;Gasta um ciclo de máquina Vamos agora utilizar a instrução BTFSS (Bit Test F Skip if Set – Testa o Bit do registrador F e Pula uma linha se está em nível alto) para desligar o pino RB1 caso o pino RB0 estiver em nível baixo. 1 MOVLW b‟00000001‟ ;Configura o pino RB0 como entrada 2 MOVWF TRISB, 1 ;Salva o valor de configuração 3 BTFSS PORTB,RB0 ;Verifica o estado de RB0 4 BCF PORTB,RB1 ;Caso estado = 1 irá pular esta linha 5 NOP ;Gasta um ciclo de máquina Instruções Literais e de Controle Estas instruções não trabalham com registradores, apenas alteram ou verificam o valor de W e fazem alterações diretamente no controle do microcontrolador. Utilizamos estas instruções para, por exemplo, criar um loop (laço de repetição) no programa, ou para fazer com que o microcontrolador entre em estado de baixo consumo de potência (Stanby). Os loops, particularmente, são constantemente utilizados; lembre-se que os microcontroladores são sequenciais: processam a lista de programa e param de processar, só voltando ao início da lista caso sejam resetados ou caso alguma instrução oriente o program counter a retornar para determinada instrução. A estrutura destas instruções costuma envolver apenas a literal (numeral de oito bits) “k”, armazenando o resultado em W, da seguinte maneira: 1 INSTRUÇÃO LITERAL Instrução e operadores Descrição Flags afetados ADDLW k Soma k com W C, DC, Z ANDLW k AND lógico entre k e W Z CALL k Chama a subrotina k - CLRWDT Limpa o Watch-Dog Timer TO, PD GOTO k Vai até a linha de programa k - IORLW k OU lógico entre k e W Z MOVLW k Move k para W - RETFIE Retorna da interrupção - Prof. Zaqueu Dacoregio Heinzen SENAI/SC Tendências e Demandas em Automação Industrial 35 RETLW k Retorna com a literal k - RETURN Retorna da subrotina - SLEEP Entra em modo de Stanby (baixo consumo). TO, PD SUBLW k Subtrai W da literal k C, DC, Z XORLW k OU Exclusivo lógico entre k e W Z Vamos tratar um caso muito comum: precisamos criar um loop para verificar constantemente o estado do pino RB0, ligando ou desligando o pino RB1 conforme o estado: 1 MOVLW b‟00000001‟ ;Configura o pino RB0 como entrada
Compartilhar