Escolar Documentos
Profissional Documentos
Cultura Documentos
Introduo
Este tutorial foi feito para as pessoas que tm a eletrnica como diverso e
desejam aprender a utilizar microcontroladores em seus projetos.
Tambm sou um entusiasta da eletrnica e gosto de entender como as coisas
funcionam. Por isso, escrevo os programas para os microcontroladores em linguagem Assembly.
Se voc como eu, creio que gostar deste tutorial.
Boa leitura!
Mulder_Fox
Membro do frum de Eletrnica do Clube do Hardware
http://forum.clubedohardware.com.br/eletronica/f39
Parte 1
Pisca LED
Nesta primeira parte, vamos montar um circuito para fazer um LED piscar
numa frequncia de aproximadamente um Hz.
Vamos utilizar o microcontrolador PIC16F628A, um dos modelos mais
usados hoje em dia.
Figura 1
1
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 1 Pisca LED
Figura 2
2
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 1 Pisca LED
Incio
Configurao
dos registradores
Inicializao das
variveis
Passou 0,5
segundo? no
sim
Indica o incio
3
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 1 Pisca LED
Figura 3
4
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 1 Pisca LED
;***********************************************************************************************
; PROGRAMA: PISCA LED
; VERSO 1.0
; DESENVOLVIDO POR: MULDER_FOX
; DATA DE CONCLUSO: / /2011
;***********************************************************************************************
Tudo o que for digitado na linha aps ponto e vrgula ser ignorado pelo
MPLAB na hora da montagem do cdigo, portanto, todas as anotaes e comentrios tm de virem
precedidos de ponto e vrgula.
Repare no ponto e vrgula no incio de cada linha que faz com que o
MPLAB ignore o que est escrito aps.
Em seguida vamos incluir no nosso programa o arquivo padro de
definies do PIC16F628A, usando a diretiva #INCLUDE:
;***********************************************************************************************
#INCLUDE <P16F628A.INC> ;ARQUIVO PADRAO MICROCHIP PARA O PIC16F628A
;***********************************************************************************************
Repare que antes de #INCLUDE <P16F628A.INC> no h ponto e vrgula
e portanto o MPLAB ir executar esse comando.
Observe que foi deixado um espao a partir da margem esquerda. Isso
porque se o MPLAB encontra uma diretiva na margem esquerda, ele envia uma mensagem de alerta
na hora de criar o arquivo a ser gravado no microcontrolador.
Observe que na mesma linha, antes do comentrio ARQUIVO PADRAO
MICROCHIP PARA O PIC16F628A h ponto e vrgula, pois, no queremos que o MPLAB leve
em considerao o que est escrito, pois se trata de um comentrio (no faz parte do programa).
Repare que aps digitar #INCLUDE a cor da letra ficou azul, O MPLAB faz
isso sempre que reconhece o termo como uma diretiva. Isso ajuda a perceber quando escrevemos a
diretiva de forma errada, pois, a ela no ficar azul.
No arquivo P16F628A.INC onde constam, alm do modelo do
microcontrolador, as correspondncias entre os nomes dos registradores e as respectivas posies
que eles ocupam na memria de dados, bem como, entre os nomes de cada bit e sua posio no
registrador, entre outras informaes, como tamanho e endereos vlidos da memria e bits de
configurao.
O que ocorre que, para facilitar a vida do programador, as localidades da
memria de dados, ou seja, os registradores, recebem nomes.
Quando o MPLAB vai traduzir o programa para a linguagem de mquina ele
usa essas correspondncias.
Se voc quiser ver o arquivo P16F628A.INC, localize-o na pasta MPASM
Suite que uma subpasta da pasta Microchip, criada no diretrio onde foi instalado o MPLAB IDE.
O prximo passo ajustar os Bits de Configurao, tambm conhecidos por
fusveis ou fuses. Isso feito com a diretiva __CONFIG.
;***********************************************************************************************
; BITS DE CONFIGURAO
__CONFIG _INTOSC_OSC_NOCLKOUT & _WDT_ON & _PWRTE_ON & _MCLRE_OFF & _BOREN_OFF
& _LVP_OFF & _CP_OFF & DATA_CP_OFF
;**********************************************************************************************
5
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 1 Pisca LED
6
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 1 Pisca LED
;**********************************************************************************************
A memria de dados est dividida em quatro bancos (figura 4).
Para ter acesso a qualquer registrador a fim de ler ou alterar o seu valor,
precisamos ajustar os valores dos bits RP0 e RP1 do registrador STATUS, para selecionar o banco
onde se encontra o registrador.
Banco 0: RP0 = 0, RP1 = 0
Banco 1: RP0 = 1, RP1 = 0
Banco 2: RP0 = 0, RP1 = 1
Banco 3: RP0 = 1, RP1 = 1
Neste programa que estamos fazendo, no necessitaremos de acessar os
bancos 3 e 4, pois, os Registradores de Uso Especfico que neles se encontram tambm esto nos
bancos 0 ou 1 e no iremos precisar das posies destinadas a Registradores de Uso Geral que l se
encontram, pois, nos bastaro os disponveis no banco 0.
Como o bit RP1 inicializa com o valor 0, basta que alteremos o bit RP0,
para alternar entre os bancos 0 e 1.
Usamos a diretiva #DEFINE para que onde houver a palavra BANCO_0 o
microcontrolador execute a instruo BCF STATUS,RP0.
BANCO_0 o que chamamos de label e poderia ser outra palavra de sua
preferncia.
A instruo BCF serve para fazer o valor de um determinado bit igual a 0.
Em BCF STATUS,RP0 STATUS o nome do registrador e RP0 o
nome do bit deste registrador cujo valor ficar igual a 0.
Ns tambm usamos a diretiva #DEFINE para que onde houver a palavra
BANCO_1 o microcontrolador execute a instruo BSF STATUS,RP0.
A instruo BSF serve para fazer o valor de um determinado bit igual a 1.
Desta forma, fica mais fcil fazer a comutao entre os bancos de memria,
pois basta escrever a palavra BANCO_0 para que o banco 0 da memria de dados seja selecionado
e a palavra BANCO_1 para o banco 1.
Repare que aps digitar BCF e BSF, a cor da letra ficou azul e em negrito. O
MPLAB faz isto com qualquer termo reconhecido como uma instruo. Isto nos ajuda a perceber se
escrevermos uma instruo de forma errada.
7
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 1 Pisca LED
Figura 4
8
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 1 Pisca LED
variveis. Por esse motivo, minha forma preferida para defini-las com o uso da diretiva CBLOCK:
;**********************************************************************************************
; VARIAVEIS
;**********************************************************************************************
;**********************************************************************************************
; CONSTANTES
9
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 1 Pisca LED
;***********************************************************************************************
; SADA
;***********************************************************************************************
10
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 1 Pisca LED
;***********************************************************************************************
; VETOR DE RESET
;***********************************************************************************************
Aps a inicializao e depois de um reset, o microcontrolador executa a
instruo que estiver no endereo 0X00 da memria de programa.
Em seguida ele ir executar a instruo presente no endereo 0X01, depois
0X02 e assim por diante.
A diretiva ORG indica em qual endereo da memria de programa dever
ser escrita a instruo seguinte. No nosso programa, a instruo GOTO INICIO ocupar o endereo
0X00 da memria de programa, ou seja, ser a primeira instruo a ser executada pelo
microcontrolador.
O microcontrolador ao executar esta instruo desvia para o endereo da
memria de programa ocupado pela instruo que estiver aps a label INICIO.
Mas, porque fazer esse desvio?
Os microcontroladores possuem um recurso muito til chamado Interrupo,
que a interrupo da execuo do programa devido a um evento provocado por um perifrico do
microcontrolador configurado para isso. Perifricos so os circuitos presentes no microcontrolador
que fazem funes especficas como contadores, geradores de sinal PWM, comparadores, etc...
Quando uma interrupo ocorre, o microcontrolador executa a instruo
presente no endereo 0X04 da memria de programa (no caso do PIC16F628A).
Este o motivo de fazermos um desvio logo no endereo 0X00. Este desvio
ser para depois do fim da rotina de interrupo, pois, o programa no caberia entre o endereo
0X00 e 0X03 e ele no pode ocupar os endereos a partir do 0X04, pois, ali estar a rotina de
interrupo.
Como neste programa no iremos utilizar o recurso da interrupo, iremos
escrever no nosso programa a instruo RETFIE no endereo 0X04 para que se, por acaso, ocorrer
uma interrupo indesejada, o programa possa retornar para o ponto de onde foi desviado:
;**********************************************************************************************
; ROTINA DE INTERRUPO
ORG 0X04 ;VETOR DAS INTERRUPES
RETFIE ;RETORNA
11
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 1 Pisca LED
;***********************************************************************************************
Em outra parte deste tutorial falaremos detalhadamente sobre interrupes.
O prximo passo configurar os Registradores de Uso Especfico.
;***********************************************************************************************
; CONFIGURACAO DOS REGISTRADORES DE USO ESPECFICO
INICIO
MOVLW B'00000111'
MOVWF CMCON ;CONFIGURA RA3, RA2, RA1 E RA0 COMO I/O
;***********************************************************************************************
12
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 1 Pisca LED
13
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 1 Pisca LED
MOVWF CMCON
So apenas esses os Registradores de Uso Especfico que precisamos
configurar nesse programa.
;***********************************************************************************************
Inicializar as variveis escrever nesses registradores os valores que eles
devem ter na inicializao do programa.
Ns criamos 3 variveis: DELAY_0, DELAY_1 e DELAY_2.
A varivel DELAY_0 deve ser iniciada com o valor decimal 255. A
DELAY_1 com o valor decimal 50 e a DELAY_3 com o valor decimal 13.
Ns criamos constantes para esses valores, que foram INI_DELAY_0, para
o valor 255, INI_DELAY_1, para o valor 50 e INI_DELAY_2, para o valor 13.
Por isso, quando escrevemos MOVLW INI_DELAY_0, o registrador W
assume o valor 255, ocorrendo o mesmo para os outros dois valores.
14
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 1 Pisca LED
Vamos l!
Primeiramente escrevemos a label PRINCIPAL.
Toda vez que quisermos que o programa volte a este ponto escreveremos:
GOTO PRINCIPAL. (goto em Ingls significa v para).
H certo preconceito a respeito da instruo GOTO. Algumas pessoas dizem
que se deve evitar usar essa instruo.
O que se deve evitar us-la desnecessariamente.
Sempre que for necessrio usar essa instruo use-a sem medo. Ela foi feita
para ser usada!
A primeira instruo DECFSZ DELAY_0,F
Essa instruo decrementa o valor de DELAY_0 e, aps, verifica se o valor
ficou igual a 0.
Repare na letra F aps o DELAY_0. Ela indica que o resultado ser gravado
nele prprio, ou seja, supondo que o valor de DELAY_0 fosse 255, ento, ficar igual a 254.
Se a letra fosse W, o resultado seria gravado no registrador W e o registrador
DELAY_0 teria ficado com o mesmo valor de antes, ou seja, W ficaria com o valor de 254 e
DELAY_0 com 255.
Se aps decrementar DELAY_0, o seu valor for igual a 0, a prxima linha
do programa ser pulada, se no, a prxima linha ser executada.
Repare no nome desta instruo: DEC vem de decrementar, F, o registrador
que ser decrementado, S, da palavra skip (neste caso, pular, em Ingls) e Z de zero. DECFSZ =
decrementa o registrador F e pula a prxima linha se o resultado for zero.
Se voc procurar fazer essas associaes entre o nome das instruo e sua
funo, ir memoriz-las mais facilmente.
Voltando ao nosso programa, se o resultado da operao for diferente de
zero, a prxima linha do programa ser executada.
O que precisamos que ocorra quando a varivel DELAY_0 ainda no
chegou a 0?
Precisamos que ela continue a ser decrementada at que o seu valor seja
igual a 0.
Por isso, na prxima linha escrevemos: GOTO PRINCIPAL.
Isso faz com que a varivel DELAY_0 seja decrementada novamente at
que seu valor chegue a 0, quando ento, a linha aps a instruo DECFSZ ser pulada.
Neste momento em que DELAY_0 chega a zero, ns iremos reinici-la.
Fazemos isto, da mesma forma que fizemos para escrever o seu valor, na
parte de Inicializao das Variveis:
MOVLW INI_DELAY_0
MOVWF DELAY_0
GOTO PRINCIPAL
15
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 1 Pisca LED
MOVLW INI_DELAY_1
MOVWF DELAY_1
DECFSZ DELAY_2,F
GOTO PRINCIPAL
MOVLW INI_DELAY_2
MOVWF DELAY_2
************************************************************************************************
16
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 1 Pisca LED
Agora que passou o tempo de meio segundo, devemos testar o LED para ver
se ele est aceso ou apagado.
O LED estar aceso se o pino RA0 estiver em nvel alto e apagado se estiver
em nvel baixo.
Para testar o estado deste pino, devemos verificar qual o valor do bit 0 do
registrador PORTA.
Para verificar o valor de um bit, existem 2 instrues: BTFSS E BTFSC.
BTFSS testa o bit e pula a prxima linha se o valor for 1. (BTFSS = testa o
bit do registrador F e pula se estiver setado).
BTFSC testa o bit e pula a prxima linha se o valor for 0. (BTFSC = testa o
bit do registrador F e pula se estiver limpo (clean)).
A escolha entre uma ou outra depende das particularidades do trecho do
programa onde sero usadas.
Neste nosso programa no faz diferena e, portanto, vamos escolher BTFSS:
BTFSS LED
17
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 1 Pisca LED
Faremos assim:
ACENDE_LED
BSF LED ;ACENDE O LED
GOTO PRINCIPAL ;desvia
Desta forma, quando o valor do bit for igual a 0, o programa ser desviado
para onde est escrito ACENDE_LED, executando a instruo BSF LED.
Repare que depois de acender ou de apagar o LED ele desvia para o comeo
da rotina principal, onde, comear novamente a decrementar as rotinas.
Com isso chegamos ao final do nosso programa.
Devemos indicar o fim do programa ao MPLAB atravs da diretiva END.
Lembre-se de que ns ativamos o WDT nos bits de configurao.
O WDT um circuito que reinicia o microcontrolador caso o programa
trave.
Ele um contador que incrementado continuamente e quando atinge o
valor mximo, provoca o reset do microcontrolador.
Em algum ponto do nosso programa deveremos escrever a instruo
CLRWDT, que reinicia o contador do WDT toda vez que executada.
;***********************************************************************************************
; PROGRAMA: PISCA LED
; VERSO 1.0
; DESENVOLVIDO POR: MULDER_FOX
; DATA DE CONCLUSO: / /
;***********************************************************************************************
;***********************************************************************************************
; BITS DE CONFIGURAO
__CONFIG _INTOSC_OSC_NOCLKOUT & _WDT_ON & _PWRTE_ON & _MCLRE_OFF & _BOREN_OFF
& _LVP_OFF & _CP_OFF & DATA_CP_OFF
;**********************************************************************************************
; PAGINACAO DE MEMORIA
18
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 1 Pisca LED
; VARIAVEIS
;**********************************************************************************************
; CONSTANTES
;***********************************************************************************************
; SADA
;***********************************************************************************************
; VETOR DE RESET
;***********************************************************************************************
; ROTINA DE INTERRUPO
;***********************************************************************************************
; CONFIGURACAO DOS REGISTRADORES DE USO ESPECFICO
INICIO
;***********************************************************************************************
19
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 1 Pisca LED
;**********************************************************************************************
; INICIALIZACAO DAS VARIAVEIS
;***********************************************************************************************
;**********************************************************************************************
END ;FIM DO PROGRAMA
;**********************************************************************************************
20
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 1 Pisca LED
Figura 5
Figura 6
21
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 1 Pisca LED
Figura 7
Figura 8
22
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 1 Pisca LED
Figura 9
Figura 10
23
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 1 Pisca LED
Figura 11
Figura 12
24
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 1 Pisca LED
Figura 13
25
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 1 Pisca LED
Figura 14
A mensagem BUILD SUCCEEDED, confirma que no ocorreu nenhum
erro na compilao.
Com isto, ns j temos disponvel o arquivo Pisca LED.hex para ser gravado
no microcontrolador, criado na mesma pasta onde est o arquivo Pisca LED.asm., mas, antes vamos
simular a execuo do programa.
A mensagem Message[302] E:\PISCA LED.ASM 56 : Register in operand
not in bank 0. Ensure that bank bits are correct um aviso de que o registrador objeto da
instruo presente naquela linha do programa (linha 56), no est no banco 0, afim de que nos
certifiquemos de ter setado corretamente o banco. uma mensagem que aparece mesmo que o
banco tenha sido selecionado corretamente.
Abra o arquivo Pisca LED.asm, clicando no menu File em Open.
Clique no menu Edit, depois em Properties e depois na aba ASM File
Types e selecione Line Numbers.
Aparecero os nmeros das linhas esquerda.
V linha 56 e veja que o registrador em questo o TRISA, que est no
banco 1. Repare que ns selecionamos esse banco antes e, por isso, no precisamos nos preocupar.
O mesmo ocorre para a mensagem da linha 58.
Agora vamos simulao:
Clique no menu Debugger e depois, em Select Tool, selecione MPLAB
SIM.
Clique novamente no menu Debugger e depois em Settings
Na aba Osc/Trace, em Processor Frequency digite 4 e selecione Mhz.
Na aba Animation / Real Time Updates, selecione Enable Real Time
Watch Updates e leve o cursor todo para a esquerda Fastest.
Clique em OK.
No menu View, clique em Watch.
26
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 1 Pisca LED
Figura 15
Figura 16
27
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 1 Pisca LED
Figura 17
28
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 1 Pisca LED
Figura 18
Clique no boto Reset.
O cursor vai para a linha 46 onde est a instruo GOTO INICIO.
Esta a posio 0X00 da memria de programa, e, portanto a instruo
contida nesta posio que o microcontrolador ir executar em primeiro lugar, quando for ligado ou
resetado.
Repare que apareceu uma seta verde do lado esquerdo:
Figura 19
29
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 1 Pisca LED
Figura 20
30
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 1 Pisca LED
31
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 1 Pisca LED
Figura 21
32
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 1 Pisca LED
Figura 22
33
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 1 Pisca LED
Figura 23
34
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 1 Pisca LED
Figura 24
35
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 1 Pisca LED
Figura 25
Figura 26
36
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 1 Pisca LED
Figura 27
37
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 1 Pisca LED
Figura 28
Para utiliz-lo necessrio o programa IC-prog:
http://www.ic-prog.com/icprog106B.zip
Tambm necessrio o driver para Windows XP:
http://www.ic-prog.com/icprog_driver.zip.
38
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 1 Pisca LED
Figura 29
Na prxima janela tambm clique em OK, deixando como est, pois, este
gravador baseado no JDM.
Figura 30
39
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 1 Pisca LED
Figura 31
Figura 32
40
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 1 Pisca LED
Figura 33
Figura 34
41
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 1 Pisca LED
Figura 35
42
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 1 Pisca LED
Figura 36
43
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 2 Pisca LED II
Parte 2
Pisca LED II
Nesta 2 parte iremos montar o mesmo circuito da Parte 1, mas utilizaremos
o Timer 0 do PIC16F628A para obter a frequncia de cerca de 1 Hz para o LED.
O Timer 0 um circuito do microcontrolador que incrementa um registrador
chamado TMR0, ou seja, um circuito que faz com que o valor desse registrador v aumentando de
1 em 1.
O registrador TMR0 de 8 bits (como todos os registradores do
PIC16F628A) e, portanto, seu valor pode variar de 0 a 255. O seu valor pode ser lido e tambm
alterado, ou seja, podemos escrever o valor que quisermos nele (de 0 a 255).
O Timer 0 pode ser configurado para incrementar o registrador TMR0 a
partir do ciclo de instruo ou a partir do ciclo de um sinal externo aplicado no pino T0CKI (pino 3).
Quando ele incrementado pelo ciclo de instruo, diz-se que ele est sendo
usado como timer e quando incrementado por um sinal aplicado no pino T0CKI, diz-se que ele
est sendo usado como contador (pois pode ser usado para contar os ciclos do sinal externo).
No nosso caso vamos configur-lo para que seja incrementado a partir do
ciclo de instruo, pois, desejamos obter um determinado intervalo de tempo, conhecendo o tempo
de durao do ciclo de instruo.
Podemos configurar o Timer 0 para que o registrador TMR0 seja
incrementado a cada ciclo ou para que seja incrementado a cada 2, 4, 8, 16, 32, 64, 128 e 256 ciclos.
Isso o que se chama de Prescaler. Quando ele estiver configurado para incrementar a cada ciclo,
dizemos que o valor do prescaler 1:1, quando for incrementado a cada 2 ciclos, 1:2, e assim por
diante.
Quando o registrador TMR0 estiver com o valor 255, o prximo incremento
far seu valor voltar a 0 e, ento, dizemos que ele estourou.
Quando o TMR0 estoura, o bit T0IF do registrador INTCON setado, ou
seja, o valor desse bit passa a ser igual a 1, sendo que ele precisa ser apagado na rotina do programa
para que se detecte nova mudana de seu estado. Ao mesmo tempo uma interrupo provocada, se
estiver habilitada.
A vantagem de se usar o Timer 0 para obter o tempo que desejamos que o
programa fica livre para executar outras funes, bastando monitorar o estado do bit T0IF para ver
se o tempo que desejamos j passou. Outra opo habilitar a interrupo de estouro do Timer 0.
O intervalo de tempo que precisamos de 500 milissegundos.
Para uma frequncia do oscilao de 4 MHz, o ciclo de instruo de 1
microssegundo, como j vimos na parte 1 deste tutorial.
Dividindo 500 milissegundos por 1 microssegundo, obtemos o valor de
500.000, ou seja, a cada 500.000 ciclos de instruo tero se passado 500 milissegundos.
Se configurarmos o prescaler do Timer 0 para 1:1, ou seja, se o registrador
TMR0 for incrementado a cada ciclo de instruo, ele ir estourar a cada 256 microssegundos.
Como este tempo muito menor do que o que estamos querendo, vamos
configurar o prescaler para o seu valor mximo, isto , para 1:256.
44
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 2 Pisca LED II
;***********************************************************************************************
; PROGRAMA: PISCA LED II
; VERSO 1.0
; DESENVOLVIDO POR: MULDER_FOX
; DATA DE CONCLUSO: / /
;***********************************************************************************************
;***********************************************************************************************
; BITS DE CONFIGURAO
__CONFIG _INTOSC_OSC_NOCLKOUT & _WDT_ON & _PWRTE_ON & _MCLRE_OFF & _BOREN_OFF
& _LVP_OFF & _CP_OFF & DATA_CP_OFF
;**********************************************************************************************
; PAGINACAO DE MEMORIA
;**********************************************************************************************
Para no ter de escrever tudo de novo, no MPLAB, abra o arquivo Pisca
LED.asm e, no menu File, clique em Save As... e mude o nome do arquivo para Pisca LED
II.asm e v fazendo as alteraes.
O prximo passo do programa a definio das variveis.
Iremos utilizar apenas uma varivel, que ser usada para contar os estouros
do TMR0.
Vamos nome-la de CONT_EST_TMR0:
;**********************************************************************************************
; VARIVEIS
45
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 2 Pisca LED II
;**********************************************************************************************
;**********************************************************************************************
; CONSTANTES
;***********************************************************************************************
; SADA
;***********************************************************************************************
; VETOR DE RESET
;***********************************************************************************************
; ROTINA DE INTERRUPO
;***********************************************************************************************
O bit 3 define se o prescaler ser usado pelo Timer 0. Para que o Timer 0
use o prescaler, o valor desse bit deve ser igual a 0.
Os bits 2, 1 e 0 definem o valor do prescaler. No nosso caso, iremos utilizar
o valor 1:32, e, portanto, os valores desses bits devero ser 1, 0 e 0, respectivamente.
Os demais bits no nos interessam e, portanto, vamos deix-los com o valor
1, valor com o qual eles so inicializados.
Dessa forma, iremos escrever o seguinte nmero binrio no registrador
OPTION_REG: 11010100.
As configuraes dos outros registradores so as mesmas.
A seguir, inicializamos a varivel e teremos chegado rotina principal:
46
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 2 Pisca LED II
;***********************************************************************************************
; CONFIGURACAO DOS REGISTRADORES DE USO ESPECFICO
INICIO
;***********************************************************************************************
; INICIALIZACAO DA VARIAVEL
;***********************************************************************************************
A seguir, iremos reiniciar o TMR0 com o valor 131, usando a constante que
criamos:
MOVLW INI_TMR0 ;W = INI_TMR0
MOVWF TMR0 ;REINICIA TMR0
Se o seu valor no for igual a 0, a prxima linha ser executada e, nesse caso,
desviaremos o programa para o comeo da rotina principal:
47
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 2 Pisca LED II
;***********************************************************************************************
; PROGRAMA: PISCA LED II
; VERSO 1.0
; DESENVOLVIDO POR: MULDER_FOX
; DATA DE CONCLUSO: / /
;***********************************************************************************************
;***********************************************************************************************
; BITS DE CONFIGURAO
__CONFIG _INTOSC_OSC_NOCLKOUT & _WDT_ON & _PWRTE_ON & _MCLRE_OFF & _BOREN_OFF
& _LVP_OFF & _CP_OFF & DATA_CP_OFF
;**********************************************************************************************
; PAGINACAO DE MEMORIA
;**********************************************************************************************
; VARIVEIS
;**********************************************************************************************
; CONSTANTES
;***********************************************************************************************
; SADA
;***********************************************************************************************
; VETOR DE RESET
;***********************************************************************************************
; ROTINA DE INTERRUPO
48
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 2 Pisca LED II
;***********************************************************************************************
; CONFIGURACAO DOS REGISTRADORES DE USO ESPECFICO
INICIO
;***********************************************************************************************
; INICIALIZACAO DA VARIAVEL
;***********************************************************************************************
PRINCIPAL ;ROTINA PRINCIPAL DO PROGRAMA
;**********************************************************************************************
END ;FIM DO PROGRAMA
;**********************************************************************************************
Salve o arquivo.
A seguir iremos simular a execuo do programa com o MPLAB SIM.
No menu Project, clique em Open. Localize o projeto de nome Pisca
LED, selecione-o e clique em Abrir.
No menu Project, em Remove Files to Project, clique no arquivo Pisca
LED.asm (o da parte I) para remov-lo.
No menu Project, clique em Add Files to Project..., localize o arquivo
Pisca LED II.asm (o novo), selecione-o e clique em Abrir.
No menu Project, clique em Buid All.
Verifique se a montagem foi feita com sucesso, selecionando a janela
Output no menu Window:
49
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 2 Pisca LED II
Figura 1
Figura 2
50
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 2 Pisca LED II
Figura 3
O erro de 5 milissegundos devido ao tempo gasto com as instrues que reiniciam o TMR0 com o
valor 131 toda vez que ele estoura.
Experimente mudar este valor para 132 (na constante), monte novamente o
projeto e volte a fazer a simulao e medir o tempo.
Voc ver que o tempo agora de 497 milissegundos:
Figura 4
51
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 2 Pisca LED II
52
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 3 Pisca LED III
Parte 3
Pisca LED III
;***********************************************************************************************
; PROGRAMA: PISCA LED III
; VERSO 1.0
; DESENVOLVIDO POR: MULDER_FOX
; DATA DE CONCLUSO: / /
;***********************************************************************************************
53
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 3 Pisca LED III
;***********************************************************************************************
; BITS DE CONFIGURAO
__CONFIG _INTOSC_OSC_NOCLKOUT & _WDT_ON & _PWRTE_ON & _MCLRE_OFF & _BOREN_OFF
& _LVP_OFF & _CP_OFF & DATA_CP_OFF
;**********************************************************************************************
; PAGINACAO DE MEMORIA
;**********************************************************************************************
;**********************************************************************************************
54
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 3 Pisca LED III
; CONSTANTES
;***********************************************************************************************
; SADA
;***********************************************************************************************
; VETOR DE RESET
;***********************************************************************************************
; ROTINA DE INTERRUPO
Nos programas utilizados nas partes 1 e 2 deste tutorial, havia aqui apenas a
instruo RETFIE, pois no utilizamos o recurso de interrupo, e a instruo RETFIE servia para
se, por acaso, ocorresse uma interrupo inesperada, o programa voltasse ao ponto de onde havia
sido desviado.
Agora iremos habilitar a interrupo de estouro do Timer 0 e, quando ela
ocorrer, o microcontrolador ir executar o cdigo contido a partir daqui.
Primeiramente vamos salvar os valores dos registradores W e STATUS,
copiando-os para as variveis W_TEMP e STATUS_TEMP.
A Microchip, fabricante do PIC16F628A, recomenda a seguinte sequncia
de instrues para salvar os contedos dos registradores W e STATUS:
55
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 3 Pisca LED III
Se o bit T0IF estiver setado, indicando que a interrupo foi causada pelo
estouro do Timer 0, a linha com a instruo GOTO SAI_INT ser pulada, e, nesse caso, na prxima
instruo apagaremos o bit T0IF:
56
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 3 Pisca LED III
ACENDE_LED
BSF LED ;ACENDE O LED
Recapitulando:
O Timer 0 foi configurado para estourar a cada 4 milissegundos. A cada vez
que o registrador TMR0 estoura, gerada uma interrupo, onde a varivel CONT_EST_TMR0
decrementada. Como essa varivel iniciada com o valor 125, quando ela chega a 0, tero se
passado cerca de 500 milissegundos, quando, ento, o estado do LED testado e alterado.
Ou seja, o que era feito na rotina principal do programa na parte 2 deste
tutorial, agora feito dentro da rotina de interrupo.
O programa da parte 2 fica testando o bit T0IF para detectar quando ele for
setado. Aqui, no precisamos fazer isto, porque, quando o bit setado, gerada uma interrupo.
A cada interrupo, a varivel CONT_EST_TMR0 decrementada. Quando
o seu valor chega a 0, mudamos o estado do LED.
Neste programa to simples, talvez voc no veja muita vantagem nisso,
mas, em programas mais complexos, o recurso da interrupo muito til.
Nosso objetivo aqui foi explicar como usar o recurso da interrupo do
microcontrolador.
Com isso conclumos a rotina de interrupo que ficou assim:
;***********************************************************************************************
; ROTINA DE INTERRUPO
57
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 3 Pisca LED III
SAI_INT
SWAPF STATUS_TEMP,W ;SWAP EM STATUS_TEMP
MOVWF STATUS ;RECUPERA STATUS
SWAPF W_TEMP,F ;SWAP EM W_TEMP
SWAPF W_TEMP,W ;RECUPERA W
RETFIE ;RETORNA DA INTERRUPO
;**********************************************************************************************
;***********************************************************************************************
; CONFIGURACAO DOS REGISTRADORES DE USO ESPECFICO
INICIO
MOVLW B'11111111'
MOVWF TRISB ;TODOS OS PINOS DO PORTB COMO ENTRADAS
BANCO_0 ;SELECIONA BANCO 0 DE MEMORIA
MOVLW B'00000111'
MOVWF CMCON ;CONFIGURA RA3, RA2, RA1 E RA0 COMO I/O
MOVLW B'11100000'
MOVWF INTCON ;HABILITA INTERRUPO DO TIMER 0
;**********************************************************************************************
A seguir vem a inicializao da varivel CONT_EST_TRMR0.
No necessrio inicializar W_TEMP e STATUS_TEMP, pois, no so
variveis que precisam ter um determinado valor na inicializao.
Finalmente, vem a rotina principal, que consiste apenas na execuo da
instruo CLRWDT.
O programa fica executando a instruo CLRWDT at que ocorra uma
interrupo.
O programa completo ficou assim:
58
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 3 Pisca LED III
;***********************************************************************************************
; PROGRAMA: PISCA LED III
; VERSO 1.0
; DESENVOLVIDO POR: MULDER_FOX
; DATA DE CONCLUSO: / /
;***********************************************************************************************
;***********************************************************************************************
; BITS DE CONFIGURAO
__CONFIG _INTOSC_OSC_NOCLKOUT & _WDT_ON & _PWRTE_ON & _MCLRE_OFF & _BOREN_OFF
& _LVP_OFF & _CP_OFF & DATA_CP_OFF
;**********************************************************************************************
; PAGINACAO DE MEMORIA
;**********************************************************************************************
; VARIVEIS
;***********************************************************************************************
; CONSTANTES
;***********************************************************************************************
; SADA
;***********************************************************************************************
; VETOR DE RESET
;***********************************************************************************************
; ROTINA DE INTERRUPO
59
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 3 Pisca LED III
ACENDE_LED
BSF LED ;ACENDE O LED
SAI_INT
SWAPF STATUS_TEMP,W ;W = SWAP EM STATUS_TEMP
MOVWF STATUS ;RECUPERA STATUS
SWAPF W_TEMP,F ;SWAP EM W_TEMP
SWAPF W_TEMP,W ;RECUPERA W
RETFIE ;RETORNA DA INTERRUPO
;***********************************************************************************************
; CONFIGURACAO DOS REGISTRADORES DE USO ESPECFICO
INICIO
;***********************************************************************************************
; INICIALIZACAO DA VARIVEL
;***********************************************************************************************
;**********************************************************************************************
END ;FIM DO PROGRAMA
60
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 3 Pisca LED III
Figura 1
No menu File, clique em Open, localize e abra o arquivo Pisca LED III.
Na barra de ferramentas do simulador, clique no boto Reset:
61
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 3 Pisca LED III
Figura 2
62
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 3 Pisca LED III
Figura 3
63
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 4 Pisca LED IV
Parte 4
64
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 4 Pisca LED IV
65
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 4 Pisca LED IV
;********************************************************************************************
; VARIVEIS
;********************************************************************************************
A seguir, vamos criar as constantes para a inicializao das variveis
DB_BTA e DB_BTB:
;**********************************************************************************************
; CONSTANTES
;**********************************************************************************************
;***********************************************************************************************
; ENTRADA
;***********************************************************************************************
;***********************************************************************************************
; FLAGS
;***********************************************************************************************
66
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 4 Pisca LED IV
;***********************************************************************************************
A varivel FLAGS foi inicializada com a instruo CLRF. Esta instruo faz
todos os bits de um registrador iguais a 0.
Na rotina principal, aps a instruo CLRWDT, temos a instruo BTFSS
SOLTAR_BOTAO que testa o estado desse bit de flag.
Se o valor desse bit for 0, significando que no est se aguardando soltar o
boto, a prxima linha ser executada e programa ser desviado para onde est a label
TESTA_BOTAO, onde ser testado o estado do pino onde o boto est ligado (RA1) para ver se
est pressionado.
Porm, se o bit estiver setado, significando que est se aguardando soltar o
boto, devemos verificar se o boto j foi solto. Nesse caso, a prxima linha ser pulada e ser
executada a instruo BTFSS BOTAO, para testar o RA1.
Se o estado do RA1 for igual a 0, significa que o boto ainda no foi solto e
por isso o programa desviado para o incio da rotina PRINCIPAL, para que voltemos a test-lo
at que ele tenha sido solto.
Se o estado do RA1 for igual a 1, significa que o boto foi solto e, ento,
apagamos o flag SOLTAR_BOTAO.
Aps a label TESTA_BOTAO, temos a instruo BTFSC BOTAO, onde
testamos o estado do bit RA1 para verificarmos se o boto est pressionado.
Se ele no estiver pressionado, o estado deste bit ser igual a 1, e, portanto, a
prxima linha ser executada, desviando o programa para REINC_CONT_DEB, onde as variveis
DB_BTA e DB_BTB so reinicializadas e depois o programa desviado para o incio da rotina
principal.
Se o boto estiver pressionado (estado do bit RA1 igual a 0), a prxima
linha ser pulada e a instruo DECFSZ DB_BTA ,F ser executada, comeando o de-bouncing.
A instruo DECFSZ DB_BTA,F decrementa a varivel e ao mesmo tempo
verifica se o seu valor chegou a 0. Se no chegou, o programa retorna para o incio da rotina
PRINCIPAL e, se o boto permanecer pressionado, esta varivel ser novamente decrementada.
Toda vez que o valor de DB_BTA chega a 0, ela reinicializada e a varivel DB_BTB
decrementada. Quando o valor de DB_BTB chegar a 0, o de-bouncing ter terminado.
Mas, para que isso ocorra, necessrio que o estado do pino RA1 se
mantenha em nvel baixo durante todo esse tempo, que iremos ajustar para cerca de 50
milissegundos, atravs dos valores de inicializao de DB_BTA e DB_BTB.
Se antes disso o nvel de RA1 voltar a 1, o programa ser desviado para a
subrotina REINC_CONT_DEB, onde as variveis DB_BTA e DB_BTB so reinicializadas, para
que se comece uma nova contagem de 50 milissegundos, quando for detectado nvel baixo em RA1.
67
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 4 Pisca LED IV
;***********************************************************************************************
PRINCIPAL ;ROTINA PRINCIPAL DO PROGRAMA
TESTA_BOTAO
BTFSC BOTAO ;O BOTO EST PRESSIONADO?
GOTO REINC_CONT_DEB ;NO, DESVIA
DECFSZ DB_BTA,F ;SIM, DECREMENTA DB_BTA. DB_BTA = 0?
GOTO PRINCIPAL ;NAO, DESVIA
MOVLW INI_DB_BTA ;SIM, W = INI_DB_BTA
MOVWF DB_BTA ;INICIALIZA DB_BTA
DECFSZ DB_BTB,F ;DECREMENTA DB_BTB. DB_BTB = 0?
GOTO PRINCIPAL ;NAO, DESVIA
MOVLW INI_DB_BTB ;SIM, W = INI_DB_BTB
MOVWF DB_BTB ;INICIALIZA DB_BTB
BTFSS ESTADO_DO_LED ;LED EST PISCANDO?
GOTO PISCAR_O_LED ;NAO, DESVIA
BCF ESTADO_DO_LED ;SIM, APAGA O LED
BSF SOLTAR_BOTAO ;SETA O FLAG PARA AGUARDAR SOLTAR O BOTAO
GOTO PRINCIPAL ;DESVIA
PISCAR_O_LED
BSF ESTADO_DO_LED ;FAZ O LED PISCAR
BSF SOLTAR_BOTAO ;SETA O FLAG PARA AGUARDAR SOLTAR O BOTAO
GOTO PRINCIPAL ;DESVIA
REINC_CONT_DEB
MOVLW INI_DB_BTA ;W = INI_DB_BTA
MOVWF DB_BTA ;INICIALIZA DB_BTA
MOVLW INI_DB_BTB ;W = INI_DB_BTB
68
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 4 Pisca LED IV
;*********************************************************************************************
END ;FIM DO PROGRAMA
;**********************************************************************************************
;***********************************************************************************************
; ROTINA DE INTERRUPO
CONT_INTERRUPCAO
MOVLW INI_TMR0 ;W = INI_TMR0
MOVWF TMR0 ;REINICIA TMR0
DECFSZ CONT_EST_TMR0,F ;DECREMENTA CONT_EST_TMR0. CONT_EST_TMR0 = 0?
GOTO SAI_INT ;NAO
MOVLW INI_CONT_EST_TMR0 ;SIM, W = INI_CONT_EST_TMR0
MOVWF CONT_EST_TMR0 ;REINICIALIZA CONT_EST_TMR0
BTFSS LED ;TESTA O VALOR DO BIT 0 DO PORTA
GOTO ACENDE_LED ;VALOR = 0, DESVIA
BCF LED ;VALOR = 1, APAGA O LED
GOTO SAI_INT ;SAIR DA INTERRUPCAO
ACENDE_LED
BSF LED ;ACENDE O LED
SAI_INT
SWAPF STATUS_TEMP,W ;SWAP EM STATUS_TEMP
69
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 4 Pisca LED IV
;***********************************************************************************************
Nosso programa est pronto para ser simulado, tendo ficado assim:
;***********************************************************************************************
; PROGRAMA: PISCA LED IV
; VERSO 1.0
; DESENVOLVIDO POR: MULDER_FOX
; DATA DE CONCLUSO: / /
;***********************************************************************************************
;***********************************************************************************************
; BITS DE CONFIGURAO
__CONFIG _INTOSC_OSC_NOCLKOUT & _WDT_ON & _PWRTE_ON & _MCLRE_OFF & _BOREN_OFF
& _LVP_OFF & _CP_OFF & DATA_CP_OFF
;**********************************************************************************************
; PAGINACAO DE MEMORIA
;**********************************************************************************************
; VARIVEIS
;**********************************************************************************************
; CONSTANTES
;***********************************************************************************************
; SADA
70
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 4 Pisca LED IV
;***********************************************************************************************
; ENTRADA
;***********************************************************************************************
; FLAGS
;***********************************************************************************************
; VETOR DE RESET
;***********************************************************************************************
; ROTINA DE INTERRUPO
CONT_INTERRUPCAO
MOVLW INI_TMR0 ;W = INI_TMR0
MOVWF TMR0 ;REINICIA TMR0
DECFSZ CONT_EST_TMR0,F ;DECREMENTA CONT_EST_TMR0. CONT_EST_TMR0 = 0?
GOTO SAI_INT ;NAO
MOVLW INI_CONT_EST_TMR0 ;SIM, W = INI_CONT_EST_TMR0
MOVWF CONT_EST_TMR0 ;REINICIALIZA CONT_EST_TMR0
BTFSS LED ;TESTA O VALOR DO BIT 0 DO PORTA
GOTO ACENDE_LED ;VALOR = 0, DESVIA
BCF LED ;VALOR = 1, APAGA O LED
GOTO SAI_INT ;SAIR DA INTERRUPCAO
ACENDE_LED
BSF LED ;ACENDE O LED
SAI_INT
SWAPF STATUS_TEMP,W ;SWAP EM STATUS_TEMP
MOVWF STATUS ;RECUPERA STATUS
SWAPF W_TEMP,F ;SWAP EM W_TEMP
SWAPF W_TEMP,W ;RECUPERA W
RETFIE ;RETORNA DA INTERRUPO
71
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 4 Pisca LED IV
;***********************************************************************************************
; CONFIGURACAO DOS REGISTRADORES DE USO ESPECFICO
INICIO
;***********************************************************************************************
; INICIALIZACAO DAS VARIAVEIS
;***********************************************************************************************
TESTA_BOTAO
BTFSC BOTAO ;O BOTO EST PRESSIONADO?
GOTO REINC_CONT_DEB ;NO, DESVIA
DECFSZ DB_BTA,F ;SIM, DECREMENTA DB_BTA. DB_BTA = 0?
GOTO PRINCIPAL ;NAO, DESVIA
MOVLW INI_DB_BTA ;SIM, W = INI_DB_BTA
MOVWF DB_BTA ;INICIALIZA DB_BTA
DECFSZ DB_BTB,F ;DECREMENTA DB_BTB. DB_BTB = 0?
GOTO PRINCIPAL ;NAO, DESVIA
MOVLW INI_DB_BTB ;SIM, W = INI_DB_BTB
MOVWF DB_BTB ;INICIALIZA DB_BTB
BTFSS ESTADO_DO_LED ;LED EST PISCANDO?
GOTO PISCAR_O_LED ;NAO, DESVIA
BCF ESTADO_DO_LED ;SIM, APAGA O LED
BSF SOLTAR_BOTAO ;SETA O FLAG PARA AGUARDAR SOLTAR O BOTAO
GOTO PRINCIPAL ;DESVIA
72
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 4 Pisca LED IV
PISCAR_O_LED
BSF ESTADO_DO_LED ;FAZ O LED PISCAR
BSF SOLTAR_BOTAO ;SETA O FLAG PARA AGUARDAR SOLTAR O BOTAO
GOTO PRINCIPAL ;DESVIA
REINC_CONT_DEB
MOVLW INI_DB_BTA ;W = INI_DB_BTA
MOVWF DB_BTA ;INICIALIZA DB_BTA
MOVLW INI_DB_BTB ;W = INI_DB_BTB
MOVWF DB_BTB ;INICIALIZA DB_BTB
GOTO PRINCIPAL ;DESVIA
;*********************************************************************************************
END ;FIM DO PROGRAMA
;**********************************************************************************************
73
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 4 Pisca LED IV
Figura 1
74
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 4 Pisca LED IV
Figura 2
Figura 3
75
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 4 Pisca LED IV
Figura 4
76
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 4 Pisca LED IV
Figura 5
Figura 6
Clicando nesse boto estar fazendo com que o pino RA1 fique em nvel
alto, ou seja, que o seu valor seja igual a 1.
Volte para a janela do programa e clique mais uma vez no boto Step Into .
77
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 4 Pisca LED IV
Figura 7
78
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 4 Pisca LED IV
Figura 8
Aps fazer isso, v clicando no boto Step Into at que o cursor chegue
linha da instruo CLRWDT.
Abra a janela do Stopwatch e clique em Zero.
Clique no boto Run do simulador e quando o programa parar no
breakpoint, verifique o tempo indicado pelo Stopwatch.
Repare que o tempo do de-bouncing agora foi de cerca de 46
milissegundos o que est bom, pois, no precisa ser de exatos 50 milissegundos.
V clicando no boto Step Into e acompanhe a execuo do programa.
Quando ele retornar para o incio da rotina PRINCIPAL, tero sido
setados os dois bits de flag: o que indica que se est aguardando soltar o boto e o que indica que o
LED deve piscar. Repare, no Watch, que esses dois bits esto setados.
V clicando no boto Step Into e repare que o programa est aguardando o
boto ser solto.
Vamos simular que o boto foi solto clicando, no Stimulus, no boto da
primeira linha, fazendo com que o RA1 v para nvel alto.
V clicando em Step Into e repare que ele apaga o flag
SOLTAR_BOTAO.
Continue clicando no boto Step Into e acompanhando a execuo do
programa e repare que ele ficar em loop at que o boto seja novamente pressionado.
Como o flag que indica que o boto deve piscar foi setado, vamos ver se o
pino onde o LED est ligado (RA0) est alternando de nvel.
79
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 4 Pisca LED IV
Figura 9
80
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 4 Pisca LED IV
Figura 10
Posicione as janelas de forma que possa visualizar os valores do PORTA, na
janela do Watch e ao mesmo tempo possa clicar nos botes do Stimulus:
Figura 11
81
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 4 Pisca LED IV
Figura 12
82
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 5 Contador Crescente e Decrescente
Parte 5
Figura 1
83
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 5 Contador Crescente e Decrescente
84
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 5 Contador Crescente e Decrescente
Figura 2
85
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 5 Contador Crescente e Decrescente
Figura 3
86
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 5 Contador Crescente e Decrescente
;***********************************************************************************************
; VARIVEIS
;***********************************************************************************************
;**********************************************************************************************
; CONSTANTES
;***********************************************************************************************
Na seo SADAS, vamos definir a label DIGITO_1 para o pino RA2 e
a label DIGITO_2 para o pino RA3.
Relembrando que quando RA2 estiver em nvel alto, o dgito 1 do display
estar ativo e quando RA3 estiver em nvel alto, o dgito 2 estar ativo:
;***********************************************************************************************
; SADAS
;***********************************************************************************************
Na seo ENTRADAS, vamos definir a label BOTAO_1 para o pino
RA0 e a label BOTAO_2 para o pino RA1, conforme o esquema do circuito:
;***********************************************************************************************
; ENTRADAS
;***********************************************************************************************
87
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 5 Contador Crescente e Decrescente
;***********************************************************************************************
; FLAGS
;***********************************************************************************************
;***********************************************************************************************
; ROTINA DE INTERRUPO
A seguir, vamos verificar qual o dgito que est ativo, desativ-lo, e ativar o
outro:
DESATIVA_DIGITO_2
BCF DIGITO_2 ;DESATIVA DIGITO 2
CLRF PORTB ;TODOS OS BITS DO PORT B = 0
BSF DIGITO_1 ;ATIVA DIGITO 1
88
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 5 Contador Crescente e Decrescente
Segmento Bit
a RB0
b RB1
c RB2
d RB3
e RB4
f RB5
g RB6
Tabela 1
O display utilizado do tipo catodo comum, portanto os segmentos so
ativados com nvel alto. Sendo assim, os valores a serem escritos no PORTB para cada algarismo a
ser exibido no display so os constantes na tabela abaixo. O bit 7 do PORTB est desconectado,
portanto, seu valor indiferente, pelo que lhe atribumos o valor 0 para todos os algarismos.
Algarismo PORTB
0 00111111
1 00000110
2 01011011
3 01001111
4 01100110
5 01101101
6 01111101
7 00000111
8 01111111
9 01101111
Tabela 2
89
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 5 Contador Crescente e Decrescente
00111111 00000110
01011011 01001111
90
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 5 Contador Crescente e Decrescente
01100110 01101101
01111101 00000111
91
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 5 Contador Crescente e Decrescente
01111111 01101111
Aps o dgito ser ativado, devemos enviar para o PORTB o valor referente
ao algarismo que deve ser exibido.
O dgito 1 do display exibe a dezena do nmero e o dgito 2, a unidade.
O algarismo da dezena est gravado na varivel DEZENA, enquanto que
o da unidade est gravado na varivel UNIDADE, porm, esses algarismos esto gravados nessas
variveis no formato binrio, conforme a tabela abaixo:
92
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 5 Contador Crescente e Decrescente
Esses valores so diferentes dos que deve assumir o PORTB para que os
algarismos sejam exibidos no display de 7 segmentos, conforme a tabela comparativa abaixo:
Tabela 4
93
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 5 Contador Crescente e Decrescente
94
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 5 Contador Crescente e Decrescente
CONVERTE_BINARIO_7_SEGMENTOS
ADDWF PCL,F ;PCL = PCL + W
RETLW B'00111111' ;W = 0
RETLW B'00000110' ;W = 1
RETLW B'01011011' ;W = 2
RETLW B'01001111' ;W = 3
RETLW B'01100110' ;W = 4
RETLW B'01101101' ;W = 5
RETLW B'01111101' ;W = 6
RETLW B'00000111' ;W = 7
RETLW B'01111111' ;W = 8
RETLW B'01101111' ;W = 9
95
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 5 Contador Crescente e Decrescente
;***********************************************************************************************
; ROTINA DE INTERRUPO
DESATIVA_DIGITO_2
BCF DIGITO_2 ;DESATIVA DIGITO 2
CLRF PORTB ;TODOS OS BITS DO PORT B = 0
BSF DIGITO_1 ;ATIVA DIGITO 1
MOVF DEZENA,W ;W = DEZENA
CALL CONVERTE_BINARIO_7_SEGMENTOS ;CHAMA SUBROTINA
MOVWF PORTB ;PORTB RECEBE O VALOR CONVERTIDO
GOTO SAI_INT ;DESVIA
COPIAR_UNIDADE
MOVF UNIDADE,W ;W = UNIDADE
CALL CONVERTE_BINARIO_7_SEGMENTOS ;CHAMA SUBROTINA
MOVWF PORTB ;PORTB RECEBE O VALOR CONVERTIDO
GOTO SAI_INT ;DESVIA
CONVERTE_BINARIO_7_SEGMENTOS
ADDWF PCL,F ;PCL = PCL + W
RETLW B'00111111' ;W = 0
96
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 5 Contador Crescente e Decrescente
RETLW B'00000110' ;W = 1
RETLW B'01011011' ;W = 2
RETLW B'01001111' ;W = 3
RETLW B'01100110' ;W = 4
RETLW B'01101101' ;W = 5
RETLW B'01111101' ;W = 6
RETLW B'00000111' ;W = 7
RETLW B'01111111' ;W = 8
RETLW B'01101111' ;W = 9
SAI_INT
SWAPF STATUS_TEMP,W ;SWAP EM STATUS_TEMP
MOVWF STATUS ;RECUPERA STATUS
SWAPF W_TEMP,F ;SWAP EM W_TEMP
SWAPF W_TEMP,W ;RECUPERA W
RETFIE ;RETORNA DA INTERRUPO
;***********************************************************************************************
O prximo passo configurar os registradores de uso especfico.
Devemos configurar o Timer 0 para estourar a cada 5 milissegundos,
aproximadamente.
Como ele ser incrementado pelo ciclo de instruo, que dura 1
microssegundo, se definirmos o seu prescaler para 1:16, ele ser incrementado a cada 16
microssegundos e portanto ir estourar a cada 4 milissegundos aproximadamente (16 x 256).
Esse valor prximo o suficiente daquele que precisvamos.
Para configurar o prescaler do Timer 0 para 1:16, devemos ajustar os valores
dos bits 2, 1 e 0 do registrador OPTION_REG para 0,1 e 1, respectivamente, conforme consta no
datasheet do PIC16F628A.
Temos de configurar tambm o registrador TRISA para definirmos os pinos
RA0 e RA1 como entrada e os pinos RA2 e RA3 como sada. Os demais pinos do PORTA,
deixaremos como entrada.
Devemos configurar ainda o registrador TRISB para definirmos os pinos
RB0 a RB6 como sada deixando o RB7 como entrada, pois no usado.
As demais configuraes so as mesmas do programa anterior:
;***********************************************************************************************
; CONFIGURACAO DOS REGISTRADORES DE USO ESPECFICO
INICIO
;***********************************************************************************************
97
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 5 Contador Crescente e Decrescente
;***********************************************************************************************
; INICIALIZACAO DAS VARIAVEIS
;***********************************************************************************************
Chegamos rotina principal do programa.
Aqui vamos introduzir um conceito conhecido como Programao
Estruturada, onde, na rotina principal, chamamos atravs da instruo CALL as subrotinas do
programa.
Teremos duas subrotinas que sero as que tratam os dois botes.
Nossa rotina PRINCIPAL ficar assim:
;***********************************************************************************************
PRINCIPAL ;ROTINA PRINCIPAL DO PROGRAMA
;***********************************************************************************************
;***********************************************************************************************
TRATA_BOTAO_1
98
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 5 Contador Crescente e Decrescente
TESTA_BOTAO_1
BTFSC BOTAO_1 ;O BOTO 1 EST PRESSIONADO?
GOTO REINC_CONT_DEB_1 ;NO, DESVIA
DECFSZ DB1_BTA,F ;SIM, DECREMENTA DB1_BTA. DB1_BTA = 0?
RETURN ;NAO,RETORNA
MOVLW INI_DB1_BTA ;SIM, W = INI_DB1_BTA
MOVWF DB1_BTA ;INICIALIZA DB1_BTA
DECFSZ DB1_BTB,F ;DECREMENTA DB1_BTB. DB1_BTB = 0?
RETURN ;NAO, RETORNA
MOVLW INI_DB1_BTB ;SIM, W = INI_DB1_BTB
MOVWF DB1_BTB ;INICIALIZA DB1_BTB
Como ficou definido, a cada vez que o boto 1 for pressionado o nmero
exibido no display ser incrementado.
O nmero composto de dois dgitos: unidade e dezena. Para incrementar
esse nmero, devemos incrementar a unidade, o que fazemos com a instruo INCF:
99
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 5 Contador Crescente e Decrescente
;***********************************************************************************************
TRATA_BOTAO_1
TESTA_BOTAO_1
BTFSC BOTAO_1 ;O BOTO 1 EST PRESSIONADO?
GOTO REINC_CONT_DEB_1 ;NO, DESVIA
DECFSZ DB1_BTA,F ;SIM, DECREMENTA DB1_BTA. DB1_BTA = 0?
RETURN ;NAO,RETORNA
MOVLW INI_DB1_BTA ;SIM, W = INI_DB1_BTA
MOVWF DB1_BTA ;INICIALIZA DB1_BTA
DECFSZ DB1_BTB,F ;DECREMENTA DB1_BTB. DB1_BTB = 0?
RETURN ;NAO, RETORNA
MOVLW INI_DB1_BTB ;SIM, W = INI_DB1_BTB
MOVWF DB1_BTB ;INICIALIZA DB1_BTB
BSF SOLTAR_BOTAO_1 ;SETA FLAG PARA AGUARDAR SOLTAR O BOTO 1
100
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 5 Contador Crescente e Decrescente
REINC_CONT_DEB_1
MOVLW INI_DB1_BTA ;W = INI_DB1_BTA
MOVWF DB1_BTA ;INICIALIZA DB1_BTA
MOVLW INI_DB1_BTB ;W = INI_DB1_BTB
MOVWF DB1_BTB ;INICIALIZA DB1_BTB
RETURN ;RETORNA
;**********************************************************************************************
;***********************************************************************************************
TRATA_BOTAO_2
TESTA_BOTAO_2
BTFSC BOTAO_2 ;O BOTO 2 EST PRESSIONADO?
GOTO REINC_CONT_DEB_2 ;NO, DESVIA
DECFSZ DB2_BTA,F ;SIM, DECREMENTA DB2_BTA. DB2_BTA = 0?
RETURN ;NAO,RETORNA
MOVLW INI_DB2_BTA ;SIM, W = INI_DB2_BTA
MOVWF DB2_BTA ;INICIALIZA DB2_BTA
DECFSZ DB2_BTB,F ;DECREMENTA DB2_BTB. DB2_BTB = 0?
RETURN ;NAO, RETORNA
MOVLW INI_DB2_BTB ;SIM, W = INI_DB2_BTB
MOVWF DB2_BTB ;INICIALIZA DB2_BTB
BSF SOLTAR_BOTAO_2 ;SETA FLAG PARA AGUARDAR SOLTAR O BOTO 2
101
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 5 Contador Crescente e Decrescente
;**********************************************************************************************
TRATA_BOTAO_2
TESTA_BOTAO_2
BTFSC BOTAO_2 ;O BOTO 2 EST PRESSIONADO?
GOTO REINC_CONT_DEB_2 ;NO, DESVIA
DECFSZ DB2_BTA,F ;SIM, DECREMENTA DB2_BTA. DB2_BTA = 0?
RETURN ;NAO,RETORNA
MOVLW INI_DB2_BTA ;SIM, W = INI_DB2_BTA
MOVWF DB2_BTA ;INICIALIZA DB2_BTA
DECFSZ DB2_BTB,F ;DECREMENTA DB2_BTB. DB2_BTB = 0?
RETURN ;NAO, RETORNA
MOVLW INI_DB2_BTB ;SIM, W = INI_DB2_BTB
MOVWF DB2_BTB ;INICIALIZA DB2_BTB
BSF SOLTAR_BOTAO_2 ;SETA FLAG PARA AGUARDAR SOLTAR O BOTO 2
DECF UNIDADE,F ;DECREMENTA UNIDADE
MOVLW .255 ;W = 255
XORWF UNIDADE,W ;W = W XOR UNIDADE
BTFSS STATUS,Z ;UNIDADE = 255?
102
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 5 Contador Crescente e Decrescente
REINC_CONT_DEB_2
MOVLW INI_DB2_BTA ;W = INI_DB2_BTA
MOVWF DB2_BTA ;INICIALIZA DB2_BTA
MOVLW INI_DB2_BTB ;W = INI_DB2_BTB
MOVWF DB2_BTB ;INICIALIZA DB2_BTB
RETURN ;RETORNA
;**********************************************************************************************
;***********************************************************************************************
; PROGRAMA: CONTADOR CRESCENTE E DECRESCENTE
; VERSO 1.0
; DESENVOLVIDO POR: MULDER_FOX
; DATA DE CONCLUSO: / /
;***********************************************************************************************
;***********************************************************************************************
; BITS DE CONFIGURAO
__CONFIG _INTOSC_OSC_NOCLKOUT & _WDT_ON & _PWRTE_ON & _MCLRE_OFF & _BOREN_OFF
& _LVP_OFF & _CP_OFF & DATA_CP_OFF
;**********************************************************************************************
; PAGINACAO DE MEMORIA
;***********************************************************************************************
; VARIVEIS
103
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 5 Contador Crescente e Decrescente
;***********************************************************************************************
; CONSTANTES
;***********************************************************************************************
; SADAS
;***********************************************************************************************
; ENTRADAS
;***********************************************************************************************
; FLAGS
#DEFINE SOLTAR_BOTAO_1 FLAGS,0 ;SE = 1 AGUARDA SOLTAR O BOTO 1
#DEFINE SOLTAR_BOTAO_2 FLAGS,1 ;SE = 1 AGUARDA SOLTAR O BOTO 2
;***********************************************************************************************
; VETOR DE RESET
;***********************************************************************************************
; ROTINA DE INTERRUPO
DESATIVA_DIGITO_2
BCF DIGITO_2 ;DESATIVA DIGITO 2
104
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 5 Contador Crescente e Decrescente
COPIAR_UNIDADE
MOVF UNIDADE,W ;W = UNIDADE
CALL CONVERTE_BINARIO_7_SEGMENTOS ;CHAMA SUBROTINA
MOVWF PORTB ;PORTB RECEBE O VALOR CONVERTIDO
GOTO SAI_INT ;DESVIA
CONVERTE_BINARIO_7_SEGMENTOS
ADDWF PCL,F ;PCL = PCL + W
RETLW B'00111111' ;W = 0
RETLW B'00000110' ;W = 1
RETLW B'01011011' ;W = 2
RETLW B'01001111' ;W = 3
RETLW B'01100110' ;W = 4
RETLW B'01101101' ;W = 5
RETLW B'01111101' ;W = 6
RETLW B'00000111' ;W = 7
RETLW B'01111111' ;W = 8
RETLW B'01101111' ;W = 9
SAI_INT
SWAPF STATUS_TEMP,W ;SWAP EM STATUS_TEMP
MOVWF STATUS ;RECUPERA STATUS
SWAPF W_TEMP,F ;SWAP EM W_TEMP
SWAPF W_TEMP,W ;RECUPERA W
RETFIE ;RETORNA DA INTERRUPO
;***********************************************************************************************
; CONFIGURACAO DOS REGISTRADORES DE USO ESPECFICO
INICIO
;***********************************************************************************************
; INICIALIZACAO DAS VARIAVEIS
105
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 5 Contador Crescente e Decrescente
;***********************************************************************************************
PRINCIPAL ;ROTINA PRINCIPAL DO PROGRAMA
;***********************************************************************************************
TRATA_BOTAO_1
TESTA_BOTAO_1
BTFSC BOTAO_1 ;O BOTO 1 EST PRESSIONADO?
GOTO REINC_CONT_DEB_1 ;NO, DESVIA
DECFSZ DB1_BTA,F ;SIM, DECREMENTA DB1_BTA. DB1_BTA = 0?
RETURN ;NAO,RETORNA
MOVLW INI_DB1_BTA ;SIM, W = INI_DB1_BTA
MOVWF DB1_BTA ;INICIALIZA DB1_BTA
DECFSZ DB1_BTB,F ;DECREMENTA DB1_BTB. DB1_BTB = 0?
RETURN ;NAO, RETORNA
MOVLW INI_DB1_BTB ;SIM, W = INI_DB1_BTB
MOVWF DB1_BTB ;INICIALIZA DB1_BTB
BSF SOLTAR_BOTAO_1 ;SETA FLAG PARA AGUARDAR SOLTAR O BOTO 1
INCF UNIDADE,F ;INCREMENTA UNIDADE
MOVLW .10 ;W = 10
XORWF UNIDADE,W ;W = W XOR UNIDADE
BTFSS STATUS,Z ;UNIDADE = 10?
RETURN ;NAO, RETORNA
CLRF UNIDADE ;SIM, UNIDADE = 0
INCF DEZENA,F ;INCREMENTA DEZENA
MOVLW .10 ;W = 10
XORWF DEZENA,W ;W = W XOR DEZENA
BTFSS STATUS,Z ;DEZENA = 10?
RETURN ;NAO, RETORNA
CLRF DEZENA ;SIM, DEZENA = 0
RETURN ;RETORNA
REINC_CONT_DEB_1
MOVLW INI_DB1_BTA ;W = INI_DB1_BTA
MOVWF DB1_BTA ;INICIALIZA DB1_BTA
MOVLW INI_DB1_BTB ;W = INI_DB1_BTB
MOVWF DB1_BTB ;INICIALIZA DB1_BTB
RETURN ;RETORNA
106
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 5 Contador Crescente e Decrescente
;********************************************************************************************
TRATA_BOTAO_2
TESTA_BOTAO_2
BTFSC BOTAO_2 ;O BOTO 2 EST PRESSIONADO?
GOTO REINC_CONT_DEB_2 ;NO, DESVIA
DECFSZ DB2_BTA,F ;SIM, DECREMENTA DB2_BTA. DB2_BTA = 0?
RETURN ;NAO,RETORNA
MOVLW INI_DB2_BTA ;SIM, W = INI_DB2_BTA
MOVWF DB2_BTA ;INICIALIZA DB2_BTA
DECFSZ DB2_BTB,F ;DECREMENTA DB2_BTB. DB2_BTB = 0?
RETURN ;NAO, RETORNA
MOVLW INI_DB2_BTB ;SIM, W = INI_DB2_BTB
MOVWF DB2_BTB ;INICIALIZA DB2_BTB
BSF SOLTAR_BOTAO_2 ;SETA FLAG PARA AGUARDAR SOLTAR O BOTO 2
DECF UNIDADE,F ;DECREMENTA UNIDADE
MOVLW .255 ;W = 255
XORWF UNIDADE,W ;W = W XOR UNIDADE
BTFSS STATUS,Z ;UNIDADE = 255?
RETURN ;NAO, RETORNA
MOVLW .9 ;SIM, W = 9
MOVWF UNIDADE ;UNIDADE = 9
DECF DEZENA,F ;DECREMENTA DEZENA
MOVLW .255 ;W = 255
XORWF DEZENA,W ;W = W XOR DEZENA
BTFSS STATUS,Z ;DEZENA = 255?
RETURN ;NAO, RETORNA
MOVLW .9 ;SIM, W = 9
MOVWF DEZENA ;DEZENA = 9
RETURN ;RETORNA
REINC_CONT_DEB_2
MOVLW INI_DB2_BTA ;W = INI_DB2_BTA
MOVWF DB2_BTA ;INICIALIZA DB2_BTA
MOVLW INI_DB2_BTB ;W = INI_DB2_BTB
MOVWF DB2_BTB ;INICIALIZA DB2_BTB
RETURN ;RETORNA
;**********************************************************************************************
107
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 5 Contador Crescente e Decrescente
Figura 4
108
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 5 Contador Crescente e Decrescente
Figura 5
109
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 5 Contador Crescente e Decrescente
Figura 6
110
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 5 Contador Crescente e Decrescente
Figura 7
111
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 5 Contador Crescente e Decrescente
Figura 8
112
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 5 Contador Crescente e Decrescente
Figura 9
113
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 5 Contador Crescente e Decrescente
Figura 10
114
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 5 Contador Crescente e Decrescente
Figura 11
115
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 6 Contador II
Parte 6
116
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 6 Contador II
117
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 6 Contador II
;***********************************************************************************************
;***********************************************************************************************
; FLAGS
118
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 6 Contador II
;***********************************************************************************************
Para verificarmos se a gravao da EEPROM terminou, podemos escolher
entre testar o estado do bit WR at que ele seja zerado ou habilitar a interrupo de gravao
completa na EEPROM. Ficaremos com o teste do bit, por ser mais simples e, portanto, no iremos
fazer nenhuma alterao na rotina de interrupo.
A prxima alterao na seo de Inicializao das Variveis, onde
inclumos as instrues para a inicializao das variveis criadas para a contagem do tempo de espera
pelo fim da escrita na EEPROM.
As variveis UNIDADE e DEZENA no sero inicializadas com o valor 0,
como fizemos na parte anterior deste tutorial, mas, sim, com os valores que houverem sido salvos na
memria EEPROM, pois, queremos que quando o circuito seja ligado, ele mostre o valor que tinha
antes de ser desligado.
Como havamos comentado, todas as vezes que formos salvar os valores da
unidade e da dezena, iremos alterar as localidades da memria EEPROM, a fim de prolongar sua vida
til. Assim sendo, quando o programa for iniciado, ele ter de encontrar as localidades onde os
valores esto salvos.
Como o valor da unidade varia entre 0 e 9, apenas os quatro bits menos
significativos (bits 0 a 4) da localidade da memria so necessrios para salv-lo:
Tabela 1
Sendo assim, usaremos os bits 5 a 8 para gravar um cdigo que far com que
o programa identifique a localidade onde est armazenado o valor da unidade.
O cdigo que utilizaremos ser este: 0110, ou seja, esses sero os valores dos
bits 5 a 8 da localidade onde o valor da unidade estiver salvo. Esse cdigo ser gravado todas as
vezes que salvarmos o valor da unidade, porm, na gravao do programa no microcontrolador,
devemos escrever o cdigo na primeira localidade da memria EEPROM, caso contrrio, no haver
nenhuma localidade com o cdigo para que o programa encontre na primeira vez que o
microcontrolador for ligado. Isso feito com o uso da diretiva DE, desta forma:
119
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 6 Contador II
;**********************************************************************************************
; INICIALIZAO DA EEPROM
ORG 2100 ;APONTA PARA O ENDEREO 00H DA EEPROM
DE B'01100000', .0 ;ESCREVE O NMERO BINRIO 01100000 NO ENDEREO 00H DA EEPROM
;E O NMERO DECIMAL 0, NA LOCALIDADE 01H
;**********************************************************************************************
A diretiva DE serve para escrevermos nas localidades da memria
EEPROM durante a gravao do programa no microcontrolador. Para o PIC16F628A, devemos nos
referir primeira localidade da memria EEPROM como 2100. Se quisermos escrever em localidades
sequenciais, basta separar os valores por vrgula. Por exemplo, se escrevssemos assim:
DE .1, .5, .3 escreveramos os nmeros decimais 1, 5 e 3, nas trs localidades iniciadas pela que foi
apontada na diretiva ORG.
No nosso caso, o nmero binrio 01100000 ser escrito na localidade 00h e o
nmero decimal 0 na localidade seguinte, ou seja, a 01h. Assim, na primeira vez que o programa for
executado, ele encontrar o cdigo na primeira localidade da memria EEPROM, iniciando a unidade
com o valor 0. Na localidade seguinte, escrevemos 0 para que a dezena tambm seja iniciada com o
valor 0.
Insira a seo INICIALIZAO DA EEPROM, entre as sees BITS DE
CONFIGURAO e PAGINAO DE MEMRIA.
Voltando seo INICIALIZAO DAS VARIVEIS, o programa ir ler
a primeira localidade da memria EEPROM (00h) em busca do cdigo. Se encontrar, ele saber que
o valor da unidade est salvo naquela localidade e, portanto, que o valor da dezena est salvo na
prxima (01h). Se no encontrar, ele ir ler a terceira localidade (02h). Se encontrar o cdigo, ele
saber que o valor da unidade est salvo naquela localidade, e a dezena na prxima (03h) e assim por
diante at encontrar onde esto salvos os valores:
120
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 6 Contador II
121
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 6 Contador II
;***********************************************************************************************
122
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 6 Contador II
;***********************************************************************************************
PRINCIPAL ;ROTINA PRINCIPAL DO PROGRAMA
;***********************************************************************************************
TESTA_BOTAO_1
BTFSC BOTAO_1 ;O BOTO 1 EST PRESSIONADO?
GOTO REINC_CONT_DEB_1 ;NO, DESVIA
DECFSZ DB1_BTA,F ;SIM, DECREMENTA DB1_BTA. DB1_BTA = 0?
RETURN ;NAO,RETORNA
MOVLW INI_DB1_BTA ;SIM, W = INI_DB1_BTA
MOVWF DB1_BTA ;INICIALIZA DB1_BTA
DECFSZ DB1_BTB,F ;DECREMENTA DB1_BTB. DB1_BTB = 0?
RETURN ;NAO, RETORNA
MOVLW INI_DB1_BTB ;SIM, W = INI_DB1_BTB
MOVWF DB1_BTB ;INICIALIZA DB1_BTB
BSF SOLTAR_BOTAO_1 ;SETA FLAG PARA AGUARDAR SOLTAR O BOTO 1
INCF UNIDADE,F ;INCREMENTA UNIDADE
BSF APAGAR_UNIDADE ;SETA O FLAG PARA APAGAR LOCALIDADE ANTERIOR DA UNIDADE
BSF GRAVAR_UNIDADE ;SETA O FLAG PARA GRAVAO DA UNIDADE
BSF GRAVAR_DEZENA ;SETA O FLAG PARA GRAVAO DA DEZENA
MOVLW .10 ;W = 10
XORWF UNIDADE,W ;W = W XOR UNIDADE
BTFSS STATUS,Z ;UNIDADE = 10?
RETURN ;NAO, RETORNA
CLRF UNIDADE ;SIM, UNIDADE = 0
INCF DEZENA,F ;INCREMENTA DEZENA
MOVLW .10 ;W = 10
XORWF DEZENA,W ;W = W XOR DEZENA
BTFSS STATUS,Z ;DEZENA = 10?
RETURN ;NAO, RETORNA
CLRF DEZENA ;SIM, DEZENA = 0
RETURN ;RETORNA
123
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 6 Contador II
REINC_CONT_DEB_1
MOVLW INI_DB1_BTA ;W = INI_DB1_BTA
MOVWF DB1_BTA ;INICIALIZA DB1_BTA
MOVLW INI_DB1_BTB ;W = INI_DB1_BTB
MOVWF DB1_BTB ;INICIALIZA DB1_BTB
RETURN ;RETORNA
;********************************************************************************************
TESTA_BOTAO_2
BTFSC BOTAO_2 ;O BOTO 2 EST PRESSIONADO?
GOTO REINC_CONT_DEB_2 ;NO, DESVIA
DECFSZ DB2_BTA,F ;SIM, DECREMENTA DB2_BTA. DB2_BTA = 0?
RETURN ;NAO,RETORNA
MOVLW INI_DB2_BTA ;SIM, W = INI_DB2_BTA
MOVWF DB2_BTA ;INICIALIZA DB2_BTA
DECFSZ DB2_BTB,F ;DECREMENTA DB2_BTB. DB2_BTB = 0?
RETURN ;NAO, RETORNA
MOVLW INI_DB2_BTB ;SIM, W = INI_DB2_BTB
MOVWF DB2_BTB ;INICIALIZA DB2_BTB
BSF SOLTAR_BOTAO_2 ;SETA FLAG PARA AGUARDAR SOLTAR O BOTO 2
DECF UNIDADE,F ;DECREMENTA UNIDADE
BSF APAGAR_UNIDADE ;SETA O FLAG PARA APAGAR LOCALIDADE ANTERIOR DA UNIDADE
BSF GRAVAR_UNIDADE ;SETA O FLAG PARA GRAVAO DA UNIDADE
BSF GRAVAR_DEZENA ;SETA O FLAG PARA GRAVAO DA DEZENA
MOVLW .255 ;W = 255
XORWF UNIDADE,W ;W = W XOR UNIDADE
BTFSS STATUS,Z ;UNIDADE = 255?
RETURN ;NAO, RETORNA
MOVLW .9 ;SIM, W = 9
MOVWF UNIDADE ;UNIDADE = 9
DECF DEZENA,F ;DECREMENTA DEZENA
MOVLW .255 ;W = 255
XORWF DEZENA,W ;W = W XOR DEZENA
BTFSS STATUS,Z ;DEZENA = 255?
RETURN ;NAO, RETORNA
MOVLW .9 ;SIM, W = 9
MOVWF DEZENA ;DEZENA = 9
RETURN ;RETORNA
REINC_CONT_DEB_2
MOVLW INI_DB2_BTA ;W = INI_DB2_BTA
MOVWF DB2_BTA ;INICIALIZA DB2_BTA
MOVLW INI_DB2_BTB ;W = INI_DB2_BTB
MOVWF DB2_BTB ;INICIALIZA DB2_BTB
RETURN ;RETORNA
;**********************************************************************************************
124
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 6 Contador II
Se esse flag estiver setado, o programa desviado para onde est a label
TESTA_FIM_DA_GRAVACAO:
GOTO TESTA_FIM_DA_GRAVACAO ;SIM
Se o flag estiver zerado, testamos o flag que informa se j podemos conferir a
gravao:
BTFSC CONF_GRV_EEPROM ;NAO, CONFERIR A GRAVAO?
Se esse flag estiver setado, o programa desviado para onde est a label
CONFERE_DEZENA:
GOTO CONFERE_DEZENA ;SIM
Se o flag estiver zerado, testamos o flag que informa se a vez de apagar a
localidade anterior da unidade:
125
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 6 Contador II
126
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 6 Contador II
127
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 6 Contador II
128
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 6 Contador II
GRAVA_A_UNIDADE
BANCO_1 ;SELECIONA O BANCO 1 DE MEMRIA
INCF EEADR,F ;INCREMENTA EEADR
INCF EEADR,F ;INCREMENTA EEADR
O registrador EEADR de 8 bits, o que significa que seu valor pode variar de
0 a 255, porm, no PIC16F628A, existem somente 128 localidades de memria EEPROM. Por isso, o
valor do EEADR dever variar entre 0 e 127. Por esse motivo, depois de incrementar o EEADR,
testamos se o seu valor igual a 128. Se for, zeramos o EEADR:
MOVLW .128 ;W = 128
XORWF EEADR,W ;W = W XOR EEADR
BTFSS STATUS,Z ;EEADR = 128?
GOTO CONT_GRV_UNIDADE ;NAO, DESVIA
CLRF EEADR ;SIM, EEADR = 0
129
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 6 Contador II
GRAVA_A_DEZENA
BANCO_1 ;SELECIONA O BANCO 1 DE MEMRIA
INCF EEADR,F ;INCREMENTA EEADR
A seguir, copiamos o valor da dezena apara o registrador EEDATA:
MOVF DEZENA,W ;W = DEZENA
MOVWF EEDATA ;EEDATA = DEZENA
Em seguida, escrevemos as instrues que realizam a gravao na EEPROM:
BSF EECON1,WREN ;HABILITA ESCRITA NA EEPROM
BCF INTCON,GIE ;DESABILITA AS INTERRUPES
BTFSC INTCON,GIE ;BIT GIE EST ZERADO?
GOTO $-2 ;DESVIA O PROGRAMA PARA 2 LINHAS ACIMA
MOVLW 0x55 ;W = NUMERO 55 HEXADECIMAL
MOVWF EECON2 ;EECON2 = 55 HEXADECIMAL
MOVLW 0xAA ;W = NUMERO AA HEXADECIMAL
MOVWF EECON2 ;EECON2 = AA HEXADECIMAL
BSF EECON1,WR ;INICIA A GRAVAO
BSF INTCON,GIE ;HABILITA INTERRUPES
130
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 6 Contador II
Como o EEADR um registrador de 8 bits, cujo valor pode variar entre 0 e 255 e,
supondo que seu valor seja 1 (unidade atualmente na localidade 00 e dezena na 01), aps decrement-lo trs vezes,
ele ir exibir o valor 254 (1 1 = 0; 0 1 = 255; 255 1 = 254), mas, como s existem 128 localidades de memria
EEPROM no PIC16F628A, o valor do EEADR deve variar entre 0 a 127. Qualquer valor alm disso invlido, pois,
corresponde a uma localidade que no existe na EEPROM. Por esse motivo, aps decrementarmos trs vezes o
EEADR, iremos testar seu valor. Se ele for igual a 254, iremos faz-lo igual a 126, pois esse valor que ele deve
assumir aps ser decrementado trs vezes partindo do valor 1 (1 1 = 0; 0 1 = 127; 127 1 = 126).
131
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 6 Contador II
Pode ser que voc esteja se perguntando o que ocorreria se o valor do EEADR fosse 0 ou
2.
Isso no possvel, pois, neste ponto do programa, o EEADR aponta para o endereo
onde a dezena est gravada atualmente. A dezena estar sempre gravada numa localidade mpar (01, 03, 05, etc.),
pois, ela gravada pela primeira vez na localidade 01, durante a gravao do programa no microcontrolador, por
meio da diretiva DE. A partir da, ela sempre ser gravada duas localidades aps a anterior, na subrotina de
gravao da EEPROM.
Por esse motivo, aps decrementarmos o EEADR, testamos se o seu valor igual a 254 e,
se for, o fazemos igual a 126.
CONFERE_APAGAMENTO
DECF EEADR,F ;DECREMENTA EEADR
DECF EEADR,F ;DECREMENTA EEADR
DECF EEADR,F ;DECREMENTA EEADR
MOVLW .254 ;W = 254
XORWF EEADR,W ;W = W XOR EEADR
BTFSS STATUS,Z ;EEADR = 254?
GOTO CONT_CONFERENCIA ;NAO, DESVIA
MOVLW .126 ;SIM, W = 126
MOVWF EEADR ;EEADR = 126
CONT_CONFERENCIA
BSF EECON1,RD ;INICIA LEITURA
MOVF EEDATA,W ;W = VALOR DA LOCALIDADE DA EEPROM
132
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 6 Contador II
CONFERE_UNIDADE
INCF EEADR,F ;INCREMENTA EEADR
INCF EEADR,F ;INCREMENTA EEADR
MOVLW .128 ;W = 128
XORWF EEADR,W ;W = W XOR EEADR
BTFSS STATUS,Z ;EEADR = 128?
GOTO CONT_CONF_UNIDADE ;NAO, DESVIA
CLRF EEADR
Em seguida, procedemos da mesma forma que foi feito na conferncia do
valor da dezena, com a diferena de que aps copiarmos a unidade para o W, inserimos o cdigo nos
bits 5 a 8 do W, com a instruo IORWF, antes de comparar com o registrador EEDATA.
Se a gravao estiver correta, o programa desviado para onde est a label
GRAVACAO_CORRETA, onde apagamos o flag CONF_GRV_EEPROM, copiamos o valor do
EEADR para a varivel LOCAL_DA_UNIDADE, atualizando essa varivel e retornamos,
finalizando o processo de gravao.
Mas, se o valor da unidade no houver sido gravado corretamente, apagamos
o flag CONF_GRV_EEPROM, setamos os flags APAGAR_UNIDADE, GRAVAR_UNIDADE e
GRAVAR_DEZENA para que o processo de gravao seja repetido:
CONT_CONF_UNIDADE
BSF EECON1,RD ;INICIA LEITURA
MOVF UNIDADE,W ;W = UNIDADE
IORLW B'01100000' ;W = W OR B'01100000'
XORWF EEDATA,W ;W = W XOR EEDATA
BTFSC STATUS,Z ;VALOR DA UNIDADE FOI GRAVADO CORRETAMENTE?
GOTO GRAVACAO_CORRETA ;SIM
BCF CONF_GRV_EEPROM ;NAO, APAGA FLAG
BSF APAGAR_UNIDADE ;SETA O FLAG PARA APAGAR LOCALIDADE ANTERIOR DA UNIDADE
BSF GRAVAR_UNIDADE ;SETA O FLAG PARA GRAVAO DA UNIDADE
BSF GRAVAR_DEZENA ;SETA O FLAG PARA GRAVAO DA DEZENA
BANCO_0 ;SELECIONA O BANCO 0 DE MEMRIA
RETURN ;RETORNA
GRAVACAO_CORRETA
BCF CONF_GRV_EEPROM ;APAGA FLAG
MOVF EEADR,W ;W = EEADR
MOVWF LOCAL_DA_UNIDADE ;LOCAL_DA_UNIDADE = EEADR
BANCO_0 ;SELECIONA O BANCO 0 DE MEMRIA
RETURN ;RETORNA
;***********************************************************************************************
; PROGRAMA: CONTADOR CRESCENTE E DECRESCENTE
; VERSO 1.1
; DESENVOLVIDO POR: MULDER_FOX
; DATA DE CONCLUSO: / /
;***********************************************************************************************
#INCLUDE <P16F628A.INC> ;ARQUIVO PADRAO MICROCHIP PARA O PIC16F628A
;***********************************************************************************************
133
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 6 Contador II
; BITS DE CONFIGURAO
__CONFIG _INTOSC_OSC_NOCLKOUT & _WDT_ON & _PWRTE_ON & _MCLRE_OFF & _BOREN_OFF &
_LVP_OFF & _CP_OFF & DATA_CP_OFF
;**********************************************************************************************
; INICIALIZAO DA EEPROM
ORG 2100 ;APONTA PARA O ENDEREO 00H DA EEPROM
DE B'01100000', .0 ;ESCREVE O NMERO BINRIO 01100000 NO ENDEREO 00H DA EEPROM
;E O NMERO DECIMAL 0 NA LOCALIDADE 01h
;**********************************************************************************************
; PAGINACAO DE MEMORIA
;***********************************************************************************************
; VARIVEIS
;***********************************************************************************************
; CONSTANTES
;***********************************************************************************************
134
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 6 Contador II
; ENTRADAS
;***********************************************************************************************
; FLAGS
;***********************************************************************************************
; ROTINA DE INTERRUPO
DESATIVA_DIGITO_2
BCF DIGITO_2 ;DESATIVA DIGITO 2
CLRF PORTB ;TODOS OS BITS DO PORT B = 0
BSF DIGITO_1 ;ATIVA DIGITO 1
MOVF DEZENA,W ;W = DEZENA
CALL CONVERTE_BINARIO_7_SEGMENTOS ;CHAMA SUBROTINA
MOVWF PORTB ;PORTB RECEBE O VALOR CONVERTIDO
GOTO SAI_INT ;DESVIA
COPIAR_UNIDADE
MOVF UNIDADE,W ;W = UNIDADE
CALL CONVERTE_BINARIO_7_SEGMENTOS ;CHAMA SUBROTINA
MOVWF PORTB ;PORTB RECEBE O VALOR CONVERTIDO
GOTO SAI_INT ;DESVIA
135
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 6 Contador II
CONVERTE_BINARIO_7_SEGMENTOS
ADDWF PCL,F ;PCL = PCL + W
RETLW B'00111111' ;W = 0
RETLW B'00000110' ;W = 1
RETLW B'01011011' ;W = 2
RETLW B'01001111' ;W = 3
RETLW B'01100110' ;W = 4
RETLW B'01101101' ;W = 5
RETLW B'01111101' ;W = 6
RETLW B'00000111' ;W = 7
RETLW B'01111111' ;W = 8
RETLW B'01101111' ;W = 9
SAI_INT
SWAPF STATUS_TEMP,W ;SWAP EM STATUS_TEMP
MOVWF STATUS ;RECUPERA STATUS
SWAPF W_TEMP,F ;SWAP EM W_TEMP
SWAPF W_TEMP,W ;RECUPERA W
RETFIE ;RETORNA DA INTERRUPO
;***********************************************************************************************
; CONFIGURACAO DOS REGISTRADORES DE USO ESPECFICO
INICIO
;***********************************************************************************************
; INICIALIZACAO DAS VARIAVEIS
136
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 6 Contador II
;***********************************************************************************************
PRINCIPAL ;ROTINA PRINCIPAL DO PROGRAMA
;***********************************************************************************************
TRATA_BOTAO_1
TESTA_BOTAO_1
BTFSC BOTAO_1 ;O BOTO 1 EST PRESSIONADO?
GOTO REINC_CONT_DEB_1 ;NO, DESVIA
DECFSZ DB1_BTA,F ;SIM, DECREMENTA DB1_BTA. DB1_BTA = 0?
RETURN ;NAO,RETORNA
MOVLW INI_DB1_BTA ;SIM, W = INI_DB1_BTA
MOVWF DB1_BTA ;INICIALIZA DB1_BTA
DECFSZ DB1_BTB,F ;DECREMENTA DB1_BTB. DB1_BTB = 0?
RETURN ;NAO, RETORNA
MOVLW INI_DB1_BTB ;SIM, W = INI_DB1_BTB
MOVWF DB1_BTB ;INICIALIZA DB1_BTB
BSF SOLTAR_BOTAO_1 ;SETA FLAG PARA AGUARDAR SOLTAR O BOTO 1
INCF UNIDADE,F ;INCREMENTA UNIDADE
BSF APAGAR_UNIDADE ;SETA O FLAG PARA APAGAR LOCALIDADE ANTERIOR DA UNIDADE
BSF GRAVAR_UNIDADE ;SETA O FLAG PARA GRAVAO DA UNIDADE
BSF GRAVAR_DEZENA ;SETA O FLAG PARA GRAVAO DA DEZENA
MOVLW .10 ;W = 10
XORWF UNIDADE,W ;W = W XOR UNIDADE
BTFSS STATUS,Z ;UNIDADE = 10?
RETURN ;NAO, RETORNA
CLRF UNIDADE ;SIM, UNIDADE = 0
137
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 6 Contador II
REINC_CONT_DEB_1
MOVLW INI_DB1_BTA ;W = INI_DB1_BTA
MOVWF DB1_BTA ;INICIALIZA DB1_BTA
MOVLW INI_DB1_BTB ;W = INI_DB1_BTB
MOVWF DB1_BTB ;INICIALIZA DB1_BTB
RETURN ;RETORNA
;********************************************************************************************
TRATA_BOTAO_2
TESTA_BOTAO_2
BTFSC BOTAO_2 ;O BOTO 2 EST PRESSIONADO?
GOTO REINC_CONT_DEB_2 ;NO, DESVIA
DECFSZ DB2_BTA,F ;SIM, DECREMENTA DB2_BTA. DB2_BTA = 0?
RETURN ;NAO,RETORNA
MOVLW INI_DB2_BTA ;SIM, W = INI_DB2_BTA
MOVWF DB2_BTA ;INICIALIZA DB2_BTA
DECFSZ DB2_BTB,F ;DECREMENTA DB2_BTB. DB2_BTB = 0?
RETURN ;NAO, RETORNA
MOVLW INI_DB2_BTB ;SIM, W = INI_DB2_BTB
MOVWF DB2_BTB ;INICIALIZA DB2_BTB
BSF SOLTAR_BOTAO_2 ;SETA FLAG PARA AGUARDAR SOLTAR O BOTO 2
DECF UNIDADE,F ;DECREMENTA UNIDADE
BSF APAGAR_UNIDADE ;SETA O FLAG PARA APAGAR LOCALIDADE ANTERIOR DA UNIDADE
BSF GRAVAR_UNIDADE ;SETA O FLAG PARA GRAVAO DA UNIDADE
BSF GRAVAR_DEZENA ;SETA O FLAG PARA GRAVAO DA DEZENA
MOVLW .255 ;W = 255
XORWF UNIDADE,W ;W = W XOR UNIDADE
BTFSS STATUS,Z ;UNIDADE = 255?
RETURN ;NAO, RETORNA
MOVLW .9 ;SIM, W = 9
MOVWF UNIDADE ;UNIDADE = 9
DECF DEZENA,F ;DECREMENTA DEZENA
MOVLW .255 ;W = 255
XORWF DEZENA,W ;W = W XOR DEZENA
BTFSS STATUS,Z ;DEZENA = 255?
RETURN ;NAO, RETORNA
MOVLW .9 ;SIM, W = 9
MOVWF DEZENA ;DEZENA = 9
RETURN ;RETORNA
138
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 6 Contador II
EINC_CONT_DEB_2
MOVLW INI_DB2_BTA ;W = INI_DB2_BTA
MOVWF DB2_BTA ;INICIALIZA DB2_BTA
MOVLW INI_DB2_BTB ;W = INI_DB2_BTB
MOVWF DB2_BTB ;INICIALIZA DB2_BTB
RETURN ;RETORNA
;**********************************************************************************************
GRAVA_EEPROM
APAGA_UNIDADE_ANTERIOR
BANCO_1 ;SELECIONA BANCO 1 DE MEMRIA
MOVF LOCAL_DA_UNIDADE,W ;W = ENDEREO DA EEPROM ONDE EST GRAVADA A UNIDADE
MOVWF EEADR ;EEADR RECEBE ENDERECO
CLRF EEDATA ;EEDATA = 0
BSF EECON1,WREN ;HABILITA ESCRITA NA EEPROM
BCF INTCON,GIE ;DESABILITA AS INTERRUPES
BTFSC INTCON,GIE ;BIT GIE EST ZERADO?
GOTO $-2 ;DESVIA O PROGRAMA PARA 2 LINHAS ACIMA
MOVLW 0x55 ;W = NUMERO 55 HEXADECIMAL
MOVWF EECON2 ;EECON2 = 55 HEXADECIMAL
MOVLW 0xAA ;W = NUMERO AA HEXADECIMAL
MOVWF EECON2 ;EECON = AA HEXADECIMAL
BSF EECON1,WR ;INICIA A GRAVAO
BSF INTCON,GIE ;HABILITA INTERRUPES
BCF APAGAR_UNIDADE ;APAGA O FLAG
BSF ESP_FIM_GRV_EEPROM ;SETA O FLAG PARA ESPERAR PELO FIM DA GRAVAO
BANCO_0 ;SELECIONA O BANCO 0 DE MEMRIA
RETURN ;RETORNA
GRAVA_A_UNIDADE
BANCO_1 ;SELECIONA O BANCO 1 DE MEMRIA
INCF EEADR,F ;INCREMENTA EEADR
INCF EEADR,F ;INCREMENTA EEADR
MOVLW .128 ;W = 128
XORWF EEADR,W ;W = W XOR EEADR
BTFSS STATUS,Z ;EEADR = 128?
GOTO CONT_GRV_UNIDADE ;NAO, DESVIA
CLRF EEADR ;SIM, EEADR = 0
CONT_GRV_UNIDADE
MOVF UNIDADE,W ;W = UNIDADE
MOVWF EEDATA ;EEDATA = UNIDADE
MOVLW B'01100000' ;W = 01100000
IORWF EEDATA,F ;EEDATA = EEDATA OR 01100000
BSF EECON1,WREN ;HABILITA ESCRITA NA EEPROM
BCF INTCON,GIE ;DESABILITA AS INTERRUPES
139
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 6 Contador II
GRAVA_A_DEZENA
BANCO_1 ;SELECIONA O BANCO 1 DE MEMRIA
INCF EEADR,F ;INCREMENTA EEADR
MOVF DEZENA,W ;W = DEZENA
MOVWF EEDATA ;EEDATA = DEZENA
BSF EECON1,WREN ;HABILITA ESCRITA NA EEPROM
BCF INTCON,GIE ;DESABILITA AS INTERRUPES
BTFSC INTCON,GIE ;BIT GIE EST ZERADO?
GOTO $-2 ;DESVIA O PROGRAMA PARA 2 LINHAS ACIMA
MOVLW 0x55 ;W = NUMERO 55 HEXADECIMAL
MOVWF EECON2 ;EECON2 = 55 HEXADECIMAL
MOVLW 0xAA ;W = NUMERO AA HEXADECIMAL
MOVWF EECON2 ;EECON2 = AA HEXADECIMAL
BSF EECON1,WR ;INICIA A GRAVAO
BSF INTCON,GIE ;HABILITA INTERRUPES
BCF GRAVAR_DEZENA ;APAGA O FLAG
BSF ESP_FIM_GRV_EEPROM ;SETA O FLAG PARA ESPERAR PELO FIM DA GRAVAO
BSF CONF_GRV_EEPROM ;SETA O FLAG PARA CONFERIR A GRAVAO DA EEPROM
BANCO_0 ;SELECIONA BANCO 0 DE MEMORIA
RETURN ;RETORNA
TESTA_FIM_DA_GRAVACAO
BANCO_1 ;SELECIONA O BANCO 1 DE MEMRIA
BTFSC EECON1,WR ;A GRAVAO TERMINOU?
GOTO DEC_CONT_TEMPO_FIM_ESCRITA ;NAO, DESVIA
BCF ESP_FIM_GRV_EEPROM ;SIM, APAGA FLAG
BCF EECON1,WREN ;DESABILITA ESCRITA NA EEPROM
MOVLW INI_ESC_EEPROM_A ;W = INI_ESC_EEPROM_A
MOVWF ESC_EEPROM_A ;REINICIA ESC_EEPROM_A
MOVLW INI_ESC_EEPROM_B ;W = INI_ESC_EEPROM_B
MOVWF ESC_EEPROM_B ;REINICIA ESC_EEPROM_B
BANCO_0 ;SELECIONA O BANCO 0 DE MEMRIA
RETURN ;RETORNA
DEC_CONT_TEMPO_FIM_ESCRITA
BANCO_0 ;SELECIONA O BANCO 0 DE MEMRIA
DECFSZ ESC_EEPROM_A,F ;DECREMENTA ESC_EEPROM_A. ESC_EEPROM_A = 0?
RETURN ;NAO, RETORNA
MOVLW INI_ESC_EEPROM_A ;SIM, W = INI_ESC_EEPROM_A
MOVWF ESC_EEPROM_A ;REINICIA ESC_EEPROM_A
DECFSZ ESC_EEPROM_B,F ;DECREMENTA ESC_EEPROM_B.ESC_EEPROM_B = 0?
RETURN ;NAO, RETORNA
MOVLW INI_ESC_EEPROM_B ;SIM, W = INI_ESC_EEPROM_B
MOVWF ESC_EEPROM_B ;REINICIA ESC_EEPROM_B
BSF APAGAR_UNIDADE ;SETA O FLAG PARA APAGAR LOCALIDADE ANTERIOR DA UNIDADE
BSF GRAVAR_UNIDADE ;SETA O FLAG PARA GRAVAO DA UNIDADE
140
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 6 Contador II
CONFERE_DEZENA
BANCO_1 ;SELECIONA O BANCO 1 DE MEMRIA
BSF EECON1,RD ;INICIA LEITURA
MOVF DEZENA,W ;W = DEZENA
XORWF EEDATA,W ;W = W XOR EEDATA
BTFSC STATUS,Z ;VALOR DA DEZENA FOI GRAVADO CORRETAMENTE?
GOTO CONFERE_APAGAMENTO ;SIM
BCF CONF_GRV_EEPROM ;NAO, APAGA FLAG
BSF APAGAR_UNIDADE ;SETA O FLAG PARA APAGAR LOCALIDADE ANTERIOR DA UNIDADE
BSF GRAVAR_UNIDADE ;SETA O FLAG PARA GRAVAO DA UNIDADE
BSF GRAVAR_DEZENA ;SETA O FLAG PARA GRAVAO DA DEZENA
BANCO_0 ;SELECIONA O BANCO 0 DE MEMRIA
RETURN ;RETORNA
CONFERE_APAGAMENTO
DECF EEADR,F ;DECREMENTA EEADR
DECF EEADR,F ;DECREMENTA EEADR
DECF EEADR,F ;DECREMENTA EEADR
MOVLW .254 ;W = 254
XORWF EEADR,W ;W = W XOR EEADR
BTFSS STATUS,Z ;EEADR = 254?
GOTO CONT_CONFERENCIA ;NAO, DESVIA
MOVLW .126 ;SIM, W = 126
MOVWF EEADR ;EEADR = 126
CONT_CONFERENCIA
BSF EECON1,RD ;INICIA LEITURA
MOVF EEDATA,W ;W = VALOR DA LOCALIDADE DA EEPROM
BTFSC STATUS,Z ;LOCALIDADE ANTERIOR DA UNIDADE FOI APAGADO CORRETAMENTE?
GOTO CONFERE_UNIDADE ;SIM
BCF CONF_GRV_EEPROM ;NAO, APAGA FLAG
BSF APAGAR_UNIDADE ;SETA O FLAG PARA APAGAR LOCALIDADE ANTERIOR DA UNIDADE
BSF GRAVAR_UNIDADE ;SETA O FLAG PARA GRAVAO DA UNIDADE
BSF GRAVAR_DEZENA ;SETA O FLAG PARA GRAVAO DA DEZENA
BANCO_0 ;SELECIONA O BANCO 0 DE MEMRIA
RETURN ;RETORNA
CONFERE_UNIDADE
INCF EEADR,F ;INCREMENTA EEADR
INCF EEADR,F ;INCREMENTA EEADR
MOVLW .128 ;W = 128
XORWF EEADR,W ;W = W XOR EEADR
BTFSS STATUS,Z ;EEADR = 128?
GOTO CONT_CONF_UNIDADE ;NAO, DESVIA
CLRF EEADR ;SIM, EEADR = 0
CONT_CONF_UNIDADE
BSF EECON1,RD ;INICIA LEITURA
MOVF UNIDADE,W ;W = UNIDADE
IORLW B'01100000' ;W = W OR B'01100000'
XORWF EEDATA,W ;W = W XOR EEDATA
BTFSC STATUS,Z ;VALOR DA UNIDADE FOI GRAVADO CORRETAMENTE?
GOTO GRAVACAO_CORRETA ;SIM
BCF CONF_GRV_EEPROM ;NAO, APAGA FLAG
141
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 6 Contador II
142
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 6 Contador II
Figura 1
143
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 6 Contador II
No Stimulus, clique nos botes que fixam o RA0 e o RA1 em nvel alto
para simular que os botes esto soltos.
Continue clicando em Step Into at chegar subrotina de gravao da
EEPROM.
Em TESTA_FIM_DA_GRAVACAO, insira um breakpoint na linha que
contm a instruo BCF ESP_FIM_GRV_EEPROM, dando um duplo clique nessa linha.
Quando o programa for executar essa instruo, o tempo de espera ter
terminado.
Precisamos setar manualmente o flag ESP_FIM_GRV_EEPROM para que
o programa entre em TESTA_FIM_DA_GRAVACAO.
Para fazer isso, no Watch, d um duplo clique no campo Binary da linha
do registrador FLAGS, e altere o bit 5 para 1:
Figura 2
144
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 6 Contador II
Figura 3
145
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 6 Contador II
Figura 4
Podemos deixar este tempo pois, est bem prximo dos 10 milissegundos que
pretendamos.
Vamos desfazer a alterao feita em TESTA_FIM_DA_GRAVACAO,
voltando a instruo para: BTFSC EECON1,WR.
Aps isso, monte o projeto novamente, clicando em Build All, no menu
Project.
Clique no boto Reset do simulador e depois v clicando no boto Step
Into at chegar inicializao das variveis.
No Stimulus, clique nos botes que fixam o RA0 e o RA1 em nvel alto
para simular que os botes esto soltos.
No menu Debugger, clique em Breakpoints. Na janela que se abre, clique
em Remove All.
Posicione as janelas para que possa clicar nos botes do Stimulus enquanto
observa os valores dos registradores no Watch.
Clique no boto Run do simulador.
No Stimulus, clique no boto que simula que o boto 1 foi pressionado e
solto (RA0 Pulse Low).
No Watch repare que o valor da unidade foi incrementado.
Clique no boto Halt do simulador.
No menu Window, selecione a janela EEPROM. Se ela no estiver na
lista, clique em EEPROM no menu View para exibi-la.
146
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 6 Contador II
Figura 5
147
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 6 Contador II
Figura 6
148
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 7 Dimmer para LED
Parte 7
Dimmer para LED
Nesta parte do tutorial, vamos montar o circuito da figura abaixo para
controlar o brilho de um LED usando dois botes: um para aument-lo e outro para diminui-lo.
Figura 1
Figura 2
149
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 7 Dimmer para LED
Figura 3
Figura 4
150
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 7 Dimmer para LED
Para que no se perceba que o LED est piscando, temos de escolher uma
frequncia de, pelo menos, 75 Hz para o sinal PWM.
Vamos ver como o PIC16F628A produz o sinal PWM.
Na parte 2 deste tutorial, falamos sobre o Timer 0. O PIC16F628A possui
outros dois circuitos semelhantes: o Timer 1 e o Timer 2.
A principal diferena do Timer 1 em relao ao Timer 0 que ele composto
por dois registradores de 8 bits enquanto que o Timer 0 possui apenas um. Os registradores do Timer
1 so o TMR1L e o TMR1H.
Quando o Timer 1 incrementado, esse incremento ocorre no TMR1L que
pode ir at o valor 255. No prximo incremento, ele volta para o valor 0 e o TMR1H incrementado.
Assim, o Timer 1 pode ser incrementado at o valor 65535, o que o torna ideal para contagem de
tempos mais longos.
O Timer 1 pode ser incrementado tanto a partir do ciclo de instruo como a
partir de um sinal externo aplicado no pino 13 (RB7/T1OSI/PGD). Um cristal pode ser ligado entre
esse pino e o pino 12 (RB6/T1OSO/T1CKI/PGC), para fazer funcionar um oscilador interno
otimizado para a frequncia de 32.768 KHz, ideal para relgios.
O Timer 1 possui um prescaler que pode ser configurado para 1:1, 1:2, 1:4 ou
1:8.
O Timer 2, assim como o Timer 0, constitudo de apenas um registrador de 8
bits, o TMR2 e, portanto, seu valor pode ser incrementado at 255, porm, somente possvel
increment-lo a partir do ciclo de instruo, no sendo possvel increment-lo a partir de um sinal
externo.
O Timer 2 possui algumas caractersticas diferentes dos demais:
Existe um registrador chamado PR2 cujo valor define at onde o registrador
TMR2 poder ser incrementado. Por exemplo, se o valor do PR2 for igual a 255, o TMR2 poder ser
incrementado at esse valor e, no prximo incremento ele ir estourar, ou seja, seu valor voltar para
0. J, se o valor do PR2 for, por exemplo, 100, o TMR2 poder ser incrementado at esse valor
estourando no prximo incremento. Podemos escrever qualquer valor entre 0 e 255 no PR2.
O seu Prescaler pode assumir apenas os seguintes valores: 1:1, 1:4 ou 1:16, ou
seja, ele pode incrementado a cada ciclo de instruo ou a cada quatro ciclos ou a cada dezesseis
ciclos.
O Timer 2 possui um Postscaler, que pode ser configurado de 1:1 at 1:16. O
Postscaler define o nmero de vezes que o TMR2 dever estourar para gerar uma interrupo. Por
exemplo, se ele estiver configurado para 1:1, a cada vez que o TMR2 estourar, o flag TMR2IF ser
setado, gerando uma interrupo (desde que ela esteja habilitada). J, se o Postscaler estiver
configurado, por exemplo, para 1:5, uma interrupo ser gerada a cada 5 estouros do TMR2.
As configuraes do Prescaler e do Postscaler so feitas no registrador
T2CON, onde tambm h um bit para ligar e desligar o Timer 2.
no mdulo CCP do PIC16F628A que gerado o sinal PWM. A
configurao do mdulo CCP feita no registrador CCP1CON. Devemos setar os bits 3 e 2 desse
registrador para habilitar o modo PWM.
151
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 7 Dimmer para LED
O ciclo do sinal PWM reinicia toda vez que o TMR2 estoura. A frmula para
o clculo do tempo de durao do ciclo do sinal PWM esta:
Ciclo = (PR2 + 1) x ciclo de instruo x prescaler do TMR2
Mas, o valor mximo para o PR2 de 255. Vamos ver qual seria o valor do
PR2 para um prescaler de 1:4:
Novamente obtivemos um valor muito alto para o PR2. Vamos, ento, aumen-
tar o valor do prescaler para 1:16:
152
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 7 Dimmer para LED
O valor a ser escrito no PR2 continua acima de 255. Isto mostra que no
possvel obter um sinal PWM de 75 Hz se a frequncia de oscilao do microcontrolador de 4 MHz.
Teramos de diminuir a frequncia do oscilador se quisssemos um sinal PWM de 75 Hz. Poderamos
fazer isso alterando a frequncia do oscilador interno para 48 KHz ou ento usando um cristal externo.
Escrevendo no PR2 o seu valor mximo (255) e configurando o prescaler
tambm para seu valor mximo (16), obtemos a mxima durao do ciclo do sinal PWM para uma
frequncia de oscilao de 4 MHz:
Bit 9 Bit 8 Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
CCP1CON CCP1CON
CCPR1L Bit 5 Bit 4
Tabela 1
153
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 7 Dimmer para LED
0 0 0 1 1 0 0 1 1 0
Bit 9 Bit 8 Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
CCP1CON CCP1CON
CCPR1L Bit 5 Bit 4
Tabela 2
154
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 7 Dimmer para LED
Figura 5
155
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 7 Dimmer para LED
;***********************************************************************************************
; ENTRADAS
;***********************************************************************************************
;************************************************************************************************
; ROTINA DE INTERRUPO
156
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 7 Dimmer para LED
INCREMENTA_CCPR1L
MOVLW .255 ;W = 255
XORWF CCPR1L,W ;W = W XOR CCPRR1L
BTFSC STATUS,Z ;CCPR1L = 255?
RETFIE ;SIM, SAI DA INTERRUPO
DECREMENTA_CCPR1L
MOVLW .0 ;W = 0
XORWF CCPR1L,W ;W = W XOR CCPRR1L
BTFSC STATUS,Z ;CCPR1L = 0?
RETFIE ;SIM, SAI DA INTERRUPO
DECF CCPR1L,F ;NAO, DECREMENTA CCPR1L
RETFIE ;SAI DA INTERRUPO
157
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 7 Dimmer para LED
;***********************************************************************************************
; CONFIGURACAO DOS REGISTRADORES DE USO ESPECFICO
INICIO
Em seguida zeramos o CCPR1L para que quando o circuito for ligado o LED
esteja apagado:
CLRF CCPR1L ;ZERA CCPR1L
158
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 7 Dimmer para LED
;**********************************************************************************************
;**********************************************************************************************
;***********************************************************************************************
; PROGRAMA: DIMMER PARA LED
; VERSO 1.0
; DESENVOLVIDO POR: MULDER_FOX
; DATA DE CONCLUSO: / /
;***********************************************************************************************
;***********************************************************************************************
; BITS DE CONFIGURAO
__CONFIG _INTOSC_OSC_NOCLKOUT & _WDT_ON & _PWRTE_ON & _MCLRE_OFF & _BOREN_OFF &
_LVP_OFF & _CP_OFF & DATA_CP_OFF
;**********************************************************************************************
; PAGINACAO DE MEMORIA
;***********************************************************************************************
; ENTRADAS
;***********************************************************************************************
159
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 7 Dimmer para LED
;***********************************************************************************************
; VETOR DE RESET
;***********************************************************************************************
; ROTINA DE INTERRUPO
INCREMENTA_CCPR1L
MOVLW .255 ;W = 255
XORWF CCPR1L,W ;W = W XOR CCPRR1L
BTFSC STATUS,Z ;CCPR1L = 255?
RETFIE ;SIM, SAI DA INTERRUPO
INCF CCPR1L,F ;NAO, INCREMENTA CCPR1L
RETFIE ;SAI DA INTERRUPO
DECREMENTA_CCPR1L
MOVLW .0 ;W = 0
XORWF CCPR1L,W ;W = W XOR CCPRR1L
BTFSC STATUS,Z ;CCPR1L = 0?
RETFIE ;SIM, SAI DA INTERRUPO
DECF CCPR1L,F ;NAO, DECREMENTA CCPR1L
RETFIE ;SAI DA INTERRUPO
;************************************************************************************************
; CONFIGURACAO DOS REGISTRADORES DE USO ESPECFICO
INICIO
160
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 7 Dimmer para LED
;**********************************************************************************************
; ROTINA PARA AGUARDAR A INTERRUPO
;**********************************************************************************************
161
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 7 Dimmer para LED
Figura 6
162
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 7 Dimmer para LED
Figura 7
163
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 7 Dimmer para LED
Figura 8
Vamos medir o tempo que o boto 1 deve ficar pressionado para o CCPR1L ir
de 0 at 255.
Clique no boto Halt do simulador.
Insira um breakpoint na linha que contem a instruo RETFIE, que
executada quando o valor do CCPR1L for igual a 255:
164
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 7 Dimmer para LED
Figura 9
165
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 7 Dimmer para LED
Figura 10
Remova o breakpoint.
Clique no boto Run do simulador.
No Stimulus, volte o pino RA0 para nvel alto.
Repare que, quando o valor do CCPR1L igual a 255, o pino RB3 fica fixo
em nvel alto. Por outro lado, quando o valor do CCPR1L igual a 0, ele fica fixo em nvel baixo.
Com o valor do CCPR1L num ponto intermedirio, o estado do RB3 varia
entre 0 e 1, indicando que temos o sinal PWM nesse pino.
Grave o programa no microcontrolador, monte o circuito na protoboard e
comprove o seu funcionamento. muito interessante.
Se usarmos um rel de estado slido, ligado no pino RB3 podemos controlar
equipamentos de maior potncia, como por exemplo, lmpadas incandescentes, aquecedores, motores
eltricos, etc.
Aqui termina esta parte do tutorial. Espero que tenha sido til para voc. Na
prxima parte iremos desenvolver um frequencmetro. At l!
166
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 8 Frequencmetro
Parte 8
Frequencmetro
Figura 1
10 F 1 Hz a 40 Hz
1 F 16 Hz a 460 Hz
100 nF 150 Hz a 4.100 Hz
10 nF 1.400 Hz a 9.999 Hz
167
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 8 Frequencmetro
1
Frequncia do sinal =
nmero de incrementos x 0,000001
168
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 8 Frequencmetro
1 1 1
Frequncia do sinal = x
nmero de incrementos 0,000001
1.000.000
Frequncia do sinal =
nmero de incrementos
169
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 8 Frequencmetro
100.000.000
Frequncia do sinal =
nmero de incrementos
;***********************************************************************************************
; VARIVEIS
170
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 8 Frequencmetro
;***********************************************************************************************
;***********************************************************************************************
; SADAS
;***********************************************************************************************
171
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 8 Frequencmetro
;***********************************************************************************************
; FLAGS
;***********************************************************************************************
;*************************************************************************************************
; ROTINA DE INTERRUPO
O prescaler do Timer 0 ser configurado para 8:1. Assim, ele ir gerar uma
interrupo a cada 2,048 milissegundos (0,000001 x 256 x 8). No intervalo entre cada interrupo do
Timer 0, apenas um dos dgitos estar ativo. A cada interrupo, desativaremos o dgito que estiver
ativo e ativaremos o prximo. Com isso, cada dgito ficar ativado por 2,048 milissegundos e
desativado por 6,144 milissegundos, num perodo total de 8,192 milissegundos, o que corresponde a
uma frequncia de 122 Hz.
Na rotina de interrupo do Timer 0, primeiramente apagamos o flag TMR0IF:
INT_TIMER_0
172
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 8 Frequencmetro
CONT_DIG_DEZ
BCF DIG_CEN ;DESATIVA DGITO DA CENTENA
BCF SEG_A ;APAGA SEGMENTO
BCF SEG_B ;APAGA SEGMENTO
BCF SEG_C ;APAGA SEGMENTO
BCF SEG_D ;APAGA SEGMENTO
BCF SEG_E ;APAGA SEGMENTO
BCF SEG_F ;APAGA SEGMENTO
BCF SEG_G ;APAGA SEGMENTO
BSF DIG_DEZ ;ATIVA DGITO DA DEZENA
MOVF DEZENA,W ;COPIA DEZENA PARA O W
GOTO CONV_BIN_7_SEG ;CHAMA SUBROTINA
CONT_DIG_UNI
BCF DIG_DEZ ;DESATIVA DGITO DA DEZENA
BCF SEG_A ;APAGA SEGMENTO
BCF SEG_B ;APAGA SEGMENTO
BCF SEG_C ;APAGA SEGMENTO
BCF SEG_D ;APAGA SEGMENTO
173
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 8 Frequencmetro
CONV_BIN_7_SEG
ADDWF PCL,F ;PCL = PCL + W
GOTO NUM_ZERO ;W = 0
GOTO NUM_UM ;W = 1
GOTO NUM_DOIS ;W = 2
GOTO NUM_TRES ;W = 3
GOTO NUM_QUATRO ;W = 4
GOTO NUM_CINCO ;W = 5
GOTO NUM_SEIS ;W = 6
GOTO NUM_SETE ;W = 7
GOTO NUM_OITO ;W = 8
GOTO NUM_NOVE ;W = 9
NUM_ZERO
BSF SEG_A ;ACENDE SEGMENTO
BSF SEG_B ;ACENDE SEGMENTO
BSF SEG_C ;ACENDE SEGMENTO
BSF SEG_D ;ACENDE SEGMENTO
BSF SEG_E ;ACENDE SEGMENTO
BSF SEG_F ;ACENDE SEGMENTO
GOTO SAI_INT
NUM_UM
BSF SEG_B ;ACENDE SEGMENTO
BSF SEG_C ;ACENDE SEGMENTO
GOTO SAI_INT
NUM_DOIS
BSF SEG_A ;ACENDE SEGMENTO
BSF SEG_B ;ACENDE SEGMENTO
BSF SEG_D ;ACENDE SEGMENTO
BSF SEG_E ;ACENDE SEGMENTO
BSF SEG_G ;ACENDE SEGMENTO
GOTO SAI_INT
174
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 8 Frequencmetro
NUM_TRES
BSF SEG_A ;ACENDE SEGMENTO
BSF SEG_B ;ACENDE SEGMENTO
BSF SEG_C ;ACENDE SEGMENTO
BSF SEG_D ;ACENDE SEGMENTO
BSF SEG_G ;ACENDE SEGMENTO
GOTO SAI_INT
NUM_QUATRO
BSF SEG_B ;ACENDE SEGMENTO
BSF SEG_C ;ACENDE SEGMENTO
BSF SEG_F ;ACENDE SEGMENTO
BSF SEG_G ;ACENDE SEGMENTO
GOTO SAI_INT
NUM_CINCO
BSF SEG_A ;ACENDE SEGMENTO
BSF SEG_C ;ACENDE SEGMENTO
BSF SEG_D ;ACENDE SEGMENTO
BSF SEG_F ;ACENDE SEGMENTO
BSF SEG_G ;ACENDE SEGMENTO
GOTO SAI_INT
NUM_SEIS
BSF SEG_A ;ACENDE SEGMENTO
BSF SEG_C ;ACENDE SEGMENTO
BSF SEG_D ;ACENDE SEGMENTO
BSF SEG_E ;ACENDE SEGMENTO
BSF SEG_F ;ACENDE SEGMENTO
BSF SEG_G ;ACENDE SEGMENTO
GOTO SAI_INT
NUM_SETE
BSF SEG_A ;ACENDE SEGMENTO
BSF SEG_B ;ACENDE SEGMENTO
BSF SEG_C ;ACENDE SEGMENTO
GOTO SAI_INT
NUM_OITO
BSF SEG_A ;ACENDE SEGMENTO
BSF SEG_B ;ACENDE SEGMENTO
BSF SEG_C ;ACENDE SEGMENTO
BSF SEG_D ;ACENDE SEGMENTO
BSF SEG_E ;ACENDE SEGMENTO
BSF SEG_F ;ACENDE SEGMENTO
BSF SEG_G ;ACENDE SEGMENTO
GOTO SAI_INT
NUM_NOVE
BSF SEG_A ;ACENDE SEGMENTO
BSF SEG_B ;ACENDE SEGMENTO
BSF SEG_C ;ACENDE SEGMENTO
BSF SEG_D ;ACENDE SEGMENTO
BSF SEG_F ;ACENDE SEGMENTO
BSF SEG_G ;ACENDE SEGMENTO
GOTO SAI_INT
175
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 8 Frequencmetro
Para obtermos o valor decimal do Timer 1 a partir dos valores decimais dos
registradores, multiplicamos o valor do TMR1H por 256 e somamos ao valor do TMR1L.
Por exemplo, se o valor decimal do TMR1H 35 e o valor decimal do
TMR1L 23, o valor decimal do Timer 1 igual a 35 x 256 + 23 = 8983.
Para calcularmos os valores decimais dos registradores a partir do valor
decimal do Timer 1, dividimos o valor decimal do Timer 1 por 256. A parte inteira da diviso o
valor do TMR1H. A seguir, multiplicamos a parte decimal por 256 e obtemos o valor do TMR1L.
Por exemplo, se o valor decimal do Timer 1 de 8983, dividindo esse valor
por 256, obtemos 35,08984375. Portanto, TMR1H = 35. Multiplicando 0,08984375 por 256, obtemos
23, que o valor do TMR1L.
No nosso projeto, o Timer 1 ser incrementado continuamente. Quando
ocorrer uma captura, ele estar com um valor qualquer entre 0 e 65.535.
Vamos supor que na primeira captura, o valor do Timer 1 seja igual a 34.328
(TMR1H = 134 e TMR1L = 24) e que na segunda captura, o valor do Timer 1 seja igual a 43.436
(TMR1H = 169 e TMR1L = 172).
Se calcularmos a diferena entre esses dois valores, obtemos 9.108. Ento, o
Timer 1 teria sido incrementado esse nmero de vezes entre as duas capturas. Mas, tambm pode ser
que ele tenha sido incrementado 74.644 vezes. Isso porque ele pode ter estourado entre as duas
capturas. Partindo do valor 34.328, com 31.208 incrementos ele ir estourar (65.536 34.328).
Somando 31.208 com 43.436, obtemos que ele foi incrementado 74.644 vezes.
Para sabermos se o Timer 1 estourou entre as capturas, usaremos a varivel
REG3B, que iremos incrementar a cada vez que o Timer 1 estourar. Essa varivel ser como se fosse
o terceiro registrador do Timer1.
Assim, no haver dvida quanto ao nmero de incrementos que ocorreram
no Timer 1 entre as duas capturas, pois, poderemos contar at 16.777.215 incrementos, sendo que o
nmero mximo de incrementos ser de 1.000.000 quando a frequncia do sinal for de 1 Hz.
Para obtermos o valor decimal do Timer 1 a partir do valor decimal desses
trs registradores, multiplicamos o valor do REG3B por 65.536, o valor do TMR1H por 256 e
somamos os resultados ao valor do TMR1L.
No exemplo anterior, onde na 2 captura, TMR1H = 169 e TMR1L = 172, se o
REG3 for igual a 1, teremos o seguinte valor para o Timer 1: 1 x 65536 + 169 x 256 + 172 = 108.972.
Subtraindo o valor do Timer 1 na 1 captura, que era igual a 34.328, obtemos 74.644.
A rotina de interrupo do Timer 1 consiste em apagar o flag TMR1IF e
incrementar a varivel REG3B:
INT_TIMER_1
176
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 8 Frequencmetro
INT_CCP
CLRF PIR1,CCP1IF ;APAGA FLAG
PRIMEIRA_CAPTURA
MOVF CCPR1L,W ;W = CCPR1L
MOVWF REG1A ;REG1A = CCPR1L
MOVF CCPR1H,W ;W = CCPR1H
MOVWF REG2A ;REG2A = CCPR1H
CLRF REG3B ;REG3B = 0
GOTO SAI_INT ;SAI DA INTERRUPO
177
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 8 Frequencmetro
MOVLW .2 ;NO, W = 2
XORWF CAPTURA,W ;W = CAPTURA XOR 2
BTFSC STATUS,Z ;CAPTURA = 2?
GOTO CALC_INC ;SIM
CALC_INC
MOVF CCPR1L,W ;W = CCPR1L
MOVWF REG1B ;REG1B = CCPR1L
MOVF CCPR1H,W ;W = CCPR1H
MOVWF REG2B ;REG2B = CCPR1H
1 6 4 -
0 3 2
2 =
1 6 4 -
0 3 2
1 3 2 =
178
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 8 Frequencmetro
1 9 2 -
0 6 5
=
1 9 2 -
1 8 12
0 6 5
7 =
1 9 2 -
1 8 12
0 6 5
2 7 =
E, finalmente a centena:
1 9 2 -
1 8 12
0 6 5
1 2 7 =
1 0 2 -
0 3 4
=
179
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 8 Frequencmetro
1 0 2 -
0 10 2
0 3 4
=
1 0 2 -
0 10 2
0 9 12
0 3 4
8 =
1 0 2 -
0 10 2
0 9 12
0 3 4
6 8 =
1 0 2 -
0 10 2
0 9 12
0 3 4
0 6 8 =
180
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 8 Frequencmetro
REG1B -
REG1A
RESULTADO RESULTADO
POSITIVO NEGATIVO
REG2B - DECREMENTA
REG2A REG2B
RESULTADO RESULTADO
REG2B 255 REG2B = 255
POSITIVO NEGATIVO
OPERAO
CONCLUDA
Figura 2
181
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 8 Frequencmetro
182
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 8 Frequencmetro
TST_NR_INC
MOVF REG2B,W ;W = REG2B
SUBLW .3 ;W = 3 REG2B
183
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 8 Frequencmetro
TST_MENOR_3
MOVF REG2B,W ;W = REG2B
SUBLW .2 ;W = 2 REG2B
BTFSC STATUS,C ;REG2B MENOR DO QUE 3?
GOTO SAI_INT ;SIM
Caso REG1B seja igual ou menor do que 232, o resultado ser positivo, o que
indica que o nmero de incrementos menor do que 1.000 e, por isso, samos da interrupo:
Se REG1B for maior do que 232, o resultado ser negativo, o que significa
que o nmero de incrementos maior do que 1.000, ento, zeramos a varivel CAPTURA, e testamos
se o flag CALCULAR_FREQ est setado:
184
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 8 Frequencmetro
SAI_INT
SWAPF STATUS_TEMP,W ;SWAP EM STATUS_TEMP
MOVWF STATUS ;RECUPERA STATUS
SWAPF W_TEMP,F ;SWAP EM W_TEMP
SWAPF W_TEMP,W ;RECUPERA W
RETFIE ;RETORNA DA INTERRUPO
185
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 8 Frequencmetro
186
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 8 Frequencmetro
INICIA_DIVISAO
CLRF UNI_TEMP ;UNI_TEMP = 0
CLRF DEZ_TEMP ;DEZ_TEMP = 0
CLRF CEN_TEMP ;CEN_TEMP = 0
CLRF MIL_TEMP ;MIL_TEMP = 0
187
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 8 Frequencmetro
Se o valor de MILHAO_4 for igual a 255, a diviso terminou, caso contrrio, foi
possvel efetuar a diviso e ento entramos na subrotina INC_UNI_TEMP:
188
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 8 Frequencmetro
MOVLW .10 ;W = 10
XORWF MIL_TEMP,W ;W = MIL_TEMP XOR 10
BTFSS STATUS,Z ;MIL_TEMP = 10?
GOTO CICLO_DE_SUBTRACAO ;NO
CLRF MIL_TEMP ;SIM, MIL_TEMP = 0
GOTO DIVISAO_TERMINOU
189
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 8 Frequencmetro
;*************************************************************************************************
END ;FIM DO PROGRAMA
;***********************************************************************************************
; CONFIGURACAO DOS REGISTRADORES DE USO ESPECFICO
INICIO
Configuramos o registrador TRISA para que os pinos RA0, RA1, RA2 e RA3
sejam sadas e os demais entradas e o TRISB para que o pino RB3 seja entrada e os demais sadas:
MOVLW B'00000101'
MOVWF PIE1 ;HABILITA AS INTERRUPES DO TIMER 1 E DO MDULO CCP
190
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 8 Frequencmetro
MOVLW B'00000001'
MOVWF T1CON ;HABILITA TIMER 1 COM PRESCALER DE 1:1
MOVLW B'00000101'
MOVWF CCP1CON ;HABILITA MODO CAPTURE A CADA MUDANA DE BAIXO PARA ALTO
;***********************************************************************************************
; INICIALIZACAO DAS VARIAVEIS
;***********************************************************************************************
; PROGRAMA: FREQUENCIMETRO
; VERSO 1.0
; DESENVOLVIDO POR: MULDER_FOX
; DATA DE CONCLUSO: / /
;***********************************************************************************************
;***********************************************************************************************
; BITS DE CONFIGURAO
__CONFIG _INTOSC_OSC_NOCLKOUT & _WDT_ON & _PWRTE_ON & _MCLRE_OFF & _BOREN_OFF &
_LVP_OFF & _CP_OFF & DATA_CP_OFF
191
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 8 Frequencmetro
;**********************************************************************************************
; PAGINACAO DE MEMORIA
;***********************************************************************************************
; VARIVEIS
;***********************************************************************************************
; SADAS
192
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 8 Frequencmetro
;***********************************************************************************************
; FLAGS
;***********************************************************************************************
; VETOR DE RESET
;*************************************************************************************************
; ROTINA DE INTERRUPO
INT_TIMER_0
BCF INTCON,T0IF ;APAGA FLAG
DECFSZ DISP_DELAY,F ;DECREMENTA DISP_DELAY. DISP_DELAY = 0?
GOTO TESTA_DIG_ATIVO ;NO
BSF ATUALIZA_DISP ;SIM, SETA FLAG
TESTA_DIG_ATIVO
BTFSC DIG_MIL ;DGITO DO MILHAR EST ATIVADO?
GOTO CONT_DIG_CEN ;SIM
BTFSC DIG_CEN ;NO, DGITO DA CENTENA EST ATIVADO?
GOTO CONT_DIG_DEZ ;SIM
BTFSC DIG_DEZ ;NO, DGITO DA DEZENA EST ATIVADO?
GOTO CONT_DIG_UNI ;SIM
GOTO CONT_DIG_MIL ;NAO
CONT_DIG_CEN
BCF DIG_MIL ;DESATIVA DGITO DO MILHAR
BCF SEG_A ;APAGA SEGMENTO
BCF SEG_B ;APAGA SEGMENTO
BCF SEG_C ;APAGA SEGMENTO
BCF SEG_D ;APAGA SEGMENTO
BCF SEG_E ;APAGA SEGMENTO
BCF SEG_F ;APAGA SEGMENTO
BCF SEG_G ;APAGA SEGMENTO
BSF DIG_CEN ;ATIVA DGITO DA CENTENA
MOVF CENTENA,W ;COPIA CENTENA PARA O W
GOTO CONV_BIN_7_SEG ;CHAMA SUBROTINA
193
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 8 Frequencmetro
CONT_DIG_DEZ
BCF DIG_CEN ;DESATIVA DGITO DA CENTENA
BCF SEG_A ;APAGA SEGMENTO
BCF SEG_B ;APAGA SEGMENTO
BCF SEG_C ;APAGA SEGMENTO
BCF SEG_D ;APAGA SEGMENTO
BCF SEG_E ;APAGA SEGMENTO
BCF SEG_F ;APAGA SEGMENTO
BCF SEG_G ;APAGA SEGMENTO
BSF DIG_DEZ ;ATIVA DGITO DA DEZENA
MOVF DEZENA,W ;COPIA DEZENA PARA O W
GOTO CONV_BIN_7_SEG ;CHAMA SUBROTINA
CONT_DIG_UNI
BCF DIG_DEZ ;DESATIVA DGITO DA DEZENA
BCF SEG_A ;APAGA SEGMENTO
BCF SEG_B ;APAGA SEGMENTO
BCF SEG_C ;APAGA SEGMENTO
BCF SEG_D ;APAGA SEGMENTO
BCF SEG_E ;APAGA SEGMENTO
BCF SEG_F ;APAGA SEGMENTO
BCF SEG_G ;APAGA SEGMENTO
BSF DIG_UNI ;ATIVA DGITO DA UNIDADE
MOVF UNIDADE,W ;COPIA UNIDADE PARA O W
GOTO CONV_BIN_7_SEG ;CHAMA SUBROTINA
CONT_DIG_MIL
BCF DIG_UNI ;DESATIVA DGITO DA UNIDADE
BCF SEG_A ;APAGA SEGMENTO
BCF SEG_B ;APAGA SEGMENTO
BCF SEG_C ;APAGA SEGMENTO
BCF SEG_D ;APAGA SEGMENTO
BCF SEG_E ;APAGA SEGMENTO
BCF SEG_F ;APAGA SEGMENTO
BCF SEG_G ;APAGA SEGMENTO
BSF DIG_MIL ;ATIVA DGITO DA MILHAR
MOVF MILHAR,W ;COPIA MILHAR PARA O W
GOTO CONV_BIN_7_SEG ;CHAMA SUBROTINA
CONV_BIN_7_SEG
ADDWF PCL,F ;PCL = PCL + W
GOTO NUM_ZERO ;W = 0
GOTO NUM_UM ;W = 1
GOTO NUM_DOIS ;W = 2
GOTO NUM_TRES ;W = 3
GOTO NUM_QUATRO ;W = 4
GOTO NUM_CINCO ;W = 5
GOTO NUM_SEIS ;W = 6
GOTO NUM_SETE ;W = 7
GOTO NUM_OITO ;W = 8
GOTO NUM_NOVE ;W = 9
NUM_ZERO
BSF SEG_A ;ACENDE SEGMENTO
BSF SEG_B ;ACENDE SEGMENTO
BSF SEG_C ;ACENDE SEGMENTO
BSF SEG_D ;ACENDE SEGMENTO
BSF SEG_E ;ACENDE SEGMENTO
BSF SEG_F ;ACENDE SEGMENTO
GOTO SAI_INT
194
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 8 Frequencmetro
NUM_UM
BSF SEG_B ;ACENDE SEGMENTO
BSF SEG_C ;ACENDE SEGMENTO
GOTO SAI_INT
NUM_DOIS
BSF SEG_A ;ACENDE SEGMENTO
BSF SEG_B ;ACENDE SEGMENTO
BSF SEG_D ;ACENDE SEGMENTO
BSF SEG_E ;ACENDE SEGMENTO
BSF SEG_G ;ACENDE SEGMENTO
GOTO SAI_INT
NUM_TRES
BSF SEG_A ;ACENDE SEGMENTO
BSF SEG_B ;ACENDE SEGMENTO
BSF SEG_C ;ACENDE SEGMENTO
BSF SEG_D ;ACENDE SEGMENTO
BSF SEG_G ;ACENDE SEGMENTO
GOTO SAI_INT
NUM_QUATRO
BSF SEG_B ;ACENDE SEGMENTO
BSF SEG_C ;ACENDE SEGMENTO
BSF SEG_F ;ACENDE SEGMENTO
BSF SEG_G ;ACENDE SEGMENTO
GOTO SAI_INT
NUM_CINCO
BSF SEG_A ;ACENDE SEGMENTO
BSF SEG_C ;ACENDE SEGMENTO
BSF SEG_D ;ACENDE SEGMENTO
BSF SEG_F ;ACENDE SEGMENTO
BSF SEG_G ;ACENDE SEGMENTO
GOTO SAI_INT
NUM_SEIS
BSF SEG_A ;ACENDE SEGMENTO
BSF SEG_C ;ACENDE SEGMENTO
BSF SEG_D ;ACENDE SEGMENTO
BSF SEG_E ;ACENDE SEGMENTO
BSF SEG_F ;ACENDE SEGMENTO
BSF SEG_G ;ACENDE SEGMENTO
GOTO SAI_INT
NUM_SETE
BSF SEG_A ;ACENDE SEGMENTO
BSF SEG_B ;ACENDE SEGMENTO
BSF SEG_C ;ACENDE SEGMENTO
GOTO SAI_INT
NUM_OITO
BSF SEG_A ;ACENDE SEGMENTO
BSF SEG_B ;ACENDE SEGMENTO
BSF SEG_C ;ACENDE SEGMENTO
BSF SEG_D ;ACENDE SEGMENTO
BSF SEG_E ;ACENDE SEGMENTO
195
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 8 Frequencmetro
NUM_NOVE
BSF SEG_A ;ACENDE SEGMENTO
BSF SEG_B ;ACENDE SEGMENTO
BSF SEG_C ;ACENDE SEGMENTO
BSF SEG_D ;ACENDE SEGMENTO
BSF SEG_F ;ACENDE SEGMENTO
BSF SEG_G ;ACENDE SEGMENTO
GOTO SAI_INT
INT_TIMER_1
INT_CCP
PRIMEIRA_CAPTURA
MOVF CCPR1L,W ;W = CCPR1L
MOVWF REG1A ;REG1A = CCPR1L
MOVF CCPR1H,W ;W = CCPR1H
MOVWF REG2A ;REG2A = CCPR1H
CLRF REG3B ;REG3B = 0
GOTO SAI_INT ;SAI DA INTERRUPO
CALC_INC
MOVF CCPR1L,W ;W = CCPR1L
MOVWF REG1B ;REG1B = CCPR1L
MOVF CCPR1H,W ;W = CCPR1H
MOVWF REG2B ;REG2B = CCPR1H
MOVF REG1A,W ;W = REG1A
SUBWF REG1B,F ;REG1B = REG1B - REG1A
BTFSC STATUS,C ;RESULTADO NEGATIVO?
GOTO SEG_SUB ;NO
DECF REG2B,F ;SIM, DECREMENTA REG2B
MOVLW .255 ;W = 255
XORWF REG2B,W ;W = REG2B XOR 255
196
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 8 Frequencmetro
TST_NR_INC
MOVF REG2B,W ;W = REG2B
SUBLW .3 ;W = 3 REG2B
BTFSC STATUS,C ;REG2B MAIOR DO QUE 3?
GOTO TST_MENOR_3 ;NAO
CLRF CAPTURA ;SIM, CAPTURA = 0
BTFSC CALCULAR_FREQ ;FREQUNCIA SENDO CALCULADA?
GOTO SAI_INT ;SIM, SAI DA INTERRUPO
GOTO COPIA_NR_INC ;NAO, DESVIA
TST_MENOR_3
MOVF REG2B,W ;W = REG2B
SUBLW .2 ;W = 2 REG2B
BTFSC STATUS,C ;REG2B MENOR DO QUE 3?
GOTO SAI_INT ;SIM, SAI DA INTERRUPO
MOVF REG1B,W ;NO, W = REG1B
SUBLW .232 ;W = 232 REG1B
BTFSC STATUS,C ;REG1B MAIOR DO QUE 232?
GOTO SAI_INT ;NO, SAI DA INTERRUPO
CLRF CAPTURA ;SIM, CAPTURA = 0
BTFSC CALCULAR_FREQ ;FREQUNCIA SENDO CALCULADA?
GOTO SAI_INT ;SIM, SAI DA INTERRUPO
GOTO COPIA_NR_INC ;NAO, DESVIA
SAI_INT
SWAPF STATUS_TEMP,W ;SWAP EM STATUS_TEMP
MOVWF STATUS ;RECUPERA STATUS
SWAPF W_TEMP,F ;SWAP EM W_TEMP
SWAPF W_TEMP,W ;RECUPERA W
RETFIE ;RETORNA DA INTERRUPO
;***********************************************************************************************
; CONFIGURACAO DOS REGISTRADORES DE USO ESPECFICO
INICIO
197
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 8 Frequencmetro
;***********************************************************************************************
; INICIALIZACAO DAS VARIAVEIS
;***********************************************************************************************
PRINCIPAL ;ROTINA PRINCIPAL DO PROGRAMA
INICIA_DIVISAO
CLRF UNI_TEMP ;UNI_TEMP = 0
CLRF DEZ_TEMP ;DEZ_TEMP = 0
CLRF CEN_TEMP ;CEN_TEMP = 0
CLRF MIL_TEMP ;MIL_TEMP = 0
CICLO_DE_SUBTRACAO
CLRWDT ;LIMPA O WDT
MOVF REG1C,W ;W = REG1C
SUBWF MILHAO_1,F ;MILHAO_1 = MILHAO_1 - REG1C
BTFSC STATUS,C ;RESULTADO NEGATIVO?
GOTO SEG_DIV_1 ;NO
DECF MILHAO_2,F ;SIM, DECREMENTA MILHAO_2
MOVLW .255 ;W = 255
XORWF MILHAO_2,W ;W = MILHAO_2 XOR 255
198
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 8 Frequencmetro
199
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 8 Frequencmetro
DIVISAO_TERMINOU
BCF CALCULAR_FREQ ;APAGA FLAG
BTFSS ATUALIZA_DISP ;ATUALIZAR O DISPLAY?
GOTO PRINCIPAL ;NO
BCF ATUALIZA_DISP ;SIM, APAGA FLAG
MOVF UNI_TEMP,W ;W = UNI_TEMP
MOVWF UNIDADE ;UNIDADE = UNI_TEMP
MOVF DEZ_TEMP,W ;W = DEZ_TEMP
MOVWF DEZENA ;DEZENA = DEZ_TEMP
MOVF CEN_TEMP,W ;W = CEN_TEMP
MOVWF CENTENA ;CENTENA = CEN_TEMP
MOVF MIL_TEMP,W ;W = MIL_TEMP
MOVWF MILHAR ;MILHAR = MIL_TEMP
GOTO PRINCIPAL
;*************************************************************************************************
END ;FIM DO PROGRAMA
200
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 8 Frequencmetro
Figura 3
Com essa configurao, o pino RB3 ficar alternando de nvel a cada 833
ciclos de instruo, ou seja, a cada 833 microssegundos, o que corresponde a um sinal de frequncia
de 600 Hz. Ou seja, estamos simulando que um sinal de 600 Hz est presente no pino RB3.
Remova o breakpoint do incio da rotina de interrupo e insira um na
primeira instruo da rotina de interrupo do mdulo CCP (BCF PIR1,CCP1IF).
Clique no boto Run.
Quando a simulao parar no breakpoint, v clicando no boto Step Into.
Repare que executada a subrotina da primeira captura.
Clique no boto Run novamente.
Quando a simulao parar no breakpoint, repare que, por ser a 2 captura,
executada a subrotina CALC_INC. Depois, em TST_NR_INC, verificado que o nmero de
incrementos maior do que 1.000, e, ento, o flag para calcular a frequncia setado.
201
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 8 Frequencmetro
Figura 4
Para a frequncia de 600 Hz, o clculo foi feito com base no nmero de
incrementos entre a 1 e a 2 capturas.
Vamos testar com um sinal de 3.012 Hz, cujo perodo de 332
microssegundos. Sendo maior do que 1.000 Hz, o clculo ser feito com base no nmero de
incrementos entre a 1 e a 101 capturas.
No Stimulus, na aba Clock Stimulus, mude o valor das colunas Low
Cyc e High Cyc para 166, valor, em microssegundos, de meio ciclo da frequncia de 3.012 Hz e
clique em Save e em Apply.
Clique no boto Reset da barra de ferramentas do simulador.
Insira um breakpoint na linha da primeira istruo da rotina de interrupo do
mdulo CCP.
Clique no boto Run.
202
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 8 Frequencmetro
Figura 5
203
Tutorial de Programao Assembly para Microcontroladores PIC - Parte 8 Frequencmetro
Figura 6
Aqui termina a parte 8 do tutorial. Espero que ela tenha sido til para voc.
Na 9 parte, vamos usar o PIC16F628A para controlar um LED RGB, onde
iremos gerar 3 sinais PWM por software. At l.
204