Sei sulla pagina 1di 30

Introdução ao microcontrolador PIC: Portas de

E/S

Objetivos
• Apresentar a estrutura de um microcontrolador PIC;
• Apresentar o conjunto de instruções do microcontrolador PIC;
• Compreender como os registradores de configuração afetam o funcionamento do
microcontrolar PIC;

INTRODUÇÃO
O PIC pertence a uma classe de microcontroladores de 8 bits, com uma arquitetura RISC.
Os blocos básicos de uma estrutura genérica do PIC são:
MEMÓRIA DE PROGRAMA (FLASH): Para armazenar as rotinas de programa.
Como a memória FLASH pode ser programada e limpa mais que uma vez. ela torna-se
adequada para o desenvolvimento de dispositivos.
• EEPROM: Memória dos dados que necessitam ser mantidos quando a alimentação
é desligada.

• RAM: Memória de dados usada por um programa, durante a sua execução.


Na RAM, são guardados todos os resultados intermédios ou dados temporários
durante a execução do programa e que não são cruciais para o dispositivo, depois de
ocorrer uma falha na alimentação.

• PORTAS DE E/S: São ligações físicas entre o microcontrolador e o mundo


exterior.

• CONTADOR/TEMPORIZADOR: São registros de 8 bits no interior do


microcontrolador que trabalham independentemente do programa. No fim de cada
conjunto de quatro ciclos de relógio do oscilador, ele incrementa o valor
armazenado.

• UNIDADE DE PROCESSAMENTO CENTRAL: Faz a conexão com todos os


outros blocos do microcontrolador. Ele coordena o trabalho dos outros blocos
durante a execução do programa.
PORTA A PORTA B

Esquema de um microcontrolador PIC com duas portas de E/S

Arquiteturas Harvard versus Von Neumann

A diferença principal entre microcontroladores e microprocessadores é a sua


funcionalidade. Para que um microprocessador possa ser usado, outros componentes devem
ser adicionados ao circuito, tais como, memória e componentes para receber e enviar dados.
O microcontrolador foi projetado para ter tudo em só dispositivo, podendo operar sem
outros componentes externos.

Outro aspecto que pode diferenciar microcontroladores e microprocessadores é a sua


arquitetura. Os microcontroladores PIC apresentam uma arquitetura Harvard, onde a
memória de dados está separada da memória de programa. Assim, é possível um acesso
concorrente as duas memórias e assim, obter uma maior velocidade de funcionamento. A
separação da memória de dados da memória de programa, faz com que as instruções
possam ser representadas por palavras de mais que 8 bits. O PIC16F877, usa 14 bits para
cada instrução, o que permite que todas as instruções ocupem uma só palavra de instrução.
É também típico da arquitetura Harvard ter um conjunto reduzido de instruções, geralmente
executadas em apenas um ciclo de máquina. No caso do PIC 16F877 este conjunto é
formado por apenas 35 instruções. Esta característica lhe rende também a designação de
dispositivo RISC (Reduced Instruction Set Computer). Todas as instruções são executadas
num único ciclo de máquina, exceto no caso de instruções de salto e de ramificação.
Estrutura do PIC 16F877

Memória flash para instruções (program memory) com 14 bits/palavra (cada instrução do
PIC16F8X tem 14 bits!);
• 8K x 14 bits de memória flash;
• 368 x 8 bits de4 memória RAM;
• 256 x 8 bits de memória EEPROM;
• Pilha implementada por hardware com 8 níveis (até 8 chamadas de rotinas
aninhadas)
• 5 Portas de E/S;
• 14 fontes de interrupção (internas e externas);
• Dois módulos de Captura/Comparação/PWM;
• Conversor A/D de 10 bits com entradas multiplexadas;
• Porta serial síncrona com SPI (master mode) e I2C (master/slave);
• USART/SCI;
• Porta paralela com 8 bits de dados e sinais de controle externos (RD, WR e CS);
• Timer/Counter programável e um Watchdog Timer embutidos, este com seu
próprio oscilador, para aplicações de Tempo Real críticas;
• Recursos de hardware para proteção de código, modo de operação com baixo
consumo de energia (sleep), programação "in-circuit", alta corrente de saída para
LEDs (25 mA), power-on-reset, power-up timer, etc

Relógio / Ciclo de instrução


O relógio (clock), que determina a freqüência de operação do PIC é dividido internamente
em quatro fases, Q1, Q2, Q3 e Q4 que não se sobrepõem. Estas quatro fases compõem um
ciclo de instrução (também chamado ciclo de máquina), durante o qual uma instrução é
executada.
A execução de uma instrução, é antecedida pela extração da instrução que está na linha
seguinte. O código da instrução é extraído da memória de programa em Q1 e é escrito no
registro de instrução em Q4. A decodificação e execução dessa mesma instrução, fazem-se
entre as fases Q1 e Q4 seguintes. No diagrama abaixo, pode-se observar a relação entre o
ciclo de instrução e o clock do oscilador (OSC1) assim como as fases Q1-Q4.
O contador de programa (Program Counter ou PC) guarda o endereço da próxima instrução
a ser executada.
Cada ciclo de instrução inclui as fases Q1, Q2, Q3 e Q4. A extração do código de uma
instrução da memória de programa, é feita num ciclo de instrução, enquanto que a sua
decodificação e execução, são feitos no ciclo de instrução seguinte. Contudo, devido à
sobreposição – pipelining (o microcontrolador ao mesmo tempo em que executa uma
instrução extrai simultaneamente da memória o código da instrução seguinte), pode-se
considerar que, para efeitos práticos, cada instrução demora um ciclo de instrução para ser
executada. No entanto, se a instrução provocar uma mudança no conteúdo do contador de
programa (PC), ou seja, se o PC não tiver que apontar para o endereço seguinte na memória
de programa, mas sim para outro (como no caso de saltos ou de chamadas de subrotinas),
então deverá considerar-se que a execução desta instrução demora dois ciclos. Isto
acontece, porque a instrução vai ter que ser processada de novo, mas, desta vez, a partir do
endereço correto. O ciclo de chamada começa na fase Q1, escrevendo a instrução no
registro de instrução (Instruction Register – IR). A decodificação e execução continuam nas
fases Q2, Q3 e Q4 do clock.

Fluxograma das Instruções no Pipeline

TCY0: É lido da memória o código da instrução MOVLW 55h;


TCY1: É executada a instrução MOVLW 55h e é lida da memória a instrução MOVWF
PORTB;
TCY2: É executada a instrução MOVWF PORTB e lida a instrução CALL SUB_1;
TCY3: É executada a chamada (call) de um subprograma CALL SUB_1 e é lida a
instrução BSF PORTA,BIT3. Como esta instrução não é a próxima instrução a ser
executada (primeira instrução do subprograma SUB_1), a leitura de uma instrução tem que
ser feita de novo. Este é um exemplo de uma instrução que precisa de mais que um ciclo.
TCY4: este ciclo de instrução é totalmente usado para ler a primeira instrução do
subprograma no endereço SUB_1;
TCY5: É executada a primeira instrução do subprograma SUB_1 e lida a instrução
seguinte.

Unidade Central de Processamento


A unidade central de processamento (CPU) é o cérebro do microcontrolador. Essa parte é
responsável por extrair a instrução da memória de programa, decodificar essa instrução e
executá-la.

Registros

Direto
Indireto
Registro

Registro

Esquema da unidade central de processamento – CPU

A principal função da unidade central de processamento é a de decodificar as instruções do


programa. A cada uma das instruções do conjunto do microcontrolador, corresponde um
conjunto de ações para a implementação da instrução. Estas ações podem envolver
transferências de dados de um local de memória para outro, de um local de memória para as
portas, e diversos cálculos.

Unidade Lógica e Aritmética (ULA)


A ULA do PIC possui 8 bits de largura e um único acumulador denominado w (“working
register”). Ela faz operações aritméticas de soma e subtração (em 2- complemento) e
operações lógicas como rotate, and, or, xor etc.

Nas operações lógicas e aritméticas com 2 operandos, o acumulador w é sempre um dos


operandos e qualquer um dos 80 registradores f pode ser o 2º operando (ou uma
constante de 8 bits ou literal, codificada na própria instrução).
Instruções lógico/aritméticas com um só operando (por exemplo inc, dec, clr, com, bit set,
etc) tomam como operando ou o acumulador w ou um registrador f.

As instruções lógicas e aritméticas podem atualizar os bits Z (zero) , C (carry) e DC (digit


carry) do registrador de estado (f = 03).
Uma característica interessante das instruções com dois operandos envolvendo w e um
registrador f é que um bit na instrução permite escolher se o resultado vai para o
acumulador w (bit= 0) ou para o registrador f (bit = 1), permitindo algumas operações
pouco convencionais como: f - w => w.

Nos mnemônicos das instruções do PIC o destino do resultado é designado genericamente


pela letra d e especificamente pelas letras f ou w (é conveniente, portanto, definir nos
programas em assembler duas constantes w e f com as diretivas: w equ 0 e f equ 1). Por
exemplo: a instrução movf f, w move o conteúdo de um registrador genérico f para o
acumulador w, a instrução movwf f move o conteúdo do acumulador w para um
registrador genérico f e a instrução movlw k move uma constante k para w.

Obs: Existem dois paradigmas largamente utilizados para codificação simbólica de


instruções com dois operandos: o paradigma da Intel, onde uma instrução genérica do tipo:
opr dest, source significa: dest <= dest opr source
(interprete o símbolo <= como "recebe" e opr como a operação feita pela instrução)

e o paradigma do minicomputador PDP11 e seus seguidores como os microprocessadores


Motorola MCHC11 e MC68000, onde uma instrução do tipo:

opr source, dest significa: source opr dest => dest


( interprete o símbolo => como "vai para" )

O PIC 16F8X adota o paradigma do PDP11, porém de forma não ortogonal como pode ser
notado claramente nas 3 instruções vistas anteriormente.

Unidade lógica-aritmética
Diagrama de blocos do PIC 16F877
Registradores “f” especiais (SFR - Special File Registers)
Os registradores f de número 0 a 0xb são especiais, mas podem ser (na sua maioria)
lidos/alterados por qualquer instrução envolvendo um registrador f. Alguns refletem o
estado da CPU e são particularmente importantes para o programador assembler:

Registrador STATUS

Bit 0 C (Carry) Transporte: Este bit é afetado pelas operações de adição, subtração e
deslocamento. É setado (assume o valor 1), quando na subtração X – Y, X é menor que Y e
é resetado (assume o valor 0), quando na subtração X-Y, X é maior que Y.
1= Ocorreu um transporte no bit mais significativo
0= Não ocorreu transporte no bit mais significativo
O bit C é afetado pelas instruções ADDWF, ADDLW, SUBLW e SUBWF.

Bit 1 DC (Digit Carry) Transporte de dígito: Este bit é afetado pelas operações de adição e
subtração. Ao contrário do anterior, DC assinala um transporte do bit 3 para o bit 4 do
resultado. Este bit recebe o valor ‘1’, quando na subtração X – Y, X é menor que Y e
recebe o valor ‘0’, quando na subtração X-Y, X é maior que Y.
1= Ocorreu um transporte no quarto bit mais significativo
0= Não ocorreu transporte nesse bit
O bit DC é afetado pelas instruções ADDWF, ADDLW, SUBLW e SUBWF.

Bit 2 Z (bit Zero) Indicação de resultado igual a zero: Este bit recebe o valor ‘1’ quando o
resultado da operação lógica ou aritmética executada é igual a 0.
1= resultado igual a zero
0= resultado diferente de zero

Bit 3 PD (Bit de queda de tensão – Power Down): Este bit recebe ‘1’ quando o
microcontrolador é alimentado e começa a trabalhar, depois de um reset normal e depois da
execução da instrução CLRWDT. A instrução SLEEP põe este bit em ‘0’ ou seja, quando o
microcontrolador entra no regime de baixo consumo / pouco trabalho. Este bit pode
também ser setado (assume o valor 1), no caso de ocorrer um impulso no pino RB0/INT,
uma variação nos quatro bits mais significativos da porta B, ou quando é concluída uma
operação de escrita na DATA EEPROM ou ainda pelo watchdog.
1 = depois de ter sido ligada a alimentação
0 = depois da execução de uma instrução SLEEP

Bit 4 TO (Time-out - transbordo do Watchdog): Este bit recebe ‘1’, depois da alimentação
ser ligada e depois da execução das instruções CLRWDT e SLEEP. O bit recebe ‘0’ quando
o watchdog consegue chegar ao fim da sua contagem (overflow = transbordar), o que indica
que qualquer coisa não esteve bem.
1 = não ocorreu transbordo
0 = ocorreu transbordo

bits 5 e 6 RP1:RP0 (bits de seleção de banco de registros): Estes dois bits são a parte mais
significativa do endereço utilizado para endereçamento direto. Como as instruções que
endereçam diretamente a memória dispõem somente de sete bits, é preciso mais um ou dois
bits para poder endereçar todos os registros (memória RAM) do PIC16F8X.
11 = banco de registros 3
10 = banco de registros 2
01 = banco de registros 1
00 = banco de registros 0

Bit 7 IRP (Bit de seleção de banco de registros):Este bit é utilizado no endereçamento


indireto da RAM interna, como oitavo bit 1 = bancos 2 e 3 0 = bancos 0 e 1 (endereços de
00h a FFh)

O registro de estado (STATUS), contém o estado da ALU (C, DC, Z), estado de RESET
(TO, PD) e os bits para seleção do banco de memória (IRP, RP1, RP0). Considerando que a
seleção do banco de memória é controlada através deste registro, ele tem que estar presente
em todos os bancos.

Registrador OPTION

Bits 0 a 2 PS0, PS1, PS2 (bits de seleção do divisor Prescaler): Estes três bits definem o
fator de divisão do prescaler.

Bit 3 PSA (Bit de Atribuição do Prescaler): Bit que atribui o prescaler ao TMR0 ou ao
watchdog.
1 = prescaler atribuído ao watchdog
0 = prescaler atribuído ao temporizador TMR0
Bit 4 T0SE (bit de seleção de borda ativa em TMR0): Se for permitido aplicar impulsos em
TMR0, a partir do pino RA4/TOCK1, este bit determina se os impulsos ativos são os
impulsos ascendentes ou os impulsos descendentes.
1 = Borda descendente
0 = Borda ascendente

Bit 5 TOCS (bit de seleção de fonte de clock em TMR0): Este pino escolhe a fonte de
impulsos que vai ser ligada ao temporizador. Esta fonte pode ser o clock do
microcontrolador (freqüência de clock a dividir por 4) ou impulsos externos no pino
RA4/TOCKI.
1 = impulsos externos
0 = ¼ do clock interno

Bit 6 INDEDG (bit de seleção de borda de interrupção): Se esta interrupção estiver


habilitada, é possível definir a borda que vai ativar a interrupção no pino RB0/INT.
1 = borda ascendente
0 = borda descendente

Bit 7 RBPU (Habilitação dos resistores de pull-up nos bits da porta B): Este bit introduz ou
retira as resistências internas de pull-up da porta B.
1 = resistências de “pull-up” desligadas
0 = resistências de “pull-up” ligadas

Organização da Memória
O PIC16F877 tem dois blocos de memória separados, um para dados e o outro para o
programa. A memória EEPROM e os registros de uso genérico (GPR) na memória RAM
constituem o bloco para dados e a memória FLASH constitui o bloco de programa.

Memória de programa
A memória de programa é implementada usando tecnologia FLASH, o que torna possível
programar o microcontrolador muitas vezes antes de se obter a versão definitiva do
programa. No PIC 16F877 o tamanho da memória de programa é de 8192 endereços de
palavras de 14 bits, destes, os endereços zero e quatro estão reservados respectivamente
para o reset e para o vetor de interrupção.

Memória de dados
A memória de dados compreende memória EEPROM e memória RAM. A memória
EEPROM consiste em 256 posições para palavras de oito bits. A memória EEPROM não
faz parte diretamente do espaço de memória mas é acessada indiretamente através dos
registros EEADR e EEDATA. Como a memória EEPROM serve em geral para armazenar
dados que devem ser mantidos mesmo após o desligamento do sistema onde o
microcontrolador está inserido, existe um procedimento específico para escrever na
EEPROM que tem que ser seguido de modo a evitar uma escrita acidental. A memória
RAM para dados, ocupa um espaço no mapa de memória que varia de acordo com o banco
de memória usado, conforme indicado na tabela abaixo
Banco Faixa de endereços da RAM
0 0x20 a 0x7F
1 0xA0 a 0xEF
2 0x110 a 0x16F
3 0x190 a 0x1F0

Os locais da memória RAM são também chamados registros GPR (General Purpose
Registers = Registros de uso geral). Os registros GPR podem ser acessados sem referenciar
o banco de memória em que o mesmo se encontra.

Registros SFR
Os registros que ocupam 12 primeiras localizações nos bancos 0 a 4 são registros especiais
e têm a ver com a manipulação de certos blocos do microcontrolador. Estes registros são os
SFR (Special Function Registers ou Registros de Funções Especiais).
Mapa de Registros do PIC 16F877
Contador de Programa
O contador de programa (PC = Program Counter), é um registro de 13 bits que contém o
endereço da instrução que vai ser executada.

Pilha
O PIC16F877 tem uma pilha (stack) de 13 bits e 8 níveis de profundidade, o que
corresponde a 8 locais de memória com 13 bits de largura. O seu papel básico é guardar o
valor do contador de programa quando ocorre um salto do programa principal para o
endereço de um subprograma a ser executado. Depois de ter executado o subprograma, para
que o microcontrolador possa continuar com o programa principal a partir do ponto em que
o deixou, ele tem que buscar na pilha esse endereço e carregá-lo no contador de programa.
Quando ocorre o desvio de um programa para um subprograma, o conteúdo do contador de
programa é salvo na da pilha (um exemplo disto é a instrução CALL). Quando são
executadas instruções tais como RETURN, RETLW ou RETFIE no fim de um
subprograma, o contador de programa é retirado da pilha, de modo que o programa possa
continuar a partir do ponto em que a seqüência foi interrompida. Estas operações de colocar
e extrair da pilha o contador de programa, são designadas por PUSH (colocar na pilha) e
POP (retirar da pilha), estes dois nomes provêm de instruções com estas designações,
existentes em alguns microcontroladores de maior porte.

Programação no Sistema
Para programar a memória de programa, o microcontrolador tem que entrar num modo
especial de funcionamento no qual o pino MCLR é posto a 13,5V e a voltagem da
alimentação Vdd deve permanecer estável entre 4,5V e 5,5V. A memória de programa pode
ser programada em série, usando dois pinos ‘data/clock’ que devem ser previamente
separados do dispositivo em que o microcontrolador está inserido, de modo que não
possam ocorrer erros durante a programação.

Modos de endereçamento
Os locais da memória RAM podem ser acessados direta ou indiretamente.

Endereçamento Direto
O endereçamento direto é feito através de um endereço de 9 bits. Este endereço é obtido
juntando aos sete bits do endereço direto de uma instrução, mais dois bits (RP1 e RP0) do
registro STATUS, como pode ser visto na figura que se segue. Qualquer acesso aos
registros especiais (SFR), pode ser um exemplo de endereçamento direto.

Bsf STATUS, RP0 :banco 0


movlw 0xFF :w = 0xFF
movwf TRISA :o endereço do registro TRISA é retirado do código
da instrução movwf TRISA
Registro

Seleção de Banco

Seleção de Registro

Endereçamento Direto

Endereçamento Indireto
O endereçamento indireto, não retira um endereço do código da instrução. O endereço é
obtido com a ajuda do bit IRP do registro STATUS e do registro FSR. O local endereçado é
acessado através do registro INDF e coincide com o endereço contido em FSR (qualquer
instrução que use INDF como registro, na realidade acessa os dados apontados pelo registro
FSR). Por exemplo, considere que o registro de uso genérico de endereço 0Fh contém o
valor 20. Escrevendo o valor 0Fh no registro FSR, obtém-se um ponteiro para o registro
0Fh e, ao ler o registro INDF, obtém-se o valor 20, o que significa que foi lido o conteúdo
do registro 0Fh, sem o mencionar explicitamente (mas através de FSR e INDF).
Registro

Registro FSR

Seleção de Banco

Seleção de Registro

Endereçamento Indireto
Interrupções
As interrupções são um mecanismo que o microcontrolador possui e que torna possível
responder a alguns eventos no momento em que eles ocorrem. Geralmente, cada
interrupção muda a direção de execução do programa, suspendendo a sua execução,
enquanto o microcontrolador executa um subprograma que é a rotina de atendimento de
interrupção. Depois deste subprograma ter sido executado, o microcontrolador continua
com o programa principal, a partir do local em que o tinha abandonado.

Programa
sendo
executado

Interrupção externa e seqüência de desvios para atendimento da interrupção e retorno ao


programa principal.

O registro que controla as interrupções é chamado INTCON e tem o endereço 0Bh. O papel
do INTCON é permitir ou impedir as interrupções e, mesmo no caso de elas não serem
permitidas, ele registra os pedidos de interrupção, mudando o valor de alguns dos seus bits.

Registrador INTCON

Bit 0 RBIF (flag que indica variação na porta B): Bit que informa que houve mudança nos
níveis lógicos nos pinos 4, 5, 6 e 7 da porta B.
1= pelo menos um destes pinos mudou de nível lógico
0= não ocorreu nenhuma variação nestes pinos

Bit 1 INTF (flag de interrupção externa INT): Ocorrência de uma interrupção externa
1= ocorreu uma interrupção externa
0= não ocorreu uma interrupção externa

Se uma transição ascendente ou descendente for detectada no pino RB0/INT, o bit INTF
ajustado para ‘1’ (o tipo de sensibilidade, ascendente ou descendente é definida através do
bit INTEDG do registro OPTION). O subprograma de atendimento desta interrupção, deve
resetar este bit, afim de que a próxima interrupção possa ser detectada.

Bit 2 TOIF (Flag de interrupção por transbordo de TMR0): O contador TMR0,


transbordou.
1= o contador mudou a contagem de FFh para 00h
0= o contador não transbordou
Para que esta interrupção seja detectada, o programa deve resetar este bit.

Bit 3 RBIE (bit de habilitação de interrupção por variação na porta B): Habilitação da
interrupção por variação dos níveis lógicos nos pinos 4, 5, 6 e 7 da porta B.
1= habilita a interrupção por variação dos níveis lógicos
0= inibe a interrupção por variação dos níveis lógicos
A interrupção só pode ocorrer se RBIE e RBIF estiverem simultaneamente em ‘1’ lógico.

Bit 4 INTE (bit de habilitação da interrupção externa INT): Bit que habilita uma
interrupção externa no bit RB0/INT.
1= interrupção externa habilitada
0= interrupção externa desabilitada
A interrupção só pode ocorrer se INTE e INTF estiverem simultaneamente em‘1’ lógico.

Bit 5 TOIE (bit de habilitação de interrupção por transbordo de TMR0): Bit que habilita a
interrupção por transbordo do contador TMR0.
1= interrupção habilitada
0= interrupção desabilitada
A interrupção só pode ocorrer se TOIE e TOIF estiverem simultaneamente em ‘1’ lógico.

Bit 6 PEIE (bit de habilitação de interrupção dos periféricos): Bit que habilita as
interrupções geradas pelos periféricos.
1= habilita todas as interrupções dos periféricos
0= desabilita todas as interrupções dos periféricos
Se EEIE e EEIF (que pertence ao registro EECON1) estiverem simultaneamente em ‘1’, a
interrupção pode ocorrer.

Bit 7 GIE (bit de habilitação global de interrupção): Bit que habilita ou desabilita todas as
interrupções.
1= todas as interrupções são permitidas
0= todas as interrupções impedidas
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 chamado GIE que pode ser usado para desabilitar ou habilitar todas as
interrupções, simultaneamente. Este bit é muito útil quando se está escrevendo um
programa porque permite que todas as interrupções sejam impedidas durante um período de
tempo, 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), todos os pedidos de interrupção pendentes, serão ignorados.

Memória de dados EEPROM


O PIC16F877 tem 256 bytes de localizações de memória EEPROM, correspondentes aos
endereços de 00h a FFh e onde podemos ler e escrever. A característica mais importante
desta memória é de não perder o seu conteúdo quando a alimentação é desligada. Na
prática, isso significa que os dados escritos permanecem no microcontrolador, mesmo
quando a alimentação é desligada. Sem alimentação, estes dados permanecem no
microcontrolador durante mais de 40 anos (especificações do fabricante do
microcontrolador PIC), além disso, esta memória suporta até 10000 operações de escrita.

A memória EEPROM é colocada num espaço de memória especial e pode ser acessada
através dos registros especiais:
• EEDATA (endereço 10Ch): Contém o byte menos significativo do dado de 14 bits a
ser lido/escrito na EEPROM;
• EEDATAH (endereço 10Eh): Contém o byte mais significativo do dado de 14 bits a
ser lido/escrito na EEPROM;
• EEADR (endereço 10Dh): Contém o byte menos significativo do endereço de 13
bits da posição de memória da EEPROM a ser lida/escrita;
• EEADRH (endereço 10Fh): Contém o byte mais significativo do endereço de 13
bits da posição de memória da EEPROM a ser lida/escrita;
• EECON1 (endereço 18Ch): Registrador de controle de acesso a memória EEPROM;
• EECON2 (endereço 18Dh): Este registro não existe fisicamente e serve para
proteger a EEPROM de uma escrita acidental.

O registro EECON1 ocupa o endereço 18Ch e é um registro de controle com cinco bits
implementados.
Os bits 4, 5 e 6 não são usados e, se forem lidos, são sempre iguais a zero.
Os bits do registro EECON1, devem ser interpretados do modo que se segue.

Bit 0 RD (bit de controle de leitura): Ao setar este bit (Bit 0 = 1), tem início a transferência
do dado do endereço definido em EEADRH:EEADR para o registro EEDATAH:EEDATA.
Como o tempo não é essencial, tanto na leitura como na escrita, o dado de EEDATAH:
EEDATA pode já ser usado na instrução seguinte.
1 = inicia a leitura
0 = não inicia a leitura
Este bit é resetado, (Bit 0 = 0) por hardware uma vez que a escrita tenha terminado.

Bit 1 WR (bit de controle de escrita): Ao setar este bit ( Bit 1 = 1), tem início a escrita do
dado a partir do registro EEDATAH:EEDATA para o endereço especificado no registro
EEADRH:EEADR.
1 = inicia a escrita
0 = não inicia a escrita
Este bit é resetado, (Bit 1 = 0) por hardware uma vez que a escrita tenha terminado.

Bit 2 WREN (bit de habilitação de escrita na EEPROM): Permite a escrita na EEPROM.


Se este bit não estiver em um lógico, o microcontrolador não permite a escrita na
EEPROM.
1 = a escrita é permitida
0 = não se pode escrever

Bit 3 WRERR (Erro de escrita na EEPROM): Erro durante a escrita na EEPROM


Este bit é setado (Bit 3 = 1) quando a escrita na EEPROM for interrompida por um sinal de
reset ou por um transbordo no temporizador do watchdog (no caso deste estar ativo).
1 = ocorreu um erro
0 = não houve erros

Bit 7 EEPGD (Bit que indica acesso a memória de programa (FLASH) ou a memória de
dados EEPROM)
1 = Acesso a memória de programa (FLASH)
0 = Acesso a memória de dados (EEPROM)

Portas de E/S
Alguns pinos das portas de E/S são multiplexados com uma função alternativa de um
periférico do microcontrolador. Em geral, quando o periférico é habilitado este pino não
pode ser utilizado como um pino de E/S de propósito geral.

Porta A e o registrador TRISA


A porta A é uma porta de E/S bidirecional de 6 bits de largura. A direção que os pinos
assumem (entrada ou saída) é determinada pelos bits do registrador TRISA, setando um bit
de TRISA, faz com que o correspondente pino da porta funcione como entrada. Resetando
o bit, o respectivo pino funciona como saída. Uma operação de leitura da porta, lê o valor
dos pinos, enquanto em uma escrita o dado é copiado para o “latch” da porta.

O pino RA4 é multiplexado com a entrada de clock do módulo Timer0 (pino RA4/T0CKI).
Outros pinos da porta A são multiplexados com entradas analógicas e entradas analógicas
VREF. A operação de cada pino é selecionada setando/resetando os bits de controle no
registrador ADCON1 (A/D Control Register1). O registrador TRISA controla a direção
dos pinos da porta A mesmo quando eles são usados como entradas analógicas, neste caso
os respectivos bits do TRISA devem estar setados.

EXEMPLO: Inicialização da porta A


BCF STATUS, RP0 ;
BCF STATUS, RP1 ; Bank0
CLRF PORTA ; Initialize PORTA by clearing output data latches
BSF STATUS, RP0 ; Select Bank 1
MOVLW 0x06 ; Configure all pins
MOVWF ADCON1 ; as digital inputs
MOVLW 0xCF ; Value used to initialize data direction
MOVWF TRISA ; Set RA<3:0> as inputs; RA<5:4> as outputs; TRISA<7:6> are always;
read as ’0’.

Tabela: Funções dos pinos da porta A

Resumo dos registradores associados a porta A

Porta B e o registrador TRISB


A porta B é uma porta de E/S bidirecional de 8 bits de largura. A direção que os pinos
assumem (entrada ou saída) é determinada pelos bits do registrador TRISB, setando um bit
de TRISB, faz com que o correspondente pino da porta funcione como entrada. Resetando
o bit, o respectivo pino funciona como saída. Uma operação de leitura da porta, lê o valor
dos pinos, enquanto em uma escrita o dado é copiado para o “latch” da porta.

Três pinos da porta B são multiplexados com a função de Programação em Baixa Tensão
(RB3/PGM, RB6/PGC e RB7/PGD). Cada pino da porta B pode ser ajustado para funcionar
com um resistor de pull-up. O bit RBPU (OPTION_REG<7>) controla esta configuração,
quando resetado ativa os resistores de pull-up.

Os pinos de RB7 a RB4 podem gerar interrupções quando configurados como pinos de
entrada. Os valores dos pinos são comparados com o valor da última leitura destes pinos,
gravada no latch. As diferenças dos quatro pinos passa por uma operação lógica OU, para
gerar a interrupção “RB Port Change” e ajustar o respectivo bit de flag RBIF (Bit 0 do
registrador INTCON). RB0/INT pode ser configurado também como um pino de
interrupção. A borda que identifica a interrupção é configurada a partir do bit INTEDG (bit
6) do registrador OPTION.

Tabela: Funções dos pinos da porta B

Resumo dos registradores associados a porta B

Porta C e o registrador TRISC


A porta C é uma porta de E/S bidirecional de 8 bits de largura. A direção que os pinos
assumem (entrada ou saída) é determinada pelos bits do registrador TRISC, setando um bit
de TRISC faz com que o correspondente pino da porta funcione como entrada. Resetando o
bit, o respectivo pino funciona como saída. Uma operação de leitura da porta, lê o valor dos
pinos, enquanto em uma escrita o dado é copiado para o “latch” da porta.

Quando funções de periféricos forem habilitadas, deve ser observado se não há uma
sobreposição de configurações, já que alguns periféricos sobrepõem sua configuração
originalmente definida no registrador TRISC.
Tabela: Funções dos pinos da porta C

Resumo dos registradores associados a porta C

Porta D e o registrador TRISD


A porta D é uma porta de E/S bidirecional de 8 bits de largura. A direção que os pinos
assumem (entrada ou saída) é determinada pelos bits do registrador TRISD, setando um bit
de TRISD faz com que o correspondente pino da porta funcione como entrada. Resetando o
bit, o respectivo pino funciona como saída. Uma operação de leitura da porta, lê o valor dos
pinos, enquanto em uma escrita o dado é copiado para o “latch” da porta.

A porta D pode ser configurada como uma porta paralela de 8 bits, setando o bit de controle
PSPMODE (bit 4) do registrador TRISE. Nesse modo, os buffers de entrada são TTL.

Tabela: Funções dos pinos da porta D


Resumo dos registradores associados a porta D

A porta E tem três pinos, RE0/RD/AN5, RE1/WR/AN6 e RE2/CS/AN7, que são


individualmente configurados como entrada ou como saída. A porta de E torna-se entrada
de controle para a porta paralela (porta D), quando o bit PSPMODE (bit 4 de TRISE) é
setado. Nesse modo, os bits de 2 a 0 de TRISE devem estar setados para configurar os
respectivos pinos da porta E como entradas digitais e os bits PCFG3:PCFG0 do registrador
ADCON1 deve estar ajustados para configurar RE2:RE0 como E/S digital.

Os pinos da porta E são multiplexados com entradas analógicas. Quando selecionados


como uma entrada analógica, leituras desses pinos retornam 0. O TRISE controla a direção
dos pinos RE mesmo quando eles estão sendo usados como entradas analógicas (deve ser
garantido que os pinos estão configurados como entradas pelo TRISE, quando os mesmos
funcionam como entradas analógicas ).

Função dos bits do registrador TRISE (Endereço 89h)


Tabela: Funções dos pinos da porta E

Resumo dos registradores associados a porta E

Características especiais da CPU


O PIC16F877 possui um conjunto de características que permite customizar a sua operação
sem a necessidade de componentes externos. São elas:
• Seleção de Oscilador
• Seleção do modo de Reset
o Power-on Reset (POR)
o Power-up Timer (PWRT)
o Oscillator Start-up Timer (OST)
o Brown-out Reset (BOR)
• Interrupções
• Watchdog Timer (WDT)
• SLEEP
• Proteção de código
• ID locations
• Programação serial In-Circuit
• Programação serial In-Circuit em baixa tensão
• In-Circuit Debugger

O WatchDog timer pode ser desligado apenas ajustando alguns bits de configuração. O
mesmo possui o próprio oscilador. Há dois Timers que geram os atrasos necessários
quando o microcontrolador é ativado, o OST (Oscilator Start-up Timer), que mantém o PIC
em RESST até o oscilador a cristal estabilizar e o PWRT (Power-up Timer), que gera um
atraso fixo de 72 ms quando o PIC é energizado (mantém o PIC em RESET enquanto a
tensão da fonte estabiliza).

O modo SLEEP foi desenvolvido para oferecer um consume muito baixo quando o PIC
está no modo “power-down”. A saída do modo SLEEP pode ocorrer por reset externo,
“Watchdog Timer Wake-up” ou através de uma interrupção.

Diferentes opções de osciladores são disponibilizadas, para permitir uma perfeita


adequação do PIC ao sistema. A opção RC diminui custos, enquanto a opção LC
economiza energia. Um conjunto de bits de configuração são usados para selecionar as
opções.

Bits de configuração
Os bits de configuração são mapeados na memória de programa, no endereço 2007h. O
endereço 2007h está dentro do espaço de memória de programa do usuário (pertence ao
espaço de memória especial de teste e configuração – 2000h a 3FFFh), que pode ser
acessado apenas durante a programação.
Palavra de configuração

Tipos de osciladores
O PIC 16F87X pode ser operado em quatro modos distintos de oscilação. O usuário pode
programar um dos modos abaixo a partir dos bits (FOSC1 and FOSC0):
• LP Low Power Crystal
• XT Crystal/Resonator
• HS High Speed Crystal/Resonator
• RC Resistor/Capacitor

Nos modos XT, LP ou HS,um cristal deve ser conectado aos pinos OSC1/CLKIN e
OSC2/CLKOUT para estabelecer a oscilação. Quando nos modos XT, LP ou HS, o
dispositivo pode ter um fonte externa de clock para acionar o pino OSC1/CLKIN.
Para aplicações insensíveis a variações de tempo, a opção RC apresenta baixo custo de
implementação, no entanto, a freqüência do oscilador variará em função de variações da
tensão da fonte e dos valores de R e C

Reset
The PIC16F87X pode operar com vários tipos de reset:
• Power-on Reset (POR)
• MCLR reset during normal operation
• MCLR reset during SLEEP
• WDT Reset (during normal operation)
• WDT Wake-up (during SLEEP)
• Brown-out Reset (BOR)

Alguns registradores não são afetados em algumas condições de reset, Neste caso o status
desses registradores é desconhecido no POR e não são alterados pelos outros modos de
reset. Muitos outros registradores são ajustados para um estado de “reset” no POR, no
MCLR e WDT reset, no NCLR durante o SLEEP e no BOR. Eles são afetados pro um
WDT Wake-up, que é visto como um reinício de uma operação normal. Os bits TO e PD
são setados ou resetados em diferentes situações de reset como indicado na tabela abaixo.
Esses bits são usados para determinar o modo de reset.

Bits de status e seu significado

Power-On Reset (POR)


Um Power-on Reset pulso é gerado internamente ao chip quando uma subida de VDD é
detectada (na faixa de 1,2V – 1,7V).

Power-up Timer (PWRT)


O Power-up Timer fornece um time-out nominal fixo de 72 ms na energização do PIC, após
um POR. O chip é mantido em reset enquanto PWRT está ativo. O atraso gerado pelo
PWRT’s time, permite o VDD atingir um nível aceitável de tensão para operação. Um bit
de configuração é provido para permitir habilitar/desabilitar o PWRT.

Oscillator Start-up Timer (OST)


O Oscillator Start-up Timer (OST) fornece 1024 ciclos de oscilação de atraso (da entrada
OSC1) ao fim do atraso do PWRT. Isso garante que o circuito de oscilação a cristal atingiu
a sua estabilidade. O OST time-out é invocado apenas nos modos XT, LP e HS e apenas no
Power-on Reset ou wake-up de SLEEP.

Brown-Out Reset (BOR)


O bit de configuração, BODEN, pode habilitar ou desabilitar o circuito Brown-out Reset.
Se VDD cai abaixo de VBOR (parâmetro D005, aproximadamente4V) por mais do que
TBOR (parâmetro #35, aproximadamente 100mS), a situação de brown-out resetará o PIC.
If VDD cai abaixo de VBOR por menos que TBOR, um reset não poderá ocorrer.
Uma vez que o brown-out ocorra, o dispositivo permanecerá em brown-out reset até VDD
subir acima deVBOR. O power-up timer então mantém o dispositivo em reset por TPWRT
(parâmetro #33, aproximadamente 72mS). Se VDD deve cair abaixo de VBOR durante
TPWRT, o processo de brown-out reset reinicia quando VDD sobe acima de VBOR com o
power-up timer reset. O power-up timer está sempre habilitado quando o circuito de brown-
out reset está habilitado, independente do estado do bit de configuração PWRT

A tabela abaixo mostra a condição de reset para os registradores de STATUS, PCON e PC .


As tabelas abaixo mostram as condições de reset para todos os outros registradores.
Power Control/Status Register (PCON)
O registrador Power Control/Status, PCON, tem até dois bits, dependendo do dispositivo. O
Bit0 é o bit de Brown-out Reset Status, BOR. O bit BOR é desconhecido no Power-on
Reset. Ele deve ser setado pelo usuário e checado em subseqüentes resets para ver se o bit
BOR está apagando, indicando que um BOR ocorreu. O bit BOR é um bit "don’t care" e é
necessário predizer se a circuitaria do Brown-out Reset está desabilitada (apagando o bit
BODEN na palavra de configuração).
O bit 1 é o POR (Power-on Reset Status bit). Ele é apagado no Power-on Reset e não é
afetado. O usuário deve setar este bit após um Power-on Reset.

Referências
1 – Microcontrolador PIC 16F8X - Resumo da Arquitetura, ,MC404B - Nov 2001 - Prof. Célio
Guimarães.
2 – PIC16F87X Datasheet – Microchip Technology Incorporated. USA. Nov 1999.
3 - Microcontroladores PIC – mikroElektronika , 2003
PREPARAÇÃO
1. Quantos ciclos de clock no total são gastos para realizar a busca e execução de uma
instrução no PIC?
2. Descreva a condição indicada por cada Flag (bits de 0 a 4) do registrador de “STATUS”
do PIC.
3. Identifique os bits do registrador “OPTION” que configuram o preescalonador do clock
que alimenta o TIMER0 ou WatchDog.
4. Identifique a faixa de endereços de cada bloco de memória de dados (memória RAM)
do PIC.
5. O que deve ser feito para programar o pino de uma porta de I/O como:
a) Entrada digital;
b) Saída digital.
6. Quais os pinos da porta B podem gerar interrupções?
7. Indique em que condição ocorre o “Power-on-Reset” e o “Brown-Out-Reset”.
8. Explique que operação é realizada pelas instruções C para PIC abaixo:
OUTPUT_HIGH (PIN);
OUTPUT_LOW (PIN);
OUTPUT_BIT (PIN, VALUE);
OUTPUT_X (VALUE) (X=A, B, C,...);

9. Explique que operação é realizada pelas instruções C para PIC abaixo:


INPUT (PIN);
INPUT_X ( ), (X=A, B, C,...);

10. Explique que operação é realizada pelas instruções C para PIC abaixo:
DELAY_MS(VALOR);
DELAY_US(VALOR);

11. Explique que operação é realizada pelas instruções C para PIC abaixo:
SET_TRIS_x (VALOR) (x=a,b,c,d ou e, representa uma porta de I/O)

12. Elabore uma rotina em C que ao pressionar um botão, acenda um LED da placa de
experimentos do PIC e ao apertar um segundo botão, apague o respectivo LED.
Considere como pinos de entrada para leitura dos botões os pinos A3 e A4 da porta A.
Considere como saída para acender o LED o pino B0 da porta B.

13. Elabore uma rotina em C que incremente um contador (variável do tipo int, 8 bits) a
cada 0,1s (use a instrução delay_ms para gerar o atraso de 0,1s) e o escreva na porta D
do PIC quando for pressionado um botão (use o código do item 12).

14. Elabore uma rotina em C que calcule o complemento de 2 do valor de 8 bits gerado
pelo contador da rotina acima. Esse valor é selecionado a aplicar um sinal 0 (zero) a
entrada B0 (conecte um botão ao pino B0 do PIC). Ao pressionar o botão o valor
selecionado deve ser apresentado através de LED’s usando os 8 bits da porta D e 1 (um)
segundo depois, deve ser apresentado o complemento de 2 do número, usando também
a porta D como saída de dados.

Potrebbero piacerti anche