Sei sulla pagina 1di 36

AUTOR

Maurício Madeira Oliveira


Página pessoal (fonte): www.seguidorsolar.com.br
Este curso pode ser usado e divulgado, sem fins comerciais, citar fonte e autor

Microcontrolador – 16F84A

Os microcontroladores (uC) podem ser chamados de microcomputadores de um só


chip , são usados , pelos mais diversos equipamentos eletrônicos , como:
Videocassetes, celulares, dvd, alarmes, eletrônica embarcada, televisores, controle-remoto,
agendas eletrônicas, etc.
Possuem em uma única pastilha (ci), memória de dados, temporizadores, canal
serial, vários canais de I/O, eeprom, pwm e etc.
Arquiteturas usadas em microcontroladores:
Existe a tradicional Von Newman, baseada em um único barramento por onde trafegam
dados e instruções (8051) e Harvard que prevê varias vias de comunicação entre CPU e
periféricos permitindo a realização de várias operações simultâneas, os microcontroladores
PIC da Microchip se baseiam nesta arquitetura. No PIC 16F84 os dados são de 8 bits e as
instruçôes são de 14 bits. Com esta facilidade em uma palavra de 14 bits podemos ter
código de instrução (opcode) , onde vai atuar e o eventual operando ou dado. Criou-se uma
terminologia chamada RISC (reduced instruction set computer) que no PIC são
aproximadamente 35 instruções.

Pinagem do PIC 16F84A (18 pinos):

RA0 – entrada ou saída PORTA (P17).


RA1 – entrada ou saída PORTA (P18).
RA2 – entrada ou saída PORTA (P01).
RA3 – entrada ou saída PORTA (P02).
RA4 – entrada ou saída PORTA (P03), também é entrada do Timer zero.
RB0 – entrada ou saída PORTB (P06), também é interrupção externa.
RB1 – entrada ou saída PORTB (P07).
RB2 – entrada ou saída PORTB (P08).
RB3 – entrada ou saída PORTB (P09).
RB4 – entrada ou saída PORTB (P10).
RB5 – entrada ou saída PORTB (P11).
RB6 – entrada ou saída PORTB (P12).
RB7 – entrada ou saída PORTB (P13).

RB4 a RB7 – também sinalizam interrupção por mudança de estado.


VDD – alimentação ( 2V a 6V, típico 5V) (P14).
VSS – referência de terra (P05).
MCLR\ - entrada de reset (em nível 0) (P04).
OSC1/CLKIN – cristal ou entrada de clock externo (P16).
OSC2/CLKOUT – cristal ou saída do clock/4 quando usado sinal externo (P15).

Principais características :

1 K (1024) palavras de 14 bits para programa.


68 bytes de uso geral.
64 bytes de EEPROM para dados.
Stack com 8 níveis.
35 instruções .
15 registros especiais em RAM (SFR’s) para controle do chip e periféricos.
Timer 8 bits e prescaler.
13 pinos entrada/saída (cfe.config.) PORTA e PORTB.
Alta capacidade de corrente nos pinos.
Capacidade de gerenciar até 4 interrupções.
Watch Dog para recuperação e reset em caso de travamento de software.
Memória de programa protegida contra cópias.
Modo sleep , economia de energia.
Várias opções de osciladores.

O microcontrolador 16F84A pode operar de DC até 20 Mhz ( ou até 10 MHz no


16F84).
Vamos usar em nossos estudos um clock de 4 MHz (a cristal), o que nos
proporciona um ciclo de máquina de 1 uS. O PIC divide o sinal de clock por 4 internamente
gerando as fase Q1, Q2, Q3 e Q4, que somadas formam 1 ciclo de máquina:
Tc = 1/(Fosc/4) ou Tc = (1/Fosc) x 4
A característica de buscar a informação em um ciclo de e executa-la no ciclo
seguinte chama-se PIPELINE, as instruções são executadas em 1uS, com exceção das
instruções que alteram o PC (program counter) , que usam dois ciclos.

Os circuitos de CLOCK :
O PIC pode operar com 4 modos diferentes de osciladores, a saber:

a) RC (resistor-capacitor) : modo simples e de baixo custo, mas que oferece instabilidade


na frequência, com variação do VCC e da temperatura, recomendado em aplicações
onde a precisão do clock não é importante.

Nota: na saída osc2 colocar um ociloscópio ou frequencimetro, para ajustar a frequência de


operação do sistema (por ex.: 4Mhz em osc1 terei 1Mhz em osc2).

b) XT (modo cristal) : de 100Khz a 4Mhz.


Nota : as ligações entre os pinos do ci, cristal e capacitor , devem ser as mais curtas
possíveis.

c) HS (modo cristal) : acima de 4Mhz.


Podemos usar cristal ou ressoador cerâmico. A ligação elétrica é idêntica a do modo
XT.
d) LP (modo cristal) : baixa potência < 200 Khz .

OBS.: também podemos um circuito de clock externo , gerado por um oscilador qualquer
que entrando por osc1 ira determinar a frequência de trabalho para um ou mais PIC .

O circuito de Reset :

a) O PIC pode ser resetado ao alimentar o mesmo, através do pino MCLR\ ligado em Vcc,
esta seria a forma mais básica :

OBS.: acima , temos o circuito mínimo de POR (power-on-reset).

b) Um circuito mais elaborado, seria com uma chave para reset manual, quando
necessário.
Nota : o pic possui ainda um sistema que gera 72 mS fixo, após o final do POR usado,
ficando por mais este tempo em reset.

Nota : quando utilizamos o modo XT, LP ou HS, o timer de partida do oscilador (OST) é
automaticamente acionado por 1024 períodos do oscilador, para sair do reset; isto garante a
estabilização do cristal ou resonador.

As memórias do PIC :

A família PIC possui em sua arquitetura, segmentos de memória separados para programas
e dados, e inclusive com palavras de tamanho diferentes.
O PC (programa counter) da família 16Cxxx tem 13 bits, permitindo memória de
programa de até 8Kbytes (2 exp.13).
O pic 16F84A possui apenas 1K (000 até 3FFh). Qualquer referência a outras
posições de memória serão deslocadas para este bloco de 1K. No reset do PC ele aponta
para o endereço 000 e ao atender uma interrupção o PC é carregado com o endereço 004h.

a) Memória de programa – devido a estrutura Havard ela pode ter palavras de 12,14ou 16
bits, no caso do 16F84 o tamanho da palavra manipulada na memória é de 14 bits; esta
área reservada do microcontrolador é onde será gravado o programa de controle do
mesmo ,em alguns modelos temos uma eprom, no CI em estudo a memória é do tipo
FLASH, o que nos permite gravar e apagar centenas de vezes esta memória, tornando-
se o ci mais indicado para desenvolvimento de sistemas.

b) Stack (pilha) : local separado da memória de programa para salvar endereços do PC,
para o qual o programa principal retornara após executar interrupções ou subrotinas que
forem chamadas. O stack salva só o endereço de retorno, as condições do
microcontrolador tem que serem tratadas pelo usuário. O stack do 16F84 tem 8 níveis ,
ou seja se passar deste número de interrupções ou subrotinas ele perdera a mais antiga.
c) Memória de dados : nada mais é do que uma área de RAM , utilizada para guardar as
variáveis e registradores usados pelo sistema microcontrolado, no PIC esta área é
separada em bancos de memória, no caso do 16F84 temos o banco 0 e banco 1, que são
selecionados pelos bits RP1 e RP0 do registro STATUS que veremos adiante.

d) SFR (special function registers – registros especiais de controle) : são usados pela CPU
e ou periféricos para controlar o funcionamento do chip conforme o desejado. Se
dividem em 2 tipos , controle e uso da CPU e controle e uso dos periféricos. São lidos e
escritos tanto pelo usuário como pelo hardware, ocupam espaço na RAM, e podem estar
em um ou em ambos os bancos de memória, e são acessados através de seu endereço.

e) Registradores de uso geral : área destinada ao armazenamento de variáveis definidas


pelo usuário, para serem escritas ou lidas pelo programa. O tamanho desta área de RAM
depende do PIC usado.

f) EEPROM : alguns PIC possuem esta memória especial não volátil (o 16F84 possui uma
de 64 bytes), que podemos usar para escrever ou ler dados .

Memória de dados e RAM de uso geral:

BANCO 0 BANCO 1
As interrupções do PIC :

Uma interrupção, para a execução do programa que estiver em curso, é desviado


para o endereço 0004h no caso do PIC, onde teremos uma rotina de interrupção que será
executada pelo microcontrolador, e após voltara para a instrução seguinte a que foi atendida
a interrupção (o PC guarda o último end.+1 para o retorno). No PIC 16F84 as interrupções
podem acontecer por :
Overflow do timer 0.
Fim de escrita na EEPROM.
Interrupção externa pelo pino RB0/INT.
Mudança nos pinos RB4 a RB7.
Como trata-las será descrito nos registradores e rotinas adiante.

Os registros de controle da CPU :

Estudaremos a seguir os registros STATUS, OPTION, INTCON, e registros de


controle das portas. Com eles e que inicializamos nosso microcontrolador.

a) STATUS : Configura a página de memória atual (banco 0 ou 1), flags da ULA e forma
do ültimo reset.

BIT 7 IRP Seleciona bancos - no 16F84 sempre em 0


BIT 6 RP1 No 16F84 manter em 0
BIT 5 RP0 Seleciona 0=banco 0 e 1=banco1
bancos
BIT 4 TO\ Bit sinaliza time out/ 1=power-up,clrwdt,sleep, 0=time-out do watch dog
BIT 3 PD\ Power Down/1=power-up,clrwdt, 0=inst.sleep
BIT 2 Z Bit sinalizador 0,1 reg.estac/vlr.0 se =0 oreg.dif.de 0
BIT 1 DC Digit carry/borrow
BIT 0 C Carry/borrow

b) OPTION : Configura prescaler, timer, e outras opções. Na programação usa-se option-


reg , pois em PICs mais antigos existia uma instrução option.

BIT 7 RPBU\ Habilita os pull-up portB 1=desab. 0=hab.


BIT 6 INTEDG Como aceitara int.externa (RB0) 1=borda de susbida 0=borda de descida
BIT 5 TOCS Fonte do clock do timer 0 1=pino RA4/TOCKI 0=clock interno (f/4)
BIT 4 TOSE Como o clock ext.inc.timer 0 1=borda descida 0=borda susbida
BIT 3 PSA Atribuição do prescaler 1=Watch dog 0=timer 0
BIT 2 PS2 PS2
BIT 1 PS1 PS1 VER TABELA ABAIXO
BIT 0 PS0 PS0
PS2 PS1 PS0 TIMER 0 WATCH DOG
0 0 0 1 para 2 1 para 1
0 0 1 1 para 4 1 para 2
0 1 0 1 para 8 1 para 4
0 1 1 1 para 16 1 para 8
1 0 0 1 para 32 1 para 16
1 0 1 1 para 64 1 para 32
1 1 0 1 para 128 1 para 64
1 1 1 1 para 256 1 para 128

Nota : para assegurar uma taxa de 1:1 na frequência de contagem do timer0 direcionar o
prescaler para Watch dog .

c) INTCON : serve para configurar e identificar as interrupções.

BIT 7 GIE Habil.geral das int. 0=desab. 1=hab.


BIT 6 EEIE Habil.da int.de final de escrita 0=int.não será tratada 1=int.será tratada
BIT 5 TOIE Hab.de overflow timer 0=nào tratada 1=int.será tratada
BIT 4 INTE Hab.da int.externa RB0 0=int.não será tratada 1=int.será tratada
BIT 3 RBIE Hab.da int.mudança RB4 a RB7 0=int.não será tratada 1=int.será tratada
BIT 2 TOIF Identificação de over.timer 0 0=não ocorreu 1=ocorreu
BIT 1 INTF Identificação da int.externa RB0 0=não ocorreu 1=ocorreu
BIT 0 RBIF Identificação da int.por mudança de estado 0=não ocorreu 1=ocorreu

d) TRIS : registros de configuração das portas de IO (Port B e Port A) , através do TRIS e


que determinamos se determinado pino de uma porta será entrada ou saída. Para
programar a porta A usamos o TRISA, e a porta B o TRISB, quando queremos que o
pino seja entrada setamos (1) o bit correspondente ao pino no registro, se queremos que
seja uma saída resetamos (0) o bit correspondente ao pino no registro TRIS .

TRISA

BIT 7 NC
BIT 6 NC
BIT 5 NC
BIT 4 RA4 Pino 3 0=saída 1=entrada
BIT 3 RA3 Pino 2 0=saída 1=entrada
BIT 2 RA2 Pino 1 0=saída 1=entrada
BIT 1 RA1 Pino 18 0=saída 1=entrada
BIT 0 RA0 Pino 17 0=saída 1=entrada
TRISB

BIT 7 RB7 Pino 13 0=saida 1=entrada


BIT 6 RB6 Pino 12 0=saida 1=entrada
BIT 5 RB5 Pino 11 0=saida 1=entrada
BIT 4 RB4 Pino 10 0=saida 1=entrada
BIT 3 RB3 Pino 9 0=saida 1=entrada
BIT 2 RB2 Pino 8 0=saida 1=entrada
BIT 1 RB1 Pino 7 0=saida 1=entrada
BIT 0 RB0 Pino 6 0=saida 1=entrada

e) PCL e PCLATH : O PCL é o registro que armazena os 8 bits menos significativos do


PC e o PCLATH os 5 bits mais significativos, o programador pode acessar o PCL (mas
com cuidado para não travar o uC) . o PCLATH só é acessado pelo hardware do uC.

PCL

BIT 7 Escrita e leitura


BIT 6 Escrita e leitura
BIT 5 Escrita e leitura
BIT 4 Escrita e leitura
BIT 3 Escrita e leitura
BIT 2 Escrita e leitura
BIT 1 Escrita e leitura
BIT 0 Escrita e leitura

f) Portas de I/O (PORTA e PORTB) : o estado destas portas é acessado diretamente em


posições distintas da memória. E cada bit pode ser testado individualmente , se for
entrada verificaremos qual o nível de tensão presente no mesmo, e se for saída
poderemos determinar o valor que queremos para cada pino.

PORTA

BIT 4 I/O Schmidt trigger Open In timer0


drain
BIT 3 I/O TTL
BIT 2 I/O TTL
BIT 1 I/O TTL
BIT 0 I/O TTL
PORTB

BIT 7 I/O TTL Pode gerar int.ext.por mudança de estado


BIT 6 I/O TTL Pode gerar int.ext.por mudança de estado
BIT 5 I/O TTL Pode gerar int.ext.por mudança de estado
BIT 4 I/O TTL Pode gerar int.ext.por mudança de estado
BIT 3 I/O TTL
BIT 2 I/O TTL
BIT 1 I/O TTL
BIT 0 I/O Schmidt trigger Int.externa

Nota : todos os pinos do PORTB possuem Pull-up interno, e para ser habilitado
globalmente o bit 7 (RPBU\) do OPTION deve ser zerado. Individualmente apenas os bits
de entrada terão pull-ups habilitados.
g) TIMER 0 : contador de 8 bits na memória que pode ser acessado para escrita ou leitura.
O seu incremento pode ser interno ( Fclock/4, logo T=1/(fclock/4)),o que em um clock
de 4Mhz será um pulso a cada 1uS . Também pode ser incrementado externamente pelo
pino RA4 (TOKI). Nosso TIMER 0 pode ser usado de duas formas, temporizador ou
contador.

BIT 7 ESCRITA/LEITURA
BIT 6 ESCRITA/LEITURA
BIT 5 ESCRITA/LEITURA
BIT 4 ESCRITA/LEITURA
BIT 3 ESCRITA/LEITURA
BIT 2 ESCRITA/LEITURA
BIT 1 ESCRITA/LEITURA
BIT 0 ESCRITA/LEITURA

Modo timer (sinal interno): ao ajustar TOCS=0 no OPTION, o timer será incrementado a
cada ciclo de máquina (4Mhz 1uS). E por lógica de programação , faremos o controle de
transbordo do contador através da interrupção (T0IE) ou através T0IF que quando igual a 1
ocorreu overflow e se igual a 0 não ocorreu.

Modo contador (sinal externo RA4) : o timer 0 incrementará sua contagem a cada pulso
presente no pino TOCKI. Para ser incrementado na borda de subida fazer TOSE=0 e na
borda de descida TOSE=1.

h) WATCH DOG (cão de guarda): timer especial que funciona com um clock RC interno
e independente do clock do uC. O tempo normal de transbordo do WDT é de 18 mS,
mas pode variar com a temperatura e a tensão de alimentação. Ele resetara o uC sempre
que ocorrer o overflow, isto impede que haja travamento no uso do uC em circuitos
críticos, pois o programador devera implementar uma subrotina para dar clear no WDT,
antes do transbordo de seu contador (instrução clrwdt) cujo o valor básico é FFh (pode
assumir outros valores com o uso do prescaler). O WDT é selecionado durante a
gravação do PIC para estar ativo ou não.

i) PRESCALER : um registro de 8 bits que pode dividir o sinal de clock , tando do timer 0
como do WDT por 256 , conforme tabela anexa ao registro OPTION.

Nota : quando queremos uma contagem de 1:1 no timer 0 devemos atribuir o prescaler ao
WDT que tem esta relação .

J) INDF e FSR : registro para endereçamento indireto; onde o INDF e o registro onde eu
darei os comandos, e no fsr o endereço que estes comandos irão atuar.
Exemplo : clrf indf - se no FSR eu estiver com o valor 18h, o clear dado no registro
indf ira zerar a posição 18h da RAM de uso geral.
k) EEPROM : já sabemos que o PIC 16F84 possui esta memória de 64 bytes, que pode ser
usada como memória de dados. Sua vantagem é que não perde as informações , mesmo sem
alimentação. Pode ser usado para gravar diversas informações em circuitos de controle
remoto, telefones, alarmes e etc. Possui 4 registros importantes para seu funcionamento, são
eles : EEADR, EEDATA, EECON1 e EECON2.

EEADR registro do endereço para escrita ou leitura.

EEDATA tem duas funções, escrevemos o dado a ser gravado, no endereço escolhido, ou
teremos o dado lido da eeprom.

EECON1 registro que controla as operações de escrita e leitura.

BIT 4 EEIF Identificação da int.de fim de escita 0=não ocorreu 1=ocorreu


BIT 3 WRERR Identificação de erro durante a escrita 0=não ocorreu 1=ocorreu
BIT 2 WREN Habilitação de escrita na eeprom 0=não disponível 1=dispon.
BIT 1 WR Inicio de escrita 0=escrita terminou/zerada pelo hardware 1=inicia
BIT 0 RD Inicio da leitura 0=leitura teminou/zerada pelo hardware 1=inicia

EECON2 é um registro que não sofre ajustes, é usado durante o processo de escrita da
eeprom, será visto nos modelos de programas adiante.

K) POWER-DOWN (modo sleep) : o uC entra em estado inerte de 7mA de consumo cai


para 60uA. Para entrar neste modo basta usar a instrução sllep. Para sair deste estado basta
um reset externo pelo MCLR\ , time out no WDT , interrupção externa RB0, ou por fim de
escrita na eeprom, ou por mudança de estado no PORTB (RB7 a RB4).

Nota 1 : o PIC 16F84 possui no endereço 2007 da memória de programa, 14 bits que os
gravadores preenchem, com informações determinadas pelo usuário.

BIT 13 CP código de proteção


a
BIT 4 CP código de proteção
BIT 3 PWRTE\ 1=Habilitado 0=desabilitado
BIT 2 WDTE 1=WDT Habilitado 0=desabilitado
BIT 1 FOSC1 Seleciona tipo de oscilador
BIT 0 FOSC2 Seleciona tipo de oscilador

Tabela de escolha do tipo de oscilador :

FOSC1 FOSC2 TIPO


0 0 LP
0 1 XT
1 0 HS
1 1 RC
Nota 2 : nos endereços 2000h a 2003h, armazena-se 4 nibles (4 bits) sendo um em cada
posição de memória, que servem como identificação, check-sum, ou outro código desejado
pelo usuário. Estas informações só podem ser lidas durante a gravação ou verificação do
uC. Estes valores são escritos pelo gravador.

Ex.: ID (identificação) 2E7Fh = 0010 1110 0111 1111 , teremos :


2000h xxxxxxxxxx0010
2001h xxxxxxxxxx1110
2002h xxxxxxxxxx0111
2003h xxxxxxxxxx1111

Agora que já conhecemos nosso microcontrolador, vamos começar nosso


aprendizado através de programas, que vão nos levar ao conhecimento das principais
características de um uC, tais como : temporização , contador, sensoreamento, controle de
display e cargas diversas. Mas as possibilidades de uso de um uC são quase ilimitadas e
fascinantes, e com a prática e perseverança , seremos capazes de desenvolver sistemas de
alto grau de complexidade.
Vamos escrever programas e comentá-los , juntamente com o circuito que será
controlado pelo uC, assim poderemos fixar as principais instruções e seu uso lógico.
Em vários livros e data sheets , temos algumas convenções que nos facilitam o
entendimento das instruções em linguagem de máquina de um uC. No PIC temos
convenções que o compilador MPASM e MPASMWIN reconhecem.

1) O que for escrito após “; “ é considerado comentário.


2) Constante decimal D’valor’ ou d’valor’ , ex.: d’20’
3) Constante binária B’xxxx’ ex.: 0110 = B’0110’
4) Constante hexadecimal 0x’valor’ou valorH, ex.: 0x’12’ ou 12H, se a constante hexa for
uma das letras A até F , terá que ser precedia de um 0 ; ex.: A = 0AH
5) A letra f será um registro entre 0 e 127 (0 a 7FH).
6) W ou w registro Work (ou acumulador no 8031).
7) A letra b será um bit entre 0 e 7 usado em uma operação.
8) A letra k representa uma constante ou um rótulo (label).
9) A letra d o destino da instrução. Se d = 0 o resultado é armazenado em W, se d = 1 o
resultado é armazenado no próprio registro indicado (f).
10) Algumas dicas para entender como é formada as instruções:
File = f , literal = l na instrução e k no argumento, destino = d, work = w, bit = b, teste
= t, skip = s (pulo), set =s, clear = c, zero = z .
Também temos as ações especificas como:
Add =soma, and= lógica e, clr= limpar, com =complemento, dec= decrementar , inc =
incrementar, ior= lógica ou , mov= mover, rl = rotacionar 1 bit a esquerda (left), rr =
rotacionar um bit a direita (right), sub = subtração , swap = inversão entre os nibles de um
byte, xor = lógica ou exclusivo.
Agora podemos construir os nomes das instruções , vamos a uns exemplos:
DECF = decrementar (dec) um registrador (f).
DECFSZ = decrementar (dec) o registrador (F) e pula (Skip) se o resultado for zero (z).
Após algum treino ficaremos campeões (retirado de Desbravando o PIC-editora Érica).
TABELA DE INSTRUÇÕES

INSTRUÇÃO OPERANDO DESCRIÇÃO CICLOS

ADDWF f,d Soma W e f 1


ANDWF f,d And entre W e f 1
CLRF f Zera f 1
CLRW Zera w 1
COMF f,d Complementa f 1
DECF f,d Decrementa f 1
DECFSZ f,d Decrem.f pula se f=0 1(2)
INCF f,d Incrementa f 1
INCFSZ f,d Increm.f pula se f = 0 1(2)
IORWF f,d OR entre W e f 1
MOVF f,d Move f 1
MOVWF f Move W para f 1
NOP Nenhuma operação 1
RLF f,d Roda esq.pelo carry 1
RRF f,d Roda dir. pelo carry 1
SUBWF f,d Subtrai W de f 1
SWAPF f,d Troca nibles em f 1
XORWF f,d XOR entre W e f 1

BCF f,b Zera bit b em f 1


BSF f,b Seta bit b em f 1
BTFSC f,b Se bit b=0 em f,pula 1(2)
BTFSS f,b Se bit b=1 em f,pula 1(2)

ADDLW k Soma W e k 1
ANDLW k And entre W e k 1
CALL k Chama sub-rotina 2
CLRWDT Zera timer Watch dog 1
GOTO k Desvia p/label k 1
IORLW k OR entre W e k 1
MOVLW k W=k 1
RETFIE Retorna de interrup. 2
RETLW k Retorna c/ w = k 2
RETURN Retorna de sub-rotina 2
SLEEP Entra em modo sleep 1
SUBLW k Subtrai k de W 1
XORLW k Xor entre W e k 1
PROGRAMAS EXEMPLOS

Vamos ao nosso primeiro programa; ao lado de cada comando teremos o


comentário do que o mesmo executa no funcionamento do projeto proposto.

a) Sensoreamento e acionamento de LED.


Neste projeto iremos testar uma chave normalmente aberta (nosso sensor) , e se a mesma
estiver aberta ligara o LED(D2) e fechada ligara o LED(D1). Vejamos o circuito abaixo:

O mesmo é bem simples , mas aprenderemos conceitos importantes de programação do PIC


através das instruções que usaremos. Iremos sugerir um modelo padrão de formulário para
programação mais adiante , o que facilita e organiza o trabalho do projetista, pois poderá
montar uma pasta com o diagrama lógico e o programa de seus projetos. Importante
salientar que o programa deve ser digitado no bloco de notas (note pad) ou no editor do
próprio MPLAB.

Vamos ao programa: (foi digitado no bloco de notas)

list p=16F84 ;para qual o processador o código será gerado


radix dec ;padrão decimal para vlrs.s/identificação
include<P16F84A.INC> ;anexa arquivo def.16F84A>

l1 equ 2 ;nome do pino 2 da portB


l2 equ 1 ;nome do pino 1 da portB
s1 equ 1 ;nome do pino 1 da portA
org 0 ;define início do progrma no end.0
goto início ;desvia para o label(rótulo) início

org 4 ;inicio das interrupções (reservada)


retfie ;retorno da interrupção

início: ;aqui neste label começa o programa

movlw B'00000000' ;w=0h


movwf INTCON ;registro intcon=0h,ou seja todas int.desab.
bsf STATUS,RP0 ;seta bit RP0 no reg.status, sel.banco 1
movwf TRISB ;trisb=0h,todos pinos conf.saidas portB
movlw B'11111111' ;w=ffh
movwf TRISA ;TRISA=B'11111'os 5 pinos serão entradas
portA
movlw B'11011000' ;w=D8h
movwf OPTION_REG ;usa-se este nome p/o registrador,estudar
;com as tabelas como configuramos o option
bcf STATUS,RP0 ;clear bit RP0 volto para o banco 0
movlw B'00000000' ;w=0h
movwf PORTB ;garanto zero nos pinos do portB no
;inicio/portB=w

principal: ;aqui vou começar as rotinas de controle

btfss PORTA,s1 ;se pino 1 portA=1 salta próxima linha


goto test1
bsf PORTB,l2 ;liga pino 2 portB
goto desl1 ;vai p/label desl1 (desliga1)
test1:
bsf PORTB,l1 ;liga pino 1 portB
goto desl2 ;vai p/label desl2 (desliga2)
desl1:
bcf PORTB,l1 ;desliga pino 1 portB
goto principal
desl2:
bcf PORTB,l2 ;desliga pino 2 portB
goto principal
end ;fim de programa

Após a digitação do programa em assembler, iremos compilar o mesmo no MPLAB


(solução completa da MICROCHIP), conforme explicações nos anexos. Se não tivermos
nenhum erro de programação, iremos verificar o funcionamento do mesmo gravando o
arquivo gerado em hexadecimal (código de máquina) no PIC16F84A, com um dos
gravadores sugeridos. Se não funcionar conforme o esperado, analisar o circuito lógico e o
programa, pois só a solução de sistemas simples nos dará experiência e a base necessária
para projetos mais complexos (todos circuitos e programas desta apostila foram testados).

b) Seqüencial de 4 LEDS .
Neste programa iremos aprender a fazer bases de tempo (temporização), usando ciclos de
máquina para obtermos o tempo desejado entre o ligar e desligar de cada LED da
seqüência. Usaremos o PORTB como saída, sendo definido em nosso programa o P0B até
o P3B os pinos que usaremos para acionamento de LED1 (D1) até LED4 (D4)
respectivamente. Vamos ao circuito :

O programa :

list p=16F84 ;para qual o processador o código será gerado


radix dec ;padrão decimal para vlrs. s/ identificação
include <P16F84A.INC> ;anexa arquivo def.16F84A>

l1 equ 0 ;nome do pino 0 da portB


l2 equ 1 ;nome do pino 1 da portB
l3 equ 2 ;nome do pino 2 da portB
l4 equ 3 ;nome do pino 3 da portB
x equ 0CH ;define var.aux.x no end 0Ch da RAM
y equ 0DH ;define var.aux.y no end 0Dh da RAM
j equ 0EH ;define var.aux.j no end 0Eh da RAM

org 0 ;define início do progrma no end.0


goto início ;desvia para o label(rótulo) início
org 4 ;inicio das interrupções (reservada)
retfie ;retorno da interrupção

início: ;aqui neste label começa o programa

movlw B'00000000' ;w=0h


movwf INTCON ;registro intcon=0h,ou seja todas int.desab.
bsf STATUS,RP0 ;seta bit RP0 no reg.status,sel.banco 1
movwf TRISB ;trisb=0h,todos pinos conf.saidas portB
movlw B'11111111' ;w=ffh
movwf TRISA ;TRISA=B'11111'os 5 pinos serão entradas
; portA
movlw B'11011000' ;w=D8h
movwf OPTION_REG ;usa-se este nome p/o registrador,estudar
;com as tabelas como configuramos o option
bcf STATUS,RP0 ;clear bit RP0 volto para o banco 0
movlw B'10001000' ;w=88h
movwf PORTB ;garanto zero nos pinos do portB no
; inicio/portB=w
principal: ;aqui vou começar as rotinas de controle
rrf PORTB ;rotaciona a direita o registo portB
call time
goto principal
time: ;inicio da rotina de tempo (aprox.500mS)
movlw 2 ;w=2 decimal (1uS)
movwf j ;j=w (1uS)
time1:
movlw 250 ;w=250 decimal (1uS)
movwf x ;x=w (1uS)
time2:
movlw 248 ;w=248 decimal (1uS)
movwf y ;y=w (1uS)
time3:
nop ; (1uS)
decfsz y ; decrem.y se y=0 salta prox.inst.(2uS se salta)
; (1us se não salta)
goto time3 ; (2uS)
decfsz x ; (1uS ou 2uS)
goto time2 ; (2uS)
decfsz j ; (1uS ou 2uS)
goto time1 ; (2uS)
return ; (2uS)
end ;fim de programa
; COMO FUNCIONA A ROTINA DE TEMPO
; Tempo usado por cada instrução da rotina:
; call=2uS nop=1uS
; movlw=1uS decfsz=1uS
; movwf=1uS goto=2uS
; total:
2+1+1+1+1+1+1+1+2x{250x[(248x4uS)+2+2+1+1]+2+2+1+1+1+1}=0,499021uS==0,5 S
; note que os loops me garantem chegar ao tempo desejado, estude para entender
; o funcionamento deste método. Note que não usamos o timer do PIC.

c) Contador de sinal externo (RA4/TOCKI) .


Neste exemplo iremos utilizar nosso uC para contar um determinado número de pulsos
externos , em nosso caso serão 10, quando isto acontecer nosso timer 0 ira gerar uma
interrupção no uC, a mesma será resolvida pelo software , que ligara um led (representando
uma carga qualquer) por 250mS, e após desligara, voltando para rotina principal do uC
como contador. Também aproveitaremos para ativar um display de 7 segmentos (de led)
para fixarmos mais este conceito. O circuito :

O programa deste circuito nos introduz a vários comandos importantes do uC em estudo,


que também são usados em quase todos uC da MICROCHIP.
;------------------------------------------------------------------------------
; FORMULÁRIO PADRÃO PARA USO EM PROGRAMAÇÃO COM
; MICROCONTROLADORES
; DA LINHA PIC ( MICROCHIP ). COM USO DO COMPILADOR MPASWIN.
;------------------------------------------------------------------------------
; ** Os registros da CPU serão escritas com letras maiúsculas, e a-
; pós " ; " os comentários não serão considerados pelo compilador.
;------------------------------------------------------------------------------
; PROJETO : CONTADOR DE SINAL EXTERNO DATA : 08/10/2002
;------------------------------------------------------------------------------
; AUTOR :Maurício Madeira Oliveira
;------------------------------------------------------------------------------
list p=16F84 ;para qual processador o código será gerado
radix dec ;padrão decimal para valores sem identificação
include <p16f84a.inc> ;anexa arquivo def.16F84A

;------------------------------------------------------------------------------
; TABELA DE DEFINIÇÕES DE RAM E CONSTANTES (defino nomes associados a
; valores)
;------------------------------------------------------------------------------
x equ 0CH ; define variável auxiliar x na ram 0Ch (hexadecimal)
y equ 0DH ; define variável auxiliar y na ram 0Dh (hexadecimal)
STEMP equ 0EH ; define variável p/colocar vlrs.temporarios do status
l1 equ 7 ; define led1 ligado ao pino 7 do portB
; variáveis acima são exemplos do uso da diretriz EQU

;------------------------------------------------------------------------------
; TABELA DE MONTAGEM DO DISPLAY
;------------------------------------------------------------------------------
;
; a=RB0 define segmento do display ligado ao pino 0 do portB
; b=RB1 " " " " " " " 1 do portB
; c=RB2 " " " " " " " 2 do portB
; d=RB3 " " " " " " " 3 do portB
; e=RB4 " " " " " " " 4 do portB
; f=RB5 " " " " " " " 5 do portB
; g=RB6 " " " " " " " 6 do portB
;
; fica em binario: B'0gfedcba', para escrever n.7 ==> B'00000111' ou B'00000cba'
; , para escrever n.6 ==> B'01111101' ou B'0gfedc0a' , etc.
;
; a
; *******
; f* *b
; * g *
; ******* DISPLAY
; e* *c
; * *
; *******
; d
;------------------------------------------------------------------------------

;------------------------------------------------------------------------------
; MEMÓRIA DE PROGRAMA
;------------------------------------------------------------------------------
org 0 ; define inicio do programa a partir do end. 0h
goto inicio ; desvia o progrma para o label (rótulo) início

;------------------------------------------------------------------------------
; INÍCIO DA ROTINA DE INTERRUPÇÃO
;------------------------------------------------------------------------------
org 4 ; sempre inicia no end.4h as interrup.no PIC
swapf STATUS,W
movwf STEMP ; stemp=w=status (c/nibles invertidos)
bsf PORTB,l1 ; ligo led1 pino 7 do portB
movlw 0x0F6 ; w=F6h
movwf TMR0 ; tmr0=w=F6h
call tempo
bcf PORTB,l1 ; desligo led1
swapf STEMP,W
movwf STATUS ; move vlrs.stemp p/status (inv.nibles/fica correto)
bcf INTCON,T0IF ; zera o indicador de overflow p/iniciar novam.
retfie ; comando de retorno de interrupção

;------------------------------------------------------------------------------
; INÍCIO DO PROGRAMA
;------------------------------------------------------------------------------

inicio:
; inicialização do uC
movlw B'10000000' ; w=10000000b
movwf INTCON ; INTCON=w , GIE esta habilitada
bsf STATUS,RP0 ; seleciono banco1
movlw B'11111000' ; w=11111000b
movwf OPTION_REG ; OPTION=w , T0CS=1 contagem por RA4 , externa
movlw B'11111111' ; w=FFh
movwf TRISA ; trisa=w , portA entrada
movlw B'00000000' ; w=0
movwf TRISB ; trisb=w , portB saídas
bcf STATUS,RP0 ; seleciono banco0
movwf PORTA ; portA=w=0
movwf PORTB ; portB=w=0

principal:
movlw 0x0F5 ; w=0F5h
movwf TMR0 ; timer0=w
bcf INTCON,T0IF ; reset no bit indicador de overflow
bsf INTCON,T0IE ; seto o bit de interrupção do timer0
loop:
movf TMR0,0 ; w=tmr0
call certo ; sub-rotina de conversão p/7 segmentos
movwf PORTB ; portB=w
nop
goto loop
certo:
andlw B'00001111' ; and w p/limitar em 4 bits vlr.contador
sublw 0x0E ; subtrai de 14 o vlr.w(vlr.do tmr0 acertado)
addwf PCL ; soma valor de w com pcl, saltando p/ instrução
; necessária p/escrita do número correto
;'0gfedcba' sequência dos segmentos

retlw B'01100111' ; retorna 9


retlw B'01111111' ; retorna 8
retlw B'00000111' ; retorna 7
retlw B'01111100' ; retorna 6
retlw B'01101101' ; retorna 5
retlw B'01100110' ; retorna 4
retlw B'01001111' ; retorna 3
retlw B'01011011' ; retorna 2
retlw B'00000110' ; retorna 1
retlw B'00111111' ; retorna 0

tempo: ; rotina de 250mS

movlw 250 ; w=250d


movwf x
temp1:
movlw 248 ; w=248d
movwf y
temp2:
nop
decfsz y
goto temp2
decfsz x
goto temp1
return
end

d) Escrevendo em um display de cristal liquido (LCD).


Vamos aprender a usar um LCD para escrever a frase CURSO DE
MICROCONTROLADOR. Vários conceitos importantes sobre o uso deste serão
abordados.

Vamos conhecer um pouco sobre o LCD :

1) Pinagem padrão.

Comandos para inicialização do display (seguir a tabela abaixo):

MÓDULO TIPO INST. TEMPO INST. TEMPO INST. TEMPO INST. TEMPO INST. TEMPO

1 LINHA 7X5 18X5 30 15mS 30 15mS 6 40uS 0E 40uS 1 40uS

2 LINHAS 7X5 18X5 38 15mS 38 15mS 6 40uS 0E 40uS 1 40uS


Existem outros módulos com mais linhas e mais colunas. Procurar outras bibliografias e
referências técnicas . Em nosso projeto exemplo iremos usar os 8 bits de dados, mas é
possível usarmos apenas 4 bits para enviarmos as informações para o LCD, usamos o nible
mais significativo D7 a D4 (pinos 14 a 11) para a comunicação, por ex.: enviar a instrução
14 , primeiro envio 1(0001) e após o 4 (0100) note que também envio primeiro o nible mais
significativo, se estivesse usando os 8 bits enviaria direto 14 (00010100).

3) Agora iremos descrever quais os pinos do uC iremos usar para gerar os sinais de
controle e transferência de dados para o LCD. Usaremos a porta A para gerar os sinais de
controle e a porta B para enviarmos dados e instruções.

PINO Controla Comentários

PA.0 RS 1=dado 0=inst.


PA.1 CS 1=enable 0=disable
PB.0 D0 bmS
PB.1 D1
PB.2 D2
PB.3 D3
PB.4 D4
PB.5 D5
PB.6 D6
PB.7 D7 BmS

4)Diagrama lógico do circuito com LCD.


5) Vamos ao programa que ira controlar o LCD e escrever a mensagem escolhida, vamos
com isto aprender os conceitos necessários para o funcionamento correto do display.

;------------------------------------------------------------------------------
; FORMULÁRIO PADRÃO PARA USO EM PROGRAMAÇÃO COM
; MICROCONTROLADORES
; DA LINHA PIC ( MICROCHIP ). COM USO DO COMPILADOR MPASWIN.
;------------------------------------------------------------------------------
; ** Os registros da CPU serão escritas com letras maiúsculas, e a-
; pós " ; " os comentários não serão considerados pelo compilador.
;------------------------------------------------------------------------------
; PROJETO : Display-LCD DATA : 29/10/2002
;------------------------------------------------------------------------------
; AUTOR :Mauricio Madeira Oliveira
;------------------------------------------------------------------------------
list p=16F84 ;para qual processador o código será gerado
radix dec ;padrão decimal para valores sem identificação
include <p16f84a.inc> ;anexa arquivo def.16F84A

;------------------------------------------------------------------------------
; TABELA DE DEFINIÇÕES DE RAM E CONSTANTES (defino nomes associados a
valores)
;------------------------------------------------------------------------------
x equ 0Ch ; define variável auxiliar x na ram 0Ch (hexadecimal)
y equ 0Dh ; define variável auxiliar y na ram 0Dh (hexadecimal)
con0 equ 0h ; controle do sinal RS (LCD) através do PA.0
con1 equ 1h ; controle do sinal CS (LCD) através do PA.1

;Definição de caracteres que serão usados:

M equ 0x4D
I equ 0x49
;C equ 0x43
R equ 0x52
O equ 0x4F
N equ 0x4E
T equ 0x54
L equ 0x4C
A equ 0x41
D equ 0x44
U equ 0x55
S equ 0x53
E equ 0x45
# equ 0x23
;------------------------------------------------------------------------------
; MEMÓRIA DE PROGRAMA
;------------------------------------------------------------------------------
org 0 ; define inicio do programa a partir do end. 0h
goto início ; desvia o progrma para o label (rótulo) início

;------------------------------------------------------------------------------
; INÍCIO DA ROTINA DE INTERRUPÇÃO
;------------------------------------------------------------------------------
org 4 ; sempre inicia no end.4h as interrup.no PIC
; rotinas ...............................
retfie ; comando de retorno de interrupção

;------------------------------------------------------------------------------
; INÍCIO DO PROGRAMA
;------------------------------------------------------------------------------

início:
movlw B'00000000' ; w=0
movwf INTCON ; inticon=w int.desabilitadas
bsf STATUS,RP0 ; sel.banco1
movwf TRISB ; portB def.para saída
movlw B'11111100' ; w=11111100
movwf TRISA ; PA.0 e PA.1 def.saidas , demais input
movlw B'11011000' ; w=11011000b
movwf OPTION_REG ; option=w (verif.naa tabela as atribuições)
movlw B'00000000' ; w=o
bcf STATUS,RP0 ; sel.banco0
movwf PORTA ; portA=w
movwf PORTB ; portB=w

principal: ;inicialização do display LCD

bcf PORTA,con0 ; portA P0=0, RS=0 ,LCD recebe instrução


movlw 0x38 ; w=38h
movwf PORTB ; portB=instrução 38 p/ o LCD
call tempo ; rotina de 20mS
movlw 0x38 ;
movwf PORTB ; Verificar tabela de configuração LCD
call tempo ;
movlw 0x06 ; w=o6h
movwf PORTB ; portB=inst. 06 p/ o LCD
call tempo
movlw 0x0E ; w=0Eh
movwf PORTB ; portB=inst. 0E p/ o LCD
call tempo
movlw 0x01 ; w=01h
movwf PORTB ; portB=inst. 01 p/ o LCD
call tempo
movlw 0x80 ; w=80h
movwf PORTB ; portB=inst. 80 p/ o LCD, iniciar na 1.linha
; e 1.coluna do LCD
call time ; rotina de 40uS (pode ter tempo menor p/esta
; inst.)

esc1: ; rotina de escrita na primeira linha do LCD

bcf PORTA,con0
movlw 0x80
movw f PORTB
call time
bsf PORTA,con0 ; portA P0=1, RS=1 , LCD recebe dados
movlw 0x43 ; letra C
movwf PORTB
call time
movlw U
movwf PORTB
call time
movlw R
movwf PORTB
call time
movlw S
movwf PORTB
call time
movlw O
movwf PORTB
call time
movlw #
movwf PORTB
call time
movlw D
movwf PORTB
call time
movlw E
movwf PORTB
call time
movlw #
movwf PORTB
call time
bcf PORTA,con0 ; porta P0=0, RS=0 , LCD recebe inst.
Movlw 0x0C0 ; w=C0h
Movwf PORTB ; cursor vai p/2.linha, 1.coluna do LCD
call time
bsf PORTA,con0
movlw M
movwf PORTB
call time
movlw I
movwf PORTB
call time
movlw 0x43
movwf PORTB
call time
movlw R
movwf PORTB
call time
movlw O
movwf PORTB
call time
movlw 0x43
movwf PORTB
call time
movlw O
movwf PORTB
call time
movlw N
movwf PORTB
call time
movlw T
movwf PORTB
call time
movlw R
movwf PORTB
call time
movlw O
movwf PORTB
call time
movlw L
movwf PORTB
call time
movlw A
movwf PORTB
call time
movlw D
movwf PORTB
call time
movlw O
movwf PORTB
call time
movlw R
movwf PORTB
call time
aqui: goto aqui

tempo: ; rotina de 20mS

bsf PORTA,con1 ; gera sinal (alto) p/ CS do LCD


bcf PORTA,con1 ; gera sinal (low ) p/ CS do LCD
movlw 250 ; w=250d, 1uS
movwf x ; x=w , 1uS

temp1:
movlw 18 ; 1uS
movwf y ; 1uS
temp2:
nop ; 1uS
decfsz y ; decrementa y de 1,se>0 exec.prox.inst.
goto temp2 ; se=0 salta prox.inst.
decfsz x ; 1uS
goto temp1 ; 1uS
return ; 1uS

time: ; rontina de 4uS

bsf PORTA,con1 ; gera sinal (alto) p/ CS do LCD


bcf PORTA,con1 ; gera sinal (low ) p/ CS do LCD
movlw 38 ; w=38d
movwf x
tim1:
nop
decfsz x
goto tim1
return
end
e) Acionando um motor de passo (stepper motor) .
Vamos controlar através do microcontrolador um motor de passo com 5 terminações, sendo
um dos fios terminais o comum (ligaremos a +Vcc) e os demais fios terminais
correspondem aos 4 enrolamentos do motor, cada um será ligado ao coletor de um
transistor NPN (BC548). Assim iremos controlar o sentido de rotação (horário ou anti-
horário) e a velocidade do mesmo. Com esta aplicação poderemos explorar mais algumas
das possibilidades de uso do microcontrolador, robótica, aplicações industriais, e etc.
O diagrama lógico abaixo, mostra o circuito , e sua simplicidade, pois iremos
controlar o sentido e velocidade de rotação através de um programa.

O programa para este circuito é de fácil entendimento, basta analisar as instruções


usadas e os comentários ao lado de cada uma, note que usamos apenas 4 portas de I/O,
sobrando recursos para circuitos bem mais complexos.

;------------------------------------------------------------------------------
; FORMULÁRIO PADRÃO PARA USO EM PROGRAMAÇÃO COM
; MICROCONTROLADORES
; DA LINHA PIC ( MICROCHIP ). COM USO DO COMPILADOR MPASWIN.
;------------------------------------------------------------------------------
; ** Os registros da CPU serão escritas com letras maiúsculas, e a-
; pós " ; " os comentários não serão considerados pelo compilador.
;------------------------------------------------------------------------------
; PROJETO : Controle de motor de passo DATA : 09/11/2002
;------------------------------------------------------------------------------
; AUTOR :Mauricio Madeira Oliveira
;------------------------------------------------------------------------------
list p=16F84 ;para qual processador o código será gerado
radix dec ;padrão decimal para valores sem identificação
include <p16f84a.inc> ;anexa arquivo def.16F84A

;------------------------------------------------------------------------------
; TABELA DE DEFINIÇÕES DE RAM E CONSTANTES (defino nomes associados a
valores)
;------------------------------------------------------------------------------
x equ 0Ch ; define variável auxiliar x na ram 0Ch (hexadecimal)
y equ 0Dh ; define variável auxiliar y na ram 0Dh (hexadecimal)
n equ 0Eh ; define variável auxiliar n na ram 0Eh (hexadecimal)
; variáveis acima são exemplos do uso da diretriz EQU
;------------------------------------------------------------------------------

;------------------------------------------------------------------------------
; MEMÓRIA DE PROGRAMA
;------------------------------------------------------------------------------
org 0 ; define inicio do programa a partir do end. 0h
goto início ; desvia o progrma para o label (rótulo) início

;------------------------------------------------------------------------------
; INÍCIO DA ROTINA DE INTERRUPÇÃO
;------------------------------------------------------------------------------
org 4 ; sempre inicia no end.4h as interrup.no PIC
; rotinas ...............................
retfie ; comando de retorno de interrupção

;------------------------------------------------------------------------------
; INÍCIO DO PROGRAMA
;------------------------------------------------------------------------------

início :
movlw B'00000000' ; w=0d
movwf INTCON ; desabilito todas as interrupções
movlw B'10001000' ; w=88h
movwf OPTION_REG ; option=w , verificar tabela
bsf STATUS,RP0 ; seleciono banco1
movlw B'00000000' ; w=0d
movwf TRISB ; portB=saida
movlw B'11111111' ; w=ffh
movwf TRISA ; portA=entrada
bcf STATUS,RP0 ; seleciono banco0
movlw B'00000000' ; w=0d
movwf PORTB ; portB=0d
movwf PORTA ; portA=0d

HORARIO:
Movlw 100 ; w=100d
Movwf n ; n=100d
HORA1:
Movlw B'00001000' ; w=8h
movwf PORTB
call TIME ; chama rotina de tempo
call CON1 ; chama rotina de controle1
movlw B'00000100' ; w=4d
movwf PORTB
call TIME
call CON1
movlw B'00000010' ; w=2d
movwf PORTB
call TIME
call CON1
movlw B'00000001' ; w=1d
movwf PORTB
call TIME
call CON1
goto HORA1
ANTIHORA:
movlw 100
movwf n
ANTI1:
Movlw B'00000001' ; w=1h
Movwf PORTB
call TIME ; chama rotina de tempo
call CON2 ; chama rotina de controle2
movlw B'00000010' ; w=2d
movwf PORTB
call TIME
call CON2
movlw B'00000100' ; w=4d
movwf PORTB
call TIME
call CON2
movlw B'00001000' ; w=8d
movwf PORTB
call TIME
call CON2
goto ANTI1
TIME:
movlw 100 ; w=100d
movwf x ; x=w
TIM1:
movlw 248 ; w=248d
movwf y ; y=w
TIM2:
nop
decfsz y ;dec.y,pula prox.inst.se =0
goto TIM2
decfsz x
goto TIM1
return
CON1:
decfsz n
return
goto ANTIHORA
CON2:
decfsz n
return
goto HORARIO
end

Memória EEPROM .

Agora vamos ao estudo dos registros de escrita e leitura da EEPROM do PIC em


estudo. O 16F84 possui 64 Bytes que posso usar como memória de dados, e que diferente
da RAM não perco as informações com a falta de alimentação . Esta memória facilita o
projeto de circuitos, tais como : discadores telefônicos , códigos para sistemas de alarmes,
ajustes em controle remoto, coletor de dados, etc.
Iremos descrever o uso básico para leitura e escrita de dados. Temos 4 registros
especiais para esta finalidade, são eles :
EEADR – endereço desejado para leitura ou escrita na EEPROM.
EEDATA – dado a escrever ou dado lido da EEPROM.
EECON1 – registro de controle 1.
EECON2 – registro de controle 2.

1) Escrevendo na EEPROM.
- Coloco o endereço de escrita no EEADR ( 0 a 63 ou 0 a 3Fh).
- O dado a ser escrito coloco em EEDATA.
- Desabilito as interrupções (GIE = 0).
- Habilito a escrita setando o bit WREN no registro EECON1.
- Carrego o registro EECON2 com os valores 0x55 e 0xAA nesta seqüência(obrigatório).
- A escrita deve ser iniciada setando o bit WR no registro EECON2.
- Devo resetar o bit WREN no registro EECON1 (isto ira proteger o processo de escrita).
- Agora aguardamos o bit WR ir para 0 , e após continuamos nossas rotinas ou usamos a
interrupção de escrita (bit EEIE no registro INTCON, associado ao bit EEIF do
EECON1), para controle do final de escrita.
- Caso algum erro de escrita ocorra no processo o bit WRERR do registro EECON1 será
setado.
Nota : o registro EECON1 e descrito em Registros de controle da CPU em páginas
anteriores.

Vamos a um trecho de programa de escrita , iremos escrever no endereço 01h da EEPROM


o valor 1Ch (00011010).

escrita:
bcf STATUS,RP0 ; seleciono banco0
movlw 0x1 ; w=1h
movwf EEADR ; EEADR=w=1h
movlw 0x1C ; w=1Ch
movwf EEDATA ; EEDATA=w=1Ch
bsf STATUS,RP0 ; seleciono banco1 para EECON1
bcf INTCON,GIE ; desabilito as int.
bsf EECON1,WREN ; hab. escrita na EEPROM
movlw 55H ; w=55h
movwf EECON2 ; EECON2=55h
movlw 0AAH ; w0=AAh
movwf EECON2 ; EECON2=AAh
bsf EECON1,WR ; inicia processo de escrita
bcf EECON1,WREN ; desab. esc. EEPROM, não interfere na
; escrita(agora)
controle: ; escolho uma rotina de controle de fim de
; escrita , vamos implementar uma bem simples
; (como exemplo)

btfss EECON1,EEIF ; se bit EEIF=1 pula próxima instrução


goto controle
bcf EECON1,EEIF ; zero o bit EEIF (para novo controle de
; escrita)
bsf INTCON,GIE ; habilito novamente as interrupções
return

Nota : este exemplo não tem o controle de erros , o ideal e fazer uma rotina usando a
interrupção de fim de escrita e de erros.

2) Lendo na EEPROM.
Podemos ler os dados a qualquer momento, bastando seguir os passos abaixo.

- O endereço a ser lido deve ser colocado em EEADR.


- A leitura deve ser habilitada setando o bit RD no registro EECON1.
- O dado lido será colocado em EEDATA.

Vamos a um trecho de programa onde iremos ler o dado contido no endereço 01h, o qual
escrevemos no trecho anterior (escrita), e colocar a informação lida (1C, no caso) no
endereço 10h na RAM de uso geral.
leitura:
bcf STATUS,RP0 ; seleciono banco0, onde esta EEADR
movlw 0x1C ; w=1Ch
movwf EEADR ; EEADR= w
bsf STATUS,RPO ; sel.banco1 onde esta EECON1
bsf EECON1,RD ; hab. leitura
bcf STATUS,RP0 ; volto ao banco0 onde esta EEDATA
movf EEDATA,0 ; w= EEDATA que é o dado lido
movwf 0x10 ; disponibilizo o dado no end.10h da
; RAM de uso geral, para uso qualquer
return

Não esgotamos de forma alguma, neste curso inicial a gama de recursos e


aplicações de um MICROCONTROLADOR , mas esperamos ter conseguido iniciar nossos
alunos neste campo maravilhoso da eletrônica atual , onde software e hardware andam
juntos, onde o limite praticamente é criatividade e perseverança do projetista.
AUTOR

Maurício Madeira Oliveira


Página pessoal (fonte): www.seguidorsolar.com.br
Este curso pode ser usado e divulgado, sem fins comerciais, citar fonte e autor.

BIBLIOGRAFIA

Microcontroladores – PIC , Engenheiro Vidal Pereira da Silva Jr. , edição independ. 1997.

Desbravando o PIC , David José de Souza , Editora Érica. 2000.

Microchip – Data Sheet , Microchip Technology Inc. 2001.

Circuito Digitais , Herbert Taub , Editora McGRAW-HILL 1984.

Display LCM , Polígrafos diversos (colhidos na Internet).

Motor de Passo , Polígrafos diversos (colhidos na Internet).

Sites :

www.microchip.com
www.mosaico-eng.com.br
www.vidal.com.br
www.ic-prog.com ( site com vários modelos de programadores e software gratuito).

Potrebbero piacerti anche