Buscar

APOSTILA MPLAB XC8

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 93 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 93 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 93 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

PMR2415 – Microprocessadores em Automação e Robótica
Jun Okamoto Jr.
23 de fevereiro de 2015
Sumário
I Teoria para Laboratório 3
1 Introdução 4
1.1 Integração com o PI-7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.2 Sistema de Desenvolvimento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.3 Estrutura dos Programas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2 Microcontrolador PIC 9
2.1 Organização da memória . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.2 Interrupções . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.3 Programação serial no circuito . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.4 Programação dos bits de configuração . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.5 Portas de entrada e saída . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.6 Timer 0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3 Conversão A/D 17
3.1 Conversão A/D com o PIC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
4 Display LCD 22
4.1 Interface com microcontrolador . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
4.2 Instruções e dados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
4.3 Caracteres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
4.4 Biblioteca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
5 Comunicação serial 29
5.1 Comunicação serial no PIC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
6 PWM 36
6.1 PWM com o PIC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
7 Encoder 40
II Atividades de Laboratório 43
8 Orientações gerais 44
8.1 Critérios de avaliação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
8.2 Material para as atividades . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
1
SUMÁRIO SUMÁRIO
9 Atividade 1: Trabalhando com DipTrace 50
9.1 DipTrace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
9.2 Procedimentos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
9.3 Relatório . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
10 Atividade 2: Layout e Fabricação 58
10.1 Procedimentos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
10.2 Relatório . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
11 Atividade 3: Montagem e testes 62
11.1 Procedimentos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
11.2 Relatório . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
12 Atividade 4: Conversão A/D com display LCD 66
12.1 Programa a ser desenvolvido . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
12.2 Procedimentos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
12.3 Relatório . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
13 Atividade 5: Comunicação serial 68
13.1 Análise dos sinais de comunicação serial . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
13.2 Procedimentos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
13.3 Relatório . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
14 Atividade 6: Acionamento de motor com PWM 71
14.1 Procedimentos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
14.2 Relatório . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
15 Atividade 7: Leitura de encoder 73
15.1 Procedimentos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
15.2 Relatório . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
16 Atividade 8: Estimativa de velocidade 75
16.1 Procedimentos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
16.2 Relatório . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
III Apêndices 78
2
Parte I
Teoria para Laboratório
3
Capítulo 1
Introdução
A disciplina de PMR2415 – Microprocessadores em Automação e Robótica tem como objetivo passar
para o aluno conhecimentos sobre o projeto de hardware com microprocessadores e microcontroladores e
desenvolvimento de software com aplicações voltadas automação e robótica. Assim, são abordados tópicos
presentes nessas áreas tais como acionamento, sensoriamento, comunicação e interface com o usuário. O
curso está dividido em aulas expositivas, com 2 créditos e aulas de laboratório com 2 créditos quinzenais.
Nas atividades de laboratório o aluno construirá sua própria placa processadora com um microcontro-
lador, com a qual executará atividades desenvolvendo o software específico para as áreas de automação e
robótica. Com essa placa processadora é possível executar as seguintes tarefas:
• Comunicação através de canal serial RS232C com outro computador ou terminal
• Controle PWM de motor CC com driver externo
• Efetuar leitura de encoder para determinar posição e velocidade do eixo de motor CC
• Mostrar mensagens em display de LCD externo
• Produzir saída digital em LED
• Efetuar leitura digital de chave
• Efetuar leitura analógica de potenciômetro
• Executar programação serial no circuito (ICSP) do microcontrolador
Com essa disciplina o aluno consolidará os conceitos de microprocessadores necessários para a implemen-
tação de sistemas de controle para sistemas mecatrônicos. O aluno terá a oportunidade de montar seu
próprio hardware e programar com linguagem C os diversos elementos presentes num sistema microcon-
trolado.
As atividades do semestre envolvem aulas expositivas com a carga horária de 2 créditos semanais e
atividades de laboratório quinzenais com mais 2 créditos.
1.1 Integração com o PI-7
Essa disciplina faz parte da série de disciplinas integrativas do programa de Mecatrônica, o Projeto
Integrativo do 7º semestre (PI-7), que visa o projeto e implementação de um sistema mecatrônico completo.
Esse projeto envolve conceitos apresentados em 5 disciplinas do 7º semestre:
4
1.1. INTEGRAÇÃO COM O PI-7 CAPÍTULO 1. INTRODUÇÃO
• PMR2400 – Controle e Automação II
• PMR2405 – Acionamentos para Automação
• PMR2415 – Microprocessadores em Automação e Robótica
• PMR2430 – Mecanismos para Automação
• PMR2440 – Programação para Automação
além, é claro, dos conceitos adquiridos nas disciplinas que compõe a grade curricular, cursadas anterior-
mente.
Procura-se com esta atividade:
• Aplicar os conhecimentos essenciais para a construção de um dispositivo mecatrônico, envolvendo
hardware mecânico e eletrônico, software e controles;
• Criar um ambiente propício para o exercício da atividade de projeto em Engenharia, por exigir que
os alunos organizem-se em equipes, coordenem suas atividades e respeitem seus cronogramas;
• Unificar, num único trabalho, parte da avaliação de diversas disciplinas, fazendo com que o aluno
possa aproveitar melhor o tempo.
• Preparar o aluno para as atividades de projeto mais complexas que seguem-se em seu curso, par-
ticularmente PMR2450 – Projeto de Máquinas e PMR2500/PMR2550 – Projeto de Conclusão de
Curso.
Estes objetivos, no PI-7, são atingidos com a implementação de uma máquinacom controle numérico
computadorizado, envolvendo múltiplos processadores. As características da máquina a ser implementada
variam a cada ano.
Mais especificamente, os conhecimentos que serão aplicados são:
• “system design” ou projeto de sistemas
• comando numérico computadorizado
• controle de trajetória para robôs e máquinas NC
• controle em malha fechada
• acionamento de motores
• projeto de hardware com microcontroladores
• projeto e construção de mecanismos
• modelagem e implementação de software para controle
5
1.2. SISTEMA DE DESENVOLVIMENTO CAPÍTULO 1. INTRODUÇÃO
1.2 Sistema de Desenvolvimento
Todo o desenvolvimento de software será feito utilizando-se o MPLAB X [3] e o compilador MPLAB
XC8 [4], ambos disponíveis sem custo no site da Microchip (http://www.microchip.com). Nesse curso é
utilizado o PICkit 3 para gravar o microcontrolador PIC16F886 que estará disponível para cada bancada
no laboratório.
Os computadores do laboratório contém o MPLAB X e o compilador C MPLAB XC8 instalados para
uso nas aulas de laboratório. Os alunos devem instalar esses dois pacotes de software em seus próprios
computadores para fazerem o desenvolvimento dos programas antes das aulas de maneira a atender a
entrega do código no início da aula.
Para a preparação da atividade antes da aula de laboratório, os alunos poderão utilizar um simulador
do PIC, o Real PIC Simulator , disponível em versão demo no site da Digital Electro Soft (http://
digitalelctrosoft.com). Um projeto configurado especificamente para o laboratório de PMR2415 está
disponível no site da disciplina (http://sites.poli.usp.br/pmr/lpa/pmr2415).
1.3 Estrutura dos Programas
Os programas de controle seguem uma estrutura semelhante à apresentada a seguir. Inicialmente, são
necessárias algumas linhas particulares da implementação com o PIC. A seguir, são definidas variáveis
globais incluindo variáveis que são atualizadas na rotina de interrupção. Depois vem as subrotinas, rotina
de interrupção e por último o programa principal.
O programa principal possui uma fase inicial de declarações de variáveis e inicializações. Depois vem
um loop infinito de controle. O que deve ser colocado dentro desse loop e o que deve ser colocado na rotina
de interrupção será definido em cada atividade onde ficarão claros os motivos de tal implementação.
Um detalhe importante sobre o loop de controle, é que o mesmo nunca deve parar o processa-
mento aguardando um evento, como por exemplo, esperar um caracter chegar pelo canal serial utilizando
getch()1 que não retorna da função enquanto não for recebido um caracter no buffer de recepção. Dentro
do loop de controle um evento deve ser testado se ocorreu ou não, no caso de ter ocorrido deve ser tratado
e de não ter ocorrido, o processamento deve prosseguir. Ainda no exemplo anterior, dentro do loop de
controle, o recebimento de um caracter pelo canal serial deve ser feito com a função chkchr() que retorna
o caracter recebido ou o número inteiro sem sinal 255 caso nenhum caracter esteja disponível no buffer de
recepção. Caso o loop de controle esteja muito rápido pode-se utilizar um atraso por software disponível
através das funções DelayMs() e DelayUs() da biblioteca delay.h.
/*
* File: main.c
* Author: Jun Okamoto Jr.
*
* Created on January 6, 2015, 2:37 PM
*/
#include <xc.h> // definições dos microcontroladores
#include <stdio.h> // I/O básico (printf , sprintf , ...)
#include <stdlib.h> // rotinas adicionais (itoa , ltoa , ultoa , ...)
...
// Defines
1O comportamento padrão dessa rotina é não retornar enquanto não chegar um caracter pelo canal serial.
6
1.3. ESTRUTURA DOS PROGRAMAS CAPÍTULO 1. INTRODUÇÃO
#define ... // todas as definições usadas no programa
// Enums
// Liga / desliga LED e cursor LCD
enum {
off , on
};
// PIC16F886 Configuration Bit Settings
// CONFIG1
#pragma config FOSC = EC // Oscillator Selection bits (EC: I/O function on RA6/OSC2 ...
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled and can be enab ...
#pragma config PWRTE = ON // Power -up Timer Enable bit (PWRT enabled)
#pragma config MCLRE = ON // RE3/MCLR pin function select bit (RE3/MCLR pin function ...
#pragma config CP = OFF // Code Protection bit (Program memory code protection is ...
#pragma config CPD = OFF // Data Code Protection bit (Data memory code protection i...
#pragma config BOREN = ON // Brown Out Reset Selection bits (BOR enabled)
#pragma config IESO = OFF // Internal External Switchover bit (Internal/External Swi...
#pragma config FCMEN = OFF // Fail -Safe Clock Monitor Enabled bit (Fail -Safe Clock Mo...
#pragma config LVP = OFF // Low Voltage Programming Enable bit (RB3 pin has digital ...
// CONFIG2
#pragma config BOR4V = BOR40V // Brown -out Reset Selection bit (Brown -out Reset set ...
#pragma config WRT = OFF // Flash Program Memory Self Write Enable bits (Write ...
// Project includes
#include "always.h"
#include "delay.h"
#include "lcd.h"
#include "serial.h"
#include "adc.h"
// Variáveis Globais
// Subrotinas
// Rotina de tratamento de interrupções
void interrupt isr(void) {
}
// Programa Principal
void main (void) {
// -> Declaração de variáveis
// -> Inicialização de variáveis
// -> Configurações do processador
// -> inicialização dos dispositivos
while (1) { // Loop Principal
...
// Nunca deve se parar esse loop esperando um evento (como a chegada de um caracter
// pelo canal serial , por exemplo ). Os dispositivos devem ser lidos e no caso de
// não conterem informações novas o loop deve continuar. No caso de
7
1.3. ESTRUTURA DOS PROGRAMAS CAPÍTULO 1. INTRODUÇÃO
// informações novas é feito o processamento
.
.
...
} // fim do Loop Principal
} // fim do Programa Principal
8
Capítulo 2
Microcontrolador PIC
A família 16 dos microcontroladores PIC da Microchip é composta por uma série de microcontroladores
de 8-bits de dados com instruções de 14-bits e recursos básicos de I/O, timers, conversores A/D e canais
de comunicação serial.
O PIC16F886 foi adotado nesse curso pois é uma versão recente do antigo PIC16F76, cujo custo é menor
do que o de versões anteriores e encontra-se em produção. Nessa versão atual muitas funções avançadas
foram adicionadas em relação às anteriores, mas nesse curso são explorados recursos somente presentes
em todas as versões da família, não sendo utilizadas funções avançadas. O que se pretende com isso é
a exposição de conceitos que estão presentes nessa família de microcontroladores e que são semelhantes
em diversas outras famílias de microcontroladores e não executar funções com alto desempenho como as
que as funções avançadas do PIC16F886 permitem. Assim, apesar desse documento conter explicações
específicas para o PIC16F886 os conceitos apresentados são encontrados de forma semelhante em muitos
microcontroladores além dos da Microchip.
O microcontrolador PIC16F886 é disponível em encapsulamento SPDIP (Skinny Plastic Dual-In-Line
package) de 28 pinos e possui as seguintes características principais:
• Frequência de operação até 20MHz
• 8 kwords de memória flash para programas
• 368 bytes de memória RAM de dados
• 256 bytes de memória EEPROM
• 3 portas de I/O com 8-bits cada
• 3 Timers: 2 de 8-bits e 1 de 16-bits, até 4 PWM de 10-bits
• 2 canais de comunicação serial:1 síncrono e 1 assíncrono
• 11 canais de conversão A/D de 10-bits
• 13 interrupções
• Programação no circuito (ICSP – In-Circuit Serial Programming) através de 2 pinos
9
2.1. ORGANIZAÇÃO DA MEMÓRIA CAPÍTULO 2. MICROCONTROLADOR PIC
Assim como a maioria dos microcontroladores as configurações do PIC16F886 são feitas por meio de
SFRs (Special Function Registers). Esses registradores estão presentes em endereços específicos no mi-
crocontrolador e cada um, ou conjunto de alguns, configuram o funcionamento dos diversos módulos domicrocontrolador.
As informações apresentadas a seguir foram retiradas do data sheet PIC16F882/883/884/886/887 [2] da
Microchip e foram resumidas especificamente para as atividades de laboratório a serem desenvolvidas nesse
curso. Assim, para um conhecimento mais aprofundado e utilização geral do hardware e software da família
de microcontroladores PIC16F88X deve ser consultado o data sheet . Foi incluída nessa seção também
uma descrição das rotinas de bibliotecas em XC8 que estão disponíveis para utilização no curso. Essas
bibliotecas foram retiradas da Internet e adaptadas para as características do hardware utilizado no curso
e acrescidas com algumas funcionalidades adicionais. As rotinas presentes nas bibliotecas implementam
em Linguagem C as diversas configurações necessárias para cada módulo do PIC16F886 e funções de
acesso à alguns dos módulos.
2.1 Organização da memória
A família de microcontroladores PIC16F88x segue a arquitetura Harvard onde os espaços das memórias
de programa de de dados são separados. A memória de programa do PIC16F886 é composta por 8192
palavras de 14-bits e é do tipo Flash que pode ser apagada e gravada no circuito. O vetor de Reset é
implementado no endereço 0000h enquanto quer o vetor de interrupção é implementado no endereço 0004h.
A memória de dados é particionada em 4 bancos de 128 bytes onde os endereços baixos de cada banco são
reservados para os Special Function Registers e nos endereços acima dos Special Function Registers estão
localizados os registradores de uso geral (para os dados dos programas do usuário) que no PIC16F886
totalizam 368 bytes. O PIC16F886 possui também um espaço de memória EEPROM (não volátil) de 256
bytes que pode ser gravado e lido por instruções específicas pelo programa do usuário. Normalmente essa
memória é utilizada para armazenar parâmetros de configuração que se deseja preservar de maneira mais
permanente.
2.2 Interrupções
A família de microcontroladores PIC16F88x possui 24 interrupções1 agrupadas num único pedido geral
de interrupção para o microcontrolador. Cada interrupção pode ser mascarada individualmente, atra-
vés de um bit específico. Além disso, todas podem ser habilitadas e desabilitadas através do bit GIE
(INTCON<7>). Se GIE = 1 todas a interrupções que não estiverem mascaradas poderão gerar um pe-
dido de interrupção para o microcontrolador. Caso contrário, se GIE = 0, todas as interrupções estarão
desabilitadas e não serão tratadas pelo microcontrolador, independentemente da máscara.
Na ocorrência de um pedido de interrupção atendido o GIE é automaticamente limpo (GIE = 0),
desabilitando assim qualquer pedido de interrupção subsequente. No retorno da rotina de interrupção,
o GIE é automaticamente re-habilitado (GIE = 1) permitindo que novas interrupções não mascaradas
sejam tratadas.
É importante observar que cada interrupção que ocorre levanta2 um flag específico e que esse flag é
levantado independente das interrupções estarem habilitadas ou não. Por exemplo, no caso da interrupção
1Alguns microcontroladores da família PIC16F87X possuem 14 interrupções
2não encontrei uma tradução direta para o português, em inglês é o verbo "to set": to set a flag
10
2.3. PROGRAMAÇÃO SERIAL NO CIRCUITO CAPÍTULO 2. MICROCONTROLADOR PIC
do Timer 0, seu estouro causará o flag T0IF a se tornar "1", mesmo que GIE = 0. Por outro lado, mesmo
que GIE = 1, no caso da interrupção do Timer 0, essa só será atendida se T0IE = 1, isto é, se a interrupção
estiver desmascarada.
Assim, deverá existir uma única rotina geral para tratamento de interrupções que deverá testar se cada
interrupção a ser tratada possui seu flag de pedido igual a "1" e se está desmascarada. Essa rotina não
aceita parâmetros e não retorna nenhum valor. Por exemplo, no caso de interrupção do Timer 0, deve-se
testar se T0IF = 1 e se T0IE = 1 ao mesmo tempo. Somente nessa condição é que essa interrupção deverá
ser tratada. O mesmo dever ser feito para as outras interrupções. O trecho de programa abaixo ilustra
esse exemplo.
void interrupt isr(void) { // única rotina geral de
// tratamento de interrupções ,
// o nome pode ser qualquer
if (T0IE && T0IF) { // se a interupção do Timer 0 ocorreu
// tratamento da interrupção do Timer 0
}
if (TXIE && TXIF) { // se a interrupção de transmissão
// serial ocorreu
// tratamento da interrupção de transmissão serial
}
...
}
2.3 Programação serial no circuito
A família de microcontroladores PIC16F88x pode ser programada serialmente enquanto o microcontrola-
dor está conectado ao circuito (ICSP – In-Circuit Serial Programming). Isso é feito através de duas linhas,
uma para clock (PGC) e outra para dados (PGD) e mais três linhas para alimentação (VDD), terra (VSS)
e tensão de programação (MCLR/VPP). A ICSP dispensa a retirada do chip do circuito para que seja
apagado e reprogramado, essa característica é muito conveniente pois pode-se colocar o microcontrolador
no circuito e jamais removê-lo mesmo durante o ciclo de desenvolvimento de software. O gravador PICKit
3 usado no curso é capaz de usar esse método para programar diversas famílias de microcontroladores
PIC incluindo a PIC16F88X.
2.4 Programação dos bits de configuração
Os bits de configuração podem ser programados (com valor "0") ou deixados sem programar (com valor
"1") que é o valor default de fábrica. O valor inicial da palavra de configuração é FFFFh. Esses bits
estão organizados em duas palavras de 14-bits e estão mapeados nos endereços 2007h (CONFI1) e 2008h
(CONFIG2). Esses endereços estão além do espaço de memória de programa do usuário e pode ser
acessado somente durante a programação do microcontrolador.
No compilador XC8 esses bits de configuração podem ser programados através da diretiva e função
macro #pragma config. Os bits devem ser especificados pelo seu nome constante na documentação e
atribuído seu estado (ON ou OFF) com um sinal de igual ( = ) ou o seu valor especificado na documentação.
Os diversos bits poder ser separados por vírgula ( , ) ou colocados em diretivas independentes.
Os bits de configuração para o PIC16F886 são apresentados abaixo com os respectivos valores que
podem ser programados em cada um deles, os valores em negrito são os que devem ser alterados da
11
2.4. PROGRAMAÇÃO DOS BITS DE CONFIGURAÇÃOCAPÍTULO 2. MICROCONTROLADOR PIC
configuração default para uso nesse curso, os demais podem ser deixados no valor default:
• FOSC – configuração do oscilador ( RC, RCIO, INTOSC, INTOSCIO, EC, HS, XT, LP )
• WDTE – habilita Watchdog Timer(ON ou OFF)
• PWRTE – habilita Power-up Timer (ON ou OFF)
• MCLRE – seleciona função do pino RE3/MCLR (ON ou OFF)
• CP – habilita proteção de código da memória de programa (ON ou OFF)
• CPD – habilita proteção dos dados (ON ou OFF)
• BOREN – habilita Brown Out Reset: BOREN (ON ou OFF)
• IESO – habilita chaveamento entre oscilador interno e externo durante inicializaç‘ão (ON ou OFF)
• FCMEN – habilita monitor de clock seguro contra falhas (ON ou OFF)
• LVP – habilita programação ICSP com baixa tensão (ON ou OFF)
• BOR4V – seleciona nível de tensão de Brown Out (ON ou OFF)
• WRT – habilita proteção de escrita na memória flash de programa (256, 1FOURTH, HALF, OFF)
Para utilizar a diretiva com a função macro #pragma config e as definições de nomes dos bits deve
ser incluído o header xc.h que carregara as definições para o microcontrolador correto de acordo com o
definido no projeto do MPLAB X. Os detalhes sobre essas definições e configurações estão data sheet da
família PIC16F88x.
O MPLAB X possui uma tela que auxilia na geração de código em Linguagem C para a programação
dos bits de configuração. Essa tela pode ser acessada através do menu Windows > PIC Memory Views
> Configuration Bits. A Figura 1 mostra essa tela e as configurações utilizadas nesse curso. Os valores
configurados aparecem em vermelho.
Figura 1: Tela para bits deconfiguração do MPLAB X
Depois de fazer as alterações necessáras nos bits, clica-se no botão "Generate Source Code to Output"
e o código será gerado numa nova janela de saída. A partir daí, pode-se selecionar o texto e copiar &
colar na janela do programa main.c. A listagem com a estrutura geral do programa apresentada no item
1.3 contém o resultado do código fonte da configuração de bits já colado no programa.
12
2.5. PORTAS DE ENTRADA E SAÍDA CAPÍTULO 2. MICROCONTROLADOR PIC
2.5 Portas de entrada e saída
As portas de entrada e saída utilizam pinos do microcontrolador que são multi-funcionais. Qualquer
função programada num desses pinos desabilita a função de entrada e saída. Assim, se nenhuma função
for programada num desses pinos sua função padrão será de entrada ou saída. Se um determinado pino
será usado para entrada ou para saída, isso deve ser configurado num SFR: TRISA, TRISB e TRISC para
as portas A, B e C, respectivamente, para o PIC16F886. As Portas A, B e C possuem 8-bits cada. A
programação de um bit igual a 0 num SFR TRISx configura o bit da porta para saída, enquanto que a
programação de um bit igual a 1 configura o bit da porta para entrada. O default para todos os bits dos
SFRs TRISx é "1", ou seja todos os bits de todas as portas estão inicialmente configurados para entrada.
Essa é uma condição segura para se evitar curto-circuitos com saídas que esteja conectadas nesses pinos.
Na fase de inicialização do programa principal, as saídas devem ser configuradas.
Por exemplo, as linhas de programa abaixo configuram os bits 2, 3 e 4 da Porta C para saída:
TRISC = 0xf3; // bits 2 e 3 da Porta C são saída e os demais entrada
// (0xf3 = 0b11110011), todos os bits são alterados
TRISC4 = 0; // bit 4 da Porta C é saída e os outros bits não são alterados
Outro exemplo é o caso em que se deseja alterar a configuração de alguns bits e manter a configuração
de outros inalterada. Para isso pode-se ler o valor do registrador de configuração e colocar os bits em zero
com uma operação AND bit a bit:
TRISC &= 0b11110001; // faz os bits 2, 3 e 4 da Porta C como saída
// e não altera a configuração dos demais
Para se alterar o valor de um bit de uma porta, ou seja, fazer com que o valor de um pino mude
pode-se atribuir o valor ao pino diretamente como se fosse a atribuição de valor à uma variável:
RC2 = 1; // bit 2 da Porta C vai para nivel lógico HIGH
Da mesma maneira pode-se ler o valor de um bit de uma porta que corresponde ao valor lógico de um
pino:
bit var; // variável do tipo bit
...
var = RC5; // o valor do bit 5, Porta C é atribuido à variável ’var’
Os pinos das Portas A e B são compartilhadas com as entradas de sinal analógico para os canais de
conversão A/D e no caso de uso como pinos de I/O além da configuração dos SFRs TRISA e TRISB devem
ser configurados os SFRs ANSEL e ANSELH para as Portas A e B, respectivamente. Se o bit da porta
A for usado como I/O digital deve-se escrever um "0" no bit correspondente do SFR ANSEL, lembrando
que no PIC16F886 só existem os canais de conversão AN0 até AN4 nessa porta, ou seja, qualquer escrita
nos bits 5, 6 e 7 desse registrador é ignorada. Na Porta B, os pinos correspondentes aos bits 0 a 5 são
compartilhados com os canais de conversão A/D de 8 a 13 (6 canais de conversão A/D, AN8 a AN13) e
deve-se escrever um "0" no bit correspondente do SFR ANSELH se esses bits da porta B forem usados
como I/O digital. Da mesma maneira que no caso de ANSEL, a escrita de qualquer valor nos bits 6 e 7
de ANSELH é ignorada.
2.6 Timer 0
O módulo do Timer 0 possui as seguintes características:
13
2.6. TIMER 0 CAPÍTULO 2. MICROCONTROLADOR PIC
• contador/timer de 8-bits (sempre incrementando)
• pode ser escrito e lido
• prescaler de 8-bits programável por software
• seleção de clock interno ou externo
• seleção de borda para o clock externo
• interrupção no transbordo de FFh para 00h
O Timer 0 possui dois modos de operação: contador e timer. No modo contador, o Timer 0 conta pulsos
que entram no pino RA4/T0CKI. Já no modo timer, é utilizado o clock interno do microcontrolador
(CLKOUT) que corresponde a frequência do oscilador dividido por 4 (FOSC/4). O modo timer será
utilizado nesse curso e é descrito com mais detalhes a seguir.
O modo timer é selecionado fazendo-se o bit T0CS igual a 0 (OPTION_REG<5>). Nesse modo o
CLKOUT passa opcionalmente por um prescaler de 8-bits que pode dividir a frequência desse clock por
valores entre 2 e 256 em incrementos de potências de 2 (2, 4, 8, 16, 32, 64, 128, 256). O valor de divisão
da frequência é selecionado através de 3 bits, PS2, PS1 e PS0 (OPTION_REG<3:0>).
Esse prescaler é compartilhado com o Watchdog Timer3 e deve-se selecionar se o prescaler será usado
com o Timer 0 ou com o Watchdog Timer. Para tanto programa-se 0 no bit PSA (OPTION_REG<3>), o
que configura o prescaler para uso com o Timer 0, que é a configuração usada nas atividades de laboratório.
Os demais bits do OPTION_REG não afetam o funcionamento do Timer 0 nesse curso e não precisam
ser definidos. Todas as configurações que podem ser definidas pelo OPTION_REG podem ser vistas na
página 79 do data sheet do PIC16F88x.
O Timer 0 é incrementado a cada pulso de clock, seja interno ou recebido no pino T0CKI. Sempre
que ocorre a mudança de valor da contagem de FFh para 00H (transbordo ou estouro) é gerada uma
interrupção sinalizada pelo bit T0IF (INTCOM<2>) que vai de 0 para 1. Essa interrupção pode ser
mascarada se o bit T0IE (INTCON<5>) for limpo (T0IE = 0). Se for esse o caso o pedido de interrupção
não será gerado, mas mesmo assim o bit T0IF irá para 1. No caso de ocorrer a interrupção, o bit T0IF
deve ser limpo por software pela rotina de tratamento de interrupção do Timer 0 antes de se re-habilitar
essa interrupção. Além disso, deve-se lembrar que para que qualquer interrupção seja atendida, o bit GIE
(INTCON<7>) deve ter sido feito = 1.
Num exemplo prático, deseja-se gerar uma interrupção periódica a cada 5 ms aproximadamente usando-
se o Timer 0, considerando que a frequência do oscilador do microcontrolador é 20 MHz.
Assim, a frequência de clock interno CLKOUT é 5 MHz (= 20 MHz / 4). Configurando-se o prescaler
para divisão por 256, tem-se que:
• Período do clock interno = 200 ns
• Saída do prescaler = 51,20 ms (= 200 ns × 256)
• Valor a ser programado como contagem inicial no Timer 0 = 157 (= 255 − 98) pois 51,20 ms × 98
= 5,0176 ms
O trecho de programa abaixo mostra como configurar o Timer 0 e como habilitar a sua interrupção:
3não utilizado nesse curso
14
2.6. TIMER 0 CAPÍTULO 2. MICROCONTROLADOR PIC
#define POLLING_PERIOD 98 // 5,0176 ms
#define TMR0_PRESCALER 7 // divide por 256
#define TMR0_SETTING (0xff - POLLING_PERIOD) // valor inicial da contagem do Timer 0...
...
void main (void) {
...
// Timer 0
// esse exemplo executa a configuração do Timer 0 acessando o SFR OPTION_REG inteiro
// é possivel efetuar a mesma configuração acessando cada bit individualmente
OPTION_REG &= 0b11000000; // T0CS=0, T0SE=0, PSA=0, PS2=0, PS1=0, PS0=0,
// não altera os bits 6 e 7 de OPTION_REG
OPTION_REG |= TMR0_PRESCALER; // configura o prescaler nos bits 0, 1 e 2
// não altera os outros bits
TMR0 = TMR0_SETTING; // valor inicial do Timer 0
// Interruções
T0IE = 1; // habilita a interrupção do Timer 0
GIE = 1; // habilita interrupções
...
}
No trecho de programa acima, deve-se lembrar que a operação
AND bit a bit (&) programa "0"s e que a operação OR bit a
bit (|) programa "1"s.
A rotina de tratamento de interrupção deve verificar se os bits T0IE e T0IF são ambos iguais a 1 para,
somente nesse caso, executar o tratamento necessário para a interrupção do Timer 0. Nessa rotina de
tratamento do Timer 0 um novo valor de contagem inicial deve ser carregado no Timer 0 para se ajustar
o tempo que deverá decorrer até a próxima interrupção.
O trecho de programa abaixo correspondea rotina de tratamento de interrupção para esse exemplo:
void interrupt isr(void) { // rotina geral de tratamento de interrupções
// Timer 0
if (T0IE && T0IF) { // se estiver habilitada e ocorreu a interrupção
// executa aqui o que for necessário
TMR0 = TMR0_SETTING; // recarrega a contagem incial
T0IF = 0; // limpa o flag de interrupção
} // fim do tratamento do Timer 0
// tratamento de outras interruções aqui
}
Timer 1
O módulo do Timer 1 possui as seguintes características:
• contador/timer de 16-bits (par de registradores TMR1H:TMR1L)
15
2.6. TIMER 0 CAPÍTULO 2. MICROCONTROLADOR PIC
• prescaler de 3-bits programável por software
• oscilador LP opcional
• operação sincrona e assincrona
• habilita contagem por Gate via comparador ou pino T1G
• seleção de borda para o clock externo
• interrupção no transbordo de FFFFh para 0000h
• desperta em transfordo
• base de tempo para função de captura / comparação
• disparo por evento especial (com ECCP)
• sincronização da saída do comparador com o clock do Timer 1
16
Capítulo 3
Conversão A/D
É através do uso de um conversor A/D que se pode fazer a leitura de sinais contínuos por sistemas digitais.
Desta maneira, um valor de tensão analógico poder ser convertido para um valor numérico digital numa
variável inteira sem sinal dentro de um programa num microcontrolador. Existem diversos métodos para
conversão analógica / digital (A/D). Seja qual for o método, o sinal analógico é amostrado em intervalos
discretos e convertido num número digital que representa a amplitude do sinal. O processo de conversão
sempre demora um certo tempo para ser completado e sempre ocorrerá um erro de aproximação. Quanto
maior o número de bits do conversor, menor será o erro de aproximação.
Um dos mais utilizados atualmente em microcontroladores é o método de aproximações sucessivas
[5] que é utilizado pelo PIC 16F886. A Figura 2 mostra a estrutura básica de um conversor A/D por
aproximações sucessivas. Neste tipo de conversor é utilizado um conversor D/A para gerar níveis de
tensão que são comparados com a tensão analógica de entrada que se deseja converter. Um código binário
é gerado para o conversor D/A sempre dividindo no meio a faixa de tensão que se aproxima da tensão
de entrada. Esse processo de inicia pelo bit mais significativo e prossegue até o bit menos significativo,
quando o processo termina. A Figura 3 mostra a operação desse tipo de conversor com um exemplo de 4
bits.
Figura 2: Estrutura básica de um conversor A/D por aproximações sucessivas (adaptado de [5])
3.1 Conversão A/D com o PIC
O módulo de conversão analógica para digital (A/D) do PIC16F886 possui 11 canais compartilhando os
pinos das Portas A e B, sendo 5 canais nos pinos da Porta A e 6 canais nos da Porta B. Os canais AN0 a
AN4 compartilham os pinos RA0 a RA4 enquanto que os canais AN8 a AN13 compartilham os pinos RB0
17
3.1. CONVERSÃO A/D COM O PIC CAPÍTULO 3. CONVERSÃO A/D
Figura 3: Operação de um conversor A/D por aproximações sucessivas com um exemplo de 4 bits
(extraído de [5])
a RB5. Os Canais AN5 a AN7 não existem no PIC16F886. O conversor A/D gera um resultado binário
de 10-bits pelo método de aproximações sucessivas descrito anteriormente. O resultado da conversão é
armazenado num par de registradores de 8-bits cada. Os 10-bits do resultado podem ser alinhados à
direita ou à esquerda nos 16-bits formados por ADRESH e ADRESL. O conversor A/D é controlado pelos
registradores ADCON0 e ADCON1.
Em resumo, o módulo de conversão A/D opera com 6 registradores:
• ADCON0 – Registrador de controle e operação
• ADCON1 – Registrador de configuração
• ANSEL – Registrador de configuração dos canais AN0 a AN4 como analógicos ou digitais
• ANSELH – Registrador de configuração dos canais AN8 a AN13 como analógicos ou digitais
• ADRESH – Registrador da parte mais significativa do resultado
• ADRESL – Registrador da parte menos significativa do resultado
Além desses registradores específicos devem ser configurados os registradores TRISA, TRISB. A confi-
guração default desses registradores é para operação como entrada analógica para o conversor A/D para
todos os canais.
3.1.1 Seleção do clock de conversão A/D
O tempo de conversão A/D para cada bit é definido como TAD. O processo de conversão A/D requer
o tempo mínimo de 11 TAD para a conversão de 10-bits. Para que as conversões possam ser realizadas
corretamente a frequência do clock de conversão A/D deve ser definida de maneira a garantir no mínimo
um TAD de 1,6 ms.
A frequência do clock de conversão é definida através dos bits ADCS1 e ADCS0 (ADCON0<7:6>).
Pode-se definir as frequências de FOSC/2, FOSC/8, FOSC/32 ou FRC (frequência determinada pelo
oscilador RC interno do módulo A/D). A Tabela 1 resume as configurações possíveis para a definição da
frequência do clock do conversor.
Por exemplo, se o clock do oscilador for FOSC = 20MHz o período será 50 ns, assim o clock de conversão
com frequência FOSC/32 resultará em TAD = 1,6 ms, que é o valor mínimo possível para TAD . Nesse
18
3.1. CONVERSÃO A/D COM O PIC CAPÍTULO 3. CONVERSÃO A/D
Tabela 1: Bits de configuração da frequência do clock de conversão A/D (adaptado da página 105 do
data sheet do PIC16F88x [2]).
Período do clock do ADC (TAD) Frequência do dispositivo (FOSC)
Frequência do clock de conversão A/D
ADCON0
ADCS<1:0>
20 MHz 8 MHz 4 MHz 1 MHz
FOSC/2 00 100 ns 250 ns 500 ns 2,0 ms
FOSC/8 01 400 ns 1,0 ms 2,0 ms 8,0 ms
FOSC/32 10 1,6 ms 4,0 ms 8,0 ms 32,0 ms
FRC (frequência determinada pelo oscilador
RC interno do módulo A/D)
11 2-6 ms 2-6 ms 2-6 ms 2-6 ms
Legenda: células com fundo cinza estão fora do valor recomendado.
caso os bits ACDS1:ADCS0 devem ser programados com o valor 10. Valores de TAD maiores do que 6 ms
também não são considerados adequados pois deixam o processo de conversão muito lento e recomenda-se
a escolha de outro fator de divisão para FOSC .
3.1.2 Outras configurações
Justificação do resultado. O resultado de conversão A/D possui de 10-bits de informação que podem
ser alinhados à direita ou à esquerda com restante dos bits preenchidos com zero nos registradores
ADRESH e ADRESL que possuem juntos 16-bits. Essa configuração é feita no bit ADFM (AD-
CON1<7>). Se ADFM = 0 o resultado da conversão é justificado à esquerda e se for = 1 é justificado
à direita. A Figura 4 mostra como fica a justificação do resultado de acordo com a configuração
desse bit.
Figura 4: Justificação do resultado da conversão A/D de acordo com ADFM (extraído de [2])
Tensões de referência. As tensões de referência utilizadas para a conversão A/D pode ser configuradas
independentemente através dos bits VCFG0 e VCFG1 (ADCON1<5:4>). Para se utilizar como
referências as tensões de alimentação (VDD e VSS) do PIC deve-se configurar ambos os bits para
"0". Para se configurar a tensão de referência inferior VREF–, escreve-se o valor "1" no bit VCFG1.
Nesse caso, o pino RA2/AN2 é utilizado como entrada para esse nível de tensão de referência. Para
se configurar a tensão de referência superior VREF+, escreve-se o valor "1" no bit VCFG0. Nesse
caso, o pino RA3/AN3 é utilizado como entrada para esse nível de tensão de referência.
19
3.1. CONVERSÃO A/D COM O PIC CAPÍTULO 3. CONVERSÃO A/D
3.1.3 Procedimento para realizar uma conversão A/D
Os seguintes passos devem ser seguidos para se fazer uma conversão A/D:
1. Configurar a porta:
• Desabilitar o driver de saída do canal através da programação de um "1" no bit correspondente
do registrador TRISx
• Configurar o pino como analógico através da programação de um "1"no bit correspondente do
registrador ANSEL ou ANSELH
2. Configurar o módulo A/D:
• Selecionar a frequência do clock de conversão A/D programando-se ADCS1 e ADCS0 no regis-
trador ADCON0
• Configurar a referência de tensão programando-se VCFG1e VCFG0 no registrador ADCON1
• Selecionar o canal de entrada A/D programando-se CHS<3:0> no registrador ADCON0
• Selecionar o formato do resultado programando-se ADFM no registrador ADCON1
• Ligar o módulo de conversão A/D através da programação de um "1" no bit ADON do regis-
trador ADCON0
3. Configurar a interrupção A/D (caso desejado):
• Limpar o bit ADIF
• Fazer o bit ADIE = 1
• Fazer o bit PEIE = 1
• Fazer o bit GIE = 1
4. Esperar o tempo de aquisição necessário.
5. Iniciar o processo de conversão:
• Fazer o bit GO/DONE = 1 no registrador ADCON0
6. Esperar o processo de conversão ser completado por um de dois métodos:
• Esperar o bit GO/DONE ser limpo (sem interrupções habilitadas)
OU
• Esperar pela interrupção de A/D através do bit ADIF
7. Ler o resultado da conversão A/D no par de registradores ADRESH e ADRESL, limpar o bit ADIF
caso necessário.
8. Para a próxima conversão, prosseguir com o passo 2 ou 3 conforme necessário. O tempo de conversão
A/D por bit é definido como TAD. Um tempo mínimo de 2TAD é necessário antes que uma nova
conversão seja iniciada.
20
3.1. CONVERSÃO A/D COM O PIC CAPÍTULO 3. CONVERSÃO A/D
3.1.4 Rotinas de biblioteca
Para configuração e utilização do módulo de conversão analógica para digital (A/D) foi criada uma
biblioteca com as seguintes funções:
• void adc_init(unsigned char ADC_Channel) – Essa função configura os canais A/D de 0 a 3,
onde o número do canal é o parâmetro de entrada ADC_Channel. Ela está configurada previamente
para o caso do laboratório onde se utiliza somente o canal analógico 0, com tensão de referência dada
por VDD e VSS. Qualquer alteração deve ser feita no arquivo adc.c. Essa rotina deve ser chamada
uma única vez para cada canal na seção de inicialização dos dispositivos do programa principal.
• unsigned int adc_read(unsigned char ADC_Channel) – Recebe o valor do canal A/D passado
como parâmetro com 10-bits alinhados à direita. Essa função aguarda o término da conversão antes
de retornar. Além disso, essa função configura a frequência de conversão para FOSC/32 para a
frequência do oscilador de 20MHz e pode ser chamada dentro da rotina de interrupção.
Para a utilização dessas funções deve ser incluído o header adc.h.
21
Capítulo 4
Display LCD
A maioria dos displays de LCD utiliza chips controladores que seguem o mesmo padrão de conexão com
um microcontrolador e com comandos muito similares. O display utilizado no laboratório usa um chip
HD44780U da Hitachi cuja documentação está disponível no site da disciplina (http://www.poli.usp.
br/pmr/lpa/pmr2415). Neste documento é apresentado um resumo dos pontos mais importantes para
se utilizar o display de LCD, caso se deseje modificar o funcionamento do display deve-se consultar a
documentação completa do controlador HD44780U. A conexão física do display de LCD com o microcon-
trolador é vista nas aulas de teoria em detalhes.
4.1 Interface com microcontrolador
A interface do controlador do display LCD com o microcontrolador utiliza 3 sinais de controle e 8 ou 4
bits de dados descritos na Tabela 2.
Tabela 2: Sinais de interface do controlador do display LCD com microcontrolador.
Sinal C/D I/O Descrição
RS C I Seleciona registradores.
0: Registrador de comandos (escrita) ou Flag de
ocupado e contador de endereços (leitura)
1: Registrador de dados (escrita e leitura)
R/W C I Seleciona leitura ou escrita.
0: escrita
1: leitura
E C I Inicia escrita ou leitura de dados (age como strobe)
DB4 a DB7 D I/O 4 bits mais significativos do barramento de dados
tri-state bidirecional. Usado para transferência e
recepção de dados entre o microcontrolador e o
HD44780U. DB7 pode ser usado como flag de ocupado.
DB0 a DB3 D I/O 4 bits menos significativos do barramento de dados
tri-state bidirecional. Usado para transferência e
recepção de dados entre o microcontrolador e o
HD44780U. Esses sinais não são usados durante a
operação em 4-bits.
No circuito montado nesse curso é utilizada uma interface com 4-bits e somente para escrita, isto
é, são utilizados os sinais RS, E e DB4 a DB7, o sinal R/W é mantido em nível lógico LOW o tempo
22
4.2. INSTRUÇÕES E DADOS CAPÍTULO 4. DISPLAY LCD
todo e os sinais DB0 a DB3 não são utilizados. Essa abordagem utiliza a menor quantidade de sinais,
economizando desta maneira pinos de I/O do microcontrolador, em contrapartida, o acesso ao display
LCD é mais lento. A Figura 5 mostra um exemplo de transferência de dados entre o microcontrolador e o
display LCD através de uma interface de 4-bits. Esse exemplo mostra 3 ciclos de transferência de dados:
• Escrita no registrador de instruções
• Leitura do flag de ocupado e contador de endereços
• Leitura do registrador de dados
No primeiro e segundo o sinal RS está em nível lógico LOW, o que significa que é escrita ou leitura de
um comando. O sinal R/W define se é leitura ou escrita, ou seja, é escrita no primeiro ciclo e leitura no
segundo. No terceiro o sinal RS está em nível lógico HIGH e o sinal R/W está em nível lógico HIGH, o que
significa que é leitura de dados. Observe que o sinal E pulsa de LOW para HIGH cada vez que um dado
está estável no barramento de dados DB4 a DB7. Este é o sinal de strobe que comanda a transferência.
Figura 5: Exemplo de transferência de dados através de interface de 4-bits entre microcontrolador e
display LCD [1].
Como na implementação desse laboratório o sinal R/Westá sempre em nível lógico LOW são realizadas
somente operações de escrita no display LCD e nunca operações de leitura. A limitação dessa abordagem
é que não é possível ler o flag de ocupado e os endereços do registrador de dados (se RS = 0) nem o
conteúdo do registrador de dados (se RS = 1). Como consequência, entre duas escritas consecutivas é
necessário esperar um tempo fixo, cerca de 40 ms, para o controlador do display voltar para um estado
desocupado. O não respeito a esse intervalo de tempo causa a perda de dados.
4.2 Instruções e dados
Somente um registrador de instruções (IR) e um registrador de dados (DR) do HD44780U podem ser
controlados pelo microcontrolador. Antes de iniciar qualquer operação interna do HD44780U, a informação
de controle é temporariamente armazenada nesses registradores o que permite seu interfaceamento com
diversos tipos de microcontroladores e me diferentes velocidades.
23
4.2. INSTRUÇÕES E DADOS CAPÍTULO 4. DISPLAY LCD
4.2.1 Instruções
O registrador de instruções (IR) pode conter instruções em 4 categorias:
Especificação de funções do HD44780U, tais como formato do display, comprimento de dados, etc.
• Definição de endereços da RAM interna
• Realização transferência de dados com a RAM interna
• Realização de funções diversas
A Tabela 3 apresenta todas as instruções disponíveis com o seu tempo de execução.
Tabela 3: Instruções do HD44780U [1].
24
4.2. INSTRUÇÕES E DADOS CAPÍTULO 4. DISPLAY LCD
Procedimento de inicialização do display LCD
Ao ser aplicada energia no HD44780U, um circuito de RESET interno inicializa o chip que passa por um
procedimento de inicialização automático. Durante a inicialização, o flag de ocupado está preso no nível
lógico HIGH por cerca de 10 ms após a tensão Vcc atingir 4,5V e passa para o nível lógico LOW após a
inicialização ser completada.
Apesar a inicialização automática do HD44780U definir uma série de configurações sem a intervenção
do usuário, essas configurações não são adequadas para as conexões de hardware feitas na implementação
utilizada no laboratório. Assim, após a inicialização automática deve-se realizar um procedimento de
inicialização apropriado que deve seguir os seguintes passos:
1. Limpar display
2. Definir as seguintes funções:
3. DL = 0; interface de 4-bits
4. N = 1; display de 2 linhas
5. F = 0; tamanho do caractere em matriz de 5 x 8 pontos
6. Controle de liga/ desliga do display:7. D = 0; desliga display
8. C = 0; desliga cursor
9. B = 0; sem piscar (blink)
10. Definir modo de entrada:
11. I/D = 1; incrementa de 1
12. S = 0; sem deslocamento
O significado das siglas utilizadas no procedimento acima estão no final da Tabela 3.
4.2.2 Dados
A RAM de dados do display (DDRAM) armazena os dados que são visíveis no display num código de
8-bits por caractere. A quantidade total de caracteres que podem ser armazenados nessa memória é de 80
caracteres. Existe uma relação entre o endereço da DDRAM e a apresentação dos caracteres no display.
Num display de 2 linhas a relação dos endereços é apresentada na Figura 6. Observa-se que os 40 primeiros
endereços a partir do endereço 00h correspondem à primeira linha do display e os 40 endereços a partir
do endereço 40h correspondem à segunda linha. No display LCD utilizado no laboratório uma janela de
8 caracteres por 2 linhas sobre essa organização de endereços da DDRAM sempre estará visível. Ou seja,
se a janela estiver sobre os 8 primeiros endereços serão mostrados no display os caracteres armazenados
nos endereços 00h a 07h para a primeira linha e nos endereços 40h a 47h para a segunda linha. Essa
janela pode ser deslocada através das instruções adequadas. A Figura 7 mostra a posição da janela de 8
caracteres por 2 linhas sobre o início da DDRAM, depois no caso de deslocamento para a esquerda e por
último no caso de deslocamento para a direita.
25
4.3. CARACTERES CAPÍTULO 4. DISPLAY LCD
Figura 6: Endereços da DDRAM para apresentação de caracteres no display [1].
Figura 7: Exemplo de deslocamento da janela de um display de 8 caracteres por 2 linhas [1].
Para se escrever caracteres que podem se mostrados no display deve-se primeiramente definir no
registrador IR o endereço da DDRAM a partir do qual se deseja armazenar o código do caractere e
depois escrever o código no registrador DR. Após essas operações um procedimento interno do HD44780U
passa o código para a posição da DDRAM definida. Existe um mecanismo de incremento e decremento
automático do endereço da DDRAM de modo que não é necessário definir um novo endereço cada vez que
desejar mostrar um caractere no display, é suficiente escrever o primeiro endereço. É importante observar
que os endereços da DDRAM possuem somente 7-bits podendo assumir valores entre 0 e 127 (ou 7Fh).
4.3 Caracteres
Os caracteres que podem ser mostrados no display LCD são representados com um código de 8-bits e são
armazenados internamente numa memória ROM no HD44780U. Os caracteres com o bit mais significativo
igual a 0 e entre os códigos 20h e 7Fh são representados com o código ASCII, o que mantém compatibilidade
do display com a maioria dos sistemas. Por outro lado, os códigos que possuem bit mais significativo igual
a 1 são particulares de cada fabricante e mostrarão caracteres por ele definidos. Os primeiros 16 códigos
podem ser usados para mostrar caracteres definidos pelo usuário e armazenados numa memória apropriada
(CGRAM) dentro do HD44780U. A Tabela 4 mostra os caracteres que podem ser mostrados no display por
código. As linhas contém os 4-bits menos significativos de cada código enquanto que as colunas contém
os 4-bits mais significativos.
4.4 Biblioteca
Está disponível uma biblioteca para o HI-TECH C para acesso ao display LCD no laboratório. Essa bi-
blioteca foi configurada para a implementação de hardware utilizada nesse laboratório. Caso seja alterado
26
4.4. BIBLIOTECA CAPÍTULO 4. DISPLAY LCD
Tabela 4: Caracteres que podem ser mostrados no display LCD [1].
algum bit utilizado da Porta B ou C, a biblioteca deverá ser modificada. Para utilizá-la deve incluir o
header lcd.h no programa. As funções dessa biblioteca são as seguintes:
• void lcd_init(void) – Essa função inicializa o controlador do display LCD para utilizar uma
interface de 4-bits, somente para escrita, com 2 linhas, com cursor piscando, com deslocamento de
caracteres da esquerda para a direita a cada novo caractere e formato de caractere com matriz de 5
x 8 pontos. Essa função pode ser alterada caso se deseje iniciar o display de outra maneira, como
por exemplo, com cursor apagado.
• void lcd_clear(void) – Essa função limpa o display e coloca o cursor na primeira posição da
primeira linha. ATENÇÃO: essa função demora cerca de 2 ms para ser executada e não seve ser
utilizada dentro de loops pois causa atrasos na execução do programa e atrapalha a execução de
interrupções. Deve-se utilizar essa função somente após a inicialização do display LCD ou em trechos
de programa onde não seja repetida periodicamente. Para se retornar o cursor para a primeira
posição da primeira linha deve-se utilizar a função lcd_goto(0)(vide descrição abaixo) e para se
apagar carateres pode-se escrever espaços (ASCII = 20h) no display.
• void lcd_write(unsigned char c) – Essa função escreve um valor de 8-bits no display. Ela quebra
a escrita em duas etapas de 4-bits cada de modo que o usuário não precisa se preocupar com isso.
27
4.4. BIBLIOTECA CAPÍTULO 4. DISPLAY LCD
Ela não distingue entre comandos ou dados e é chamada pelas outras funções dessa biblioteca que
definem se são comandos ou dados apropriadamente. Deve-se evitar chamar essa função diretamente.
Caso seja chamada, o valor do sinal RS deve ser configurado antes de se chamar essa função. Se RS
= 0, o parâmetro de entrada é um comando e de RS=1 o parâmetro de entrada é um caracter a ser
mostrado no display.
• void lcd_puts(const char *s) – Essa função escreve um string na memória DDRAM.
• void lcd_goto(unsigned char pos) – Essa função muda o cursor para o endereço especificado no
parâmetro. O valor do parâmetro pode estar entre 0 e 39 para a primeira linha e entre 64 e 103
para a segunda linha.
• void lcd_cursor(int on) – Liga ou desliga o cursor de acordo com o parâmetro de entrada. Se
on = 1 liga o cursor piscando e se on = 0 desliga o cursor.
• void lcd_putchr(char c) – Escreve um caracter na posição atual do cursor no LCD. Não é feita
nenhuma consistência se o caracter é visível ou não, caso não seja um caracter visível, simplesmente
ele não será mostrado no display.
28
Capítulo 5
Comunicação serial
A comunicação serial entre dois dispositivos pode ser feita de modo síncrono ou assíncrono. No modo
síncrono a transmissão e recepção dados é controlada por um sinal de clock, gerado pelo dispositivo
mestre. Geralmente, esse modo é utilizado entre dispositivos internos de um computador onde o mestre
é o microcontrolador e os dispositivos escravos são periféricos que podem ser conversores A/D e D/A,
memórias, sensores, dentre outros. Já no modo assíncrono, a transmissão e recepção de dados é feita
através de uma única linha de dados, sem a transmissão do sinal de clock entre os dispositivos. Nesse
caso, cada dispositivo gera seu próprio clock internamente. Esse modo é utilizado para comunicação entre
computadores independentes ou entre um computador e um periférico do tipo terminal ou console de
dados.
No modo assíncrono, o início de transmissão de dados é marcado por um start-bit. Depois é enviada
a sequência dos bits de dados, a partir do bit menos significativo. A transmissão é terminada por um
stop-bit. Quando nenhum dado está sendo transmitido, a linha de comunicação permanece no mesmo
valor do stop-bit cujo nível é o oposto do start-bit. A duração de cada bit e a quantidade de bits de dados
devem ser configuradas com os mesmos valores tanto no dispositivo que transmite como no que recebe.
A Figura 8 mostra o sinal numa linha de comunicação assíncrona.
Figura 8: Sinal numa linha de comunicação assíncrona
Num microcontrolador um módulo de comunicação serial com capacidade de transmitir e receber dados
nos modos síncrono e assíncrono, configurável por software, é denominado USART (Universal Synchronous
Asynchronous Receiver Transmitter).
Se um módulo de comunicação serial tem a capacidade de receber etransmitir ao mesmo tempo, esse
módulo é denominado full-duplex . Por outro lado, se só transmite ou recebe dados exclusivamente, é
denominado half-duplex . Para o modo full-duplex são necessárias duas linhas de sinal, uma de entrada e
29
5.1. COMUNICAÇÃO SERIAL NO PIC CAPÍTULO 5. COMUNICAÇÃO SERIAL
outra de saída para que possam operar simultaneamente. No modo half-duplex , a transmissão e recepção
pode se dar numa única linha bidirecional. Pode-se ter sistemas de comunicação serial assíncrono e
síncrono tanto full-duplex como half-duplex conceitualmente, mas as implementações são mais restritivas.
Por exemplo, no PIC 16F886, a USART se configurado em modo assíncrono pode operar em full-duplex ,
mas se configurado em modo síncrono só pode operar em half-duplex .
5.1 Comunicação serial no PIC
No PIC16F886 a USART é denominada EUSART (Enhanced Universal Synchronous Asynchronous Re-
ceiver Transmitter) pois possui funções adicionais para poder operar em sistemas com barramento LIN
(Local Interconnect Network). O módulo EUSART contém gerador de clock, registradores de desloca-
mento, buffers e sistema de interrupção para realizar a transferencia serial de dados para (transmissão) e
de (recepção) outro dispositivo, independentemente da execução de um programa. A configuração assín-
crona full-duplex é utilizada nesse curso para comunicação com outro computador e é descrita em detalhes
a seguir.
A transmissão e recepção de dados pelo módulo EUSART utiliza o formato padrão NRZ (non-return-
to-zero). O NRZ é implementado por dois níveis, um nível MARK que representa um bit de dado igual a
"1" e um nível SPACE que representa um bit de dado igual a "0". O termo NRZ se refere ao fato de que
dois bits transmitidos consecutivamente com o mesmo valor permanecem no valor sem retornar para um
valor neutro entre a transmissão de cada bit. Numa transmissão NRZ o valor de repouso, isto é, quando
não estiver sendo transmitido nenhum dado, é o nível MARK. O start-bit sempre tem um nível SPACE
e o stop-bit sempre tem um nível MARK. Assim, a transmissão de um caracter consiste de um start-bit,
seguido por 8 ou 9 bits de dados e terminado por um ou mais stop-bits. Cada bit transmitido permanece
no seu nível pelo tempo de 1/(frequência de transmissão). O formato de dados mais comum é de 8 bits.
Os 8 ou 9 bits de dados são transmitidos a partir do bit menos significativo. O transmissor e o receptor do
módulo EUSART operam de maneira independente o que permite o seu funcionamento em full-duplex . A
paridade não é suportada pelo hardware, mas pode ser gerada por software e armazenada e transmitida
como o nono bit de dado.
5.1.1 Configuração da taxa de baud
O PIC 16F886 possui um gerador de Taxa de Baud dedicado para suportar tanto a operação em modo sín-
crono como assíncrono do módulo EUSART. Esse gerador possui um timer de 8 ou 16-bits que pode ser con-
figurado por software. Por default esse timer opera em 8-bits, mas fazendo BRG16 = 1 (BAUDCTL<3>)
pode-se alterar o timer para operação em 16-bits. Os registradores SPBRGH e SPBRG determinam a
Taxa de Baud. No modo assíncrono o multiplicador do período da Taxa de Baud é determinado tanto
pelo bit BRGH (TXSTA<2>) como pelo BRG16 (BAUDCTL<3>). No modo síncrono o bit BRGH é
ignorado. As fórmulas para cálculo da Taxa de Baud são apresentadas na Tabela 5 para todos os valores
possíveis dos bits de configuração.
Por exemplo, o valor que deve ser programado no par de registradores SPBRGH e SPBRG para Taxa
de Baud de 9600, em modo assíncrono, com timer de 8-bits para um dispositivo com frequência de oscilador
de 16 MHz, pode ser calculado pela seguinte fórmula:
Taxa deBaudDesejada =
FOSC
64([SPBRGH : SPBRG] + 1)
30
5.1. COMUNICAÇÃO SERIAL NO PIC CAPÍTULO 5. COMUNICAÇÃO SERIAL
Tabela 5: Fórmulas para cálculo da Taxa de Baud de acordo com os bits de configuração (adaptada da
Tabela 12-3, p. 167 do data sheet do PIC 16F886)
Bits de configuração
Modo
Timer
Fórmula
SYNC BRG16 BRGH
0 0 0 assíncrono 8-bits FOSC/[64(n+ 1)]
0 0 1 assíncrono 8-bits
FOSC/[16(n+ 1)]0 1 0 assíncrono 16-bits
0 1 1 assíncrono 16-bits
FOSC/[4(n+ 1)]1 0 x síncrono 8-bits
1 1 x síncrono 16-bits
utilizando-se BRGH = 0.
Resolvendo para SPBRGH : SPBRG:
x =
FOSC
Taxa deBaudDesejada
64
� 1 =
16000000
9600
64
� 1 = [25.042] ⇠= 25
=
16000000
9600
64
� 1
= [25.042] ⇠= 25
Para o valor de SPBRGH : SPBRG calculado e arredondado, pois o valor deve ser inteiro, tem-se:
Taxa deBaudCalculada =
16000000
64(25 + 1)
= 9615
A adoção desse valor produz o seguinte erro no valor da Taxa de Baud:
Erro =
Taxa deBaudCalculada� Taxa deBaudDesejada
Taxa deBaudDesejada
=
(9615� 9600)
9600
= 0.16%
Os valores típicos para as Taxas de Baud obtidos com as fórmulas da Tabela 5 para o modo assíncrono
e diferentes valores dos bits de configuração e frequências do oscilador estão na Tabela 12-5, p. 168-169,
do data sheet do PIC 16F886. Analisando-se a Tabela 12-5 percebe-se que o uso de BRGH = 1 ou de
BRG16 = 1 pode reduzir o erro da Taxa de Baud. O timer de 16-bits deve ser usado para obter Taxas de
Baud mais baixas com frequências de oscilador mais altas.
A escrita de um novo valor no par de registradores SPBRGH e SPBRG causa um RESET imediato no
timer do gerador de Taxa de Baud. Isso assegura que o timer não demore até seu próximo estouro para
produzir a nova Taxa de Baud.
5.1.2 Configuração e operação do transmissor assíncrono
O transmissor do módulo EUSART trabalha com dois registradores, um buffer de entrada (TXREG) e
um registrador de deslocamento (TSR). Somente o TXREG pode ser acessado pelo usuário, o TSR não
possui endereço para acesso. Dois flags podem ser usados para se determinar o estado do transmissor:
• TXIF – é o flag de interrupção e vai para "1" quando TXREG estiver vazio
• TRMT – indica se TSR está vazio e fica em "0" enquanto TSR estiver com algum dado
31
5.1. COMUNICAÇÃO SERIAL NO PIC CAPÍTULO 5. COMUNICAÇÃO SERIAL
O diagrama em blocos da Figura 12-1, p. 155, do data sheet do PIC 16F886 mostra a estrutura completa
do transmissor do módulo EUSART.
A transmissão de dados é iniciada escrevendo-se um caracter no registrador TXREG. Se for o primeiro
caracter, ou se o caracter anterior já foi totalmente transmitido, ou seja, se o TSR estiver limpo, o dado
do TXREG é transferido imediatamente para o TSR. Por outro lado, se o TSR ainda contiver alguma
parte do caracter anterior, o caracter escrito no TXREG permanecerá lá até que o stop-bit do caracter
anterior tenha sido transmitido e o TSR esteja limpo. Só então o caracter do TXREG será transferido
para o TSR e um novo processo de transmissão é iniciado imediatamente.
O flag de interrupção TXIF é setado quando o transmissor do módulo EUSART estiver habilitado
e nenhum caracter estiver armazenado em TXREG, ou seja, o TXIF vai de "0" para "1" quanto o
transmissor está pronto para enviar outro caracter. Esse flag pode ser lido a qualquer momento, mas a
sua mudança para "0" após a escrita em TXREG demora um pouco e deve retornar um valor inválido
se lido imediatamente após a escrita de um caracter em TXREG. O flag TXIF será setado toda vez que
TXREG estiver vazio, independente de TXIE. O flag TXIF só pode ser lido e não pode ser limpo por
software. Para que o flag TXIF gere uma interrupção os seguintes bits devem estar habilitados: TXIE,
GIE e PEIE (TXIE = 1, GIE = 1 e PEIE = 1).
Para usar interrupções para transmitir dados, TXIE deve ser setado somente quanto existirem mais
dados para serem transmitidos. O bit TXIE para habilitação da interrupção de transmissão deve ser
limpo quando o último caracter a ser transmitido tiver sido escrito em TXREG.
O bit TRMT indica o estado do registrador TSR. Esse bit somente pode ser lido. Quando o registrador
TSR está vazio, o bit TRMT é setado. Esse bit é limpo quando um caracter é transferido do registrador
TXREGpara o registrador TSR. O bit TRMT fica em "0" até que todos os bits do TSR tenham sido
deslocados para serem transmitidos. Esse bit não causa uma interrupção e o usuário deve ler o seu valor
para determinar o estado de TSR.
O transmissor pode ser habilitado para operações assíncronas através da configuração dos seguintes
bits de controle:
• TXEN = 1 – habilita o circuito de transmissão do módulo EUSART
• SYNC = 0 – configura o módulo EUSART para operação em modo assíncrono
• SPEN = 1 – habilita o módulo EUSART e configura automaticamente o pino de I/O TX/CK
como saída. Se o pino TX/CK tiver sido previamente utilizado como entrada analógica, o bit
correspondente no registrador ANSEL deve ser limpo.
Nota quando o bit SPEN é programado como "1", o pino de I/O TX/CK é automa-
ticamente configurado como saída, independente do valor programado no TRIS
correspondente e independente do receptor do módulo EUSART estar habili-
tado. O registrador do PORT é desconectado do driver de saída de maneira
que não é possível usar o pino TX/CK como saída de uso geral.
Assume-se que todos os outros bits de controle do módulo EUSART estão no seu estado default.
A sequência a seguir resume o procedimento para utilizar o transmissor assíncrono:
1. Inicializar o par de registradores SPBRGH e SPBRG e os bits BRGH e BRG16 de acordo com a
Taxa de Baud desejada.
32
5.1. COMUNICAÇÃO SERIAL NO PIC CAPÍTULO 5. COMUNICAÇÃO SERIAL
2. Habilitar a comunicação assíncrona fazendo SYNC = 0 e SPEN = 1.
3. Se for desejada transmissão de 9-bits, fazer o bit de controle TX9 = 1.
4. Habilitar a transmissão fazendo TXEN = 1. Isso causará o bit de interrupção TXIF ir para "1".
5. Se for desejado utilizar interrupções, fazer o bit TXIE = 1. Uma interrupção ocorrerá imediatamente
se GIE = 1 e PEIE = 1.
6. Se for transmissão de 9-bits, escrever o valor do nono bit em TX9D.
7. Carregar o caracter de 8-bits no registrador TXREG. Isso inicia a transmissão.
5.1.3 Configuração e operação do receptor assíncrono
O receptor do módulo EUSART trabalha com um registrador de deslocamento para receber os dados
(RSR) e um buffer FIFO (First-in First-out) de dois caracteres. O registrador RSR e o buffer FIFO não
são acessados diretamente. Os dados recebidos são acessados através do registrador RCREG. Três flags
podem ser usados para se determinar o estado do receptor:
• RCIF – é o flag de interrupção e vai para "1" quando um caracter entrar no buffer FIFO
• FERR – é um flag de erro e indica que não foi detectado o stop-bit no final do caracter recebido
• OERR – é um flag de erro e indica que o buffer FIFO está cheio e não será recebido outro caracter
até que o buffer tenha espaço
O diagrama em blocos da Figura 12-2, p. 156, do data sheet do PIC 16F886 mostra a estrutura completa
do receptor do módulo EUSART.
Assim que um caracter é recebido no registrador de deslocamento RSR, ele é transferido imediatamente
para o buffer FIFO e o flag RCIF é setado. Se no lugar de um stop-bit, cujo valor é "1", for recebido um
"0", é gerado um erro de FRAMING, ou seja, o flag FERR é setado. O caracter do topo do buffer FIFO
é transferido para fora do buffer na leitura do registrador RCREG. Se o buffer FIFO de dois caracteres
estiver cheio é gerado um erro de OVERRUN, ou seja o flag OERR é setado, e nenhum caracter adicional
será recebido.
O flag de interrupção RCIF é setado quando o receptor do módulo EUSART estiver habilitado e
quando o buffer FIFO contiver um caracter não lido. Ou seja, o RCIF vai de "0"para "1" quando o
receptor tiver um caracter pronto para ser lido. O flag RCIF será setado toda vez que um caracter chegar
ao buffer FIFO, independente de RCIE. O flag RCIF só pode ser lido e não pode ser limpo por software.
Para que o flag RCIF gere uma interrupção é gerada os seguintes bits devem estar habilitados: RCIE ,
GIE e PEIE (RCIE = 1, GIE = 1 e PEIE = 1).
Cada caracter no buffer FIFO de recepção possui um bit de erro de FRAMING correspondente. O
erro de FRAMING indica que o stop-bit não foi detectado no momento em que era esperado. O estado
do erro de FRAMING poder ser acessado através do bit FERR (RCSTA<2>) e representa o estado erro
do caracter no topo do buffer FIFO. Portanto, o bit FERR deve ser lido antes de se ler o registrador
RCREG senão será sobre-escrito pelo estado de erro de FRAMING do caracter seguinte do buffer FIFO.
O bit FERR somente pode ser lido e se aplica somente ao caracter no topo do buffer FIFO. Um erro de
FRAMING não impede que caracteres adicionais sejam recebidos. Não é necessário limpar o bit FERR. A
leitura do próximo caracter do buffer FIFO faz avançar a fila para o próximo caracter e consequentemente
33
5.1. COMUNICAÇÃO SERIAL NO PIC CAPÍTULO 5. COMUNICAÇÃO SERIAL
para o próximo erro de FRAMING correspondente. Pode-se força que o bit FERR seja limpo, limpando-se
o bit SPEN. Fazendo-se CREN = 0 não afeta o bit FERR. Um erro de FRAMING não gera interrupção.
Se todos os caracteres do buffer FIFO de recepção contiverem erros de FRAMING, a leitura de RCREG
não limpará o bit FERR.
O buffer FIFO de recepção pode conter até dois caracteres. É gerado um erro de OVERRUN se for
recebido um terceiro caracter antes que a FIFO tenha sido acessada. Se ocorrer essa situação o bit OERR
é setado. Os caracteres que já estiverem no buffer FIFO poderão ser lidos, mas nenhum caracter adicional
será recebido até que a condição de erro seja cancelada. Isso pode ser feito limpando-se o bit CREN
(RCSTA<4>) ou através da reinicialização do módulo EUSART limpando-se o bit SPEN (RCSTA<5>).
O módulo EUSART suporta a recepção de caracteres com 9-bits. Quando o bit RX9 (RCSTA<6>)
estiver setado, 9-bits serão deslocados para dentro do registrador RSR para cada caracter recebido. O
nono bit, o mais significativo do caracter, poder ser lido no bit RX9D (RCSTA<0>). Esse bit corresponde
ao nono bit do caracter do topo do buffer FIFO. Assim, ele deve ser lido antes da leitura dos 8-bits menos
significativos que estão no buffer.
O receptor pode ser habilitado para operações assíncronas através da configuração dos seguintes bits
de controle:
• CREN = 1 – habilita o circuito de recepção do módulo EUSART
• SYNC = 0 – configura o módulo EUSART para operação em modo assíncrono
• SPEN = 1 – habilita o módulo EUSART e configura automaticamente o pino de I/O RX/DT
como entrada. Se o pino RX/DT tiver sido previamente utilizado como entrada analógica, o bit
correspondente no registrador ANSEL deve ser limpo.
Nota quando o bit SPEN é programado como "1", o pino de I/O RX/DT é auto-
maticamente configurado como entrada, independente do valor programado no
TRIS correspondente e independente do receptor do módulo EUSART estar
habilitado. O pino RX/DT pode ser lido normalmente, mas a escrita nesse
pino não produzirá nenhum efeito.
Assume-se que todos os outros bits de controle do módulo EUSART estão no seu estado default.
A configuração e utilização da recepção assíncrona deve seguir os seguintes passos:
1. Inicializar o par de registradores SPBRGH e SPBRG e os bits BRGH e BRG16 de acordo com a
Taxa de Baud desejada.
2. Habilitar a comunicação assíncrona fazendo SYNC = 0 e SPEN = 1.
3. Se for desejado utilizar interrupções, fazer o bit RCIE = 1, GIE = 1 e PEIE = 1.
4. Se for desejada recepção de 9-bits, fazer o bit RX9 = 1.
5. Habilitar a recepção fazendo o bit CREN = 1.
6. O flag RCIF será setado quando um caracter for transferido do RSR para o buffer de recepção e
um pedido de interrupção será gerado se RCIE = 1.
7. Ler o registrador RCSTA para determinar se algum erro ocorreu durante a recepção e pegar o nono
bit (se estiver habilitado).
34
5.1. COMUNICAÇÃO SERIAL NO PIC CAPÍTULO 5. COMUNICAÇÃO SERIAL
8. Ler os 8-bits menos significativos de dados recebidos no buffer de recepção através da leitura do
registrador RCREG.
9. Se ocorreu um erro de OVERRUN, limpar o flag OERR limpando o bit CREN.
5.1.4Rotinas de biblioteca
Para configuração e utilização da Interface de Comunicação Serial no XC8 foi criada uma biblioteca com
as seguintes funções:
• void serial_init(void) – Essa função configura todos os parâmetros necessários para a operação
do canal serial a 19.200 bps, com palavra de dados de 8-bits, considerando a frequência do oscilador
do microcontrolador como sendo 20 MHz. Deve ser chamada uma única vez na seção de inicialização
dos dispositivos.
• unsigned char getch(void) – Recebe um caractere ASCII pelo canal serial. Essa função não
retorna enquanto não for recebido um caractere.
• unsigned char chkchr(void) – Essa função verifica se existe um caractere no buffer de recepção.
Se existir, retorna o caractere, senão retorna o valor 255.
• void putch(unsigned char c) – Envia um caractere ASCII pelo canal serial.
• void putst(register const char * str) – Envia um string pelo canal serial
Para a utilização dessas funções deve ser incluído o header serial.h e antes dele o always.h que contém
definições utilizadas pelo serial.h.
35
Capítulo 6
PWM
PWM significa Pulse Width Modulation ou modulação por largura de pulso. Um sinal de PWM possui
um período constante e um tempo em nível lógico HIGH (o pulso) variável. A cada ciclo o tempo que o
sinal permanece no nível lógico HIGH em relação ao período total pode ser descrito por uma porcentagem.
Essa porcentagem é chamada de Duty Cycle.
Duty Cycle =
Tempo emnı´vel lo´gicoHIGH
Perı´odo doPWM
Por exemplo, um sinal de PWM com Duty Cycle de 50% tem a forma de uma onda quadrada, na
metade do período o sinal está em nível lógico HIGH e na outra metade do período o sinal está em nível
lógico LOW. A Figura 9 mostra algumas situações para os valores do Duty Cycle.
Figura 9: Forma de onda de um sinal PWM com vários valores de Duty Cycle.
Um sinal de PWM pode ser utilizado para variar a energia entregue a um determinado dispositivo. Um
valor de 0% de Duty Cycle significa que nenhuma energia é entregue ao dispositivo. Por outro lado, 50%
de Duty Cycle significa que 50% de energia é entregue ao dispositivo. Uma das aplicações de um sinal de
PWM é o controle a corrente que passa pelo enrolamento de um motor CC e consequentemente variação
de sua velocidade. A Figura 10 mostra um arranjo para controle de velocidade em malha fechada de um
motor CC com um microcontrolador gerando um sinal de PWM e lendo sinais digitais de um encoder. A
leitura de encoder será explicada próximo capítulo.
36
6.1. PWM COM O PIC CAPÍTULO 6. PWM
Figura 10: Controle de velocidade de um motor CC com um microcontrolador gerando sinal de PWM.
6.1 PWM com o PIC
O PIC 16F886 possui um módulo Enhanced Capture/Compare/PWM (CCP1) e um módulo Capture/-
Compare/PWM (CCP2). Esses módulos são idênticos na operação com exceção das caraterísticas avan-
çadas de PWM disponíveis somente no CCP1. Com isso é possível gerar dois sinais de PWM com esse
dispositivo, um através do pino CCP1 e outro através do pino CCP2.
O Timer 2 é utilizado para dar a base de tempo para o PWM. O prescaler do Timer 2 é usado para
dar o período do PWM, enquanto que os registradores CCPRxL e CCPRxH e os bits CCPxCON<5:4>
são usados para definir a largura do pulso do PWM. O postscaler do Timer 2 não é utilizado no modo
PWM. O módulo CCP consegue produzir um sinal PWM com resolução de até 10-bits1 num dos pinos de
saída CCPx. O valor do Duty Cycle com a resolução de 10-bits é armazenado no registrador CCPRxL (8-
bits mais significativos) e nos bits CCPxCON<5:4> (2-bits menos significativos). O registrador CCPRxH
(mais dois bits internos do dispositivo) é usado como escravo do conjunto CCPRxL:CCPxCON<5:4> para
que esse possa ser alterado a qualquer momento mantendo estável a largura do pulso sendo produzido até
que se complete o ciclo. A Figura 11-3, p. 132, do data sheet do PIC 16F886 mostra um diagrama de
blocos simplificado do PWM.
A Figura 11 mostra a saída de um pino CCPx e a sua relação com os valores de PR2 e Duty Cycle
dado por CCPRxL e CCPxCON<5:4>. O Timer 2 opera numa contagem contínua com uma frequência
derivada do oscilador dividida pelo seu prescaler. No início do período do PWM o Timer 2 é zerado, a saída
CCPx é colocada em nível lógico HIGH e o valor do conjunto CCPRxL:CCPxCON<5:4> é armazenado no
registrador CCPRxH e em dois bits internos. Quando a contagem do Timer 2 atinge o valor composto por
CCPRxH e pelos dois bits internos, o valor da saída CCPx é colocado em nível lógico LOW. A contagem
do Timer 2 prossegue até que o seu valor atinja o valor de PR2. Nesse momento o Timer 2 é zerado, a saída
CCPx é colocada em nível lógico HIGH e o valor do conjunto CCPRxL:CCPxCON<5:4> é novamente
carregado no registrador CCPRxH e nos dois bits internos. Esse ciclo se repete indefinidamente enquanto
o modo PWM estiver habilitado.
O período do PWM é especificado pelo valor armazenado no registrador PR2 e é calculado pela seguinte
fórmula:
Perı´odo doPWM = [(PR2) + 1]⇥ 4⇥ TOSC ⇥ (Prescale do T imer 2)
O Prescaler do Timer 2 pode ser definido como 1:1, 1:4 ou 1:16 definindo-se os bits T2CKPS<1:0>
(T2CON<1:0>) e TOSC é o período do oscilador.
1Os 8-bits do Timer 2 são concatenados com 2-bits internos do clock do sistema (FOSC), ou 2-bits do prescaler, para
criar uma base de tempo de 10-bits.
37
6.1. PWM COM O PIC CAPÍTULO 6. PWM
Figura 11: Sinal de saída de PWM num pino CCPx.
O Duty Cycle do PWM é especificado escrevendo-se um valor de 10-bits, sendo os 8-bits mais significa-
tivos escritos no registrador CCPRxL e os 2-bits menos significativos escritos nos bits 5 e 4 do registrador
CCPxCON. A seguinte fórmula é utilizada para calcular o a largura do pulso do PWM:
Largura doPulso dePWM = (CCPRxL : CCPxCON < 5 : 4 >)⇥ TOSC ⇥ (Prescale do T imer 2)
O valor do Duty Cycle pode ser dado em porcentagem pela seguinte fórmula:
Duty Cycle =
(CCPRxL : CCPxCON < 5 : 4 >)
4(PR2 + 1)
O registrador CCPRxL e os bits 5 e 4 de CCPxCON podem ser escritos a qualquer momento, mas o
valor do Duty Cycle somente será alterado quando o valor de CCPRxL for armazenado em CCPRxH o
que ocorre somente após o valor do Timer 2 atingir o mesmo valor que PR2, ou seja, somente quando o
período do PWM estiver completo. No modo PWM o registrador CCPRxH somente pode ser lido.
No PIC 16F886 os bits 5 e 4 do registrador CCPxCOM também podem ser acessados por nomes
específicos: DCxB1 e DCxB0, respectivamente.
6.1.1 Procedimento para configuração do PWM
Os seguintes passos devem ser feitos para configurar o módulo CCP para operação em PWM:
1. Desabilitar o pino de PWM (CCPx) setando o bit correspondente do registrador TRIS. Isto é,
configurando-o para entrada
2. Definir o período do PWM escrevendo no registrador PR2.
3. Configurar o módulo CCP para modo PWM carregando o registrador CCPxCON com os valores
apropriados.
4. Definir o Duty Cycle do PWM escrevendo no registrador CCPRxL e nos bits DCxB<1:0> (CCPx-
CON<5:4>).
5. Configurar e disparar o Timer 2:
(a) Limpar o bit do flag de interrupção TMR2IF (PIR1<1>);
(b) Definir o valor de prescaler do Timer 2 carregando os bits T2CKPS<1:0> (T2CON<1:0>);
(c) Habilitar o Timer 2, fazendo o bit TMR2ON =1 (T2CON<2>).
38
6.1. PWM COM O PIC CAPÍTULO 6. PWM
6. Habilitar a saída PWM depois que um novo ciclo de PWM tiver sido iniciado:
(a) Esperar pelo transbordo do Timer 2 (bit TMR2IF = 1 (PIR1<1>));
(b) Habilitar a saída do pino de PWM (CCPx) limpando o bit correspondente do registrador TRIS.
Isto é, configurando-o para saída.
39
Capítulo 7
Encoder
O encoder incremental serve para converter a posição de um eixo em uma quantidade de pulsos. Esses
pulsos são gerados por sensores ópticos que detectam alterações de intensidade luminosa e convertem
essas alterações para sinais digitais que podem ser processados por um microcontrolador. Tipicamente as
alterações de intensidade são obtidas por um disco

Outros materiais

Outros materiais