Escolar Documentos
Profissional Documentos
Cultura Documentos
COORDENAÇÃO DE MECÂNICA
MICROCONTROLADOR
PIC16F628
BIBLIOGRAFIA ............................................................................................................................................ 52
• Microcontroladores da MOTOROLA.
O PIC pode ser visto externamente como um circuito integrado TTL ou CMOS
normal, mas internamente dispõe de todos os dispositivos típicos de um sistema
microprocessado, ou seja:
• Uma memória de programa Flash EPROM (2048 words) que possibilita a gravação
cerca de 1000 vezes sem a necessidade de apagamento com ultravioleta.
• Uma série de LINHAS de I/O para controlar dispositivos externos ou receber pulsos
de sensores, chaves, etc.
• Uma memória EEPROM de 128 bytes para gravar dados permanentes. Cada posição
pode ser gravada cerca de um milhão de vezes.
PINAGEM DO PIC16F628
RB0 a RB7, também são pinos de linhas de entrada e saída de sinais (linhas de I/O).
Mas eles tem outras funções: o pino RB0/INT também pode ser programado para ser
um pino de entrada de interrupção externa; os pinos RB4 a RB7 podem ser programados
para gerar interrupção quando houver mudança de nível lógico em um deles e os pinos
RB6 e RB7 também são usados na programação do PIC, o primeiro serve como “clock”
serial e o segundo serve como “data” serial.
VDD e VSS, são pinos de alimentação. O VSS é conectado ao TERRA (GND) e o VDD
à tensão contínua de +5V. A tensão de alimentação nominal dos PICs é de 5 Vcc, mas a
faixa de variação desta tensão depende do modelo estudado. No caso do PIC16F628, ela
vai de 2.0 a 6.0 Vcc.
/MCLR, é o pino de reset. Este se refere ao Master Clear externo. Sempre que esse pino
for colocado em nível lógico baixo (GND), o programa será resetado e o processamento
paralisado. Ao ser colocado em nível alto (+5V), a execução do programa será retomada
do ponto inicial (ORG 00H).
• Possui 4 fontes de interrupção, que são a interrupção externa RB0/INT, interrupção por
“overflow” do timer TMR0, interrupção por mudança de nível nos pinos da porta B
(pinos RB7 a RB4) e interrupção por escrita completa na EEPROM.
• Memória de programação FLASH EPROM de 2 Kbytes. Pode-se escrever nessa
memória cerca de 1000 vezes sem danificá-la.
• Memória de dados temporários, RAM separada em bancos de memória. As primeiras
posições de cada banco são reservadas para registradores de funções especiais (SFR -
Special Function Registers). O restantes de cada banco são reservadas aos registradores
de propósitos gerais (GPR - General Purpose Registers). Todos os registradores da
RAM são programáveis bit a bit;
• Memória de dados permanentes, EEPROM de 128 Bytes. Pode-se escrever em cada bit
dessa memória cerca de 1 milhão de vezes sem danificá-la;
• Via de programação com 14 bits e 35 instruções;
• 3 Módulos de timer/counter ;
• A faixa de tensão de trabalho está na faixa de 3 a 5,5 volts;
A divisão do clock por quatro forma as fases Q1, Q2, Q3 e Q4. O program counter
(registrador PC) é incrementado automaticamente na fase Q1 do ciclo de máquina e a
instrução seguinte é buscada da memória de programa e armazenada no registrador de
instruções no ciclo Q4. Ela é decodificada e executada no próximo ciclo, no intervalo de
Q1 até Q4. Esta característica de buscar a informação num ciclo de máquina e executá-la
no próximo é conhecida como PIPELINE. Ela permite que quase todas as instruções sejam
executadas em apenas um ciclo, gastando assim 1us (para um clock de 4 MHz) e tornando o
sistema muito mais rápido. As únicas exceções referem-se às instruções que geram “saltos”
no program counter, como chamadas de rotinas e retornos. Ao executar essas instruções, o
PIPELINE deve ser primeiramente limpo para depois poder ser carregado novamente com
o endereço correto, consumindo para isso 2 ciclos de máquina. Esse PIPELINE é
facilmente implementado devido à arquitetura Havard.
Capítulo III - MEMÓRIA DE PROGRAMA (FLASH EPROM), MEMÓRIA
DE DADOS (RAM) E MEMÓRIA DE DADOS PERMANENTES
(EEPROM)
Os endereços reservados para Flash EPROM começam em 0000H e vão até 07FFH.
O PIC pode somente executar instruções memorizadas nestas locações. Não se pode de
maneira nenhuma ler, escrever ou cancelar dados nesses endereços, a não ser com o uso de
um dispositivo externo chamado programador.
A primeira localização de memória de programa que será executada quando o PIC
começar a rodar (após a alimentação ou um reset) é o endereço 0000H, por isso essa
localização de memória é denominada Reset Vector (Vetor de Reset). Já, quando ocorre
uma interrupção, a primeira instrução a ser executada está no endereço 0004H, por isto,
este endereço denomina-se endereço de Interrupt Vector (Vetor de Interrupção). O
“template”, exemplo padrão, a seguir mostra como deve ser a estrutura de um programa em
Assembly escrito para o PIC16F628 no MPLAB (compilador, simulador e emulador para o
PIC).
;*******************************************************************
***
list p=16F628 ; Diretiva list para definir processador
#include <p16F628.inc> ; Definições de variáveis específicas do
processador
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
Registradores:
Power on reset R/W-0 R/W-0 R/W-0 R-1 R-1 R/W-x R/W-x R/W-x
Power on reset R/W-x R/W-x R/W-x R\W-x R/W-x R/W-x R/W-x R/W-x
Power on reset R/W-1 R/W-1 R/W-1 R\W-1 R/W-1 R/W-1 R/W-1 R/W-1
Bits - - - - - - - -
Power on reset R/W-x R/W-x R/W-x R/W-x R/W-x R/W-x R/W-x R/W-x
Nº dos bits Bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0
Bits - - - - - - - -
Power on reset R/W-x R/W-x R/W-x R/W-x R/W-x R/W-x R/W-x R/W-x
Bits - - - - - - - -
Power on reset R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0
Nº dos bits Bit 7 bit 6 Bit 5 bit 4 bit 3 bit 2 bit 1 bit 0
Bits - - - - - - - -
Bits - - - - - - - -
Power on reset R/W-x R/W-x R/W-x R/W-x R/W-x R/W-x R/W-x R/W-x
Nº dos bits Bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0
Bits - - - - - - - -
Power on reset R/W-x R/W-x R/W-x R/W-x R/W-x R/W-x R/W-x R/W-x
Nº dos bits Bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0
Nomes dos bits GIE EEIE T0IE INTE RBIE T0IF INTF RBIF
Power-on-reset R/W-0 R/W-0 R/W-0 R\W-0 R/W-0 R/W-0 R/W-0 R/W-x
Power on reset R/W-1 R/W-1 R/W-1 R\W-1 R/W-1 R/W-1 R/W-1 R/W-1
0 0 0 2 1
0 0 1 4 2
0 1 0 8 4
0 1 1 16 8
1 0 0 32 16
1 0 1 64 32
1 1 0 128 64
1 1 1 256 128
Observações quanto aos termos utilizados na construção dos nomes das instruções e
seus argumentos:
• Work: Trata-se de um registrador temporário para as operações da ULA. No Assembler
do PIC, ele é conhecido como W. Também é comum chamá-lo de acumulador.
• File: Referência a um registrador (posição de memória) propriamente dito. Utilizaremos
a letra F para sua representação nos nomes de instruções e f nos argumentos delas.
• Literal: Um número qualquer que pode ser escrito na forma decimal, hexadecimal ou
binária. Utilizaremos a letra L para sua representação nos nomes de instruções e k nos
argumentos delas.
• Destino: O local onde deve ser armazenado o resultado da operação. Os destinos
podem ser 0 (W ) ou 1 (F). A letra d será usada para indicar o destino de uma instrução,
o destino pode ser o acumulador (d=0) ou o registrador (d=1).
• Bit: Refere-se a um bit específico dentro de um byte. Utilizaremos a letra B para sua
representação nos nomes das instruções e b nos argumentos delas.
Para facilitar as operações de seus registradores especiais na RAM (que como
recordamos estava incluído no código com a diretiva INCLUDE), a Microchip inseriu uma
lista de nomes que identificam univocamente qualquer registrador especial e a qual está
associado o endereço correspondente na área da memória RAM.
Se, por exemplo, quisermos definir toda a linha do PORTB do PIC como saída,
devemos agir sobre o TRISB. Podemos escolher e referenciar diretamente o registrador
com o seu endereço:
movlw B'00000000'
movwf 86H ; Endereço de TRISB
ou então, referenciar o mesmo registrador com o seu nome simbólico, neste caso tendo que
ter a certeza de ter inserido a diretiva INCLUDE "P16F628.INC" (mostrado no Apêndice A
desta apostila):
movlw B'00000000'
movwf TRISB ; Nome simbólico do endereço de TRISB
Para facilitar o estudo das instruções do PIC, organizamos a seguir duas tabelas.
Uma com as instruções em ordem alfabética e a outra com as instruções divididas em
quatro grupos, conforme as suas aplicações:
• Operações com registradores;
• Operações com literais;
• Operações com bits;
• Controles.
Conjunto de instruções do PIC16F628
Operações em ordem alfabética
Instrução Argumento Descrição
s
ADDLW K Soma k com W, guardando o resultado em W (W = W + k).
ADDWF f,d Soma W e f, guardando o resultado em d (d = W + f).
ANDLW K Lógica “E” entre k e W, guardando o resultado em W (W = W AND k).
ANDWF f,d Lógica “E” entre W e f, guardando o resultado em d (d = W AND f).
BCF f,b Zera o bit b do registrador f.
BSF f,b Seta o bit b do registrador f.
BTFSC f,b Testa o bit b do registrador f, e pula a próxima linha se ele for 0 (zero).
BTFSS f,b Testa o bit b do registrador f, e pula a próxima linha se ele for 1 (um).
CALL Label Chamada a uma subrotina no endereço Label.
CLRF F Limpa o registrador f (f = 0).
CLRW Limpa o acumulador (W = 0).
CLRWDT Limpa o registrador WDT para evitar o reset (Watchdog timer = 0).
COMF f,d Pega o complemento de f, guardando o resultado em d (d = not f).
DECF f,d Decrementa f, guardando o resultado em d (d = f -1).
DECFSZ f,d Decrementa f, guardando o resultado em d, e pula a próxima linha se o
resultado for zero (d = f –1, skip se zero).
GOTO Label Desvia para o endereço Label.
INCF f,d Incrementa f, guardando o resultado em d (d = f +1).
INCFSZ f,d Incrementa f, guardando o resultado em d, e pula a próxima linha se o
resultado for zero (d = f+1, skip se zero).
IORLW K Lógica OU entre k e W, guardando o resultado em W (W = W OR k).
IORWF f,d Lógica OU entre W e f, guardando o resultado em d (d = f OR W).
MOVLW K Move (copia) valor literal k para o acumulador W (W = k).
MOVF F,d Move (copia) valor de registrador f para destino d (d = f).
MOVWF F Move (copia) valor do acumulador W para o registrador f (f = W).
NOP Nenhuma operação, gasta um ciclo de máquina sem fazer nada.
RETFIE Retorno de uma interrupção.
RETLW K Retorno de uma rotina, com k em W.
RETURN Retorna de uma rotina.
RLF f,d Rotaciona f um bit a esquerda, guardando o resultado em d (d = f << 1).
RRF f,d Rotaciona f um bit a direita, guardando o resultado em d (d = f >> 1).
SLEEP Coloca o PIC em modo sleep (dormindo) para economia de energia.
SUBLW K Subtrai W de k, guardando o resultado em W (W = k – W).
SUBWF f,d Subtrai W de f, guardando o resultado em d (d = f - W).
SWAPF f,d Executa uma inversão entre o nibble da parte alta e o nibble da parte
baixa de f, guardando o resultado em d.
XORLW W Lógica ou-exclusivo entre k e W, guardando o resultado em W (W=W
XOR k).
XORWF f,d Lógica ou-exclusivo entre W e f, guardando o resultado em d (d=W
XOR f).
Conjunto de instruções do PIC16F628
Instrução Argumentos Descrição
Grupo 1: Operações com registradores
ADDWF f,d Soma W e f, guardando o resultado em d (d = W + f).
ANDWF f,d Lógica “E” entre W e f, guardando o resultado em d (d = W AND f).
CLRF F Limpa o registrador f (f = 0).
COMF f,d Pega o complemento de f, guardando o resultado em d (d = not f).
DECF f,d Decrementa f, guardando o resultado em d (d = f -1).
DECFSZ f,d Decrementa f, guardando o resultado em d, e pula a próxima linha se o resultado
for zero (d = f –1, skip se zero).
INCF f,d Incrementa f, guardando o resultado em d (d = f +1).
INCFSZ f,d Incrementa f, guardando o resultado em d, e pula a próxima linha se o resultado
for zero (d = f+1, skip se zero).
IORWF f,d Lógica OU entre W e f, guardando o resultado em d (d = f OR W).
MOVF F,d Move (copia) valor de registrador f para destino d (d = f).
MOVWF F Move (copia) valor do acumulador W para o registrador f (f = W).
RLF f,d Rotaciona f um bit a esquerda, guardando o resultado em d (d = f << 1).
RRF f,d Rotaciona f um bit a direita, guardando o resultado em d (d = f >> 1).
SUBWF f,d Subtrai W de f, guardando o resultado em d (d = f - W).
SWAPF f,d Executa uma inversão entre o nibble da parte alta e o nibble da parte baixa de f,
guardando o resultado em d.
XORWF f,d Lógica ou-exclusivo entre W e f, guardando o resultado em d (d=W XOR f).
Grupo 2: Operações com literais
ADDLW K Soma k com W, guardando o resultado em W (W = W + k).
ANDLW K Lógica “E” entre k e W, guardando o resultado em W (W = W AND k).
IORLW K Lógica OU entre k e W, guardando o resultado em W (W = W OR k).
MOVLW K Move (copia) valor literal k para o acumulador W (W = k).
SUBLW K Subtrai W de k, guardando o resultado em W (W = k – W).
XORLW W Lógica ou-exclusivo entre k e W, guardando o resultado em W (W=W XOR k).
Grupo 3: Operações com bits
BCF f,b Zera o bit b do registrador f.
BSF f,b Seta o bit b do registrador f.
BTFSC f,b Testa o bit b do registrador f, e pula a próxima linha se ele for 0 (zero).
BTFSS f,b Testa o bit b do registrador f, e pula a próxima linha se ele for 1 (um).
Grupo 4: Controles
CALL Label Chamada a uma subrotina no endereço Label.
CLRW Limpa o acumulador (W = 0).
CLRWDT Limpa o registrador WDT para evitar o reset (Watchdog timer = 0).
GOTO Label Desvia para o endereço Label.
NOP Nenhuma operação, gasta um ciclo de máquina sem fazer nada.
RETFIE Retorno de uma interrupção.
RETLW K Retorno de uma rotina, com k em W.
RETURN Retorna de uma rotina.
SLEEP Coloca o PIC em modo sleep (dormindo) para economia de energia.
Explicação detalhada do conjunto de instruções do PIC.
4) ANDWF f,d ; Efetua o AND bit a bit entre o valor contido em W e o valor
contido no registrador F.
Descrição: Esta instrução efetua o AND bit a bit entre o valor contido no acumulador W e
o valor contido no registrador endereçado pelo parâmetro f.
Exemplo: Freqüentemente o AND será utilizado para mascarar o valor de algum bit dentro
de um registrador. Se por exemplo quiséssemos extrair do número binário 01010101B os
quatro bits menos significativo a fim de obter o seguinte valor 00000101B, bastará preparar
uma máscara do tipo 00001111B e fazer o AND com o nosso valor, vejamos como:
movlw 01010101B ; Armazena em W o valor binário
movwf 0CH ; Usa o endereço 0CH para armazenar o valor inicial da
máscara
movlw 00001111B ; Prepara a máscara do bit
andwf 0CH,W ; Efetua o AND e memoriza o resultado no acumulador
W
O resultado em W será 00000101B como descrito.
W = 00001111 AND
f = 01010101 =
----------------
W = 00000101
Exemplo:
parm1 equ 0CH
org 00H
movlw 11111111B ;Valor inicial
movwf parm1
loop
btfss parm1,0 ;bit0 = 1 ? Se for, pular próxima instrução.
goto loop ;Se não, ficar no loop
Este programa executa um loop infinito. O mesmo programa não executará o loop
se substituirmos a instrução:
movlw 11111111B pela instrução: movlw 11111110B.
ledOn
btfsc PORTB,LED1 ; testa o bit 1 da porta B
return
20) IORWF f,d ; Efetua o OR inclusive entre o valor contido em W e o valor contido
no registrador F
Descrição: Esta instrução efetua o OR inclusive entre o valor contido no acumulador W e o
valor contido no registrador endereçado pelo parâmetro f.
Exemplo:
parm1 equ 0CH
org 00H
movlw 00001111B
movwf parm1
movlw 11111111B
iorwf parm1,F
Ao término do programa o valor do registrador parm1 será 11111111B.
Uma vez executado esse programa ele memorizará no registrador rtc o valor 10
passado pela subrotina mySub1.
Exemplo:
org 00H
call mySub1
....
mySub1
nop
return
Nota: No PIC16F628 podemos fazer apenas 8 chamadas a subrotinas, do tipo:
org 00H
call mySub1
....
mySub1
call mySub2
return
mySub2
call mySub3
return
mySub3
return
CARRY
CARRY
Registrador INTCON:
GIE EEIE T0IE INTE RBIE T0IF INTF RBIF
• INTE (bit 4) se este bit estiver em 1 habilitará a interrupção de troca de estado sobre
a linha RB0
• RBIE (bit 3) se este bit estiver em 1 habilitará a interrupção de troca de estado sobre
uma das linhas de RB4 a RB7
• EEIE (bit 6) se este bit estiver em 1 habilitará a interrupção de final de escrita sobre
um endereço da EEPROM
• GIE (bit 7) bit de habilitação geral de interrupção. Esse bit deve ser setado em 1
antes dos demais.
• RBIF (bit 0), se for 1 é porque ocorreu uma interrupção de troca de estado de uma
das linhas de RB4 a RB7.
Como se pode ver a interrupção de final de escrita na EEPROM não tem previsto
nenhum flag de sinalização para que a interrupt handler deva considerar que a interrupção é
um estado gerado deste evento quando todos os três flags supra citados irão a 0.
Importante: Uma vez conhecido qual o flag que está ativo, a interrupt handler deve
zerá-lo, ou então não mais gerará interrupção correspondente.
Retorno de uma interrupt handler, quando for gerada uma interrupção o PIC é
desabilitada automaticamente o bit GIE (global Interrupt Enable) do registrador INTCON
de modo a desabilitar todas as interrupções restantes. Para poder retornar ao programa
principal e reinicializar em 1 este bit deve-se utilizar a instrução: RETFIE
Capítulo VII - O CONTADOR/TEMPORIZADOR (TMR0)
o registrador TMR0 será incrementado pelo hardware interno do PIC durante a execução
do loop. Uma vez atingido o valor 255 o registrador TMR0 será zerado automaticamente
recomeçando então a contagem, mas não do valor originalmente imposto mas do zero.
A freqüência é diretamente proporcional a freqüência de clock aplicada ao chip e
pode ser modificada programando-se oportunamente os seus bits de configuração. Na
figura seguinte está representada a cadeia de blocos interno do PIC que determina o
funcionamento do registrador TMR0.
Desta vez será o sinal aplicado ao pino TOCKI do PIC a ser enviado diretamente ao
contador TMR0 determinando a freqüência de contagem. Aplicando-se por exemplo a este
pino uma freqüência par de 100Hz obteremos uma de contagem igual a cem incrementos
por segundo.
A presença da porta lógica XOR (exclusive OR) na entrada TOCKI do PIC permite
determinar o caminho do bit TOSE do registrador OPTION se o contador TMR0 deve ser
incrementado na descida do pulso (TOSE=1) ou na subida do pulso (TOSE=0) do sinal
externo aplicado.
Na figura seguinte está representada a correspondência entre a cadência do sinal
externo e o valor que assume o contador TMR0 :
O último bloco a ser analisado para poder utilizar complemente o registrador TMR0
é o PRESCALER. Se configurar-mos o bit PSA do registrador OPTION em 0 enviamos ao
registrador TMR0 o sinal de saída do PRESCALER como é visível na figura abaixo:
Figura 14 - O PRESCALER como divisor
0 0 0 2 500.000 = 4MHz/(4 * 2)
0 0 1 4 250.000 = 4MHz/(4 * 4)
0 1 0 8 125.000 = 4MHz/(4 * 8)
Para ajustar o PRESCALER ao WDT, devemos agir sobre o bit PSA do registrador
OPTION_REG. O bit PSA deverá setado em 1 com a instrução:
BSF OPTION_REG,PSA
Caso contrário o prescaler estará ligado ao TIMER 0. Obviamente ajustando o
prescaler ao WTD não será possível ajustá-lo para TIMER 0 e vice-versa.
Intervindo sobre o valor do bit PS0, PS1 e PS2 do mesmo registrador
OPTION_REG podemos obter diversos intervalos de retardo. A habilitação correta deverá
ser feita tendo em conta o máximo retardo que podemos obter dentro do nosso programa
entre a execução de duas instruções CLRWD sucessivas.
Na tabela seguinte está representada a correspondência entre os valores destes
bit's e os intervalos que obteremos.
0 0 0 1 18ms
0 0 1 2 36ms
0 1 0 4 72ms
0 1 1 8 144ms
1 0 0 16 288ms
1 0 1 32 576ms
1 1 0 64 1.152s
1 1 1 128 2.304s
Capítulo IX - Escrita e Leitura na EEPROM do PIC16F628
Exemplo:
3. Sites: www.microchip.com,
http://www2.ele.ufes.br/~hans/pic/index.html,
Apêndice A - INTRODUÇÃO AO MPLAB
A Figura 1 mostra a janela principal do MPLAB onde temos um menu principal, uma barra de
ferramentas com vários ícones e uma janela do gerenciador de projeto e janela de mensagens de saída.
Barra de Ferramentas
Menu Principal
Janela do
gerenciador
Uma vez que você abriu o MPLAB a primeira coisa a se fazer é criar um projeto ou
abrir um projeto criado anteriormente. O projeto que vamos criar terá o nome de
LED.MCP. É importante ressaltar que o projeto e o código-fonte SEQLEDS.ASM têm
que ser salvos na mesma pasta.
No menu principal, na opção Project o MPLAB possui o Project Wizard que nos
facilita o trabalho de criação do projeto. A Figura 2 mostra a janela inicial do Project
Wizard.
Figura 2 – Project Wizard
O código Assembly, que utilizamos neste curso, usa mnemônicos para trabalhar cada operação
(instrução). As instruções atuam nos bits e bytes dos registradores internos do PIC.
Já a linguagem C, tem prontos comandos que realizam, muitas vezes, mais de uma
instrução assembly.
A vantagem de usar Assembly é que a arquitetura interna do microcontrolador
estudado fica muito clara, além do desenvolvimento de programas menores e mais rápidos.
A linguagem C traz a vantagem da rapidez no desenvolvimento dos programas.
A Figura 4 mostra a próxima janela do Project Wizard. Nesta etapa, selecionamos o
compilador que iremos trabalhar e verificamos o local onde o mesmo está gravado. Para
trabalharmos com a programação Assembly, selecionaremos a opção MPASM, como
mostra a figura. Em Active ToolSuite estão as outras opções de compiladores.
Compilando o Projeto
BUILD SUCCEEDED
Para isso vamos clicar na opção Debugger (menu principal), depois Select Tools e
3-MPLAB SIM. A Figura 9 mostra estes passos em detalhes. Quando o modo de simulação
estiver escolhido várias ferramentas novas aparecem na opção Debugger. Uma dessa
opções é Step InTo (execução passo-a-passo). A tecla <F7> também realiza essa tarefa.
A Figura 10 mostra a como é realizada a execução passo-a-passo.
Figura 9 – Seleção do modo Simulação.
Figura 10 – Execução passo-a-passo.
Vamos ver agora explicações mais detalhadas sobre as portas de entrada e saída e os
respectivos registradores de direção de dados: PORTA, PORTB, TRISA e TRISB.
Iniciaremos com o grupo RA0, RA1, RA2 e RA3 na qual representamos, na figura
seguinte, o esquema do estado de escrita extraído do data sheet da Microchip
(www.microchip.com):
Como dito acima, a configuração de uma linha como entrada ou saída depende do estado
do bit no registrador TRIS (TRISA para o PORTA e TRISB para o PORTB).
Pegaremos como exemplo a linha RA0 e analisaremos o funcionamento do estado de
saída seja quando a mesma funciona como entrada ou como saída.
Funcionamento como entrada
Para configurar a linha RA0 como entrada, devemos colocar em 1 o bit 0 do registrador
Microcontrolador PIC16F628 68
TRISA com a instrução:
bsf TRISA,0
Esta instrução determinará uma comutação a 1 do estado lógico do flip-flop do D-latch
indicado no bloco com o nome TRIS latch. Para outra linha de I/O existe um destes flip-flop e o
estado lógico em que se trava depende estritamente do estado lógico do relativo bit no
registrador TRIS (ou melhor dizendo, todos os bit's do registrador TRIS é fisicamente
implementado com um TRIS latch).
A saída Q do TRIS latch é conectada a entrada de uma porta lógica do tipo OR. Isto
significa que, independente do valor presente a outra entrada, a saída da porta OR estará sempre
em 1 enquanto uma de suas entradas valer 1 (veja na tabela verdade). E nesta condição o
transistor P não conduz e mantém a linha RA0 desconectada do positivo da alimentação.
Do mesmo modo a saída negativa Q do TRIS latch é conectada a entrada de uma porta
AND onde a saída desta estará sempre em 0 enquanto uma de suas entradas valer 0 (veja tabela
verdade). E nesta condição em que o transistor N não conduz mantendo a linha RA0
desconectada da massa. O estado lógico da linha RA0 dependerá exclusivamente do circuito
externo a que o conectarmos.
Aplicando 0 ou 5 volts ao pino RA0, será possível lermos o estado presente no circuito
externo a entrada do bloco representado por TTl input buffer e do latch de entrada.
Funcionamento como saída
Para configurar a linha de RA0 como saída, devemos colocar em 0 o bit 0 do registrador
TRISA com a instrução: bcf TRISA,0
Esta determina a comutação para 0 da saída Q do TRIS latch ( e para 1 a saída Q
negativa). E neste estado o valor da saída da porta OR e AND depende exclusivamente do estado
de saída do Q negativo do Data Latch. Como para o TRIS latch, em que o Data Latch depende
do estado de um bit em um registrador, particularmente do registrador PORTA. A sua saída
negativa será enviada para entrada das duas portas lógicas OR e AND e que estão diretamente
sobre a base do transistor P e N.
Se colocarmos em 0 o bit 0 do registrador PORTA com a instrução: bcf
PORTA,0
obtermos a condução do transistor N e portanto irá a 0 a linha RA0. Se ao invés colocarmos em
1 o bit 0 com a instrução:
bsf PORTA,0
obteremos a condução do transistor P e portanto irá a +5 volts a linha RA0. Nesta condição será
sempre possível rever o valor enviado sobre a linha através do circuito de entrada.
Estado de saída da linha RA4
Analisaremos agora o funcionamento do estado de saída da linha RA4 que é diferente de
todas as outras linhas de I/O enquanto compartilha o mesmo pino do PIC16c84 com o TOCKI o
qual iremos analisar no próximo passo.
Na figura seguinte está descrito o esquema de blocos do estado de saída extraído do data
sheet Microchip:
Microcontrolador PIC16F628 69
1. INTRODUÇÃO
Os módulos LCD são interfaces de saída muito útil em sistemas microprocessados. Estes
módulos podem ser gráficos e a caracter. Os módulos LCD gráficos são encontrados com
resuluções de 122x32, 128x64, 240x64 e 240x128 dots pixel, e geralmente estão disponíveis
com 20 pinos para conexão. Os LCD comuns (tipo caracter) são especificados em número de
linhas por colunas e são encontrados nas configurações previstas na Tabela 1.
8 2 14
12 2 14/15
16 1 14/16
16 2 14/16
16 4 14/16
20 1 14/16
20 2 14/16
20 4 14/16
24 2 14/16
24 4 14/16
40 2 16
40 4 16
Os módulos podem ser encontrados com LED backlight (com uma iluminação de fundo)
Microcontrolador PIC16F628 73
para facilitar as leituras durante a noite. Neste caso, a alimentação deste led faz-se normalmente
pelos pinos 15 e 16 para os módulos comuns e 19 e 20 para os módulos gráficos, sendo os pinos
15 e 19 para ligação ao anodo e os pinos 16 e 20 para o catodo. A corrente de alimentação deste
led varia de 100 a 200mA, dependendo do modelo.
Estes módulos utilizam um controlador próprio, permitindo sua interligação com com
outras placas através de seus pinos, onde deve ser alimentado o módulo e interligado o
barramento de dados e controle do módulo com a placa do usuário. Naturalmente que além de
alimentar e conectar os pinos do módulo com a placa do usuário deverá haver um protocolo de
comunicação entre as partes, que envolve o envio de bytes de instruções e bytes de dados pelo
sistema do usuário.
A Tabela 2 descreve cada pino do módulo ou do display para conexão deste a outras
placas:
7 B0 LSB
8 B1
9 B2 Barramento
10 B3 de
11 B4 Dados
12 B5
13 B6
14 B7 MSB
2. PROGRAMAÇÃO / INSTRUÇÕES
(Hexa)
Desliga 0 0 0A / 08
Desliga 0 0 0C
Cursor Home 0 0 02
Cursor Piscante 0 0 0D
segunda linha 0 0 C0
Microcontrolador PIC16F628 76
RS R/W B7 B6 B5 B4 B3 B2 B1 B0
CÓDIGO 0 0 0 0 0 0 0 0 0 1
MSB LSB
Esta instrução escreve o caracter ASCII 32 que corresponde ao branco ou barra de espaço
em todos os endereços da DDRAM apagando a mensagem que estiver escrita. O cursor
retorna ao endereço “zero”, ou seja, à posição mais a esquerda da primeira linha.
RS R/W B7 B6 B5 B4 B3 B2 B1 B0
CÓDIGO 0 0 0 0 0 0 0 0 1 *
MSB LSB
Faz retornar o cursor para a posição mais a esquerda da primeira linha e faz voltar à
posição original mensagens previamente deslocadas. O conteúdo da DDRAM permanece
inalterado.
RS R/W B7 B6 B5 B4 B3 B2 B1 B0
CÓDIGO 0 0 0 0 0 0 0 1 X S
MSB LSB
Esta instrução tem efeito somente durante a leitura ou escrita de dados, portanto, deve ser
ativada na inicialização.
S=1 SIM, S=0 NÃO. Exemplo: X=1 e S=1 => mensagem desloca p/ direita.
RS R/W B7 B6 B5 B4 B3 B2 B1 B0
CÓDIGO 0 0 0 0 0 0 0 D C B
MSB LSB
A mensagem fica aparente quando D=1 e desaparece quando D=0, porém o conteúdo da
DDRAM fica inalterado. O cursor fica aparente quando C=1 e desaparece quando C=0,
porém as propriedades de escritas vigentes permanecem inalteradas. O cursor quando
aparente liga a última linha que compõem o caracter, exceto quando B=1, que apresenta
em alternância com uma matriz com todos os pontos negros em intervalos de 0,4
segundos. Quando B=1 e C=0, obteremos a ativação intermitente de uma matriz
completa (todos os pontos da matriz).
2.1.5 - Deslocamento do Cursor ou da Mensagem
RS R/W B7 B6 B5 B4 B3 B2 B1 B0
CÓDIGO 0 0 0 0 0 1 C R * *
MSB LSB
Desloca o cursor ou a mensagem sem que para isso tenha que escrever ou ler dados do
display. Utilizado para posicionamento dos dados no display.
C R FUNÇÃO
RS R/W B7 B6 B5 B4 B3 B2 B1 B0
CÓDIGO 0 0 0 0 1 Y N F * *
MSB LSB
Y estabelece o modo de comunicação. Se Y=1 estabelece 8 bits e quando Y=0 será 4 bits,
enviados em duas operações, com os 4 bits (Nible) mais significativos sendo enviados
primeiro. N fixa o número de linhas: N=0 para uma linha e N=1 para duas ou mais
linhas. F fixa o tipo da matriz: F=0 para matriz 7x5 ou 8x5 e F=1 para matriz 10x5
(somente possível quando apresentando em uma linha).
CGRAM é uma região da memória RAM destinada para criação de caracteres especiais,
como por exemplo: ç, é, Ê, etc.
RS R/W B7 B6 B5 B4 B3 B2 B1 B0
CÓDIGO 0 0 0 1 A A A A A A
MSB LSB
RS R/W B7 B6 B5 B4 B3 B2 B1 B0
CÓDIGO 0 0 1 A A A A A A A
MSB LSB
RS R/W B7 B6 B5 B4 B3 B2 B1 B0
CÓDIGO 0 1 BF A A A A A A A
MSB LSB
Busy Flag ou o bit 7 indica ao sistema onde está conectado o módulo LCD, se o
controlador do módulo está ocupado com alguma operação interna (BF=1), e neste caso,
não aceita nenhuma instrução até que BF volte para 0.
Além disso, permite a leitura do conteúdo do contador de endereços (AC) expressa por
AAAAAAA. O contador de endereços pode conter tanto endereço da CGRAM como da
DDRAM, depende neste caso, da instrução anterior.
RS R/W B7 B6 B5 B4 B3 B2 B1 B0
CÓDIGO 1 0 A A A A A A A A
MSB LSB
RS R/W B7 B6 B5 B4 B3 B2 B1 B0
CÓDIGO 1 1 A A A A A A A A
MSB LSB
Toda vez que alimentamos o módulo LCD deve ser executado o procedimento de
inicialização, que consiste no envio de uma seqüência de instruções para configurar o modo de
operação para execução de um dado programa de interfaceamento. Em muitos display este
procedimento ocorre automaticamente, dentro de condições específicas que envolve
temporizações mínimas referente a transição do nível lógico 0 para 1, ao ligarmos a fonte. Em
caso de dúvidas, recomendamos o envio destas instruções após o reset do sistema.
MÓDULO LCD 1 2 3 4 5
MÓDULO LCD 1 2 3 4 5 6 7 8 9 10 11 12
2. Alguns módulos de uma linha só funcionam com a instrução 38 ao invés de 30, conforme
instruções de inicialização.
3. O sinal de Enable (pino 6) deverá ser gerado conforme a temporização mostrada na Figura 2.
Os códigos de dados ou de instruções só serão processados pelo processador do módulo após
a descida do sinal do Enable.
4. Para ajustar a velocidade de comunicação entre a CPU do usuário e o módulo LCD existem
duas possibilidades:
• Intercalar uma rotina de atraso de aproximadamente 15 mS entre as instruções.
• Fazer a leitura do Busy Flag antes do envio de cada instrução e só enviar quando o
mesmo for 0. Neste caso, a única exceção será durante a inicialização.
7. Após a escrita de dados na CGRAM envie a instrução 01, para posicionar o cursor.
9. Comandos úteis:
Obs:
Após o endereçamento da CGRAM, o cursor se desloca para a primeira posição
da segunda linha (ou metade), portanto é recomendado enviar a instrução 01 ou
“limpa display e cursor home”.
Microcontrolador PIC16F628 84
4.1- MANUSEIO
4.2- INSTALAÇÃO
4.3 - OPERAÇÃO