Microcontrolador – 16F84A

Anuncio
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, tornandose 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
BIT 6
BIT 5
IRP
RP1
RP0
BIT 4
BIT 3
BIT 2
BIT 1
BIT 0
TO\
PD\
Z
DC
C
Seleciona bancos - no 16F84 sempre em 0
No 16F84 manter em 0
Seleciona 0=banco 0 e 1=banco1
bancos
Bit sinaliza time out/ 1=power-up,clrwdt,sleep, 0=time-out do watch dog
Power Down/1=power-up,clrwdt, 0=inst.sleep
Bit sinalizador 0,1 reg.estac/vlr.0 se =0 oreg.dif.de 0
Digit carry/borrow
Carry/borrow
b) OPTION : Configura prescaler, timer, e outras opções. Na programação usa-se optionreg , pois em PICs mais antigos existia uma instrução option.
BIT 7
BIT 6
BIT 5
BIT 4
BIT 3
BIT 2
BIT 1
BIT 0
RPBU\
INTEDG
TOCS
TOSE
PSA
PS2
PS1
PS0
Habilita os pull-up portB
1=desab. 0=hab.
Como aceitara int.externa (RB0) 1=borda de susbida
Fonte do clock do timer 0
1=pino RA4/TOCKI
Como o clock ext.inc.timer 0
1=borda descida
Atribuição do prescaler
1=Watch dog
PS2
PS1
VER TABELA ABAIXO
PS0
0=borda de descida
0=clock interno (f/4)
0=borda susbida
0=timer 0
PS2
PS1
0
0
0
0
1
1
1
1
PS0
0
0
1
1
0
0
1
1
TIMER 0
0 1 para 2
1 1 para 4
0 1 para 8
1 1 para 16
0 1 para 32
1 1 para 64
0 1 para 128
1 1 para 256
WATCH DOG
1 para 1
1 para 2
1 para 4
1 para 8
1 para 16
1 para 32
1 para 64
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
BIT 6
BIT 5
BIT 4
BIT 3
BIT 2
BIT 1
BIT 0
GIE
EEIE
TOIE
INTE
RBIE
TOIF
INTF
RBIF
Habil.geral das int.
0=desab. 1=hab.
Habil.da int.de final de escrita
0=int.não será tratada 1=int.será tratada
Hab.de overflow timer 0=nào tratada
1=int.será tratada
Hab.da int.externa RB0
0=int.não será tratada 1=int.será tratada
Hab.da int.mudança RB4 a RB7 0=int.não será tratada
1=int.será tratada
Identificação de over.timer 0
0=não ocorreu
1=ocorreu
Identificação da int.externa RB0 0=não ocorreu
1=ocorreu
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
BIT 6
BIT 5
BIT 4
BIT 3
BIT 2
BIT 1
BIT 0
NC
NC
NC
RA4
RA3
RA2
RA1
RA0
Pino 3
Pino 2
Pino 1
Pino 18
Pino 17
0=saída
0=saída
0=saída
0=saída
0=saída
1=entrada
1=entrada
1=entrada
1=entrada
1=entrada
TRISB
BIT 7
BIT 6
BIT 5
BIT 4
BIT 3
BIT 2
BIT 1
BIT 0
RB7
RB6
RB5
RB4
RB3
RB2
RB1
RB0
Pino 13
Pino 12
Pino 11
Pino 10
Pino 9
Pino 8
Pino 7
Pino 6
0=saida
0=saida
0=saida
0=saida
0=saida
0=saida
0=saida
0=saida
1=entrada
1=entrada
1=entrada
1=entrada
1=entrada
1=entrada
1=entrada
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
BIT 6
BIT 5
BIT 4
BIT 3
BIT 2
BIT 1
BIT 0
Escrita e leitura
Escrita e leitura
Escrita e leitura
Escrita e leitura
Escrita e leitura
Escrita e leitura
Escrita e leitura
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
BIT 3
BIT 2
BIT 1
BIT 0
I/O
I/O
I/O
I/O
TTL
TTL
TTL
TTL
Open
drain
In timer0
PORTB
BIT 7
BIT 6
BIT 5
BIT 4
BIT 3
BIT 2
BIT 1
BIT 0
I/O
I/O
I/O
I/O
I/O
I/O
I/O
I/O
TTL
Pode gerar int.ext.por mudança de estado
TTL
Pode gerar int.ext.por mudança de estado
TTL
Pode gerar int.ext.por mudança de estado
TTL
Pode gerar int.ext.por mudança de estado
TTL
TTL
TTL
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
BIT 6
BIT 5
BIT 4
BIT 3
BIT 2
BIT 1
BIT 0
ESCRITA/LEITURA
ESCRITA/LEITURA
ESCRITA/LEITURA
ESCRITA/LEITURA
ESCRITA/LEITURA
ESCRITA/LEITURA
ESCRITA/LEITURA
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
BIT 3
BIT 2
BIT 1
BIT 0
EEIF
WRERR
WREN
WR
RD
Identificação da int.de fim de escita
0=não ocorreu
Identificação de erro durante a escrita
0=não ocorreu
Habilitação de escrita na eeprom
0=não disponível
Inicio de escrita
0=escrita terminou/zerada pelo hardware
Inicio da leitura
0=leitura teminou/zerada pelo hardware
1=ocorreu
1=ocorreu
1=dispon.
1=inicia
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
a
BIT 4
BIT 3
BIT 2
BIT 1
BIT 0
CP
código de proteção
CP
PWRTE\
WDTE
FOSC1
FOSC2
código de proteção
1=Habilitado
0=desabilitado
1=WDT Habilitado
0=desabilitado
Seleciona tipo de oscilador
Seleciona tipo de oscilador
Tabela de escolha do tipo de oscilador :
FOSC1
FOSC2
0
0
1
1
TIPO
0 LP
1 XT
0 HS
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)
2)
3)
4)
O que for escrito após “; “ é considerado comentário.
Constante decimal D’valor’ ou d’valor’ , ex.: d’20’
Constante binária B’xxxx’ ex.: 0110 = B’0110’
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
ADDWF
ANDWF
CLRF
CLRW
COMF
DECF
DECFSZ
INCF
INCFSZ
IORWF
MOVF
MOVWF
NOP
RLF
RRF
SUBWF
SWAPF
XORWF
f,d
f,d
f
f,d
f,d
f,d
f,d
f,d
Soma W e f
And entre W e f
Zera f
Zera w
Complementa f
Decrementa f
Decrem.f pula se f=0
Incrementa f
Increm.f pula se f = 0
OR entre W e f
Move f
Move W para f
Nenhuma operação
Roda esq.pelo carry
Roda dir. pelo carry
Subtrai W de f
Troca nibles em f
XOR entre W e f
1
1
1
1
1
1
1(2)
1
1(2)
1
1
1
1
1
1
1
1
1
BCF
BSF
BTFSC
BTFSS
f,b
f,b
f,b
f,b
Zera bit b em f
Seta bit b em f
Se bit b=0 em f,pula
Se bit b=1 em f,pula
1
1
1(2)
1(2)
ADDLW
ANDLW
CALL
CLRWDT
GOTO
IORLW
MOVLW
RETFIE
RETLW
RETURN
SLEEP
SUBLW
XORLW
k
k
k
Soma W e k
And entre W e k
Chama sub-rotina
Zera timer Watch dog
Desvia p/label k
OR entre W e k
W=k
Retorna de interrup.
Retorna c/ w = k
Retorna de sub-rotina
Entra em modo sleep
Subtrai k de W
Xor entre W e k
f,d
f,d
f,d
f,d
f,d
f,d
f,d
f
k
k
k
k
k
k
CICLOS
1
1
2
1
1
1
1
2
2
2
1
1
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
radix dec
include<P16F84A.INC>
;para qual o processador o código será gerado
;padrão decimal para vlrs.s/identificação
;anexa arquivo def.16F84A>
l1
l2
s1
;nome do pino 2 da portB
;nome do pino 1 da portB
;nome do pino 1 da portA
equ
equ
equ
2
1
1
org
goto
0
início
;define início do progrma no end.0
;desvia para o label(rótulo) início
org
4
retfie
;inicio das interrupções (reservada)
;retorno da interrupção
início:
;aqui neste label começa o programa
movlw
movwf
bsf
movwf
movlw
movwf
B'00000000'
INTCON
STATUS,RP0
TRISB
B'11111111'
TRISA
;w=0h
;registro intcon=0h,ou seja todas int.desab.
;seta bit RP0 no reg.status, sel.banco 1
;trisb=0h,todos pinos conf.saidas portB
;w=ffh
;TRISA=B'11111'os 5 pinos serão entradas
movlw
movwf
B'11011000'
OPTION_REG
bcf
movlw
movwf
STATUS,RP0
B'00000000'
PORTB
;w=D8h
;usa-se este nome p/o registrador,estudar
;com as tabelas como configuramos o option
;clear bit RP0 volto para o banco 0
;w=0h
;garanto zero nos pinos do portB no
;inicio/portB=w
portA
principal:
;aqui vou começar as rotinas de controle
btfss
goto
bsf
goto
PORTA,s1
test1
PORTB,l2
desl1
;se pino 1 portA=1 salta próxima linha
bsf
goto
PORTB,l1
desl2
;liga pino 1 portB
;vai p/label desl2 (desliga2)
bcf
goto
PORTB,l1
principal
;desliga pino 1 portB
bcf
goto
end
PORTB,l2
principal
;desliga pino 2 portB
;liga pino 2 portB
;vai p/label desl1 (desliga1)
test1:
desl1:
desl2:
;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
radix dec
include <P16F84A.INC>
;para qual o processador o código será gerado
;padrão decimal para vlrs. s/ identificação
;anexa arquivo def.16F84A>
l1
l2
l3
l4
x
y
j
equ
equ
equ
equ
equ
equ
equ
;nome do pino 0 da portB
;nome do pino 1 da portB
;nome do pino 2 da portB
;nome do pino 3 da portB
;define var.aux.x no end 0Ch da RAM
;define var.aux.y no end 0Dh da RAM
;define var.aux.j no end 0Eh da RAM
org
goto
0
início
0
1
2
3
0CH
0DH
0EH
;define início do progrma no end.0
;desvia para o label(rótulo) início
org
4
retfie
;inicio das interrupções (reservada)
;retorno da interrupção
início:
;aqui neste label começa o programa
movlw
movwf
bsf
movwf
movlw
movwf
B'00000000'
INTCON
STATUS,RP0
TRISB
B'11111111'
TRISA
movlw
movwf
B'11011000'
OPTION_REG
bcf
movlw
movwf
STATUS,RP0
B'10001000'
PORTB
principal:
rrf
call
goto
time:
movlw
movwf
time1:
movlw
movwf
time2:
movlw
movwf
time3:
nop
decfsz
goto
decfsz
goto
decfsz
goto
return
end
PORTB
time
principal
;w=0h
;registro intcon=0h,ou seja todas int.desab.
;seta bit RP0 no reg.status,sel.banco 1
;trisb=0h,todos pinos conf.saidas portB
;w=ffh
;TRISA=B'11111'os 5 pinos serão entradas
; portA
;w=D8h
;usa-se este nome p/o registrador,estudar
;com as tabelas como configuramos o option
;clear bit RP0 volto para o banco 0
;w=88h
;garanto zero nos pinos do portB no
; inicio/portB=w
;aqui vou começar as rotinas de controle
;rotaciona a direita o registo portB
2
j
;inicio da rotina de tempo (aprox.500mS)
;w=2 decimal (1uS)
;j=w (1uS)
250
x
;w=250 decimal (1uS)
;x=w (1uS)
248
y
;w=248 decimal (1uS)
;y=w (1uS)
y
time3
x
time2
j
time1
; (1uS)
; decrem.y se y=0 salta prox.inst.(2uS se salta)
; (1us se não salta)
; (2uS)
; (1uS ou 2uS)
; (2uS)
; (1uS ou 2uS)
; (2uS)
; (2uS)
;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:
movlw
movwf
bsf
movlw
movwf
movlw
movwf
movlw
; inicialização do uC
B'10000000' ; w=10000000b
INTCON
; INTCON=w , GIE esta habilitada
STATUS,RP0 ; seleciono banco1
B'11111000' ; w=11111000b
OPTION_REG ; OPTION=w , T0CS=1 contagem por RA4 , externa
B'11111111' ; w=FFh
TRISA
; trisa=w , portA entrada
B'00000000' ; w=0
movwf
bcf
movwf
movwf
principal:
movlw
movwf
bcf
bsf
loop:
movf
call
movwf
nop
goto
certo:
andlw
sublw
addwf
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
TRISB
; trisb=w , portB saídas
STATUS,RP0 ; seleciono banco0
PORTA
; portA=w=0
PORTB
; portB=w=0
0x0F5
; w=0F5h
TMR0
; timer0=w
INTCON,T0IF ; reset no bit indicador de overflow
INTCON,T0IE ; seto o bit de interrupção do timer0
TMR0,0
certo
PORTB
; w=tmr0
; sub-rotina de conversão p/7 segmentos
; portB=w
loop
B'00001111' ; and w p/limitar em 4 bits vlr.contador
0x0E
; subtrai de 14 o vlr.w(vlr.do tmr0 acertado)
PCL
; soma valor de w com pcl, saltando p/ instrução
; necessária p/escrita do número correto
;'0gfedcba'
sequência dos segmentos
B'01100111'
B'01111111'
B'00000111'
B'01111100'
B'01101101'
B'01100110'
B'01001111'
B'01011011'
B'00000110'
B'00111111'
tempo:
; retorna 9
; retorna 8
; retorna 7
; retorna 6
; retorna 5
; retorna 4
; retorna 3
; retorna 2
; retorna 1
; retorna 0
; rotina de 250mS
movlw
movwf
250
x
; w=250d
movlw
movwf y
248
; w=248d
temp1:
temp2:
nop
decfsz
goto
decfsz
goto
y
temp2
x
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
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
1 LINHA
INST. TEMPO
INST. TEMPO
INST. TEMPO
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
PA.1
PB.0
PB.1
PB.2
PB.3
PB.4
PB.5
PB.6
PB.7
RS
CS
D0
D1
D2
D3
D4
D5
D6
D7
1=dado
1=enable
bmS
0=inst.
0=disable
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
I
;C
R
O
N
T
L
A
D
U
S
E
#
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
0x4D
0x49
0x43
0x52
0x4F
0x4E
0x54
0x4C
0x41
0x44
0x55
0x53
0x45
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
movwf
bsf
movwf
movlw
movwf
movlw
movwf
movlw
bcf
movwf
movwf
B'00000000'
INTCON
STATUS,RP0
TRISB
B'11111100'
TRISA
B'11011000'
OPTION_REG
B'00000000'
STATUS,RP0
PORTA
PORTB
principal:
bcf
movlw
movwf
call
movlw
movwf
call
movlw
movwf
call
movlw
movwf
call
; w=0
; inticon=w int.desabilitadas
; sel.banco1
; portB def.para saída
; w=11111100
; PA.0 e PA.1 def.saidas , demais input
; w=11011000b
; option=w (verif.naa tabela as atribuições)
; w=o
; sel.banco0
; portA=w
; portB=w
;inicialização do display LCD
PORTA,con0
0x38
PORTB
tempo
0x38
PORTB
tempo
0x06
PORTB
tempo
0x0E
PORTB
tempo
; portA P0=0, RS=0 ,LCD recebe instrução
; w=38h
; portB=instrução 38 p/ o LCD
; rotina de 20mS
;
; Verificar tabela de configuração LCD
;
; w=o6h
; portB=inst. 06 p/ o LCD
; w=0Eh
; portB=inst. 0E p/ o LCD
movlw
movwf
call
movlw
movwf
0x01
PORTB
tempo
0x80
PORTB
call
time
esc1:
; w=01h
; portB=inst. 01 p/ o LCD
; w=80h
; portB=inst. 80 p/ o LCD, iniciar na 1.linha
; e 1.coluna do LCD
; rotina de 40uS (pode ter tempo menor p/esta
; inst.)
; rotina de escrita na primeira linha do LCD
bcf
movlw
movw f
call
bsf
movlw
movwf
call
movlw
movwf
call
movlw
movwf
call
movlw
movwf
call
movlw
movwf
call
movlw
movwf
call
movlw
movwf
call
movlw
movwf
call
movlw
movwf
call
bcf
Movlw
Movwf
call
PORTA,con0
0x80
PORTB
time
PORTA,con0
0x43
PORTB
time
U
PORTB
time
R
PORTB
time
S
PORTB
time
O
PORTB
time
#
PORTB
time
D
PORTB
time
E
PORTB
time
#
PORTB
time
PORTA,con0
0x0C0
PORTB
time
; portA P0=1, RS=1 , LCD recebe dados
; letra C
; porta P0=0, RS=0 , LCD recebe inst.
; w=C0h
; cursor vai p/2.linha, 1.coluna do LCD
bsf
movlw
movwf
call
movlw
movwf
call
movlw
movwf
call
movlw
movwf
call
movlw
movwf
call
movlw
movwf
call
movlw
movwf
call
movlw
movwf
call
movlw
movwf
call
movlw
movwf
call
movlw
movwf
call
movlw
movwf
call
movlw
movwf
call
movlw
movwf
call
movlw
movwf
call
movlw
PORTA,con0
M
PORTB
time
I
PORTB
time
0x43
PORTB
time
R
PORTB
time
O
PORTB
time
0x43
PORTB
time
O
PORTB
time
N
PORTB
time
T
PORTB
time
R
PORTB
time
O
PORTB
time
L
PORTB
time
A
PORTB
time
D
PORTB
time
O
PORTB
time
R
movwf
call
aqui: goto
PORTB
time
aqui
tempo:
; rotina de 20mS
bsf
bcf
movlw
movwf
PORTA,con1
PORTA,con1
250
x
; gera sinal (alto) p/ CS do LCD
; gera sinal (low ) p/ CS do LCD
; w=250d, 1uS
; x=w , 1uS
movlw
movwf
18
y
; 1uS
; 1uS
nop
decfsz
goto
decfsz
goto
return
y
temp2
x
temp1
; 1uS
; decrementa y de 1,se>0 exec.prox.inst.
; se=0 salta prox.inst.
; 1uS
; 1uS
; 1uS
temp1:
temp2:
time:
; rontina de 4uS
bsf
bcf
movlw
movwf
PORTA,con1
PORTA,con1
38
x
tim1:
nop
decfsz
goto
return
end
x
tim1
; gera sinal (alto) p/ CS do LCD
; gera sinal (low ) p/ CS do LCD
; w=38d
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 antihorá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
include
dec
<p16f84a.inc>
;padrão decimal para valores sem identificação
;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
movwf
movlw
movwf
bsf
movlw
movwf
movlw
movwf
bcf
movlw
movwf
movwf
HORARIO:
Movlw
B'00000000'
INTCON
B'10001000'
OPTION_REG
STATUS,RP0
B'00000000'
TRISB
B'11111111'
TRISA
STATUS,RP0
B'00000000'
PORTB
PORTA
; w=0d
; desabilito todas as interrupções
; w=88h
; option=w , verificar tabela
; seleciono banco1
; w=0d
; portB=saida
; w=ffh
; portA=entrada
; seleciono banco0
; w=0d
; portB=0d
; portA=0d
100
; w=100d
Movwf
HORA1:
Movlw
movwf
call
call
movlw
movwf
call
call
movlw
movwf
call
call
movlw
movwf
call
call
goto
ANTIHORA:
movlw
movwf
ANTI1:
Movlw
Movwf
call
call
movlw
movwf
call
call
movlw
movwf
call
call
movlw
movwf
call
call
goto
TIME:
movlw
movwf
TIM1:
movlw
movwf
n
; n=100d
B'00001000'
PORTB
TIME
CON1
B'00000100'
PORTB
TIME
CON1
B'00000010'
PORTB
TIME
CON1
B'00000001'
PORTB
TIME
CON1
HORA1
; w=8h
; chama rotina de tempo
; chama rotina de controle1
; w=4d
; w=2d
; w=1d
100
n
B'00000001'
PORTB
TIME
CON2
B'00000010'
PORTB
TIME
CON2
B'00000100'
PORTB
TIME
CON2
B'00001000'
PORTB
TIME
CON2
ANTI1
; w=1h
; w=4d
100
x
; w=100d
; x=w
248
y
; w=248d
; y=w
; chama rotina de tempo
; chama rotina de controle2
; w=2d
; w=8d
TIM2:
nop
decfsz
goto
decfsz
goto
return
y
TIM2
x
TIM1
;dec.y,pula prox.inst.se =0
CON1:
decfsz
return
goto
n
ANTIHORA
CON2:
decfsz
return
goto
end
n
HORARIO
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
movlw
movwf
movlw
movwf
bsf
bcf
bsf
movlw
movwf
movlw
movwf
bsf
bcf
STATUS,RP0
0x1
EEADR
0x1C
EEDATA
STATUS,RP0
INTCON,GIE
EECON1,WREN
55H
EECON2
0AAH
EECON2
EECON1,WR
EECON1,WREN
; seleciono banco0
; w=1h
; EEADR=w=1h
; w=1Ch
; EEDATA=w=1Ch
; seleciono banco1 para EECON1
; desabilito as int.
; hab. escrita na EEPROM
; w=55h
; EECON2=55h
; w0=AAh
; EECON2=AAh
; inicia processo de escrita
; desab. esc. EEPROM, não interfere na
; escrita(agora)
; escolho uma rotina de controle de fim de
; escrita , vamos implementar uma bem simples
; (como exemplo)
btfss
goto
bcf
EECON1,EEIF
controle
EECON1,EEIF
; se bit EEIF=1 pula próxima instrução
bsf
return
INTCON,GIE
controle:
; zero o bit EEIF (para novo controle de
; escrita)
; habilito novamente as interrupções
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
movlw
movwf
bsf
bsf
bcf
movf
movwf
STATUS,RP0
0x1C
EEADR
STATUS,RPO
EECON1,RD
STATUS,RP0
EEDATA,0
0x10
; seleciono banco0, onde esta EEADR
; w=1Ch
; EEADR= w
; sel.banco1 onde esta EECON1
; hab. leitura
; volto ao banco0 onde esta EEDATA
; w= EEDATA que é o dado lido
; 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).
Descargar