Sie sind auf Seite 1von 57

PMR2415 – Microprocessadores em Automação

e Robótica

Jun Okamoto Jr.

16 de fevereiro de 2011
Sumário

1 Introdução 3
1.1 Sistema de Desenvolvimento . . . . . . . . . . . . . . . . . . . . . 5
1.2 Estrutura do Programa . . . . . . . . . . . . . . . . . . . . . . . 5

2 Microcontrolador PIC 16F873 7


2.1 Características especiais da CPU . . . . . . . . . . . . . . . . . . 8
2.1.1 Configuração do oscilador . . . . . . . . . . . . . . . . . . 9
2.1.2 RESET . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.1.3 Interrupções . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.1.4 Timer de Watchdog . . . . . . . . . . . . . . . . . . . . . 11
2.1.5 Programação serial no circuito . . . . . . . . . . . . . . . 11
2.1.6 Programação ICSP com baixa tensão . . . . . . . . . . . . 12
2.1.7 Programação dos bits de configuração . . . . . . . . . . . 12
2.2 Portas de entrada e saída . . . . . . . . . . . . . . . . . . . . . . 14
2.3 Timer 0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.4 Cominicação serial . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.5 Conversor A/D . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.6 PWM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22

3 Display LCD 26
3.1 Interface com microcontrolador . . . . . . . . . . . . . . . . . . . 26
3.2 Instruções e dados . . . . . . . . . . . . . . . . . . . . . . . . . . 27
3.2.1 Instruções . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
3.2.2 Dados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
3.3 Caracteres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.4 Biblioteca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33

4 Encoder 34

5 Experiências 37
5.1 Montagem do circuito em placa padrão . . . . . . . . . . . . . . . 37
5.1.1 Desenvolvimento de software . . . . . . . . . . . . . . . . 40
5.1.2 Relatório . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
5.2 Conversão A/D com display LCD . . . . . . . . . . . . . . . . . . 42

1
SUMÁRIO 2

5.2.1 Relatório . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
5.3 Comunicação serial . . . . . . . . . . . . . . . . . . . . . . . . . . 44
5.3.1 Análise dos sinais de comunicação serial . . . . . . . . . . 44
5.3.2 Relatório . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
5.4 Movimentando o motor com PWM . . . . . . . . . . . . . . . . . 45
5.4.1 Relatório . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
5.5 Leitura de encoder . . . . . . . . . . . . . . . . . . . . . . . . . . 46
5.5.1 Relatório . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
5.6 Medição de velocidade . . . . . . . . . . . . . . . . . . . . . . . . 48
5.6.1 Relatório . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
Capítulo 1

Introdução

Essa disciplina faz parte da série de disciplinas integrativas do programa de


Mecatrônica, o Projeto Integrativo do 7º semestre (PI7), que visa o projeto
e implementação de um sistema mecatrônico completo. Esse projeto envolve
conceitos apresentados em 5 disciplinas do 7º semestre:
• 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 cur-
ricular, cursadas anteriormente.
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 con-
troles;
• 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, particularmente PMR2450 – Projeto de Máquinas e
PMR2500/PMR2550 – Projeto de Conclusão de Curso.

3
CAPÍTULO 1. INTRODUÇÃO 4

Estes objetivos, no PI7, são atingidos com a implementação de uma máquina


com 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

Especificamente em PMR2415 – Microprocessadores em Automação e Robótica


o aluno implementará um computador baseado no microcontrolador PIC16F873
com as seguintes características:
• Canal serial de comunicação RS232C com outro computador ou terminal

• Controle PWM de motor CC com driver


• Display de LCD para mensagens com o usuário
• Leitura de encoder para determinar posição e velocidade do eixo de motor
CC

• Saída digital em LED


• Entrada digital de chave
• Leitura analógica de potenciômetro
• Programação serial no circuito do microcontrolador

Com essa disciplina o aluno consolidará os conceitos de microprocessadores ne-


cessários para a implementaçã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 microcontrolado.
As atividades do semestre envolvem aulas expositivas com a carga horária
de 2 créditos e atividades de laboratório quizenais com mais 2 créditos. A média
das notas dos relatórios será utilzada como nota para o PI7.
CAPÍTULO 1. INTRODUÇÃO 5

1.1 Sistema de Desenvolvimento


Todo o desenvolvimento de software será feito utilizando-se o MPLAB e o com-
pilador C da HI-TECH [3], ambos disponíveis sem custo no site da Microchip
(http://www.microchip.com). Nesse curso é utilizado o ICD2 para gravar o
microcontrolador PIC16F873 que estará disponível para cada bancada no labo-
ratório.
Os computadores do laboratório contém o MPLAB e o compilador C da
HI-TECH instalados para uso nas aulas de laboratório. Os alunos poderão
instalar os dois pacotes de software em seus próprios computadores para fazerem
o desenvolvimento dos programas fora das aulas.
Todos os exemplos de programas aqui apresentados são baseados no HI-
TECH C.

1.2 Estrutura do Programa


Os programas de controle seguem uma estrutura semelhante à apresentada a
seguir. Inicialmente, são necessários algumas linhas particulares da implemen-
tação com o PIC. A seguir, são definidas variáveis globais incluindo variáveis
que são atualizadas na rotina de interrupção que devem ser declaradas como
volatile, no caso do HI-TECH. Depois vêem as subrotinas, rotina de interrup-
ção e por último o programa principal.
O programa principal possui uma fase incial 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 experiência onde ficarão claros os motivos de tal implementação.
#i n c l u d e <h t c . h> // d e f i n i ç õ e s dos m i c r o c o n t r o l a d o r e s
#i n c l u d e <s t d i o . h> // I /O b á s i c o ( p r i n t f , s p r i n t f , . . . )

#d e f i n e . . . // t o d a s a s d e f i n i ç õ e s u s a d a s no programa

/∗ C o n f i g u r a ç ã o dos f u s í v e i s
ver pic1687x . h
WDTDIS − d e s a b i l i t a watchdog t i m e r
HS − c r i s t a l de a l t a v e l o c i d a d e ( 2 0MHz)
LVPDIS − d e s a b i l i t a programação de b a i x a t e n s ã o
BORDIS − d e s a b i l i t a brown out r e s e t ∗/
__CONFIG(WDTDIS & HS & LVPDIS & BORDIS ) ;

/∗ V a r i á v e i s G l o b a i s ∗/

/∗ S u b r o t i n a s ∗/

/∗ Rotina de t r a ta m e n t o de i n t e r r u p ç õ e s ∗/
CAPÍTULO 1. INTRODUÇÃO 6

void i n t e r r u p t i s r ( void ) {

/∗ Programa P r i n c i p a l ∗/
v o i d main ( v o i d ) {
// −> D e c l a r a ç ã o de variáveis
// −> I n i c i a l i z a ç ã o de v a r i á v e i s
// −> C o n f i g u r a ç õ e s do p r o c e s s a d o r
// −> i n i c i a l i z a ç ã o dos d i s p o s i t i v o s

w h i l e ( 1 ) { // Loop P r i n c i p a l

} // fim do Loop P r i n c i p a l
} // fim do Programa P r i n c i p a l
Capítulo 2

Microcontrolador PIC 16F873

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 microntrolador PIC16F873 é disponível em encapsulamento DIP (dual in
line package) de 28 pinos e possui as seguintes características:
• Frequência de operação até 20MHz
• 4kbytes de memória flash para programas
• 192 bytes de memória RAM de dados
• 128 bytes de memória EEPROM
• 3 portas de I/O: 1 de 6 bits, e 2 de 8 bits
• 3 Timers: 2 PWM
• 2 canais de comunicação serial:1 sincrono e 1 assincrono
• 5 entradas de conversores A/D de 10-bits
• 13 interrupções
Assim como a maioria dos microcontroladores as configuraçãoes do PIC16F873
são feitas por meio de SFRs (Special Function Registers). Esses registrado-
res estão presentes em endereços específicos no microcontrolador e cada um,
ou conjunto de alguns, configuram o funcionamento dos diversos módulos do
microcontrolador.
As informações apresentadas a seguir foram retiradas do data sheet PIC16F87X
da Microchip e foram resumidas para o caso particular da aplicação a ser desen-
volvida nesse curso. Assim, para um conhecimento mais aprofundado e utiliza-
ção geral do hardware e software da família de microcontroladores PIC16F87X
deve ser consultado o data sheet. Foi incluida nessa seção também uma des-
crição das rotinas de bibliotecas em HI-TECH C que estão disponíveis para

7
CAPÍTULO 2. MICROCONTROLADOR PIC 16F873 8

utilização no curso. Essas bibliotecas foram retiradas da Internet e adaptadas


para as caracterísiticas do hardware utilizado no curso. As rotinas presentes nas
bibliotecas implementam em Lingugem C as diversas configurações necessárias
para cada módulo do PIC16F873 e funções de acesso à alguns dos módulos.

2.1 Características especiais da CPU


Todos os dispositivos da família PIC16F87x possuem um conjunto de caracte-
rísticas cujo propósito é maximizar a confiabilidade do sistema, minimizar custo
através da eliminação de componentes externos, prover modos de operação de
economia de energia e oferecer proteção de código. Essas características são as
seguintes:
• Seleção de oscilador
• RESET

– Reset ao ligar (POR – Power-on Reset)


– Temporização ao ligar (PWRT - Power-up Timer)
– Temporização de inicialização do oscilador (OST – Oscillator Start-
up Timer)
– Brown-out Reset (BOR)

• Interrupções
• Watchdog Timer (WDT)
• SLEEP
• Proteção de código

• Localização de identificadores
• Programação serial em circuito (ICSP)
• Programação serial em circuito com baixa tensão

• Depuração em circuito
Algumas dessa caracteristicas podem ser definidas através da programação de
bits de configuração, enquanto que outras estão sempre presentes no micro-
controlador e não permitem alteração de configuração. Além disso, somente
algumas dessas características são relevantes para esse curso e somente algumas
devem ser definidas. As demais possuem seus detalhes descritos no data sheet
do PIC16F87X. Na documentação original do PIC16F87X essa seção vem no
final do documento, mas no caso desse curso inicia-se esse capítulo por aqui
pois correspondem a primeira inicialização presente no programa.
CAPÍTULO 2. MICROCONTROLADOR PIC 16F873 9

2.1.1 Configuração do oscilador


A família do PIC16F87X pode operar com quatro modos diferentes de oscilador.
O usuário pode programar dois bits de configuração (FOSC1 e FOSC0) para
selecionar um desses quatro modos:
• LP – cristal de baixa potência
• XT – cristal/ressonador
• HS – cristal de alta velocidade/ressonador
• RC – resistor/capacitor
Nos modos LP, XT e HS um cristal ou ressonador cerâmico pode ser conectado
entre os pinos OSC1/CLKIN e OSC2/CLKOUT para criar um oscilador. Ainda
nesses modos, uma fonte externa de clock, com frequência FOSC, pode ser
conectada ao pino OSC1/CLKIN. Nesse caso, o pino OSC2/CLKOUT funciona
como saída de clock com uma frequência FOSC/4. O modo LP é usado para
frequências até 200 kHz, o modo XT para frequências entre 200kHz e 4 MHz e
o modo HS para frequências entre 4MHz e 20 MHz.
O modo RC pode ser utilizado quando não são necessárias uma precisão
muito grande na frequencia de oscilação do clock nem uma frequência de os-
cilação muito alta. Nesse caso pode-se utilizar somente um resistor e um ca-
pacitor externos conectados ao pino OSC1/CLKIN. Nesse caso também o pino
OSC2/CLKOT funciona como saída de clock com uma frequência FOSC/4.
No curso é utilizado um oscilador externo a cristal de 20MHz, assim o modo
a ser configurado é o HS.

2.1.2 RESET
A família PIC16F87X diferencia entre vários tipos de RESET dos quais alguns
podem ser definidos através de bits de configuração. O pino MCLR (Master
Clear) é o sinal de hardware usado para causar um RESET no microcontrolador,
tanto em operação normal quanto se o microcontrolador se encontrar no modo
SLEEP. Uma das características especiais dessa família de microcontroladores
é a existência de um sistema de RESET ao ligar (POR – Power-on Reset) que
elimina componentes RC externos normalmente usados para criar um pulso de
Limpa-ao-ligar no pino de RESET do microcontrolador. Esse sistema gera um
pulso interno quando uma subida do VDD é detectada (na faixa de 1,2V a
1,7V). Para se utilizar essa característica basta ligar o pino MCLR diretamente
(ou através de um resistor) ao VDD . Durante o processo de RESET o Timer
de inicialização do oscilador (OST) provê um atraso de 1024 ciclos do oscilador
(da entrada OSC1) após o atraso do Timer de Power-up (PWRT) terminar (se
PWRT estiver habilitado). Esse procedimento garante que o oscilador a cristal
ou ressonador tenha iniciado e estabilizado. O time-out do OST somente ocorre
para os modos LP, XT e HS e somente no POR ou acordando do modo SLEEP.
Os outros tipos de RESET podem ser definidos pela programação de bits de
configuração:
CAPÍTULO 2. MICROCONTROLADOR PIC 16F873 10

• Temporização ao ligar (PWRT – Power-up Timer) – O Timer de Power-up


fornece 72 ms de time out ao ligar somente do sistema de RESET ao ligar
(POR). O Timer de Power-up opera a partir de um oscilador RC interno.
O microcontrolador é mantido em RESET enquanto o PWRT estiver ativo.
O atraso introduzido pelo PWRT permite que o VDD suba para um nível
aceitável. O bit 3 de configuração permite habilitar/desabilitar o PWRT.

• Brown-out Reset (BOR) – Se a tensão VDD cair abaixo de VBOR (cerca


de 4V) por um tempo maior do que TBOR (cerca de 100�s), ocorre um
RESET do microcontrolador. Essa situação é chamada de Brown-out. Se
VDD cair abaixo de VBOR por um tempo menor do que TBOR , o RESET
pode não ocorrer. Uma vez que tenha ocorrido o RESET por Brown-out,
o dispositivo permanecerá no estado de RESET até que a tensão VDD
suba para um valor superior a VBOR . O Timer de Power-up (PWRT)
manterá o dispositivo em RESET por TPWRT (cerca de 72ms). O Timer
de Power-up sempre estará habilitado se o circuito de Brown-out RESET
estiver habilitado, independentemente do estado do bit de configuração de
PWRT. O circuito de Brown-out pode ser habilitado e desabilitado pelo
bit 6 de configuração.

2.1.3 Interrupções
O PIC16F873 possui 13 interrupções1 agrupadas num único pedido geral de
interrrupção para o microcontrolador. Cada interrupção pode ser mascarada
individualmente, atravé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 pedido
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.
Na ocorrência de um pedido de interrupção atendido o GIE é automati-
camente 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 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
1 Alguns microcontroladores da família PIC16F87X possuem 14 interrupções
2 não encontrei uma tradução direta para o português, em inglês é o verbo "to set": to set
a flag
CAPÍTULO 2. MICROCONTROLADOR PIC 16F873 11

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.
v o i d i n t e r r u p t i s r ( v o i d ) { // ú n i c a r o t i n a g e r a l de
// t ra t am e n t o de i n t e r r u p ç õ e s ,
// o nome pode s e r q u a l q u e r
i f ( T0IE && T0IF ) { // s e a i n t e r u p ç ã o do Timer 0 o c o r r e u
// t ra t am e n t o da i n t e r r u p ç ã o do Timer 0
}
i f (TXIE && TXIF) { // s e a i n t e r r u p ç ã o de t r a n s m i s s ã o
// s e r i a l o c o r r e u
// t ra t am e n t o da i n t e r r u p ç ã o de t r a n s m i s s ã o s e r i a l
}
...
}

2.1.4 Timer de Watchdog


O Timer de Watchdog é um sistema usado para se colocar um dispositivo num
estado conhecido caso alguma coisa dê errado durante uma operação normal. O
que pode dar errado pode estar relacionado com hardware ou software. No caso
da família PIC16F87X, o Timer de Watchdog gera um sinal de RESET para o
microcotrolador ou acorda o microcontrolador se estiver em modo SLEEP.
No caso, o Timer de Watchdog (WDT) é um oscilador RC interno do chip
que funciona independente do microcontrolador e não requer componentes ex-
ternos. Além disso, o seu oscilador RC é separado do oscilador RC do pino
OSC1/CLKIN, isso significa que o WDT funcionará mesmo que o clock nos
pinos OSC1/CLKIN e OSC2/CLKOUT pare. O bit TO no registrador de STA-
TUS será limpo no time-out do WDT. O WDT poderá ser permanentemente
desabilitado limpando-se o bit de configuração WDTE.

2.1.5 Programação serial no circuito


A família de microcontroladores PIC16F87X podem ser programados enquanto
o microcontrolador está conectado ao circuito (ICSP – In-Circuit Serial Pro-
gramming). Isso é feito através de duas linhas, uma para clock e outra para
dados e mais três linhas para VDD, terra e tensão de programação. A ICSP
dispensa a retirada do chip do circuito para que seja apagado e programado,
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 IDC2 usado no curso é capaz de usar esse método para programar
diversas famílias de microntroladores PIC incluindo a PIC16F87X. A Figura 2.1
mostra a conexão entre o ICD2 e o microcontrolador 16F873.
CAPÍTULO 2. MICROCONTROLADOR PIC 16F873 12

Figura 2.1: Conector para ICSP entre ICD2 e microcontrolador PIC16F873.

2.1.6 Programação ICSP com baixa tensão


O bit LVP da palavra de configuração habilita a programação ICSP com baixa
tensão. Esse modo permite que o microcontrolador seja programado através do
ICSP com uma fonte de tensão VDD. Isso significa que a tensão de programação
VPP não precisa ser elevada até VIHH (que é cerca de 14V) mas pode ser
deixada dentro da faixa de tensão normal de operação VDD. Nesse modo o pino
RB3/PGM é dedicado para a função de programação e não pode mais ser usado
como pino de I/O de uso geral. Durante a programação VDD é aplicado ao
pino MCLR. Para entrar no modo de programação, VDD é aplicado ao pino
RB3/PGM, desde que o bit LVP seja igual a "1". É importante notar que o bit
LVP vem de fábrica como default "1", assim, é necessário limpar LVP na etapa
de configuração de bits caso se deseje utilizar o pino RB3/PGM como pino de
I/O geral.

2.1.7 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. Quando o mi-
crocontrolador está apagado o valor da palavra de configuração é 3FFFh. Esses
bits estão organizados numa palavra de 14-bits e estão mapeados no endereço
2007h. Esse endereço está além do espaço de memória de programa do usuário
CAPÍTULO 2. MICROCONTROLADOR PIC 16F873 13

e pode ser acessado somente durante a programação do microcontrolador.


No HI-TECH C a função macro __CONFIG é utilizada para programar esses
bits. São disponíveis também uma série de definições que são utilizadas junto
com a macro __CONFIG. Essas definições devem ser compostas num único valor
através da função AND bit a bit (&). As definições disponíveis são:
• Configuração do oscilador: LP, XT, HS e RC
• Watchdog: WDTEN – habilita watchdog; WDTDIS – desabilita watchdog
• Power up timers: PWRTEN – habilita power up timer; PWRTDIS –
desabilita power up timer
• Brown ou reset: BOREN – habilita brown out reset; BORDIS – desabilita
brown out reset
• Programação ICSP com baixa tensão: LVPEN – habilita programação
ICSP com baixa tensão; LVPDIS – desabilita programação ICSP com
baixa tensão
• Proteção de código: PROTECT – protege código do programa; UNPRO-
TECT – não protege código do programa
• Proteção de memória flash: WRTEN – protege escrita na memória flash;
WRTDIS – não protege escrita na memória flash
• Debuger: DEBUGEN – habilita debugger; DEBUGDIS – desabilita de-
bugger
Para utilizar a função macro e as definições deve ser incluido o header htc.h
que carregara as definições para o microcontrolador correto. As definições apre-
sentadas acima vão um pouco além das utilizadas no curso. Mais informações
sobre essas definições e configurações deve ser consultado o data sheet da família
PIC16F87X.
As configurações utilizadas no curso são mostradas no trecho de programa
abaixo:
#i n c l u d e <h t c . h> // g e r a l para t o d o s o s m i c r o c o n t r o l a d o r e s ,
// a s d e f i n i ç õ e s do m i c r o c o n t r o l a d o r c o r r e t o
// s e r ã o i n c l u í d a s automaticamente
...

/∗ Programa b i t s de c o n f i g u r a ç ã o :
HS − o s c i l a d o r de a l t a f r e q u e n c i a
WDTDIS − d e s a b i l i t a watchdog t i m e r
LVPDIS − não u t i l i z a programação ICSP com b a i x a t e n s ã o ,
i s s o l i b e r a o uso do p i n o RB3/PRGM para I /O
BORDIS − d e s a b i l i t a o brown out r e s e t
∗/
__CONFIG(HS & WDTDIS & LVPDIS & BORDIS ) ;
CAPÍTULO 2. MICROCONTROLADOR PIC 16F873 14

2.2 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 PIC16F873.
A Porta A possui 6-bits enquanto que as portas 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, enquanro que a programação de um bit igual a 1 configura a porta para
entrada.
Por exemplo, a linha de programa abaixo configura os bits 2 e 3 da Porta C
para saída:
TRISC = 0 x f 3 ; // b i t s 2 e 3 da Porta C s ã o s a í d a
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 ; // b i t 2 da Porta C = n i v e l l ó g i c o HIGH
Da mesma maneira pode-se ler o valor de um bit de uma porta que corres-
ponde ao valor lógico de um pino:
b i t var ; // v a r i á v e l do t i p o b i t
...
var = RC4 ; // o v a l o r do b i t 4 , Porta C é a t r i b u i d o
// à v a r i á v e l ’ var ’

2.3 Timer 0
O módulo do Timer 0 possui as seguintes características:
• 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
• interrupção no transbordo de FFh para 00h
• seleção de borda para o clock externo
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
CAPÍTULO 2. MICROCONTROLADOR PIC 16F873 15

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 pre-scaler 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 Timer e deve-se selecionar
se o pre-scaler será usado com o Timer 0 ou com o Watchdog. Programando-
se 1 no bit PSA (OPTION_REG<3>) configura o prescaler para uso com o
Watchdog e programando-se 0 no mesmo bit configura seu uso para o Timer
0. As configurações que podem ser definidas pelo OPTION_REG podem ser
vistas na página 48 do data sheet do PIC16F87x.
O Timer 0 incrementa 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 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.
O trecho de programa abaixo mostra como configurar o Timer 0:
#d e f i n e TMR0_PRESCALER 7 // d i v i d e por 256
...
v o i d main ( v o i d ) {
...
OPTION &= 0 b11000000 ; // T0CS=0, T0SE=0, PSA=0,
// PS2=0, PS1=0, PS0=0
OPTION |= TMR0_PRESCALER; // configura o prescaler
T0IE = 1 ; // h a b i l i t a a i n t e r r u p ç ã o do
// Timer 0
...
}
Deve-se lembrar que a operação AND bit a bit (&) programa "0"s e a
operação OR bit a bit (|) programa "1"s. No HI-TECH C o registrador OP-
TION_REG é definido simplesmente como OPTION.
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 incial deve ser carregado no Timer 0 para se ajustar o tempo
que deverá decorrer até a próxima interrupção.
Num exemplo prático, deseja-se gerar uma interrupção periódica a cada 5
ms aproximadamente usando-se o Timer 0, considerando-se que a frequência do
oscilador do microcontrolador é 20 MHz.
CAPÍTULO 2. MICROCONTROLADOR PIC 16F873 16

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 �s (= 200 ns × 256)

• Valor a ser programado como contagem inicial no Timer 0 = 157 (= 255


− 98) pois 51,20 �s × 98 = 5,0176 ms
Na prática deve-se descontar 5 do valor calculado. esse fator leva em conside-
ração o tempo gasto para execuçào do próprio comando.
O trecho de programa abaixo corresponde a rotina de tratamento de inter-
rupção para esse exemplo:
#d e f i n e POLLING_PERIOD 98 // 5 , 0 7 1 6 ms
#d e f i n e TMR_SETTING ( 0 x f f − (POLLING_PERIOD − 5 ) ) // v a l o r
// da contagem i n c i a l do Timer 0
...
v o i d i n t e r r u p t i s r ( v o i d ) { // r o t i n a g e r a l de t ra t am e n to
// de i n t e r r u p ç õ e s
i f ( T0IE && T0IF ) { // s e f o r i n t e r r u p c ã o do Timer 0
TMR0 = TMR0_SETTING; // r e c a r r e g a a contagem i n c i a l
T0IF = 0 ; // limpa o f l a g de i n t e r r u p ç ã o

// e x e c u t a a q u i o que f o r n e c e s s á r i o

}
}

2.4 Cominicação serial


O PIC16F873 possui dois módulos de comunicação serial: o Master Synchronous
Serial Port (MSSP), que opera em dois modos (SPI e I2 C), e o Universal Synch-
ronous Asynchonous Receiver Transmitter (USART), também conhecido como
Interface de Comunicação Serial. O primeiro módulo é utilizado para comuni-
cação serial entre o microcontrolador e dispositivos internos de um computador
enquanto que o segundo módulo pode também ser utilizado para comunicação
entre dispositivos externos e o microcontrolador. Nesse curso será utilizado
somente o segundo módulo que será visto em detalhes a seguir.
A Interface de Comunicação Serial pode operar de maneira sincrona ou assin-
crona. No modo sincrono de operação, existe um sincronismo entre o transmissor
e o receptor de dados através de um sinal de clock que controla um fluxo de bits
em série numa única linha (Figuras 10-9 a 10-11 do data sheet do PIC16F873).
Desse modo o receptor armazena os bits comandado pelo clock do transmissor.
Já no modo assincrono existe um conjunto de parametros que define como será
CAPÍTULO 2. MICROCONTROLADOR PIC 16F873 17

feita a transferência de dados entre um dispositivo e outro e ambos os dispo-


sitivos são primeiramente configurados com o mesmo cojunto de parâmetros.
A partir daí os dados podem ser transferidos em série (por uma única linha)
iniciando-se com um start bit, depois 8 ou 9 bits de dados e terminando com
um stop bit (Figura 10-2, 10-3 e 10-5 do data sheet do PIC16F873).
Nesse curso será utilizado o modo de comunicação assincrona da interface.
Nesse caso, essa interface é capaz de operação de transmissão e recepção si-
multâneos (full duplex ) para tanto utiliza dois pinos de entrada e saída confi-
gurados para transmissão de dados (RC6/TX/CK) e para recepção de dados
(RC7/RX/DT). Isso significa que se a Interface de Comunicação Serial for uti-
lizada, os bits 6 e 7 da Porta C serão ocupados com essa função e não poderão
ser utilizados para entrada e saída através da configuração do SFR TRISC.
Na família do PIC16F873, o conjunto de parâmetros a ser configurado para
definir o modo de operação da Interface de Comunicação Serial é determinado
pela programação de uma série de bits em 3 SFRs:
• TXSTA – Registrador de controle e status de transmissão
• RCSTA – Registrador de controle e status de recepção
• SPBRG – Registrador do gerador de taxa de Baud
Os bits que devem ser programados no TXSTA são os seguintes para comuni-
cação assincrona:
• TX9 – habilita transmissão em 9-bits: 1 = seleciona transmissão em 9-bits;
0 = seleciona transmissão em 8-bits
• TXEN – habilita transmissão: 1 = transmissão habilitada; 0 = transmis-
são desabilitada
• SYNC – seleciona o modo de operação da USART: 1 = modo sincrono; 0
= modo assincrono
• BRGH – seleciona operação de taxa de Baud no modo assincrono (sem
efeito no modo sincrono): 1 = alta velocidade; 0 = baixa velocidade. A
princípio a escolha entre alta velocidade e baixa velocidade dependeria da
frequencia do oscilador. Na prática pode-se escolher BRGH = 1 mesmo
para baixas frequencias do oscilador, deve-se priorizar a minimização do
erro na taxa de Baud.
No RXSTA devem ser programados os seguintes bits para comunicação assin-
crona:
• SPEN – habilita a porta serial: 1 = porta serial habilitada (configura os
pinos RC7/RX/DT e RC6/TX/CK para uso na porta serial e não como
entrada e saída); 0 = desabilita porta serial
• RX9 – habilita recepção de 9-bits: 1 = seleciona recepção de 9-bits; 0 =
seleciona recepção de 8-bits
CAPÍTULO 2. MICROCONTROLADOR PIC 16F873 18

• CREN – habilita recepção contínua no modo assincrono: 1 = habilita


recepção contínua; 0 = desabilita recepção contínua
O registrador SPBRG controla o período de um timer de 8-bits dedicado para
a Interface de Comunicação Serial. No modo assincrono, o valor prgramado no
bit BRGH define a fórmula que é utilizada para se obter a taxa de Baud a partir
do valor programado no SPBRG. Assim, para BRGH = 0 tem-se
FOSC
[SPBRG] = −1
64 × BaudRate
onde [SPBRG] é o valor a ser programado no registrador SPBRG, FOSC é a
frequência do oscilador do microcontrolador.
No caso de BRGH = 1, tem-se
FOSC
[SPBRG] = −1
16 × BaudRate
No curso é utilizada uma taxa de Baud de 19.200 bps. Com uma frequencia
do oscilador de 20MHz, escolhe-se BRGH = 1, o que resulta no valor a ser
programado no SPBRG de 64. Como esse valor é inteiro, a taxa de Baud
resultante pode não ser exata. Assim, nesse caso, a programação desse valor
gera uma taxa de 19.231 bps resultando num erro de 0,16%. No curso é utilizado
comprimento da palavra de dados de 8-bits tanto para transmissão como para
recepção, assim, TX9 = 0 e RX9 =0.
A configura ção e utilização da transmissão assincrona deve seguir os seguin-
tes passos:

1. Inicializar o registrador SPBRG para a taxa de Baud apropriada.


2. Habilitar a porta serial assincrona limpando o bit SYNC e fazendo o bit
SPEN = 1.
3. Se são desejadas interrupções, fazer o bit TXIE = 1.

4. Se for desejada transmissão de 9-bits, fazer o bit TX9 = 1.


5. Habilitar a transmissão fazendo o bit TXEN = 1, que também fará o bit
TXIF = 1.
6. Se a transmissão de 9-bits estiver selecionada, esse bit deve ser carregado
no bit TX9D.
7. Carregar o dados no registrador TXREG (inicia a transmissão).
8. Se utilizando interrupção, assegurar que GIE e PEEIE do registrador INT-
CON estão iguais a "1".

A configuração e utilização da recepção assincrona deve seguir os seguintes pas-


sos:
CAPÍTULO 2. MICROCONTROLADOR PIC 16F873 19

1. Inicializar o registrador SPBRG para a taxa de Baud apropriada.


2. Habilitar a porta serial assincrona limpando o bit SYNC e fazendo o bit
SPEN = 1.
3. Se são desejadas interrupções, fazer o bit RCIE = 1.

4. Se for desejada transmissão de 9-bits, fazer o bit TX9 = 1.


5. Habilitar a recepção fazendo o bit CREN = 1.
6. O bit de flag RCIF será igual a "1" quando a recepção for completada e
um pedido de interrupção será gerado se o bit RCIE for igual a "1".

7. Ler o registrador RCSTA para pegar o nono bit (se estiver habilitado) e
determinar se algum erro ocorreu durante a recepção.
8. Ler os 8 bits de dados recebidos através da leitura do registrador RCREG.
9. Se algum erro ocorreu, limpar o erro limpando o bit CREN.

10. Se utilizando interrupção, assegurar que GIE e PEEIE do registrador INT-


CON estão iguais a "1".
Para configuração e utilização da Interface de Comunicação Serial no HI-TECH
C foi criada uma biblioteca com as seguintes funções:

• void serial_setup(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 frequencia do oscilador do microcontrola-
dor como sendo 20 MHz. Deve ser chamada uma única vez na seção de
inicialização dos dispositivos.

• unsigned char getch(void) – Recebe um caracter ASCII pelo canal se-


rial. Essa função não retorna enquanto não for recebido um caracter.
• unsigned char chkchr(void) – Essa função verifica se existe um carac-
ter no buffer de recepção. Se existir, retorna o caracter, senão retorna o
valor 255.

• void putch(unsigned char c) – Envia um caracter ASCII pelo canal


serial.
• void putst(register const char * str) – Envia um string pelo ca-
nal serial

Para a utilização dessas funções deve ser incluido o header serial.h e antes
dele o always.h que contém definições utilizadas pelo serial.h.
CAPÍTULO 2. MICROCONTROLADOR PIC 16F873 20

2.5 Conversor A/D


O módulo de conversão analógica para digital (A/D) do PIC16F873 possui 5
entradas. A conversão é feita pelo método de aproximações sucessivas e gera
um resultado de 10-bits. As tensões de referência alta e baixa podem ser con-
figuradas por software para alguma combinação de VDD (=5V), VSS (=0V),
RA2 ou RA3.
Esse módulo possui 4 registradores:
• ADCON0 – Registrador de controle 0
• ADCON1 – Registrador de controle 1

• ADRESH – Registrador da parte mais significativa do resultado


• ADRESL – Registrador da parte menos significativa do resultado
No registrador ADCON1 devem ser configurados os seguintes bits:

• ADFM – indica se o resultado da conversão é justificado à direita ou


à esquerda: 1 = justificado à direita – os 6 bits mais significativos de
ADRESH são lidos como zero; 0 = justificado à esquerda – os 6 bits
menos significativos de ADRESL são lidos como zero
• PCFG3:PCFG0 – esse conjunto de 4 bits configura quais bits são canais
de A/D, quais são digitais e quais são usados como tensão de referência.
A Tabela 2.1 mostra todas as configurações possíveis para o PIC16F873.
A tabela original do data sheet inclui informações sobre outros modelos
da mesma família.
O registrador ADCON0 controla a operação do módulo A/D. Para cada
canal A/D definido pelos bits CHS2:CHS0 pode ser configurada a frequência de
conversão para FOSC/2, FOSC/8, FOSC/32 ou FRC (frequência determinada
pelo oscilador RC interno do módulo A/D) através dos bits ADCS1:ADCS0. Os
seguintes bits são usados para controle da conversão:
• ADON – bit que liga o canal de conversão A/D: 1 = módulo de conversão
A/D está em operação; 0 = o módulo de conversão A/D está desligado e
não consome corrente de operação.
• GO/DONE – bit de status de conversão A/D: 1 = conversão A/D em
progresso (a escrita deste bit inicia o processo de converão); 0 = conversão
A/D parada (este bit é limpo automaticamente ao terminar o processo de
conversão).

Os seguintes passos devem ser seguidos para se fazer uma conversão A/D:
1. Configurar o módulo A/D:

• Configurar os pinos/referência de tensaão e I/O digital (ADCON1)


CAPÍTULO 2. MICROCONTROLADOR PIC 16F873 21

Tabela 2.1: Bits de controle de configuração dos canais A/D (adaptado da


página 112 do data sheet do PIC16F87x para o caso do PIC16F873 [2]).
PCFG3: AN4 AN3 AN2 AN1 AN0 CHAN
VREF+ VREF-
PCFG0 RA5 RA3 RA2 RA1 RA0 /Refs3
0000 A A A A A VDD VSS 5/0
0001 A VREF+ A A A RA3 VSS 4/1
0010 A A A A A VDD VSS 5/0
0011 A VREF+ A A A RA3 VSS 4/1
0100 D A D A A VDD VSS 3/0
0101 D VREF+ D A A RA3 VSS 2/1
011x D D D D D VDD VSS 0/0
1000 A VREF+ VREF- A A RA3 RA2 3/2
1001 A A A A A VDD VSS 5/0
1010 A VREF+ A A A RA3 VSS 4/1
1011 A VREF+ VREF- A A RA3 RA2 3/2
1100 A VREF+ VREF- A A RA3 RA2 3/2
1101 D VREF+ VREF- A A RA3 RA2 2/2
1110 D D D D A VDD VSS 1/0
1111 D VREF+ VREF- D A RA3 RA2 1/2

• Selecionar o canal de entrada A/D (ADCON0)


• Selecionar a frequência do clock de conversão A/D (ADCON0)

2. 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

3. Esperar o tempo de aquisição necessário.


4. Iniciar o processo de conversão:

• Fazer o bit GO/DONE = 1 (ADCON0)

5. 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

6. Ler o resultado da conversão A/D no par de registradores (ADRESH:ADRESL),


limpar o bit ADIF caso necessário.
CAPÍTULO 2. MICROCONTROLADOR PIC 16F873 22

7. Para a próxima conversão, prosseguir com o passo 1 ou 2 conforme ne-


cessário. O tempo de conversão A/D por bit é definida como TAD . Um
tempo mínimo de 2TAD é necessário antes que uma nova conversão seja
iniciada.
Para configuração e utilização do módulo de conversão analógica para digital
(A/D) no HI-TECH C 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, 1 e 3, onde o número do canal é o parâmetro de
entrada ADC_Channel. Essa função deve ser modificada caso se deseje
alterar a configuração dos canais. Ela está configurada previamente para
canais analógicos 0, 1 e 3 e digitais 2 e 5, com tensão de referência dada
pelo VDD. A alteração deve ser feita no arquivo adc.c. Deve ser chamada
uma única vez para cada canal na seção de inicialização dos dispositivos.
• unsigned int read_adc(unsigned char ADC_Channel) – Recebe o va-
lor do canal A/D passado como parâmetro com 10-bits alinhados à es-
querda. Essa função aguarda o término da conversão antes de retornar.
Essa função configura a frequencia de conversão para FOSC/32 para a
frequência do oscilador de 20MHz.
Para a utilização dessas funções deve ser incluido o header adc.h.

2.6 PWM
PWM significa Pulse Width Modulation ou modulação por largura de pulso.
Um sinal de PWM possui um periodo constante e 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.
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 2.2 mostra
algumas situações para os valores do 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 enrrolamento de um motor
CC e consequentemente variação de sua velocidade. A Figura 2.3 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 posteriormente no Capítulo 3 na
experiência correspondente.
A geração de sinais de PWM é feita através dos módulos CCP no PIC16F873.
Existem 2 módulos CCP (Captura/Comparação/PWM) na família PIC16F87X.
Cada módulo contém um registrador de 16-bits que pode operar como:
CAPÍTULO 2. MICROCONTROLADOR PIC 16F873 23

Figura 2.2: Forma de onda de um sinal PWM com vários valores de Duty Cycle.

Figura 2.3: Controle de velocidade de um motor CC com um microcontrolador


gerando sinal de PWM.

• Registrador de captura de 16-bits (CCPR1H e CCPR1L)


• Registrador de comparação de 16-bits (CCPR1H e CCPR1L)

• Registrador Master/Slave de Duty Cycle do PWM (CCPR1L: master de


8-bits e CCPR1H: slave de 8-bits)
Os 2 módulos CCP1 e CCP2 são idênticos na operação, com a excessão do
evento de disparo especial. Nos modos de captura e comparação é necessário o
uso do Timer 1, enquanto que para o modo de PWM é necessário o uso do Timer
2. Será abordado no curso somente o modo de PWM, os modos de captura e
comparação não serão vistos. Como a configuração e uso dos dois módulos é
semenlhante, então será visto aqui somente o módulo CCP1.
No modo de PWM o pino CCP1 produz uma saída de sinal PWM com a
resolução de 10-bits. Como o pino CCP1 está multiplexado com o pino do bit
2 da Porta C, o bit TRISC<2> deve ser limpo para tornar o pino CCP1 uma
saída.
CAPÍTULO 2. MICROCONTROLADOR PIC 16F873 24

O período do PWM pode ser definido através da escrita de um valor no


registrador PR2 e pode ser calculado aplicando-se a seguinte fórmula:

Período PWM = [(PR2) + 1] × 4 × TOSC × (prescale do TMR2)

Quando o valor da contagem do Timer 2 (TMR2) for igual ao valor do PR2,


ocorrem os três eventos seguintes no próximo ciclo de incremento:

• O valor do TMR2 é limpo


• O valor do pino CCP1 é colocado em nível lógico HIGH (a menos que o
Duty Cycle do PWM esteja programado para 0%, neste caso o nível lógico
permanece em LOW)
• O valor do Duty Cycle do PWM que estiver no registrador CCPR1L é
armazenado no CCPR1H.
O Duty Cycle do PWM é especificado escrevendo-se um valor de 10-bits, sendo
os 8-bits mais significativos escritos no registrador CCPR1L e os 2-bits me-
nos significativos escritos nos bits 5 e 4 do registrador CCP1CON. A seguinte
equação é utilizada para calcular o Duty Cycle do PWM no tempo:

Duty Cycle do PWM = (CCPR1L:CCP1CON<5:4>×TOSC ×(prescale do TMR2)

O registrador CCPR1L e os bits 5 e 4 de CCP1CON podem ser escritos a


qualquer momento, mas o valor do Duty Cycle somente será alterado quando
o valor de CCPR1L for armazenado em CCPR1H o que ocorre somente após
os valores de TMR2 e PR2 serem verificados como sendo iguais (i.e., somente
quando o período do PWM estiver completo). No modo PWM o registrador
CCPR1H somente pode ser lido. O registrador CCPR1H e os bits 5 e 4 do
registrador CCP1CON são usados como buffer slave do Duty Cycle. Isso é
essencial para a operação do PWM sem pulsos espurios.
A Figura 2.4 mostra a saída do pino CCP1 e a sua relação com os valores
de TMR2, PR2 e Duty Cycle.

Figura 2.4: Sinal de saída de PWM no pino CCP1.


CAPÍTULO 2. MICROCONTROLADOR PIC 16F873 25

Os seguites passos devem ser feitos para configurar o módulo CCP para
operação em PWM:
1. Definir o período do PWM escrevendo no registrador PR2.
2. Definir o Duty Cycle do PWM escrevendo no registrador CCPR1L e nos
bits 5 e 4 do registrador CCP1CON.
3. Definir o pino CCP1 com saída limpando o bit TRISC<2>.
4. Definir o valor de prescale do TMR2 escrevendo no registrador T2CON
5. Configurar o módulo CCP1 para operação em PWM
Capítulo 3

Display LCD

A maioria dos displays de LCD utilizam 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 docu-
mentaçã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 funci-
onamento do display deve-se consultar a documentação completa do controlador
HD44780U. A conexão física do display de LCD com o microcontrolador é vista
nas aulas de teoria em detalhes.

3.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 3.1.
No circuito montado nesse curso é utilizada uma interface com 4-bits e so-
mente 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 todo e os sinais DB0 a DB3 não
são utilizados. Essa abordagem utiliza a menor quantidade de sinais, econo-
mizando desta maneira pinos de I/O do microcontrolador, em contrapartida, o
acesso ao display LCD é mais lento. A Figura 3.1 mostra um exemplo de trans-
ferê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

26
CAPÍTULO 3. DISPLAY LCD 27

Tabela 3.1: Sinais de interface do controlador do display LCD com microcon-


trolador.
Sinal C/D I/O Descrição

Seleciona registradores.
0: Registador de comandos (escrita) ou Flag de ocupado
RS C I e contador de endereços (leitura)
1: Registrador de dados (escrita e leitura)

Seleciona leitura ou escrita.


R/W C I 0: escrita
1: leitura
E C I Inicia escrita ou leitura de dados (age como strobe)

4 bits mais significativos do barramento de dados tristate


bidirecional. Usado para transferência e recepção de da-
DB4 a DB7 D I/O
dos entre o microcontrolador e o HD44780U. DB7 pode
ser usado como flag de ocupado.

4 bits menos significativos do barramento de dados tris-


tate bidirecional. Usado para transferência e recepção
DB0 a DB3 D I/O
de dados entre o microcontrolador e o HD44780U. Esses
sinais não são usados durante a operação em 4-bits.

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.
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 �s, para
o controlador do display voltar para um estado desocupado. O não respeito a
esse intervalo de tempo causa a perda de dados.

3.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 é temrpora-
riamente armazendada nesses registradores o que permite seu interfaceamente
com diversos tipos de microcontroladores e me diferentes velocidades.
CAPÍTULO 3. DISPLAY LCD 28

Figura 3.1: Exemplo de transferência de dados através de interface de 4-bits


entre microcontrolador e display LCD [1].

3.2.1 Instruções
O registrador de instruções (IR) pode conter instruções em 4 categorias:
Especificação de funcões do HD44780U, tais como formato do display, com-
primento 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.2 apresenta todas as instruções disponíveis com o seu tempo de
execução.

Procedimento de incialização do display LCD


Ao ser aplicada energia no HD44780U, um circuito de RESET interno inicializa
o chip que passa por um procedimento de incialização automático. Durante a
incializaçã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 incialização automática do HD44780U definir uma série de confi-
guraçõ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 incialização apropriado que deve seguir os segintes passos:
1. Limpar display
2. Definir as seguintes funções:
CAPÍTULO 3. DISPLAY LCD 29

Tabela 3.2: Instruções do HD44780U [1].


CAPÍTULO 3. DISPLAY LCD 30

(a) DL = 0; interface de 4-bits


(b) N = 1; display de 2 linhas
(c) F = 0; tamanho do caracter em matriz de 5 x 8 pontos

3. Controle de liga/ desliga do display:

(a) D = 0; desliga display


(b) C = 0; desliga cursor
(c) B = 0; sem piscar (blink)

4. Definir modo de entrada:

(a) I/D = 1; incrementa de 1


(b) S = 0; sem deslocamento

O significado das siglas utilizadas no procedimento acima estão no final da


Tabela 3.2.

3.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 caracter. A quantidade total de caracteres
que podem ser armazenados nessa memória é de 80 caracteres. Existe uma re-
laçã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 3.2.
Observa-se que os 40 primeiros endereços a partir do endereço 00h correspondem
à primeira linha do display e os 40 endereços apartir do endereço 40h correspon-
dem à segunda linha. No display LCD utilizado no laboratório uma janela de 8
caracters 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 3.3 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.

Figura 3.2: Endereços da DDRAM para apresentação de caracteres no display


[1].
CAPÍTULO 3. DISPLAY LCD 31

Figura 3.3: 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 pri-


meiramente definir no registrador IR o endereço da DDRAM a partir do qual
se deseja armazenar o código do caracter e depois escrever o código no regis-
trador 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 incre-
mento 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 caracter
no display, é sufuciente 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).

3.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 apro-
priada (CGRAM) dentro do HD44780U. A Tabela 3.3 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.
CAPÍTULO 3. DISPLAY LCD 32

Tabela 3.3: Caracteres que podem ser mostrados no display LCD [1].
CAPÍTULO 3. DISPLAY LCD 33

3.4 Biblioteca
Está disponível uma biblioteca para o HI-TECH C para acesso ao display LCD
no laboratório. Essa bilbioteca foi configurada para a implementação de hard-
ware utilizada nesse laboratório. Caso seja alterado 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 caracter e formato de caracter 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.

• void lcd_write(unsigned char) – Essa função escreve um caracter 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. 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.

• void lcd_puts(const char *s) – Essa função escreve um string na me-


mó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.
Capítulo 4

Encoder

O encoder incremental serve para converter a posição de um eixo em uma quan-


tidade de pulsos. Esses pulsos são gerados por sensores ópticos que detectam
alterações de intensidade luminosa e convertem essas alterações para sinais di-
gitais que podem ser processados por um microcontrolador. Tipicamente as
alterações de intensidade são obtidas por um disco ligado ao eixo do motor que
alternam padrões claros e escuros, conforme mostrado na Figura 4.1. Para se
determinar a direção de rotação desse disco, um par de sensores é colocado num
arranjo em quadratura, ou seja defasados em 90°, o que produz as formas de
onda mostradas na Figura 4.1 como saídas dos canais A e B.

Figura 4.1: Disco codificado com regiões claras e escuras, sensores ópticos em
quadratura, sinais dos canais A e B para rotação no sentido horário e anti-
horário [4].

Interpretando-se os canais A e B como um código binário de 2 bits, tem-se


o seguinte, segundo a Figura 4.2:

34
CAPÍTULO 4. ENCODER 35

• Se a rotação do disco for no sentido horário, a sequencia de códigos pro-


duzida será 0, 1, 3, 2, 0, e assim por diante
• Se a rotação do disco for no sentido anti-horário, a sequencia de códigos
produzida será 0, 2, 3, 1, 0, e assim por diante.

Figura 4.2: Sinais dos canais A e B motrados como um par de bits para o sentido
horário e anti-horário[4].

Se os códigos gerados pelos canais A e B forem considerados como estados,


pode-se vizualizar a máquina de estados mostrada na Figura 4.3. Se o encoder
estiver parado numa posição correspondente ao estado 0, o movimento do eixo
do motor e consequentemente do disco do encoder causará uma mudança de es-
tado. A mudança do estado 0 para o estado 1 pode causar o incremento de um
contador, enquanto que a mudança para o estado 2 pode causar o decremento
deste mesmo contador. Assim contabilizando as mudanças de estado num sen-
tido e no outro pode-se determinar efetivamente o deslocamento angular do eixo
do motor, levando-se em consideração inclusive a direção de rotação.
Como consequencia deste método, tem-se:

• O número de regiões claras ou escuras corresponde a quantidade de pulsos


do canal A ou B por volta. Assim, se o disco do encoder tiver 12 regiões
claras e 12 regiões escuras é possível produzir 12 pulsos no sinal do canal
A e 12 pulsos no sinal do canal B. Ainda, com 12 regiões pode-se produzir
um pulso a cada 30° de rotação do eixo do motor.
CAPÍTULO 4. ENCODER 36

Figura 4.3: Máquina de estados para algoritmo de leitura de encoder.

• Considerando-se que cada pulso do sinal do canal A combinado com o


sinal do canal B produz 4 estados da máquina de estados. Assim, para
cada pulso pode-se incrementar ou decrementar a contagem 4 vezes. Dessa
maneira numa volta completa do eixo do motor pode-se ter um incremento,
ou decremento, de 48. Isso significa que cada incremento ou decremento
corresponde a 7,5° de rotação do eixo.
Deve-se observar que a quantidade de pulsos determina o deslocamento angular
do eixo do motor, enquanto que a sua frequencia determina a velocidade angualr
do eixo do motor.
Utilizando-se um microcontrolador pode-se conectar os sinais dos canais A
e B em um par de bits de uma porta de entrada digital. Um algoritmo que
monitora o estado desses 2 bits pode incrementar e decrementar um contador
possibilitando, assim, o cálculo do descolamento angular do eixo do motor. A
contabilização de mudanças de estados num intervalo de tempo possibilita o
cálculo da velocidade angular do eixo do motor.
Capítulo 5

Experiências

5.1 Montagem do circuito em placa padrão


Nesta experiência será utilizado o material listado no Apêndice 2 para cada
grupo, com o qual deverá ser montado o circuito apresentado no diagrama lógico
do Apêndice 1. A montagem será realizada numa placa padrão com fios de wire-
wrap soldados por baixo. A Fig. 5.1 mostra um exemplo de distribuição dos
componentes numa placa padrão1 enquanto que a Fig. 5.2 mostra o aspecto da
placa montada vista por baixo.

Figura 5.1: Exemplo de distribuição de componentes na placa impressa padrão.

A montagem deverá seguir o seguinte procedimento:


1. Estudar o posicionamento de todos os componentes na placa colocando os
1 Os componentes mostrados não correspondem exatamente aos que serão montados nesta
experiência. Trata-se de uma placa desenvolvida para os testes do software do laboratório.

37
CAPÍTULO 5. EXPERIÊNCIAS 38

Figura 5.2: Placa montada vista por baixo.

conectores próximos das bordas da placa e procurar minimizar a distância


entre os componentes. Ao posicionar os componentes discretos colocar
os que tem ligação entre si próximos e usar os próprios terminais dos
componentes para conectá-los.
2. Soldar os conectores, os soquetes dos circuitos integrados e os componentes
discretos.

3. Marcar os pinos 1 dos soquetes de circuitos integrados e dos conectores


por baixo e por cima.
4. Marcar os terminais positivos dos componentes com um sinal "+" por
baixo.

5. Marcar os catodos do diodo e LED por baixo.


6. Fazer as ligações dos terras e depois dos Vccs. As cada ligação feita marcar
no diagrama lógico que a ligação foi realizada.
7. Fazer as ligações dos sinais. Marcar cada ligação feita no diagrama lógico.

8. Testar todas as ligações por cima da placa com um multímetro. A cada


ligação testada, marcar no diagrama lógico que a ligação foi testada.
9. Antes de ligar a placa na alimentação testar com o multimetro que não
existe curto circuito entre o terra e o Vcc.
Uma vez terminada e testada a montagem, a placa poderá ser conectada aos
outros dispositivos que serão utilizados em todas as experiências durante o se-
mestre. A placa montada será conectada ao módulo de motor e LCD, ao pro-
gramador ICD2 e ao canal serial do computador de acordo com a Fig. 5.3.
CAPÍTULO 5. EXPERIÊNCIAS 39

Figura 5.3: Conexão da placa montada com os outros dispositivos que compre-
endem o arranjo experimental utilziado em todas as experiências do semestre.

Antes de se conectar a fonte de alimentação na tomada deve-se configurar o


sistema de desenvolvimento no PC. Para tanto, entrar na conta do laboratório
de iniciar o MPLAB IDE. A inteface de programação se abrirá sem nenhum
projeto.
Primeiramente deve-se escolher o dispositivo que se deseja programar atavés
do menu "Configure" > "Select Device..." e escolher o dispositivo PIC16F873.
Deve-se então selecionar o programador que será utilizado através do menu
"Programmer" > "Select Programmer" > "MPLAB ICD2".
Depois disso deve-se executar o menu "Programmer" > "MPLAB ICD2
Setup Wizard..." e configurar os seguintes itens:
• Com Port: USB

• Baud Rate: 19200


• Power From: Target
• AutoConnect: Disable
• AutoDownload: Enabled

Após o término do "MPLAB ICD2 Setup Wizard" deve-se conectar o MPLAB


IDE ao programador através do menu "Programmer" > "Connect". Se estiver
tudo correto a janela "Output" apresentará no tab "MPLAB ICD 2" algumas
mensagens conforme a Fig 5.4. Observe que ocorre um aviso de que o ID do
target está inválido, isso se deve ao fato de que a alimentação da placa ainda
não foi ligada.
CAPÍTULO 5. EXPERIÊNCIAS 40

Figura 5.4: Tela do MPLAB IDE após a conexão com o programador ICD2.

5.1.1 Desenvolvimento de software


Primeiramente, o MPLAB IDE deve ser configurado para trabalhar com o com-
pilador C da HI-TECH. Isso pode ser feito através do menu "Project" > "Select
Language Toolsuite...". Na janela que se abrirá configurar o seguinte:
• Active Toolsuite: HI-TECH Universal ToolSuite
• Toolsuite Contents: HI-TECH ANSI C Compiler
• Location: deixar como está
Terminar com OK.
Após isso o MPLAB IDE estará pronto para trabalhar com o compilador C
HI-TECH, ou seja, será possível editar e compilar os programas em Linguagem
C diretamente do MPLAB.
São disponibilizados para os trabalhos no laboratório uma série de bibliotecas
que auxiliam na implementação de diversas funções básicas. Essa bibliotecas
devem ser copiadas de um repositório para a área de trabalho do grupo.
Criar um diretório de trabalho para o grupo com o nome que quizer dentro
do diretório "C:\Users".
Copiar os seguintes arquivos para o diretório de trabalho criado:
adc.h, adc.c
always.h
delay.h, delay.c
lcd.h, lcd.c
CAPÍTULO 5. EXPERIÊNCIAS 41

serial.h, serial.c
main.c
Esses arquivos estão disponíveis para cópia no diretório de reposição "C:\pmr2415\software".
Cada grupo deverá manter sua cópia local no diretório de trabalho e poderá
modificar caso deseje. Os arquivos do diretório de reposição não deverão ser
modificados nunca.
Criar um novo projeto através do menu "Project" > "New...". Na ja-
nela que se abrirá, escolher um nome para o projeto e um diretório de tra-
balho. Esse diretório deverá ser criado obrigatóriamente no seguinte caminho:
"C:\Users\<nome do grupo>". Terminar com Ok. Caso não visualize as jane-
las de Projeto e Saída, usar o menu "View" > "Projetct" e "View" > "Output"
para abrí-las.
Clicando com o botão da direita sobre os itens da árvore recém criada na
janela de projeto pode-se adicionar os arquivos que foram copiados para o dire-
tório de trabalho.
Adicionar os seguintes arquivos no item "Source Files":
adc.c
delay.c
lcd.c
serial.c
main.c
Adiconar os seguintes arquivos no item "Header Files":
adc.h
always.h
delay.h
lcd.h
serial.h
O arquivo main.c contém um programa exemplo que deverá funcionar se o
hardware montado estiver correto. A partir deste momento pode-se compilar o
projeto e carregá-lo no PIC. Para compilar todos os arquivos do projeto e gerar
um arquivo que pode ser carregado no PIC pode-se utilizar a botão de cor preta
da barra de ferramentas mostrado na Fig. 5.5(a). Esse botão compila somente
os arquivos que tiverem sido modificados. O botão de cor vermelha serve para
compilar todos os arquivos novamente.

(a) Botões (b) Botões de controle da carga e funciona-


de compi- mento do PIC
lação

Figura 5.5: Botões da barra de ferramentas do MPLAB IDE.

Caso a compilação tenha sido bem sucedida, isto é, se não houverem erros
de sintaxe nem de símbolos não encontrados, aparecerá uma mensagem corres-
pondente na janela de saída. Após a confirmação de compilação bem sucedida,
CAPÍTULO 5. EXPERIÊNCIAS 42

pode-se carregar o programa executável no PIC através do primeiro botão à


esquerda mostrado na Fig. 5.5(b). Esse botão faz uma sequencia de operações
no PIC (apaga, grava e verifica) automaticamente. O programa carrgado pode
ser executado liberando-se o RESET do PIC através do 7º botão da barra de
ferramentas da Fig. 5.5(b). O 8º botão serve para parar a execução levando o
sinal de RESET do PIC para zero.
Os botões da Fig. 5.5(a) somente aparecerão na barra de ferramentas se
o compilador HI-TECH tiver sido selecionado através do menu "Project" >
"Select Language Toolsuite..." conforme descrito anteriormente. Os botões da
Fig. 5.5(b) somente aparecerão na barra de ferramentas se o programador ICD2
tirer sido selecionado através do menu "Programmer" > "Select Programmer"
> "MPLAB ICD2" conforme descrito anteriormente.
Ao ser executado, o programa exemplo faz o LED ficar piscando 1 segundo
aceso e 1 segundo apagado, e fica num loop infinito para mostrar quantas vezes
o botão que foi montado na placa foi pressionado. Esse programa exemplo
possui uma rotina para leitura do botão que internamente utiliza uma rotina
de interrupção periódica para fazer a leitura do botão através de uma técnica
chamada de debounce. Essa rotina de interrupção periódica também dá a base
de tempo para o LED piscar.
A execução desse programa testa alguns dos componentes montados na placa
e também o funcionamento básico do PIC. No caso de erros de montagem, o
programa não será executado corretamente e a montagem deverá ser conferida
até que o programa execute conforme esperado.
A estrutura desse programa pode ser utilizada como base para os outros
programas que serão desenvolvidos nas outrs experiências desse laboratório.

5.1.2 Relatório
O relatório desta experiência deve ser entregue numa folha A4 contendo a iden-
tificação do grupo, disciplina e experiência com duas figuras contendo uma foto
colorida da placa montada do lado dos componentes e outra do lado de baixo,
na melhor resolução possível. Serão avaliados para a nota os seguintes itens:
• Distribuição dos componentes na placa observando a otimização na dis-
posição dos mesmos.
• Qualidade da montagem em relação à fiação e soldagem.
• Qualidade das imagens das figuras. Imagens de má qualidade que não
permitam a avaliação dos itens acima acarretarão redução na nota.

5.2 Conversão A/D com display LCD


Nesta experiência deverá ser desenvolvido um programa para realizar periodi-
camente a conversão A/D de um sinal e mostrar o valor dessa conversão num
display LCD a cada 0,5 segundo. O valor convertido deve ser apresentado em
CAPÍTULO 5. EXPERIÊNCIAS 43

miliVolts no display LCD. O intervalo de tempo deve ser controlado com uma
interrupção periódica. O valor do sinal analógico deve ser alterado pelo poten-
ciômetro presente no módulo de motor e LCD.
O PIC 16F873 possui 5 canais de conversão A/D, cada canal converte um
sinal analógico para um valor digital de 10-bits. Os valores limites do sinal
analógico podem ser configurados por software e/ou hardware. Nesse laboratório
será utilizada a faixa de 0 V a 5 V configurada por software.
A placa montada na experiência anterior conecta o potenciômetro do módulo
de motor e LCD ao canal 0 (zero) de conversão A/D do PIC que corresponde ao
pino RA0/AN0. O uso desse pino como entrada analógica precisa ser configu-
rado através dos registradores ADCON0 e ADCON1 e o resultado da conversão
é apresentado nos registradores ADRESH e ADRESL do PIC. Os detalhes da
configuração e utilização dos canais de conversão A/D foram apresentados no
Capítulo 2. Nesta experiência deverão ser usadas as rotinas em C disponíveis
na biblioteca fornecida para realizar a configuração e conversão A/D.
O programa deve seguir a seguinte estrutura:

1. Criar uma interrupção periódica a cada 0,5 segundo com um timer interno.
O aluno deverá avaliar qual é o melhor timer a ser utilizado e os cálculos
deve ser apresentados no relatório
2. Na interrupção efetuar a conversão do sinal analógico e armazenar o re-
sultado numa variável global

3. No programa principal, ficar num loop infinito que fica realizando as se-
guintes operações:

(a) Converter o valor da variável global que armazena o resultado da


conversão A/D para a unidade de miliVolts
(b) Converter o valor em milivolts para um string ASCII que possa ver
mostrado no display LCD
(c) Escrever o string resultante no display LCD

Para que seja possível mostrar o valor correto em miliVolts no display LCD deve
ser levantada uma curva de calibração entre o valor resultante da conversão A/D
e o nível de tensão real do sinal. Pode-se aplicar um método de regressão linear
com a medida de 5 pontos entre o mínimo e o máximo.

5.2.1 Relatório
No relatório deverão estar identificados os membros do grupo, turma, disciplina
e experiência e deverão constar os seguintes itens:
1. Discussão e justificativa para escolha do timer usado para interrupção
2. Cálculo dos valores do timer
CAPÍTULO 5. EXPERIÊNCIAS 44

3. Levantamento da curva de calibração do valor da conversão A/D para a


unidade de milivolts
4. Código fonte com comentários explicando o funcionamento do programa
Além da avaliação dos pontos acima, serão levados também em consideração
para a nota:
• Estrutura do programa que deve seguir a estrutura proposta
• Relevância e adequação dos comentário inseridos no código do programa

5.3 Comunicação serial


Nesta experiência deverá ser feito um programa que recebe um caracter pelo
canal serial e envia o mesmo caracter pelo canal serial, mostrando-o ao mesmo
tempo no display LCD. As duas linhas de entrada e saída serial deverão ser
vistas com o osciloscópio e suas formas de onda interpretadas e explicadas no
relatório.
O canal serial deverá estar conectado conforme mostrado na Figura 5.3. Do
lado do PC deverá ser executado um programa de Terminal, como o TeraTerm.
Esse programa faz com que os caracteres pressionados no teclado do PC sejam
enviados pela porta serial configurada no programa. Da mesma maneira, os
caracteres recebidos por essa porta serial são mostrados na tela. Não é feito
nenhum processamento2 das informações enviadas e recebidas pelo canal serial.
Ao se pressionar a tecla ENTER no PC dentro do programa de Terminal,
deve-se alternar entre a linha 1 e a 2 do display LCD. Ou seja, se os caracteres
sendo recebidos estavam sendo mostrados na linha 1 do display LCD, ao ser
pressionada a tecla ENTER no Terminal do PC, deve-se passar a mostrar os
próximos caracteres na primeira posição da segunda linha do display LCD.
O canal de comunicação serial deve ser configurado com a taxa de baud de
19.200 bps, com 8-bits de dados, e sem paridade. Essa configuração no PIC é
feita através dos registradores TXSTA, RCSTA e SPBRG de acordo com o que
visto no Capítulo 2. Os cálculos e configurações para os valores de operação do
canal serial deverão ser apresentados no relatório.
Deverá ser utilizada a biblioteca de software para acesso ao canal serial
fornecida. Para tanto incluir o header serial.h. As rotinas disponíveis estão
descritas no Capítulo 2.

5.3.1 Análise dos sinais de comunicação serial


Devem ser observados com o osciloscópio 4 pontos do circuito:
• Pino 4 do MAX233 (Rx do RS232)
2 A única exceção é a tecla ENTER do teclado do PC, que pode ser configurada como

padrão DOS ou UNIX nos programas de Terminal. Se for DOS são enviados dois caracteres
CR (0Dh ou ’\r’) e LF (0Ah ou ’\n’) e se for UNIX é enviado somente o caracter LF.
CAPÍTULO 5. EXPERIÊNCIAS 45

• Pino 5 do MAX233 (Tx do RS232)


• Pino 18 do PIC16F873 (Rx do PIC)
• Pino 17 do PIC16F873 (Tx do PIC)
Com os dois canais verticais do osciloscópio deve-se observar os sinais de Tx e
Rx do MAX e depois do PIC. As formas de onda devem ser anotadas e devem
ser medidos tempos e tensões dos sinais. Deve-se medir também a defasagem
entre o START bit do Rx e o START bit do Tx. Esse tempo corresponde ao
tempo que o programa demora entre a recepção de um caracter e o seu envio
de volta para o PC.
O osciloscópio deve ser ajustado de modo que possam ser vistos todos os
bits de um caracter na tela, colocado em modo de disparo NORMAL, borda de
subida e disparo pelo canal que mostrará o sinal Rx. Isso permitirá que ao ser
pressionada uma tecla no Terminal do PC os sinais fiquem congelados na tela
do osciloscópio.
Deve ser mostrado se o tempo de duração de um bit corresponde à taxa de
Baud programada no PIC e no Terminal. Para tanto deve ser escolhido um
caracter para ser observado que permita boas medições de tempo.

5.3.2 Relatório
No relatório deverão estar identificados os membros do grupo, turma, disciplina
e experiência e deverão constar os seguintes itens:
1. Cálculo e programação dos bits dos registradores do PIC para taxa de
19.200 bps com palavra de 8-bits e sem paridade.
2. Desenhos das formas de ondas dos 4 pontos do circuito indicados, mos-
trando que caracter é que aparece nas formas de onda, tempos e tensões
dos sinais. Incluir verificação de que os tempos de um bit nas formas de
onda acima correspondem aos valores programados para taxa de baud.
Mostrar o tempo de atraso entre a recepção e a transmissão.
3. Código fonte com comentários explicando o funcionamento do programa.
4. Pesquisar e projetar o hardware e software necessários para transformar
um canal serial RS232 em RS485. Incluir uma descrição do funcionamento
do RS485, mostrar que circuito utilizar e desenhar o diagrama lógico do
projeto. Essa atividade será utilizada no PI7.

5.4 Movimentando o motor com PWM


Nesta experiência será desenvolvido um programa para controle da velocidade
de um motor CC através da aplicação de um sinal PWM produzido pelo PIC
no driver do motor. Os conceitos de PWM e como gerar um sinal de PWM com
o PIC foram vistos no Capítulo 2.
CAPÍTULO 5. EXPERIÊNCIAS 46

Nesta experiência, ao contrário das anteriores, não é fornecida uma biblioteca


de rotinas em C. Os alunos deverão desenvolver sua própria biblioteca para
geração do sinal PWM. Assim deverão ser implementadas as seguintes funções:
• void pwm_init(void) – inicializa o canal de PWM para operação na
frequencia de 20 kHz usando o Timer 2 para gerar a base de tempo e
define um duty cycle de zero.
• void pwm_set(int setpoint) – o parâmetro de entrada corresponde ao
valor do duty cycle em porcentagem, podendo variar entre 0 e 100. Valores
fora dessa faixa deverão ser ignodados da seguinte maneira: se menor que
zero, ajusta o valor do duty cycle para zero; se maior que 100, ajusta o
valor do duty cycle para 100%.
O programa principal deverá receber um número inteiro, entre 0 e 100 (termi-
nado por ENTER) pelo canal serial que corresponde ao valor percentual do duty
cycle do PWM. Para tanto deverão ser usadas as funções de PWM desenvolvidas
e as de canal serial utilizadas anteriormente. O sinal do PWM gerado deverá ser
visto com o osciloscópio e as formas de onda para 20%, 50% e 75% deverão ser
anotadas para o relatório, seus tempos medidos e o duty cycle calculado para
verificação de que o software está operando corretamente. Adicionalmente, as
teclas ’-’ e ’=’ deverão ser usadas para inverter a direção de rotação do motor.

5.4.1 Relatório
No relatório deverão estar identificados os membros do grupo, turma, disciplina
e experiência e deverão constar os seguintes itens:
1. Cálculo do período do PWM baseado no clock do microcontrolador e de-
terminação do valor a ser programado no registrador PR2.
2. Cálculo da conversão do valor do parâmetro de entrada da rotina pwm_set
para o valor a ser programado no registrador CCPR1L e CCP1CON
3. Desenhos das formas de onda para 25%, 50% e 75% de duty cycle mos-
trando os tempos que o sinal fica em nível lógico HIGH, e o período do
PWM. Cálcular a percentagem do PWM para verificar que o software está
correto.
4. Código fonte com comentários explicando o funcionamento do programa.

5.5 Leitura de encoder


Nessa experiência deverá ser desenvolvido um algoritmo para contabilização de
mudanças de estados dos sinais dos canais A e B do encoder, vide Capítulo 4
sobre o funcionamento do encoder. Os sinais dos canais A e B estão conecta-
dos aos bits 3 e 4 da porta C do PIC, respectivamente. Para tanto deverá ser
CAPÍTULO 5. EXPERIÊNCIAS 47

estabelecida uma interrupção periódica a cada 1 ms que lerá os 2 bits e incre-


mentará ou decrementará uma variável global que corresponde ao contador de
estados do encoder. Essa variável deverá ser de 32-bits e o seu valor deverá
ser constantemente atualizado numa das linhas do display LCD pelo programa
principal. Uma tecla do Terminal (através do canal seial RS232) deverá ser
usada para zerar essa variável. A atualização do valor no LCD deve ser feita
aproximadamente a cada segundo num loop no programa principal. O valor a
ser mostrado no display LCD corresponde simplesmente à contagem dos estados
acumulada na variável global utilizada como contador.

ATENÇÃO: A atualização do display LCD não


deve ser feita na rotina de interrupção.

A velodicade do motor deve ser controlada em incrementos e decrementos


discretos através do teclado do Terminal que altera os valores do PWM do
motor. Devem ser utilizadas as seguintes teclas do Terminal:
• r – zera a contagem do contador do encoder imediatamente

• z – incrementa o PWM em 10%


• x – incrementa o PWM em 1%
• c – decrementa o PWM em 1%
• v – decrementa o PWM em 10%

• Espaço – zera o valor do PWM


• - – motor gira no sentido anti-horário
• = – motor gira no sentido horário
A porcentagem do PWM deve ser mostrada numa das linhas do display LCD.
Um sinal de menos deve preceder o valor se a rotação for no sentido anti-horário
e um sinal de mais se for no sentido horário.
Durante a experiência, montar os dois canais verticais do osciloscópio nos
canais A e B do encoder e para a velocidade de 50% de PWM anotar as formas
de ondas dos canais A e B. Medir os tempos das larguras dos pulsos (tempo em
nível lógico HIGH e em nível lógico LOW) e da defasagem entre os canais.
Sabendo que o diâmetro da roda é 42 mm e que para cada volta são produ-
zidos 12 pulsos para cada canal A e B, calcule a velocidade em mm/s para 5
valores de PWM entre 0 e 100%. Utilize a frequencia dos sinais medidos com o
osciloscópio para o cálculo.

ATENÇÃO: Nessa implementação o disco do


encoder está posicionado na roda e não no eixo
do motor.
CAPÍTULO 5. EXPERIÊNCIAS 48

5.5.1 Relatório
No relatório deverão estar identificados os membros do grupo, turma, disciplina
e experiência e deverão constar os seguintes itens:
1. Desenhar as formas de ondas dos canais A e B do encoder e mostrar os
tempos anotados da largura dos pulsos e da defasagem entre os canais
para o PWM de 50%
2. Mostrar os cálculos para determinar a velocidade da roda em mm/s a
partir da % do PWM. Plotar um gráfico de % PWM x velocidade (mm/s)
e achar uma função que converta % PWM em velocidade em mm/s.
3. Código fonte com comentários explicando o funcionamento do programa.

5.6 Medição de velocidade


Nesta experiência a velocidade do motor deve ser alterada detectando-se a va-
riação de tensão através do potenciômetro. A velocidade da roda em mm/s
e o valor do sinal do potênciômetro convertido para % de PWM devem ser
mostrados no display LCD.
A variação de tensão do pontenciômetro é detectada pelo PIC conforme
implementado na Experiência 5.2, contudo ao invés de uma escala em miliVolts
o valor do conversor A/D deve ser convertido para % de PWM.
A velocidade da roda deve ser calculada com base na leitura do encoder
em um intervalo de tempo conhecido. Usando-se uma interrupção de 1ms para
a leitura do encoder, pode-se utilzar 100ms para o intervalo de tempo para o
cálculo da velocidade. O tempo de 100ms deve ser obtido contabilizando-se o
número de vezes que a rotina de interrupção é executada. O diâmetro da roda
é de 42 mm e cada canal A e B produz 12 pulsos por volta.
O display LCD deve ser atualizado pelo programa principal a cada 0,5 se-
gundos.
Depois de terminado o programa, deve ser levantado um gráfico com os
valores apresentados no display LCD da velocidade da roda em mm/s em função
da % de PWM. Pelo menos 5 valores devem ser anotados para a apresentação
dos resultados no relatório. Esse gráfico deve ser comparado com o levantado
na experiência anterior.

5.6.1 Relatório
No relatório deverão estar identificados os membros do grupo, turma, disciplina
e experiência e deverão constar os seguintes itens:
1. Apresentar um gráfico levantado com pelo menos 5 pontos da velocidade
da roda em mm/s em função da % PWM e comparar com o gráfico da
experiência anterior.
CAPÍTULO 5. EXPERIÊNCIAS 49

2. Apresentar uma função que descreva o gráfico levantado e compará-la com


a função encontrada na experiência anterior.
3. Código fonte com comentários explicando o funcionamento do programa.
Referências Bibliográficas

[1] Hitachi; HD44780U (LCD-II) (Dot Matrix Liquid Crystal Display Control-
ler/Driver); Rev. 0.0; 1999

[2] Microchip Technology Inc.; PIC16F87X Data Sheet 28/40-Pin 8-Bit CMOS
FLASH Microcontrollers; 2001
[3] Microchip Technology Inc.; HI-TECH C for PIC10/12/16 User’s Guide; 2009
[4] Storr, Wayne; Basic Electronics Tutorials: Position Sensors; http://www.
electronics-tutorials.ws/io/io_2.html; acessado em 31/01/2011

50
51
5 4 3 2 1

VCC

R1
10k VCC

D D
D1 R2 R3 U1
1N4148 330 10k
ICSP 2 11
3 RA0/AN0 RC0/T1OSO/T1CKI 12
VCC 4 RA1/AN1 RC1/T1OSI/CCP2 13
RA2/AN2/VREF- RC2/CCP1

Lógico
6 D2 5 14
5 6 RA3/AN3/VREF+ RC3/SCK/SCL 15
LED RA4/T0CKI RC4/SDI/SDA
4 7 16
RA5/SS/AN4 RC5/SDO J2
3 17 U2
2 21 RC6/TX/CK 18
1 22 RB0/INT RC7/RX/DT 4 3 RXD 3
23 RB1 10 19 R1IN R1OUT 20 2
24 RB2 OSC2/CLKOUT R2IN R2OUT TXD 1
25 RB3/PGM 2 5
J1 26 RB4 1 T1IN T1OUT 18
27 RB5 T2IN T2OUT
28 RB6/PGC 8 RS232C
RB7/PGD 13 C1+
9 11 C1-
OSC1/CLKIN 15 C2+
C C
1 10 C2+
MCLR/VPP/THV 16 C2-
20 14 C2-
VDD 12 V+
17 V-
+ C1 PIC16F873 V-
10 uF
REFERÊNCIAS BIBLIOGRÁFICAS

MAX233

Y1

5
OUT
J3
VCC
20MHz
AIN2 2 1 AIN1
B B 4 3 A B
SW2
GND 6 5 VCC
4 3 POT 8 7 PWM
RS 10 9 E
DB5 12 11 DB4
DB7 14 13 DB6

1 2

MOTOR_LCD
B1
Apêndice 1 – Diagrama

A A

Title
Laboratório de PMR2415 - Microcontrolador

Size Document Number Rev


A4 Drawn by Jun Okamoto Jr. 1.0

Date: Thursday, December 16, 2010 Sheet 1 of 1


5 4 3 2 1
52
Apêndice 2 – Lista de
Componentes

Laboratório de PMR2415 - Microcontrolador


Revised: Thursday, December 16, 2010
Drawn by Jun Okamoto Jr. Revision: 1.0
Bill Of Materials December 16,2010 10:55:40 Page1
Item Quantity Reference Part
______________________________________________
1 1 C1 10 uF
2 1 D1 1N4148
3 1 D2 LED
4 1 J1 HEADER 6X1
5 1 J2 HEADER 3X1
6 1 J3 HEADER 7X2
7 2 R1 10k
R3 10k
8 1 R2 330
9 1 SW1 PUSH BUTTON
10 1 U1 PIC16F873
11 1 U2 MAX233
12 1 Y1 OSC 20MHz

53
Apêndice 3 – Bibliotecas de
Software

adc.h
/∗
∗ Header f i l e f o r t h e ADC u n i t
∗ See adc . c f o r more i n f o
∗/

/∗−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
I n i t i a l i s i n g t h e ADC c h a n n e l s
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−∗/
e x t e r n v o i d a d c _ i n i t ( u n s i g n e d c h a r ADC_Channel ) ;

// [ j o : 1 0 0 2 1 2 ] f u n c t i o n name changed f o r c o m p a t i b i l i t y with


// other l i b r a r i e s
// I n i t i a l i z e A D C −> a d c _ i n i t

/∗−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
Reads t h e ADC l e v e l i n p u t on a s p e c i f i e d ADC c h a n n e l .
Takes i n an 10− b i t ADC c h a n n e l number .
Returns an 10 b i t number t h a t s i g n i f i e s t h i s l e v e l .
Approximate s a mp li n g time = 7 6 . 8 us
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−∗/
e x t e r n u n s i g n e d i n t adc_read ( u n s i g n e d c h a r ADC_Channel ) ;

// [ j o : 1 0 0 2 1 2 ] f u n c t i o n name changed f o r c o m p a t i b i l i t y with


// other l i b r a r i e s
// ReadADC −> adc_read

lcd.h

54
REFERÊNCIAS BIBLIOGRÁFICAS 55

/∗
∗ LCD i n t e r f a c e h e a d e r f i l e
∗ See l c d . c f o r more i n f o
∗/

/∗ w r i t e a byte t o t h e LCD i n 4 b i t mode ∗/


extern void lcd_write ( unsigned char ) ;

/∗ C l e a r and home t h e LCD ∗/


extern void lcd_clear ( void ) ;

/∗ w r i t e a s t r i n g o f c h a r a c t e r s t o t h e LCD ∗/
e x t e r n v o i d lcd_puts ( c o n s t c h a r ∗ s ) ;

/∗ Go t o t h e s p e c i f i e d p o s i t i o n ∗/
e x t e r n v o i d lcd_goto ( u n s i g n e d c h a r pos ) ;

/∗ i n t i a l i z e t h e LCD − c a l l b e f o r e a n y t h i n g e l s e ∗/
extern void lc d _in i t ( void ) ;

serial.h

/∗
∗ S e r i a l chennel header f i l e
∗ See s e r i a l . c f o r more i n f o
∗/

void s e r i a l _ i n i t ( void ) ; // i n i t i a l i z e s e r i a l c h a n n e l

v o i d putch ( u n s i g n e d c h a r c ) ; // output c h a r a c t e r

unsigned char getch ( void ) ; // i n p u t c h a r a c t e r

void putst ( r e g i s t e r const char ∗ s t r ) ; // output s t r i n g

u n s i g n e d c h a r u s art_ tim e ou t ( v o i d ) ; //

// [ j o : 0 9 1 2 1 1 ] i f c h a c a r t e r i s not r e c e i v e d u n t i l
// timeout , r e t u r n
u n s i g n e d c h a r getch_timeout ( v o i d ) ;

// [ j o : 0 9 1 2 1 1 ] check i f a c h a r a c t e r has been r e c e i v e d


// by t h e s e r i a l c h a n n e l . I f not r e t u r n 2 5 5 , o t h e r w i s e
REFERÊNCIAS BIBLIOGRÁFICAS 56

// r e t u r n c h a r a c t e r
u n s i g n e d c h a r chkchr ( v o i d ) ;

v o i d putchdec ( u n s i g n e d c h a r c ) ; // output c h a r a c t e r i n d e c i n a l form

v o i d putchhex ( u n s i g n e d c h a r c ) ; // output c h a r a c t e r i n h e x a d e c i n a l form

v o i d p u t i n t h e x ( u n s i g n e d i n t c ) ; // output i n t e g e r i n h e x a d e c i n a l form

#d e f i n e p u t l f p u t s t ( " \ n " ) // output l i n e f e e d

Das könnte Ihnen auch gefallen