Escolar Documentos
Profissional Documentos
Cultura Documentos
PIC 16F
Resumo
António M. S. Francisco
Janeiro de 2009
Versão 2
Microcontroladores PIC
ÍNDICE
1. Introdução ................................................................................................... 2
2. Pinout ......................................................................................................... 3
3. Memória ...................................................................................................... 3
3.1. Memória de Programa ............................................................................. 4
3.2. Memória de Dados .................................................................................. 4
4. Registos SFR mais Utilizados .......................................................................... 6
4.1. Registo W.............................................................................................. 6
4.2. Registos PORTs ...................................................................................... 6
4.3. Registos TRIS ........................................................................................ 7
4.4. Registo STATUS ..................................................................................... 7
4.5. Registo INTCON ..................................................................................... 9
4.6. Registo OPTION ................................................................................... 10
4.7. Registo ANSEL e ANSELH....................................................................... 12
4.8. Módulo TIMER0 .................................................................................... 12
4.9. Módulo TIMER1 .................................................................................... 15
4.10. Módulo TIMER2 .................................................................................. 16
4.11. Módulo CAPTURE/COMPARE/PWM ......................................................... 18
4.12. Módulo conversor A/D (ADC) ................................................................ 20
4.13. Memória de Dados EEPROM.................................................................. 21
5. Códigos Utilizados nos Sistemas de Numeração ............................................... 24
6. Descrições de Opcode.................................................................................. 24
7. Set de Instruções (1) (2) ............................................................................. 25
8. Escrita de um Programa em Assembly ........................................................... 26
8.1. Directivas ............................................................................................ 27
8.2. Instruções ........................................................................................... 28
8.3. Etiquetas............................................................................................. 28
8.4. Comentários ........................................................................................ 28
9. Organização de um Programa em Assembly .................................................... 28
10. MPLAB IDE ............................................................................................... 29
10.1. Editor ............................................................................................... 29
10.2. Assemblador/Compilador ..................................................................... 30
10.3. Simulador .......................................................................................... 30
10.4. Gravador ........................................................................................... 31
INTERNET:
António Francisco 1
Microcontroladores PIC
1. INTRODUÇÃO
Os microcontroladores são circuitos integrados que possuem num único dispositivo todos os
circuitos necessários para realizar um completo sistema programável, logo, para serem
utilizados, necessitam de ser programados.
Diferenciam-se uns dos outros, essencialmente, pela capacidade e tipo de memória
(programa e dados), velocidade de processamento, número de pinos de entrada/saída (I/O)
e periféricos.
Notas:
• Nos exemplos que se seguem utiliza-se o PIC16F690, microcontrolador com um conjunto
alargados de características e de baixo custo. Feitas as devidas ressalvas, o documento
pode ser aplicado a uma grande variedade de microcontroladores PIC de uso corrente.
Também, a utilização deste documento, deve ser complementada com a consulta do data
sheet do referido micro, cujo download pode ser feito a partir do site do fabricante.
• No site do autor: http://amsfrancisco.planetaclix.pt, estão disponíveis, para download,
programas didácticos para PICs.
António Francisco 2
Microcontroladores PIC
2. PINOUT
Encapsulamento DIP
Descrição do Pinout
3. MEMÓRIA
Os PIC têm dois blocos de memória separados; um para o programa e outro para os dados.
António Francisco 3
Microcontroladores PIC
António Francisco 4
Microcontroladores PIC
1 Nos PIC18, trabalhando com os bytes iniciais do banco 0 (endereços dos GPR) e os bytes finais do banco 15
(endereços dos SFR) não é necessário mudar de banco (access bank seleccionado, a=0).
António Francisco 5
Microcontroladores PIC
Registo Endereço
PORTA 05h e 105h
PORTB 06h e 106h
PORTC 07h e 107h
TRISA 85h e 185h
TRISB 86h e 186h
TRISC 87h e 187h
STATUS 03h, 83h, 103h e 183h
OPTION 81h e 181h
INCON 0Bh, 8Bh, 10Bh e 18Bh
TIMER 0 01h e 101h
Alguns registos mais importantes estão em todos os bancos, permitem o acesso sem
sair do banco onde se está. Tanto faz alterar num como noutro banco, pois são sempre
cópias.
Fisicamente, porto é um registo dentro do microcontrolador que está ligado por condutores
aos terminais do integrado, podendo-se assim aceder ao seu conteúdo ou nele colocar
valores lógicos.
António Francisco 6
Microcontroladores PIC
Os portos são a conexão física do microcontrolador com o mundo exterior. O micro utiliza-os
para observar ou comandar outros componentes ou dispositivos.
Os pinos do PORTA e do PORTB, quando configurados como entradas, podem ser ligados
internamente ao positivo da alimentação através de resistência de pull-up. Estas resistências
são activadas pondo a 0 o bit RABPU (bit 7 do registo OPTION). Estas resistências são
automaticamente desligadas quando os pinos do porto são configurados como saídas.
Para aumentar a sua funcionalidade, os mesmos pinos de um porto podem ter aplicações
distintas, por exemplo, o pino 16 do PIC16F690 pode ser configurado como:
RCO/AN4/C2IN+. Pode ser o bit 0 do porto C, a entrada analógica n.º 4 ou a entrada “+” do
comparador C2. A escolha da função é feita nos registos de configuração.
Para definir um pino como entrada ou como saída, é preciso, em primeiro lugar, escrever no
registo TRIS respectivo o valor lógico 0 ou 1.
Se num bit do registo TRIS for escrito o valor lógico 1, então o correspondente pino do porto
é definido como entrada (1≡Input), se for escrito o valor 0, então o pino é definido como
saída (0≡Output).
Por exemplo, se no registo TRISA for colocada a seguinte palavra: 00001111, os pinos RA0 a
RA3 funcionam entradas e os pinos RA4 e RA5 como saídas.
O registo de estado (STATUS) contém o estado da ALU (bits: C, DC, Z), estado de RESET
(bits: TO e PD) e os bits para selecção do banco de memória (IRP, RP1, RP0).
Sendo a selecção do banco de memória controlada por este registo, ele está presente em
todos os bancos.
Se o registo STATUS for o registo de destino para instruções que afectem os bits Z, DC ou C,
não é possível escrever nestes três bits.
António Francisco 7
Microcontroladores PIC
António Francisco 8
Microcontroladores PIC
* Quando o PIC arranca vai para o Banco 0, como TRISA, TRISB e TRISC estão no banco 1 ou no banco
3, para se aceder a estes registos tem que se configurar o registo STATUS para seleccionar o banco 1
ou o banco 3.
bit 0, bit 1 e bit 2: PS0, PS1 e PS2: Bits de selecção do divisor prescaler
O prescaler e como estes bits afectam o funcionamento do microcontrolador, são abordados
na secção que trata do registo TMR0.
António Francisco 9
Microcontroladores PIC
bit 4 - T0SE: Com o timer0 configurado para contar impulsos externos, aplicados ao pino
RA2/T0CKI, este bit vai determinar quando a contagem irá incidir sobre os impulsos
ascendentes ou descendentes do sinal.
1 = incrementa nos impulsos de flanco descendente no pino RA2/T0CKI
0 = incrementa nos impulsos de flanco ascendente no pino RA2/T0CKI
bit 6 – INTEDG: Se a ocorrência de interrupções estiver habilitada, este bit vai determinar
qual o bordo em que a interrupção no pino RA2/INT vai ocorrer.
1 = flanco ascendente
0 = flanco descendente
bit 7 – RABPU: Este bit introduz ou retira as resistências de pull-up internas, do Porto A e
do Porto B, ligadas ao “+” da alimentação.
1 = resistências de “pull-up” desligadas
0 = resistências de “pull-up” ligadas
bit 0 - RABIF: Bit que informa que houve mudança nos níveis lógicos nos pinos do porto A
ou do porto B; 0 para 1 ou 1 para 0:
1= Pelo menos um destes pinos mudou de nível lógico.
0= Não ocorreu nenhuma variação nestes pinos.
Para que estes pinos detectem as variações, eles devem ser definidos como entradas. Se
António Francisco 10
Microcontroladores PIC
qualquer deles for definido como saída, nenhuma interrupção será gerada quando surgir
uma variação do nível lógico. Se estes pinos forem definidos como entradas, o seu valor
actual é comparado com o valor anterior, que foi guardado quando se fez a leitura anterior
ao porto.
bit 1 - INTF: Bit que informa que houve interrupção externa no pino RA2/INT
1= Ocorreu uma interrupção externa (depois, colocar a 0 na rotina da interrupção para
que a mesma possa ocorrer de novo)
0= Não ocorreu uma interrupção externa
bit 2 – T0IF: Bit que informa que houve interrupção por transbordo do contador de TMR0:
1= Contador mudou a contagem de FFh para 00h (overflow) (depois, colocar a 0 na
rotina da interrupção o bit T0IF para que a interrupção possa ocorrer de novo).
0= Não ocorreu overflow.
De um modo geral, cada fonte de interrupção tem dois bits associados. Um habilita a
interrupção e o outro assinala quando a interrupção ocorre.
Existe um bit comum a todas as interrupções –GIE- que pode ser usado para impedir ou
habilitar todas as interrupções simultaneamente. Este bit é muito útil quando se está a
escrever um programa porque permite que todas as interrupções sejam impedidas durante
um período de tempo, de tal maneira que a execução de uma parte crítica do programa não
possa ser interrompida. Quando a instrução que faz GIE=0 é executada (GIE=0 impede
todas as interrupções) e todas os pedidos de interrupção pendentes, serão ignorados.
As interrupções que estão pendentes e que são ignoradas serão processadas quando o bit
GIE é posto a “1” (GIE=1, todas as interrupções permitidas).
Quando a interrupção é atendida, o bit GIE é posto a “0”, de tal modo que, quaisquer
António Francisco 11
Microcontroladores PIC
ANSEL
ANSEH
O micro PIC16F690 possui vários registos TIMER. Destes, o TIMER0 com o registo TMR0, é o
mais utilizado. Trata-se de um contador/temporizador de 8 bits, daí o seu conteúdo poder
ser incrementado até 255, independentemente da execução do resto do programa.
Funcionando o TIMER0 em modo temporizador, os impulsos são obtidos internamente a
partir do sinal de relógio do micro. Em modo contador os impulsos provêm do exterior
António Francisco 12
Microcontroladores PIC
Uma vez atingido o valor 255 o registo TMR0 volta automaticamente a zero, iniciando nova
contagem. Esta inicia-se em zero e não no valor em que TMR0 tivesse sido originalmente
programado.
A contagem do registo é directamente proporcional à frequência do sinal aplicado à entrada,
sendo, no entanto, possível efectuar a divisão da frequência de entrada através de um
prescaler, conforme se pode verificar, de forma simplificada, nos diagramas de blocos
seguintes:
António Francisco 13
Microcontroladores PIC
Fosc/4 e T0CKI representam as duas possíveis fontes de sinal para o contador TMR0. Fosc/4
é um sinal gerado internamente no PIC pelo circuito de clock. É a frequência de clock
dividida por quatro. T0CKI é o pino do PIC onde pode ser aplicado um sinal de um circuito
externo.
Os blocos T0CS e PSA são comutadores que permitem seleccionar as entradas do sinal. São
programados no registo OPTION com o valor 0 ou 1.
O bloco Prescaler é a designação para a parte do microcontrolador que divide a frequência
de oscilação do clock antes que os respectivos impulsos possam incrementar o
temporizador. O número pelo qual a frequência de clock é dividida está definido nos três
primeiros bits do registo OPTION: PS0, PS1 e PS2. A maior divisão possível é 256. Neste
caso, significa que só após 256 impulsos de clock é que o conteúdo do temporizador é
incrementado de uma unidade. Isto permite-nos medir grandes intervalos de tempo.
Com o PIC a funcionar com um clock de 4 MHz, o prescaler=256 e o TMR0 a contar o valor
máximo (256), o overflow de TMR0 acontece a cada 65,53ms (4/fosc x 256 x 256 =
65,54ms).
Se a interrupção de TMR0 estiver habilitada, sempre que ocorrer o overflow de TMR0
(transição de 255 para 0), o bit T0IF do registo INTCON é colocado a “1”.
Cabe ao programador voltar a colocar a “0” o bit T0IF, na rotina de interrupção, para que
uma nova interrupção possa ser detectada.
O prescaler pode ser atribuído ao temporizador TMR0, ou ao temporizador do watchdog
(WDT), isso é feito através do bit PSA no registo OPTION.
A mudança do prescaler está completamente sob o controle do programador e pode ser
executada enquanto o programa está a correr.
António Francisco 14
Microcontroladores PIC
António Francisco 15
Microcontroladores PIC
A seguir mostra-se um programa que faz piscar um led, ligado no pino RC0, por interrupção
devida ao overflow de TMR0.
António Francisco 16
Microcontroladores PIC
António Francisco 17
Microcontroladores PIC
António Francisco 18
Microcontroladores PIC
Registo que, em conjunto com dois bits do registo CCP1CON, vão determinar o TON
(Pulse Width).
Registo de 8 bits que é carregado com valor que vai afectar o PWM Period.
O tempo que o impulso está no estado “1” TON, é dado pela seguinte expressão:
Obs.
• Para habilitar o sinal PWM, colocar a 1 o bit TMR2ON do registo T2CON;
• Configurar o pino de saída do sinal PWM (RC5), no respectivo registo TRIS, como
saída.
De seguida código de um programa que permite gerar um sinal, no pino RC5, com uma
frequência de 4 kHz e com um duty cycle variável entre 0 e 100%, por alteração do valor do
registo CCPR1L.
António Francisco 19
Microcontroladores PIC
António Francisco 20
Microcontroladores PIC
A EEPROM de DADOS é uma área específica da memória que se destina, na maioria dos
casos, a guardar dados que não se podem perder em caso de falha da tensão de
alimentação do microcontrolador.
Por exemplo, num sistema de alarme, o código de acesso não se pode perder, mesmo em
caso de falta de energia
A memória EEPROM é escrita e lida em condições normais de alimentação e sem ter que
recorrer a programadores suplementares. Todavia, necessita de uma série de procedimentos
próprios para se evitar a eventualidade de se perder dados em condições de funcionamento
anormal do microcontrolador.
Registo onde é colocado o valor a guardar na EEPROM na operação de escrita ou o valor lido
na EEPROM na operação de leitura.
António Francisco 21
Microcontroladores PIC
Bit 7 - EEPGD
1 = Acesso à memória de programa
0 = Acesso a memória de dados EEPPROM
António Francisco 22
Microcontroladores PIC
Notas:
• A sequência obrigatória representa uma espécie de código de acesso à EEPROM e serve
para evitar a escrita acidental em caso de funcionamento anormal do PIC, por exemplo,
em caos de baixa de tensão ou erros de programação. Na prática, escrevem-se os dois
valores hexadecimais 55h e AAh sequencialmente no registo EECON2
• O ciclo de espera criado por “goto $-1” também é possível de programar com interrupção.
• Para escrever um novo valor na mesma célula da EEPROM, basta repetir o processo de
escrita.
António Francisco 23
Microcontroladores PIC
f endereço do registo.
W registo de trabalho (Working register), similar ao acumulador.
b posição de um bit de um registo.
k representa uma constante de 8 bits.
d bit que selecciona o destino onde se guarda o resultado de uma operação. Se d=0, o destino
é W, se d=1 o destino é f (default).
l literal (as constantes são designadas por “literais”. A palavra literal significa “número”.
a bit de acesso à RAM (só para PICs 18F):
a=0 (valor por defeito): Access Bank;
a=1: Acesso via BSR.
António Francisco 24
Microcontroladores PIC
7. SET DE INSTRUÇÕES(1)
António Francisco 25
Microcontroladores PIC
SET DE INSTRUÇÕES(2)
1 Se o porto de entrada/saída for o operando origem, é lido o estado dos pinos do microcontrolador.
2 Se esta instrução for executada no registo TMR0 e se d=1, o prescaler atribuído a esse
temporizador é automaticamente limpo.
3 Se o PC for modificado ou se resultado do teste for verdadeiro, a instrução é executada em dois
ciclos.
António Francisco 26
Microcontroladores PIC
8.1. DIRECTIVAS
As directivas não são instruções que o compilador traduza no respectivo opcode. Trata-se de
informações enviadas ao compilador, para executar determinados procedimentos, durante a
compilação. As mais utilizadas são as seguintes:
processor PIC16F690
Trata-se de uma directiva para o compilador assembler que informa para que tipo de PIC o
programa é escrito.
list p=PIC16F690
Idêntica a “processor PIC16F690”, identifica o microcontrolador utilizado.
#include P16F690
Esta directiva faz com que um ficheiro com os endereços dos registos SFR e o nome dos bits
do PIC utilizado possa ser utilizado pelo compilador, evitando-se assim a escrita dessa
informação no programa.
__config
Esta directiva permite configurar os “Configuration Bits” do PIC. Trata-se de bits que
determinam o modo de funcionamento do micro, por exemplo, tipo de oscilador,
watchdog, etc.
Oscillator – permite escolher o tipo de clock com que o micro funciona
Power Up Timer – quando o micro é ligado fica em estado de reset vários ms
Master Clear Enable - pino do micro utilizado como entrada de reset ou de input
Brown Out Detect – se ocorrer uma queda de tensão o micro “reseta”
Watchdog Timer – cão de guarda, destina-se a evitar a paragem do programa
Low Voltage Program – gravação sem necessidade de tensão >5V no pino Vpp
Code Protect – não permite ler o código de programa gravado no micro
Data EE Read Protect – protecção contra leitura na memória EEPROM
Internal External Switch Over Mode – condições de funcionamento, na inicialização,
do clock interno/externo
Monitor Clock Fail-Safe - caso haja uma falha do clock externo, liga automaticamente
o clock interno.
Os Configuration Bits estão mapeados na memória programa, endereço 2007h, fora do
programa do utilizador, e só são acedidos durante a programação do micro.
radix dec
Directiva que informa o compilador que a numeração utilizada no programa seria, no caso,
decimal. Caso a directiva “radix” não seja utilizada, a numeração, por defeito, é
hexadecimal.
equ
Directiva que é normalmente utilizada para atribuir nomes, facilmente identificáveis, a
variáveis utilizadas no programa.
#define
Directiva usada, nomeadamente, para atribuir nomes, facilmente identificáveis a bits
utilizados no programa.
Utilizando-se as directivas “equ” e “#define”, o programa torna-se mais legível, facilitando a
sua compreensão e entendimento. Também, por alteração destas, numa única linha do
programa, se afecta todo o programa.
org
“org” significa origem, sendo esta directiva utilizada para definir o endereço da memória de
programa onde a linha de código que lhe está após é escrita.
António Francisco 27
Microcontroladores PIC
banksel
Directiva que possibilita a selecção do banco de memória. Afecta os bits RP1 e RP0
atribuindo-lhe valores que permitem seleccionar o banco de memória em que se encontra o
registo indicado por banksel.
end
No fim do programa é necessário colocar a directiva “end” para que o tradutor assembly
saiba que não existem mais instruções no programa.
8.2. INSTRUÇÕES
São as ordens que o microcontrolador recebe para realizar uma determinada tarefa. São
escritas com recurso a um conjunto de palavras reservadas (mnemónicas) e a operandos.
Cada família de microcontroladores tem o seu próprio conjunto de instruções.
8.4. COMENTÁRIOS
Texto que o programador escreve no programa com a finalidade de informar sobre o
funcionamento do mesmo. Os comentários iniciam-se com ponto e vírgula ";", não fazendo
os mesmos parte do código do programa.
António Francisco 28
Microcontroladores PIC
10.1. EDITOR
Utilizando-se o MPLAB IDE faz-se uso do seu próprio editor para escrever o programa. Este é
escrito em linguagem Assembly (através de mnemónicas), dando origem a um ficheiro com
extensão *.asm (ficheiro fonte).
O ficheiro fonte é um programa constituído por um conjunto de instruções, organizadas de
acordo com regras próprias e com uma determinada ordem. Ou seja, uma sequência de
código organizada de forma a resolver um determinado problema.
O programa também pode ser escrito em linguagem Basic (linguagem semelhante ao inglês
mas mais fácil de ler e escrever que a linguagem Assembly). Neste caso, cria-se um ficheiro
com extensão *.bas.
Também, o programa pode ser escrito noutra linguagem, por exemplo, linguagem C.
Atenção! O caminho para esta pasta não pode possuir mais de 62 caracteres.
Notas:
1. A linguagem Basic é de compreensão mais fácil que a linguagem Assembly, no entanto,
gasta mais código.
A linguagem Assembly, mesmo utilizando mnemónicas, torna-se uma linguagem
compreensível por humanos. Caso se programasse em linguagem máquina, que utiliza
apenas 0 e 1, a escrita e o entendimento do programa seria uma tarefa deveras difícil.
2. Quando se liga a alimentação ou ocorre um reset, o contador de programa (PC) aponta à
direcção 00h e o micro inicia-se a partir daí. Por esta razão, no endereço 00h deve-se
escrever tudo o que tenha a ver com a inicialização do programa (por ex. configuração dos
SFRs).
Se ocorrer uma interrupção, o contador do programa aponta à direcção 04h e inicia-se a
partir desta direcção.
António Francisco 29
Microcontroladores PIC
10.2. ASSEMBLADOR/COMPILADOR
Para além do ficheiro com extensão “.asm”, o MPLAB necessita de um segundo ficheiro, com
extensão “.inc”. O mesmo é acedido através da instrução “#include P16F690.INC” do
programa. Este ficheiro contém informações relativas ao tipo de PIC utilizado. Caso não se
forneça este ficheiro, será necessário indicar-se no programa os endereços dos registos e
dos bits utilizados.
Durante a compilação do programa, o compilador gera um conjunto de arquivos com nome
idêntico ao programa fonte mas com extensões diferentes:
10.3. SIMULADOR
António Francisco 30
Microcontroladores PIC
Animate: Ícone
Executa as instruções do programa de forma visível. A velocidade de execução é
seleccionada em Debugger > Settings > Animation. A gama é de 0 a 20.000 ms.
Reset: Ícone
Inicializa o programa.
10.4. GRAVADOR
Nota:
O PICkit2 não grava os micros PIC mais antigos.
António Francisco 31
Microcontroladores PIC
Gravador PICkit2
António Francisco 32