MICROCONTROLADORES PIC PRIMEIROS PASSOS Os microcontroladores são chips inteligentes, que tem um processador, pinos de entradas/saídas e memória. Através da programação dos microcontroladores podemos controlar suas saídas, tendo como referencia as entradas ou um programa interno. O que diferencia os diversos tipos de microcontroladores, são as quantidades de memória interna (programa e dados), velocidade de processamento, quantidade de pinos de entrada/saída (I/O), alimentação, periféricos, arquitetura e set de instruções. O QUE É O PIC? O PIC é um circuito integrado produzido pela Microchip Technology Inc., que pertence a categoria dos microcontroladores, ou seja, um componente integrado que em um único dispositivo contem todos os circuitos necessários para realizar um completo sistema digital programável. O pic pode ser visto externamente como um circuito integrado TTL ou CMOS normal, mas internamente dispõe de todos os dispositivos típicos de um sistema microprocessado, ou seja: Uma CPU (Central Processor Unit ou Unidade de Processamento Central) e sua finalidade é interpretar as instruções de programa; Uma memória PROM (Programmable Read Only Memory ou Memória Programável Somente para Leitura) na qual ira memorizar de maneira permanente as instruções do programa; Uma memória RAM (Random Access Memory ou Memória de Acesso Aleatório) utilizada para memorizar as variaveis utilizadas pelo programa; Uma serie de LINHAS de I/O (entrada e saída) para controlar dispositivos externos ou receber pulsos de sensores, chaves, etc. ; Uma serie de dispositivos auxiliares ao funcionamento, ou seja, gerador de clock, bus, contador, etc. A presença de todos estes dispositivos em um espaço extremamente pequeno, da ao projetista ampla gama de trabalho e enorme vantagem em usar um sistema microprocessado, onde em pouco tempo e com poucos componentes externos podemos fazer o que seria oneroso fazer com circuitos tradicionais.o PIC esta disponível em uma ampla gama de modelos para melhor adaptar-se as exigências de projetos específicos, diferenciando-se pelo numero de linha de I/O e pelo conteúdo do dispositivo. Inicia-se com modelo pequeno identificado pela sigla PIC12Cxx dotado de 8 pinos, até chegar a modelos maiores com sigla PIC17Cxx dotados de 40 pinos. Uma descrição detalhada da tipologia do PIC é disponível no site da Microchip ( www.microchip.com ), onde conseguimos encontrar grandes e variadas quantidades de informações técnicas, software de apoio, exemplos de aplicações e atualizações disponíveis. PIC Primeiros Passos Carlos Henrique Monteiro Página 1
O HARDWARE Dependendo do modelo, um PIC pode ter vários pinos que chamamos de PORTAS. Para nosso estudo atual, veremos um PIC de 8 s chamado PIC16F84A. Este pic é formado por portas RA e portas RB, sendo que cada porta RA ou RB pode ser uma entrada ou saída conforme determinemos no programa. O pino Vdd é a alimentação de tensão contínua +5V e o pino Vss o GND. O MCLR é um pino para reset do programa, e funciona em logica inversa, ou seja, se levado a nível lógico 0, ele faz o reset do programa, logo, devemos trabalhar com ele em nível logico 1. Os pinos 15 e 16 são para o oscilador, que poder ser um oscilador RC ou cristal. Os pinos restantes são as portas RAs e RBs, note que temos 8 portas RB e 5 portas RA. PIC16F84A Programação e desenvolvimento Como qualquer arquitetura os processadores PIC apenas aceitam linguagem de máquina (assembly). No entanto a programação pode ser feita em linguagens de alto nível utilizando-se compiladores. Existem várias alternativas pagas de compiladores. Em geral é possivel utilizá-los de modo gratuito com algumas restrições. Para as famílias PIC16 e PIC18 existe uma alternativa opensource o SDCC, que pode ser configurado para operar com o MPLAB. Existem ainda diversas IDE's disponíveis para a programação, entre elas a mais utilizada é o MPLAB, disponibilizado de modo gratuíto pela própria Microchip. Há atualmente uma versão beta de IDE baseada no Netbeans sendo desenvolvida pela Microchip: MPLABX. Esta IDE já vem com suporte para qualquer Windows, Mac e Linux. Para gravar o programa no microcontrolador é utilizado um dispositivo dedicado. É comum que tais dispositivos também possuam capacidade de debuggar o programa, que auxilia muito na fase de testes dos sistemas. É possivel ainda encontrar diversas placas de desenvolvimento que já possuem um hardware pré-montado de modo a agilizar o projeto de um produto, permitindo que se comece a desenvolver o software em paralelo com o hardware. O MPLAB é um software gratuito e pode ser baixado em http://www.microchip.com. PIC Primeiros Passos Carlos Henrique Monteiro Página 2
PIC Primeiros Passos Carlos Henrique Monteiro Página 3
O QUE É UM REGISTRADOR Um registrador é um endereço na memória, que em nosso caso são formados por 8 números, ou melhor, 8 s. Cada deste pode assumir o valor de 1 (um) ou 0 (zero). Temos então um endereço que podemos chamar de registrador. Este registrador terá 8 s. Estes s podem ser 0 (zero) ou 1 (um). Muitas vezes chamamos estes s de Flags. Flags então é um dentro de um registrador. Mas o que é um Bit? Imaginemos 8 posições: Cada posição pode ter um valor de 0 (zero) ou 1 (um). Esta posição com um valor é um, ou melhor, é o valor que há dentro da posição. Quando juntamos 8 s, como no exemplo a seguir: 00110011 _ Chamamos isto de byte. Um byte então é um conjunto de 8 s. Às vezes os s podem ser agrupados em números de 4, veja: 0101 _ Damos a isto o nome de nibble. Outras vezes os s podem se agrupar com números maiores que 8, veja: 001100110011 _ Chamamos isto de Word : Nos pics existem registradores especiais, vamos citar os três mais importantes: Intcon Option-reg Status Podemos através dos s ou flags destes registradores ajustar o funcionamento do PIC ou ler como ale está operando, para isto basta escrever ou ler os flags. PIC Primeiros Passos Carlos Henrique Monteiro Página 4
REGISTRADORES ESPECIAIS E MAIS UTILIZADOS NO PIC 16F84 O REGISTRADOR W O registrador W é extremamente útil no PIC, pois é através dele que fazemos diversas partes de um programa. O nome registrador W vem de Registrador Work, que traduzindo, quer dizer trabalho. É através dele que carregamos os outros registradores com valores diversos e corretos para um perfeito funcionamento de nosso projeto. Caso desejamos colocar um determinado valor em um registrador de uso geral (GPR), primeiro temos que carregar o registrador W e depois passar para o outro registrador. Para carregarmos o registrador W usamos as instruções: MOVLW e MOVWF. Imagine como se o registrador W fosse um elevador de carga, e que os registradores fossem um andar de um prédio. Cada seria um apartamento que pode ter apenas um morador. Este morador pode ser um 0 ou 1. PIC Primeiros Passos Carlos Henrique Monteiro Página 5
STATUS Port B Port A Tris A Tris B STATUS BANCO 0 BANCO 1 Registrador W 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 Registrador STATUS Este registrador está diretamente associado à unidade lógica Aritmética, ou a já famosa ULA. Através dele conseguimos ver o estado da ULA. Gostaria de relembrar que um registrador é um endereço na memória de dados, composta por 8 s e que cada deste recebe o nome carinhoso de flag. Perceba meu amigo leitor que de 7 até 0 teremos 8 posições, portanto 8 s. R/W quer dizer Read e Write - Leitura e escrita que tem suas versões em português para L/E. Então: L/E quer dizer leitura e escrita. Um indicado por R/W ou L/E permite que você faça a leitura de seu valor ou que escreva um valor nesta posição. Lembre-se que você só poderá escrever 0 (zero) ou 1 (um). Um ou flag indicado por R permite apenas a leitura, mas não a escrita. Com a análise destes s podemos fazer nossos programas ficarem mais rápidos e eficientes. Podemos ler ou escrever em um registrador a ou tudo de uma vez. Em minha opinião a análise separada de cada é mais eficaz. Bit 5 RP0 ->seleciona os bancos no endereçamento direto. Veja: RP0: 0 = banco 0 1 = banco 1 REGISTRADOR TRISA REGISTRADOR TRISB PIC Primeiros Passos Carlos Henrique Monteiro Página 6
COMANDOS DO PIC Operações com Registradores Instrução Argumentos Descrição ADDWF f,d Soma W e F, guardando o resultado em d. ANDWF f,d Lógica "E"entre W e f, guardando o resultado em d. CLRF f Limpa f. COMF f,d Calcula o complemento de f, guardando o resultado em d. DECF f,d Decrementa f, guardando o resultado em d. DECFSZ f,d Decrementa f, guardando o resultado em d, e pula a próxima linha se o resultado for zero. INCF f,d Incrementa f, guardando o resultado em d. INCFSZ f,d Incrementa f, guardando o resultado em d, e pula a próxima linha se o resultado for zero. IORWF f,d Lógica "OU" entre W e f, guardando o resultado em d. MOVF f,d Move f para d(copia ). MOVWF f Move W para f (copia ). RLF f,d Rotaciona f 1 para esquerda. RRF f,d Rotaciona f 1 para direita. SUBWF f,d Subtrai W de f (f - W ), guardando o resultado em d. SWAPF f,d Executa uma inversão entre as partes alta e baixa de f, guardando o resultado em d. XORWF f,d Lógica "OU exclusivo "entre W e f, guardando o resultado em d. Operações com Literais Instrução Argumentos Descrição ADDLW k Soma k com W, guardando o resultado em W. ANDLW k Lógica "E "entre k e W, guardando o resultado em W. IORLW k Lógica "OU" entre k e W, guardando o resultado em W. MOVLW k Move k para W. SUBLW k Subtrai W de k(k - W), guardando o resultado em W. XORLW k Lógica "OU exclusivo" entre k e W, guardando o resultado em W. Operações com s Instrução Argumentos Descrição BCF f,b Impõe 0(zero) ao b do registrador f. BSF f,b Impõe 1(um) ao b do registrador f. BTFSC f,b Testa o b do registrador, e pula a próxima linha se ele for 0 (zero ). BTFSS f,b Testa o b do registrador, e pula a próxima linha se ele for 1 (um ). Controles Instrução Argumentos Descrição CLRW Limpa W. NOP Gasta um ciclo de máquina sem fazer nada. CALL R Executa a rotina R. CLRWDT Limpa o registrador WDT para não acontecer o reset. GOTO R Desvia para o ponto R, mudando o PC. RETFIE Retorna de uma interrupção. RETLW k Retorna de uma rotina, com k em W. RETURN Retorna de uma rotina, sem afetar W. SLEEP Coloca o PIC em módulo Sleep( dormindo) para economia de energia. PIC Primeiros Passos Carlos Henrique Monteiro Página 7
Algumas Dicas sobre as Funções Tudo o que está escrito abaixo é baseado na prática. Instruções muito usadas em Loopings: goto call return decfsz clrwdt incfsz nop movwf movlw Instruções usadas em leitura de chaves: btfsc btfss nop Instruções usadas no cabeçalho: movlw movwf bcf bsf clrw retfie Mas, e estas letrinhas f, k, W, d, R, b o que significam? f ->é um registro que deve estar definido no campo do cabeçalho onde colocamos as variáveis. Deve ter o valor entre 0 a 127 decimal. k ->é normalmente, um valor que será carregado, normalmente de novo, no registrador de trabalho W. É um número entre 0 a 255 decimal. Pode ser chamada de constante. W ->é o registrador de trabalho, tudo ou quase tudo, que o PIC faz passar por ele. d ->o d pode ser colocado ou não, se for colocado, o resultado será salvo nele, mas se não for colocado o resultado será salvo em f. Ele especifica o destino do resultado da instrução: Se d = 0 o resultado é gravado em W; Se d = 1 o resultado é gravado no registrador indicado na operação, ou seja, f. Se não for colocado o padrão será 1, ou seja, o resultado será gravado no registrador f da operação em W. R ->é um nome que você dará há uma rotina ou a uma parte do programa. Usado com goto e call. b -> o b define um de um determinado registrador e você precisa usá-lo para que as instruções que o antecedem funcionem corretamente. Deve se um número entre 0 a 7 decimal. PIC Primeiros Passos Carlos Henrique Monteiro Página 8
Observações: Os números estão indicados em decimal, mas, podem ser em binário ou hexadecimal, basta estarem dentro dos valores apropriados. Depois de cada instrução, devemos usar o ponto e vírgula (;) para separá-lo dos comentários. E vamos começar isto logo. Os comentários ajudam. EXEMPLO DE PROGRAMA PARA ACENDER UM LED COM PIC LIGA NA PORTA RA4: PROCESSOR 16F84 ;INDICANDO QUE O PROCESSADOR A SER USADO SERÁ O PIC 16F84A #INCLUDE <P16F84A.INC> ;PARA CARREGAR A BIBLIOTECA DO REFERIDO PIC ;SETANDO QUAIS PINOS SERAO ENTRADAS E SAÍDAS BSF STATUS,5 ;MUDA PARA BANCO 1 MOVLW B'00000000' ; MOVE SEQUÊNCIA BINÁRIA PARA W: TODOS OS BITS COMO 0 MOVWF TRISA ;MOVE CONTEÚDO DE W PARA REGISTRADOR TRISA MOVLW B'00000000' ; MOVE SEQUÊNCIA BINÁRIA PARA W: TODOS OS BITS COMO 0 MOVWF TRISB ; MOVE CONTEÚDO DE W PARA REGISTRADOR TRISB BCF STATUS,5 ;VOLTA PARA BANCO 0 ;INICIO DO PROGRAMA BSF PORTA,4 ;LIGA PORTA RA4 ;FIM DO PROGRAMA END AGORA ACENDER O LED APENAS SE A CHAVE LIGADA NA PORTA RB1 FOR PRESSIONADA: PROCESSOR 16F84 ;INDICANDO QUE O PROCESSADOR A SER USADO SERÁ O PIC 16F84A #INCLUDE <P16F84A.INC> ;PARA CARREGAR A BIBLIOTECA DO REFERIDO PIC ;SETANDO QUAIS PINOS SERAO ENTRADAS E SAÍDAS BSF STATUS,5 ;MUDA PARA BANCO 1 MOVLW B'00000000' ; MOVE SEQUÊNCIA BINÁRIA PARA W: TODOS OS BITS COMO 0 MOVWF TRISA ;MOVE CONTEÚDO DE W PARA REGISTRADOR TRISA MOVLW B'00000010' ; MOVE SEQUÊNCIA BINÁRIA PARA W: 00000010 MOVWF TRISB ; MOVE CONTEÚDO DE W PARA REGISTRADOR TRISB BCF STATUS,5 ;VOLTA PARA BANCO 0 ;INICIO DO PROGRAMA INICIO BTFSS PORTB,1 ;VERIFICA SE PORTA RB1 ESTA EM 1, SE ESTIVER PULA PROXIMA GOTO INICIO ;VAI PARA A PALAVRA INICIO BSF PORTA,4 ;LIGA PORTA RA4 ;FIM DO PROGRAMA END PIC Primeiros Passos Carlos Henrique Monteiro Página 9
AGORA ACENDER O LED SE A CHAVE LIGADA NA PORTA RB1 FOR PRESSIONADA E DESLIGAR SE A CHAVE FOR DESLIGADA: PROCESSOR 16F84 ;INDICANDO QUE O PROCESSADOR A SER USADO SERÁ O PIC 16F84A #INCLUDE <P16F84A.INC> ;PARA CARREGAR A BIBLIOTECA DO REFERIDO PIC ;SETANDO QUAIS PINOS SERAO ENTRADAS E SAÍDAS BSF STATUS,5 ;MUDA PARA BANCO 1 MOVLW B'00000000' ; MOVE SEQUÊNCIA BINÁRIA PARA W: TODOS OS BITS COMO 0 MOVWF TRISA ;MOVE CONTEÚDO DE W PARA REGISTRADOR TRISA MOVLW B'00000010' ; MOVE SEQUÊNCIA BINÁRIA PARA W 00000010 MOVWF TRISB ; MOVE CONTEÚDO DE W PARA REGISTRADOR TRISB BCF STATUS,5 ;VOLTA PARA BANCO 0 ;INICIO DO PROGRAMA INICIO BTFSS PORTB,1 ;VERIFICA SE PORTA RB1 ESTA EM 1, SE ESTIVER PULA PROXIMA GOTO DESLIGA ;VAI PARA A PALAVRA DESLIGA BSF PORTA,4 ;LIGA PORTA RA4 GOTO INICIO ;VAI PARA A PALAVRA INICIO DESLIGA BCF PORTA,4 ;DESLIGA PORTA RA4 GOTO INICIO ;VAI PARA A PALAVRA INICIO ;FIM DO PROGRAMA END Variáveis As variáveis são nomes que podemos dar a registros de uso geral. Também podemos dar nomes a portas ou s das variáveis, estes são chamados defines. Lembrando que os registros do PIC são de 8s, logo o maior número que pode ser armazenado nesses registros é 255. Para criarmos uma variável, basta escolher um nome que não comece com numero nem caracter especial, seguido da diretiva equ e em seguida o endereço desta variável. Exemplo TEMPO EQU 0CH Para saber quais endereços podemos usar para as variáveis devemos olhar no datasheet e procurar pelos endereços para uso geral. Que no caso do 16F84A vão de 0CH a 4FH. PIC Primeiros Passos Carlos Henrique Monteiro Página 10
Definições de nomes Já os nomes de portas ou s ou até mesmo números são criados pelo comando #DEFINE, seguido pelo nome que se quer dar e em seguida o objeto que se quer nomear: #DEFINE LED PORTB,0 As variáveis e defines devem sempre ficar no início do programa. Rotinas de tempo As rotinas de tempo servem para contagem de tempo, e para criá-las a primeira coisa a se saber é qual será o oscilador a ser usado e sua frequência. Suponhamos que usaremos um cristal como oscilador de 4MHZ. Sabemos que o PIC faz seus ciclos internos em 4 tarefas, então podemos dizer que cada ciclo é feito em ¼ da frequência externa. Então usando um cristal de 4 MHZ, cada ciclo será de 1MHZ, ou seja, 1us(micro segundo). Assim podemos prender o pic em uma contagem de tempo que demore o tempo que precisarmos. O único problema desta forma de rotina de tempo é que o PIC fica preso a rotina, não conseguindo fazer mais nada enquanto espera o tempo da contagem terminar. Vamos então fazer uma rotina de tempo que demore 1ms(milissegundo = 1000us).... TEMPO EQU 0CH ;VARIÁVEL COM NOME TEMPO... CALL ROTMILI ;CHAMA A SUBROTINA TEMPO... ROTIMILLI MOVLW.250 ;MOVE O NUMERO DECIMAL 250 PARA W MOVWF TEMPO ;MOVE O QUE ESTIVER NO W PARA A VARIÁVEL TEMPO DL1 NOP ;ESTE COMANDO NÃO FAZ NADA, APENAS GASTA 1 CICLO DE MÁQUINA DECFSZ TEMPO,F ;DECREMENTA A VARIAVEL TEMPO E GUARDA O RESULTADO NO MESMO LUGAR GOTO DL1 ; SE A VARIÁVEL FOR 0, PULA ESTA INSTRUÇÃO SE FOR MAIOR QUE 0 VOLTA PARA DL1 RETURN ;VOLTA AO PONTO QUE A SUBROTINA FOI CHAMADA Então temos 1 ciclo para NOP, 1 Ciclo para DECFSZ e 2 ciclos para GOTO, então teremos 4 ciclos X 250 = 1000 ciclos. Ou seja, 1000 us = 1ms. Se chamarmos esta rotina 1000 vezes, teremos 1 segundo e por aí vai. Só devemos levar em conta que toda vez que utilizamos o comando CALL, o PIC guarda o local onde este comando foi chamado para poder voltar assim que encontrar o comando RETURN, e ele vai empilhando estes endereços que ele guarda. Porém ele se consegue empilhar 8 endereços se passar disto ocorre um estouro de pilha e o programa para. PIC Primeiros Passos Carlos Henrique Monteiro Página 11
Exemplo de programa com variáveis, defines e contagem de tempo Vamos fazer um programa de pisca-pisca, um led ligado a porta RA4 vai ficar piscando com intervalos de 1s. PROCESSOR 16F84 ;INDICANDO QUE O PROCESSADOR A SER USADO SERÁ O PIC 16F84A #INCLUDE <P16F84A.INC> ;PARA CARREGAR A BIBLIOTECA DO REFERIDO PIC ;VARIÁVEIS SEG2 EQU 0CH SEG EQU 1CH MILI EQU 2CH ;DEFINIÇÕES DE NOMES #DEFINE LED PORTA,4 ;SETANDO QUAIS PINOS SERAO ENTRADAS E SAÍDAS BSF STATUS,5 ;MUDA PARA BANCO 1 MOVLW B'00000000' ; MOVE SEQUÊNCIA BINÁRIA PARA W: TODOS OS BITS COMO 0 MOVWF TRISA ;MOVE CONTEÚDO DE W PARA REGISTRADOR TRISA MOVLW B'00000000' ; MOVE SEQUÊNCIA BINÁRIA PARA W: TODOS OS BITS COMO 0 MOVWF TRISB ; MOVE CONTEÚDO DE W PARA REGISTRADOR TRISB BCF STATUS,5 ;VOLTA PARA BANCO 0 ;LOOP INICIAL INICIO BSF LED ;SETA PORTA,4 CALL ROTSEG ;CHAMA SUBROTINA ROTSEG BCF LED ;LIMPA PORTA,4 CALL ROTSEG ;CHAMA SUBROTINA ROTSEG GOTO INICIO ;VOLTA PARA INICIO ;ROTINA 1 SEGUNDO ROTSEG MOVLW.5 ;COLOCA 5 NO REGISTRO W MOVWF SEG2 ;CARREGA W NA VARIÁVEL SEG2 LASEG2 CALL ROTSEG200 ;CHAMA SUBROTINA ROTSEG200 DECFSZ SEG2,F ;DECREMENTA SEG2 ATÉ CHEGAR EM 0 GOTO LASEG2 ;VOLTA AO PONTO LASEG2 ENQUANTO SEG2 NÃO FOR 0 RETURN ;SAI DA SUBROTINA ROTSEG E VOLTA AO PONTO ONDE FOI CHAMADA ROTSEG200 MOVLW.200 ;COLOCA 200 NO REGISTRO W MOVWF SEG ;CARREGA W NA VARIÁVEL SEG LASEG CALL ROTMILI ;CHAMA A SUBROTINA ROTMILI E AGUARDA ATÉ ELA ACABAR DECFSZ SEG,F ;DECREMENTA SEG ATÉ CHEGAR EM 0 GOTO LASEG ;VOLTA AO PONTO LASEG ENQUANTO NÃO FOR 0 RETURN ;SAI DA SUB ROTINA SEG ;ROTINA 1 MILISSEGUNDO ROTMILI MOVLW.250 ;COLOCA 250 NO REGISTRO W MOVWF MILI ;CARREGA W NA VARIÁVEL MILI DL1 NOP ;NÃO OPERA DECFSZ MILI, F ;DECREMENTA MILI ATÉ CHEGAR EM 0 GOTO DL1 ; VOLTA AO PONTO DL1 ENQUANTO NÃO FOR 0 RETURN END ; SAI DA SUBROTINA MILI E VOLTA AO PONTO ONDE FOI CHAMADA PIC Primeiros Passos Carlos Henrique Monteiro Página 12