PIC 16F877
ÍNDICE
I - INTRODUÇÃO: ___________________________________________________________________ 2
II - MICROCONTROLADORES: _______________________________________________________ 2
III – INTRODUÇÃO ÀS ME MÓRIAS: ___________________________________________________ 2
A MEMÓRIA DE PROGRAMA:_____________________________________________________ 3
A MEMÓRIA DE PROGRAMA:_____________________________________________________ 3
EEPROM: ________________________________________________________________________ 3
IV – INTRODUÇÃO ÀS INTERRUPÇÕES _______________________________________________ 4
AS INTERRUPÇÕES EXISTENTES NO PIC: _________________________________________ 4
V – O PIC 16F877____________________________________________________________________ 5
PINAGEM: _______________________________________________________________________ 6
NOMENCLATURA DOS PINOS: ____________________________________________________ 7
A ESTRUTURAÇÃO INTERNA: ____________________________________________________ 8
MAPA DA MEMÓRIA DE DADOS: __________________________________________________ 9
VI – OS REGISTRADORES ESPECIAIS QUE CONTROLAM TUDO _________________________ 9
GERAIS: ________________________________________________________________________ 10
PORTAS:________________________________________________________________________ 12
TIMERS: ________________________________________________________________________ 13
INTERRUPÇÕES:________________________________________________________________ 15
VII - CONCLUSÃO__________________________________________________________________ 18
VIII - BIBLIOGRAFIA_______________________________________________________________ 18
I - INTRODUÇÃO:
Com a evolução constante da eletrônica faz-se cada vez mais necessário o conhecimento de componentes que
componham instrumentos e equipamentos de uso pessoal, doméstico, empresarial e industrial. Os
microcontroladores são peças indispensáveis nesse cenário.
O nome PIC pertence à empresa Microchip. Muitas figuras, termos e formatações foram retirados dos manuais da
Microchip.
II - MICROCONTROLADORES:
Um componente eletrônico dotado de uma “inteligência” programável, utilizado no controle de processos lógicos.
Vamos analisar melhor:
O controle de processos deve ser entendido como o controle de periféricos, tais como: led’s, botões, display’s de
cristal líquido (LCD), resistências, relês, sensores (pressão, temperatura, velocidade, distância, etc...) e muitos
outros. São chamados de controle lógicos, pois a operação do sistema baseia -se nas ações lógicas que devem ser
executadas, dependendo do estado dos periféricos de entrada e/ou saída.
O microcontrolador é programável, pois toda a lógica de operação deve ser programada e inserida dentro do
componente. Assim, uma vez que o microcontrolador seja alimentado o programa será executado. A Unidade
Lógica e Aritmética (ULA) é a grande responsável pela inteligência dos microcontroladores, pois, como já
sabemos, é nela que se realizam todas as operações de lógica e aritmética. Logo, quanto mais poderosa a ULA
proporcionalmente mais poderoso é o microcontrolador, pois possui maior capacidade de processar informações.
A característica fundamental dos microcontroladores é que em uma única pastilha de silício encapsulada, temos
todos os componentes necessários ao controle de um processo: memória de programa, memória de dados, portas de
entrada e/ou saída paralela, timer’s, contadores, comunicação serial, PWM’s, conversores analógicos-digitais, etc.
Temos microcontroladores em diversos aparelhos de nosso dia -a-dia, tipo: celulares, centrais telefônicas,
brinquedos, videocassete, etc.
Os microcontroladores PIC apresentam uma estrutura de máquina interna do tipo Havard, enquanto grande parte
dos microcontroladores tradicionais apresenta uma arquitetura tipo Von-Neumann. A diferença está na forma como
os dados e o programa são processados pelo microcontrolador. Na arquitetura tradicional, tipo Von-Neumann,
existe apenas um barramento interno (geralmente de 8 bits), por onde passam as instruções e os dados. Já na
arquitetura tipo Harvard existe dois barramentos internos, sendo um de dados e outro de instruções. No caso dos
microcontroladores PIC, o barramento de dados é sempre de 8 bits e o de instruções pode ser de 12, 14 ou 16 bits,
dependendo do microcontrolador. Esse tipo de arquitetura permite que enquanto uma instrução é executada outra
seja “buscada” da memória, o que torna o processamento mais rápido. Além disso, como o barramento de instrução
é maior do que 8 bits, o OPCODE (Cop – Código da Operação) da instrução já inclui o dado e o local onde ela vai
operar (quando necessário), o que significa que apenas uma posição de memória é utilizada por instrução,
economizando assim muita memória de programa.
Desta forma, podemos observar que dentro da palavra do OPCODE, que pode ser de 12, 14 ou 16 bits, não sobra
muito espaço para o código da instrução propriamente dito. Por isso, os PICs utilizam uma tecnologia chamada
RISC, que significa Reduced Instruction Set Computer ( computador com set de instruções reduzido). Desta forma,
os PICs possuem cerca de 35 instruções (o número correto varia de acordo com o microcontrolador), muito menos
que os microcontroladores convencionais (CISC) que chegam a possuir mais de 100 instruções. Isto torna o
aprendizado muito mais fácil e dinâmico, mas, por outro lado, implica no fato de que muitas funções devem ser
“construídas”, pois não possui uma instrução direta, exigindo maior habilidade do programador.
A MEMÓRIA DE PROGRAMA:
Pode ser de 12, a4 ou 16 bits, como já havíamos citado, e foi esclarecido também que o tamanho depende do
modelo do PIC. Na maioria dos modelos, essa memória é do tipo EPROM, que só pode ser gravada uma vez para
PICs normais, ou gravadas várias vezes para PICs janelados (que podem ser apagados por meio de luz ultravioleta).
Existem ainda modelos que possuem a memória de programa do tipo EEPROM, que pode ser gravada várias vezes
sem necessidade de apagar a gravação anterior. Estes PICs são muito mais fáceis de trabalhar para o
desenvolvimento de sistemas, mas, por outro lado, eles são muito mais caros para uma fabricação em série.
? VETOR DE RESET:
É o primeiro endereço de memória de programa que será executado quando o PIC começar seu trabalho,
isto é, após ser alimentado ou sofre um reset. Este endereço é 0x00.
? VETOR DE INTERRUPÇÃO:
As rotinas de interrupção são armazenadas na área de programação, juntamente com todo o resto do
programa. No entanto, existe um endereço que é reservado para o início do tratamento de todas as
interrupções, nos modelos de PIC que possuem este recurso. Este endereço é denominado vetor de
interrupção e seu endereço é 0x04.
? PILHA:
É um local, totalmente separado da memória de programação, em que serão armazenados os endereços de
retorno quando utilizarmos instruções de chamadas de rotinas. Quando o programa é desviado para o
começo de uma rotina por meio de uma instrução correta, o endereço seguinte ao ponto que estava sendo
rodado é armazenado na pilha para que, ao fim da rotina, o programa possa retornar. O tamanho da pilha
também varia de acordo com o modelo de PIC, e esse tamanho determina a quantidade de rotinas que
podem ser chamadas ao mesmo tempo. Caso se tente chamar um número de rotinas maior que o tamanho
da pilha, o endereço de retorno mais antigo será perdido.
A MEMÓRIA DE PROGRAMA:
Conhecida como RAM, que é utilizada para guardar todas as variáveis e registradores utilizados pelo programa.
Essa memória armazena dados de 8 bits e é volátil. Podemos dividi-la em dois grupos que são: Registradores
Especiais e Registradores de uso geral.
? REGISTRADORES GERAIS:
Também denominados SFRs, utilizados pelo microcontrolador para a execução do programa e
processamento da ULA. Esses Registradores serão detalhadamente estudados. O importante agora é
sabermos que eles ocupam espaço na RAM e podem ser acessados da mesma forma que as variáveis do
sistema. Eles sempre estam localizados nos primeiros endereços da memória RAM.
? REGISTRADORES DE USO GERAL:
São as variáveis definidas pelos usuários para serem escritas e lidas.
EEPROM:
Alguns modelos de PIC possuem ainda uma terceira memória que também pode ser utilizada pelo usuário para
guardar dados. Entretanto, ao contrário da memória de dados vista anteriormente, esta é uma EEPROM, isto é, uma
memória não volátil, que consegue manter as informações mesmo sem alimentação.
IV – INTRODUÇÃO ÀS INTERRUPÇÕES
Uma interrupção serve para interromper imediatamente um programa, com objetivo de tomar outras atitudes. As
interrupções são tratadas diretamente pelo hardware, o que as torna muito rápidas e disponíveis em qualquer ponto
do sistema. Assim sendo, quando uma interrupção acontece, o programa é paralisado e uma função específica é
executada e depois o programa continua a ser executado no mesmo ponto em que estava.
O primeiro conceito que devemos entender para o uso das interrupções é que para elas realmente acontecerem, isto
é, paralisarem o programa e desviarem para o vetor de interrupção, algumas questões devem ser verificadas:
1. Uma ação (ou evento) relacionado à interrupção deve acontecer;
2. Quando a ação acontece, o flag da interrupção é marcado;
3. Caso as chaves de habilitação da interrupção (geral e individual) estejam ligadas, o sistema será
paralisado e desviado para o vetor de interrupção.
A ação propriamente dita é exatamente o que queremos monitorar. Mas e as chaves de acesso? Tratam-se de bits
especificados que servem como chave ON/OFF para ligar e desligar as interrupções, individualmente ou em grupo.
? INTERRUPÇÃO DE TIMER 0:
Essa interrupção acontece sempre que um contador de tempo interno, denominado TMR0 (Timer 0),
estoura, ou seja, como ele é um contador de 8 bits, sempre que ele passar de 0xFF para 0x00. ela é utilizada
normalmente para a contagem de tempo. Como pode acontecer a qualquer momento, a contagem de tempo
fica precisa, não dependendo de análise constantes durante o programa para garantir que o tempo seja
contado. Como veremos adiante, o TMR0 pode tanto ser incrementado internamente pelo clock da
máquina, como também por um sinal externo. Neste caso, ele passa a ser um contador de pulsos, podendo
ser utilizado para outras finalidades.
? INTERRUPÇÃO EXTERNA:
Essa interrupção é gerada por um sinal externo ligado a uma porta específica do PIC, que no caso é a porta
RB0, caso ele esteja configurado como entrada. Ela é muito utilizada, por exemplo, para comunicação
entre micros, garantindo o sincronismo, para o reconhecimento de botão ou outro sinal do sistema que
necessite de ação imediata.
Esta interrupção pode ser configurada para a borda de subida ou para a borda de descida.
? INTERRUPÇÃO POR MUDANÇA DE ESTADO:
Ao contrário da interrupção externa, a interrupção por mudança de estado acontece em ambas as bodas
(subida e descida). Na verdade, esta interrupção é sensível a diferença de nível existente entre o pino e o
latch interno. Esta interrupção está relacionada às portas RB4, RB5, RB6 e RB7 simultaneamente. Por isso,
se estas portas forem configuradas como entradas, a mudança de estado em qualquer uma delas irá gerar a
interrupção. Como o lacth só é atualizado quando a porta é lida, a leitura é obrigatória para que o evento da
interrupção pare de ocorrer. Este tipo de interrupção pode ser utilizado, por exemplo, para criar um
sincronismo com a rede de 60Hz, para o controle de um triac ou outro sistema semelhante.
? INTERRUPÇÃO DA PORTA PARALELA (PSP):
Esta interrupção está diretamente ligada à porta paralela do tipo escravo e acontece sempre que uma
operação de escrita ou leitura desta porta é completada.
? INTERRUPÇÃO DOS CONVERSORES A/D:
Esta interrupção acontece quando uma conversão A/D é completada.
V – O PIC 16F877
Sua características são:
? Microcontrolador de 40 pinos, o que possiblita a montagem de um hardware complexo e capaz de
interagir com diversos recursos e funções ao mesmo tempo;
? Via de programação com 14 bits e 35 instruções;
? 33 portas configuráveis como entrada ou saída;
? 14 interrupções;
? Memória de programação EEPROM FLASH, que permite a gravação rápida do programa diversas
vezes no mesmo chip, sem a necessidade de apaga- lo através de luz ultravioleta, como acontece
nos microcontroladores de janela;
PINAGEM:
Legenda: Notas:
I = Input (entrada) (1) Esta entrada é do tipo ST somente quando configurado
O = output (saída) como interrupção externa
I/O = Input/Output (entrada ou saída) (2) Esta entrada é do tipo ST somente durante o modo de
programação serial
P = Power (alimentação)
(3) Esta entrada é do tipo ST quando configurado como I/O
- = Não utilizado de uso geral e TTL quando usado em modo de porta
TTL = Entrada tipo TTL paralela
ST = Entrada tipo Schmitt Trigger (4) Esta entrada é do tipo ST quando em modo RC e CMOS
nos demais casos.
A ESTRUTURAÇÃO INTERNA:
? OPTION_REG:
Esse registrador serve para configurar uma série de opções para a operação do microcontrolador.
Registrador: OPTION-REG Endereços: 81 e 181
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
R/W R/W R/W R/W R/W R/W R/W R/W
/RBPU INTEDG T0CS T0SE PSA PS2 PS1 PS0
/RBPU: Habilita pull-ups internos para o PORTB:
0 = Pull-ups habilitados para todos os pinos PORTB configurados como saída
1 = Pull-ups desabilitados
INTEDG: Configuração da borda que gerará a interrupção externa no RB0:
0 = A interrupção ocorrerá na borda de descida
1 = A interrupção ocorrerá na borda de subida
? PCON:
Registrador: PCON Endereços: 8E
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
- - - - - - R/W R/W
- - - - - - /POR /BOR
/POR: Indicação de Power-On Reset (energização):
0 = Ocorreu um Power-On Reset.
1 = Não ocorreu um Power-On Reset.
/BOR: Indicação de Brown-Out Reset (queda de energia):
0 = Não ocorreu um Brown-Out Reset.
1 = Ocorreu um Brown-Out Reset.
? PCL e PCLATH:
O PCL é um registrador que armazena os 8 bits menos significante do PC (Program Counter), também
conhecido como CI (Contador de Instruções), o qual indica a linha do programa que está sendo executada no
momento. A cada ciclo de máquina o PC é automaticamente alterado, para que o programa possa ser executado
normalmente. Esse registrador também pode ser alterado pelo programa, mas isto deve ser feito com estremo
cuidado, para que o sistema não se perca e/ou trave.
Registrador: PC Endereços: 02, 82, 102 e 182
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
R/W R/W R/W R/W R/W R/W R/W R/W
GIE PEIE T0IE INTE RBIE T0IF INTF RBIF
Como a área de memória de programa do PIC é maior que 256 Bytes, não é possível acessa-lo completamente
com somente os 8 bits do PCL. Por isso, o PCLATH possui os 5 bits mais altos do PC.
Registrador: PCLATH Endereços: 0A, 8A, 10A e 18A
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
R/W R/W R/W R/W R/W R/W R/W R/W
GIE PEIE T0IE INTE RBIE T0IF INTF RBIF
Rejane de Barros Araújo
Departamento de Engenharia da Computação
Organização e Arquitetura de Computadores 12
Laboratório – Informações sobre o microcontrolador PIC 16F877
? FSR e INDF:
O FSR é um registrador em que pode ser escrito um outro endereço de memória que será acessado
indiretamente, como se ele fosse apenas um ponteiro. Já o INDF não é um registrador de verdade; trata-se
somente de um espelho do endereço apontado pelo FSR.
Registrador: FSR Endereços: 04 e 84
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
R/W R/W R/W R/W R/W R/W R/W R/W
PONTEIRO PARA ENDEREÇAMENTO INDIRETO
PORTAS:
? PORT e TRIS:
Esses registradores servem para configurar os pinos das portas como entrada ou saída. Quando é colocado “1”
em um bit do TRIS, o pino relacionado a ele é configurado como Entrada. Para configurar o pino como Saída
você deve escrever “0” no bit relacionado. Uma maneira prática de memorizar esta regra é associar o “1” ao “I”
de input (entrada), e o “0” ao “O” de output (saída).
Registrador: PORTA Endereços: 05
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
- - R/W R/W R/W R/W R/W R/W
- - RA5 RA4 RA3 RA2 RA1 RA0
Registrador: TRISA Endereços: 85
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
- - R/W R/W R/W R/W R/W R/W
- - Ref. RA5 Ref. RA4 Ref. RA3 Ref. RA2 Ref. RA1 Ref. RA0
TIMERS:
? TMR0
O TMR0 é um contador de 8 bits que pode ser acessado diretamente na memória, tanto para leitura quanto para
a escrita. A diferença entre ele e os demais registradores é que seu incremento é automático e pode ser feito
pelo clock da máquina ou por um sinal externo.Vale lembrar que o estouro desse contador pode gerar uma
interrupção. Ele conta de 0 até 255, em decimal.
Registrador: TMR0 Endereços: 01 e 101
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
R/W R/W R/W R/W R/W R/W R/W R/W
CONTADOR TMR0 DE 8 BITS
INTERRUPÇÕES:
? INTCON:
Esse registrador serve para configurar e identificar as interrupções.
Registrador: INTCON Endereços: 0B, 8B, 10B e 18B
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
R/W R/W R/W R/W R/W R/W R/W R/W
GIE PEIE T0IE INTE RBIE T0IF INTF RBIF
GIE: Habilitação geral das interrupções (Chave geral):
0 = Nenhuma interrupção será tratada.
1 = As interrupções habilitadas individualmente serão tratadas.
PEIE: Habilitação das interrupções de periféricos (chave geral para periféricos):
0 = As interrupções de periféricos não serão tratadas.
1 = As interrupções de periféricos habilitadas individualmente serão tratadas.
T0IE: Habilitação da interrupção de estouro de TMR0 (Chave individual):
0 = Interrupção de TMR0 desabilitada.
1 = Interrupção de TMR0 habilitada.
INTE: Habilitação da interrupção externa no pino RB0:
0 = Interrupção de externa desabilitada.
1 = Interrupção de externa habilitada.
RBIE: Habilitação da interrupção por mudança de estado no pino RB4 a RB7 (chave individual):
0 = Interrupção por mudança de estado desabilitada.
1 = Interrupção por mudança de estado habilitada.
T0IF: Identificação de estouro do TMR0:
0 = Não ocorreu estou do TMR0.
1 = Ocorreu estouro do TMR0 (este bit deve ser limpo por software).
INT: Identificação da interrupção externa no pino RB0:
0 = Não ocorreu evento de interrupção.
1 = Ocorreu evento de interrupção (este bit deve ser limpo por software).
RBIF: Identificação da interrupção por mudança de estado nos pinos RB4 a RB7:
Rejane de Barros Araújo
Departamento de Engenharia da Computação
Organização e Arquitetura de Computadores 16
Laboratório – Informações sobre o microcontrolador PIC 16F877
0 = Não ocorreu evento de interrupção.
1 = Ocorreu evento de interrupção (este bit deve ser limpo por software).
? PIE1:
Registrador: PIE1 Endereços: 8C
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
R/W R/W R/W R/W R/W R/W R/W R/W
PSPIE ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE
PSPIE: Habilitação da interrupção da porta paralela (Chave individual):
0 = Interrupção da porta paralela desabilitada.
1 = Interrupção da porta paralela habilitada.
ADIE: Habilitação da interrupção do conversor (chave individual):
0 = Interrupção do conversor A/D desabilitada.
1 = Interrupção do conversor A/D habilitada.
RCIE: Habilitação da interrupção de recepção da USART (Chave individual):
0 = Interrupção de recepção da USART desabilitada.
1 = Interrupção de recepção da USART habilitada.
TXIE: Habilitação da interrupção de transmissão da USART (Chave individual):
0 = Interrupção de transmissão da USART desabilitada.
1 = Interrupção de transmissão da USART habilitada.
SSPIE: Habilitação da interrupção da porta serial SSP (chave individual):
0 = Interrupção da porta serial SSP desabilitada.
1 = Interrupção da porta serial SSP habilitada.
CCP1IE: Habilitação da interrupção do módulo CCP1 (chave individual):
0 = Interrupção de CCP1 desabilitada.
1 = Interrupção de CCP1 habilitada.
TMR2IE: Habilitação da interrupção do Timer 2 (chave individual):
0 = Interrupção de Timer 2 desabilitada.
1 = Interrupção de Timer 2 habilitada.
TMR1IE: Habilitação da interrupção de estouro do Timer 1 (chave individual):
0 = Interrupção de Timer 1 desabilitada.
1 = Interrupção de Timer 1 habilitada.
? PIR1:
Registrador: PIR1 Endereços: 0C
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
R/W R/W R/W R/W R/W R/W R/W R/W
PSPIF ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF
PSPIF: Identificação da interrupção da porta paralela (Chave individual):
0 = Não ocorreu evento de leitura/escrita na porta paralela.
1 = Ocorreu evento de leitura/escrita na porta paralela (este bit deve ser limpo por software).
ADIF: Identificação da interrupção do conversor A/D (chave individual):
0 = Conversão A/D NÃO foi completada.
1 = Conversão A/D foi completada.
RCIF: Identificação da interrupção de recepção da USART (Chave individual):
0 = Buffer de recepção da USART está vazio.
1 = Buffer de recepção da USART está cheio.
TXIF: Identificação da interrupção de transmissão da USART (Chave individual):
VII - CONCLUSÃO
Este material serve como leitura introdutório no estudo de microcontroladores PIC 16F877, mas para trabalhos
mais elaborados, leituras complementares são necessárias, e as mesmas são citas na Bibliografia.
VIII - BIBLIOGRAFIA
[1] MICROCHIP – PIC16F87X DATA SHEET, www.microchip.com;
[2] SOUZA, David José – DESBRAVANDO O PIC – Ed. Érica Ltda, 2002;
[3] MÓDULO ENGENHARIA – CONECTANDO O PIC, EXPLORANDO RECURSOS AVANÇADOS –
Ed. J.J.Carol, 2003;
[4] MANUAL POWERBOARD LITE, www.solbet.com.br