Sei sulla pagina 1di 51

Respostas dos exerccios

Captulo 1: Arquitetura Bsica de um


Microcomputador
1. Processar informaes. O computador recebe as informaes do
usurio, processa e retorna ao usurio o resultado do processamento.
2. Na arquitetura Von-Neumann, as memrias de programa e de dados
compartilham os barramentos de endereos e de dados. Na
arquitetura Harvard, as memrias de programa e de dados possuem
barramentos de endereos e de dados separados. Isto permite que
enquanto uma instruo esteja sendo processada, uma outra instruo
possa estar sendo buscada na memria de programa.
3. Genrenciar todo o sistema e executar os programas.
4. Como um conjunto de localidades, cada uma com o seu respectivo
endereo.
5. um dispositivo responsvel pela entrada e sada de informaes do
sistema.
6. Converter informaes codificadas em um sistema qualquer para o
sistema binrio e vice-versa.
7. Uma CPU tipo RISC possui um set de instrues reduzido, ou seja, com
poucas instrues. Uma CPU tipo CISC possui um set de instrues
ampliado, normalmente com mais de cem instrues.
8. Um Microcontrolador possui CPU, memrias e dispositivos de I/O. Um
microprocessador normalmente s possui CPU.

Captulo 2: Microcontroladores
1. ROM, OTP (PROM), EEPROM ou Flash ROM
2. Os registradores de uso geral armazenam dados temporrios,
enquanto que os registradores com finalidade especficas so
utilizados em tarefas especficas.
3. E
4. Gerar a base de tempo para que a CPU possa executar as instrues
do programa. Uma instruo ser executada em um ou mais ciclos de
clock.

Respostas dos execcios

5. Os microcontroladores da famlia PIC dividem a freqncia do oscilador


principal por quatro para dar origem a um sinal com freqncia quatro
vezes menor. Este novo sinal chamado de ciclo de instruo. Cada
instruo executada em um ciclo de instruo, com exceo das
instrues que provocam desvio, como CALL e GOTO, que so
executadas em dois ciclos de instruo.
6. Oito maneiras diferentes. Esta
configurao.

feita por meio

dos bits de

7. Primeiro a eficcia, depois o custo financeiro do projeto.


8. 15pF a 30pF.

Captulo 3: Mapeamento de memria


1. Flash ROM, uasada para armazenar o programa. RAM (SRAM), Usada
pelos registradores de uso geral e pelos registradores com finalidades
especficas. EEPROM, Usada para armazenar dados que no podem
ser perdidos memso com a alimentao desligada.
2. 2048, estando 2045 disponveis para o armazenamento de instrues.
3. 224 posies. O banco 0 possui 96 posies (20h - 7Fh), o banco 1
possui 80 posies (A0h - EFh), o banco 2 possui 48 posies (120h 14Fh). Observe tambm que foi criado um espelho nos outros bancos
das ltimas dezesseis posies de memria do banco 0 (70h - 7F0).
4. Endereamento direto e endereamento indireto.
5. 128 posies. A faixa de endereos vai de 00h at 7Fh.
6. O bit Z informa que o resultado da ltima operao mamtemtica foi
0. O bit C utilizado nas instrues de soma para informar que houve
um estouro do oitavo para o nono bit.
7. 0Bh, 8Bh, 10Bh e 18Bh.
8. Chave individual de habilitao da interrupo de estouro do TMR1

Captulo 4: Set de instrues


1. Programao.
2. OP. Code ou cdigo de operao. Este campo define a tarefa que
ser executada pela CPU. O outro campo o operando. O operando
o complemento da instruo. Este pode ser um dado, um registrador
ou um um bit de um registrador. Uma instruo pode tambm no ter
operando, como o caso da instruo RETFIE.
3. 35 instrues. Elas esto divididas em quatro grupos: operaes com
registradores, operaes com bits, operaes com literais e operaes
de controle.

Microcontroladores PIC16F628A/648A - Uma Abordagem prtica e Objetiva

4. C
5. BSF f,b
6. ADDLW

7. Complementa todos os bits do registrador especificado no operando da


instruo, ou seja, o bit que est em nvel um passa para o nvel zero e
vice-versa..
8. O contedo do reigstrador W copiado para o registrador especificado
no operando da instruo.

Captulo 5: Portas de I/O


1. Em dois grupos: PORTA e PORTB. Cada PORT possui 8 bits, com cada
bit associado a um pino do MCU.
2. TRISA e TRISB. Quando setado um determinado bit do registrador
TRISx, o respectivo pino daquele PORTx ser configurado como
entrada. Da mesma forma, quando um determinado bit do registrador
TRISx apagado, o respectivo pino daquele PORTx configurado como
sada.
3. RA5.
4. RB5.
5. Um bit de cada vez ou todos os bits de uma s vez.
6. O TRISA se encontra no banco 1, ocupando o endereo 85h. O TRISB
pode ser acessado nos bancos 1 e 3, ocupando respectivamente os
endereos 86h e 186h.

Captulo 6: MPLAB IDE Desenvolvendo Aplicaes


1. A linguagem de mquina representa as instrues pelos seus
respectivos cdigos binrios. A linguagem assembly substitui o cdigo
binrio de cada instruo por uma string, chamada de mnemnico. O
mnemnico est relacionado com a tarefa executada pela instruo.
2. O programa-fonte a forma como o programa escrito em linguagem
assembly, sendo apenas um arquivo de texto. No programa objeto, as
instrues do programa so representadas em linguagem de mquina.
Respostas dos execcios

O programa objeto que transferido para a memria de programa


do MCU.
3. Label, mnemnico, operando, comentrio e diretiva.
4. Criar programas em Assembly, efetuar a simulao e o debug de
programas e gravar programas no chip.
5. Inicializar o MPLAB IDE, criar o programa-fonte, criar o projeto, montar
o projeto, debugar o projeto e gravar o programa no chip.
6. Project Wizard
7. Gerar o programa objeto a partir do programa-fonte.
8. possvel criar vrias verses de um mesmo programa-fonte e
associar ao projeto a verso que for conveniente.

Captulo 7: Criando Programa em Assembly


1. O arquivo include um arquivo de texto chamado arquivo de
definies, no qual so definidos os nomes e os endereos de todos os
SFRs, alm de uma srie de outras definies necessrias para a sua
utilizao, facilitando, deste modo, a montagem do programa-fonte.
Um programa-fonte pode ser editado sem o arquivo include, mas neste
caso, o programador no poder se referir no programa aos
registradores pelos seus respectivos nomes, a no ser que eles sejam
declarados no programa, por exemplo, por meio da diretiva EQU.
2. Decimal, binrio, hexadecimal, octal e ASCII.
3. A varivel representa uma localidade de memria vlida, enquanto
que uma constante apenas um valor numrico.
4. RP1=0 e RP0=1.
5. um conjunto de instrues que executam uma tarefa definida dentro
do programa.
6. Representar graficamente o programa. Isto facilita o entendimento da
tarefa que ser realizada pelo programa.

Captulo 8: Gravando o PIC


1. Tipo de oscilador, Watchdog Timer (WDT), Power Up Timer, Brown Out
Detect, Master Clear Enable, Low Voltage Program, Data EE read
Protect e Code Protect. Os bits de configurao ficam armazenados no
registrador CONFIG, que ocupa o endereo de memria 2007h. Este
registrador s pode ser acessado na hora da gravao do programa no
MCU.

Microcontroladores PIC16F628A/648A - Uma Abordagem prtica e Objetiva

2. __IDLOCS

H'2536'

3. uma tcnica utilizada na verificao de erros, que consiste em somar


todos os valores numricos armazenados na memria de programa do
chip com os bits de configurao mais o ID gravado no chip. O
resultado da soma o que ns chamamos de checksun.
4. PICSTART Plus
5. Esta opo controla a velocidade com que os dados so enviados para
o programador. Alguns computadores no conseguem gravar o
programa no MCU com sucesso quando a velocidade e alta. Neste caso
necessrio diminuir a velocidade do Retardo de I/O.
6. Permitir que o IC-Prog funcione com o sistema operacional Windows
NT, Windows 2000 ou Windows XP.
7. Abrir o arquivo .HEX e selecionar o componente para o qual o
programa foi escrito. No caso do PIC16F628A, deve ser selecionado o
PIC16F628. Verifique os bits de configurao e faa os ajustes
necessrios. Finalmente, clique no cone indicado para dar incio ao
processo de gravao. Tambm pode ser dado incio ao processo de
gravao se for digitada a tecla F5 ou se for dado um clique no menu
Comando/Programar Tudo.
8. Encaix-lo de forma correta. Um erro comum encaixar o MCU ao
contrrio. Coloque o MCU num soquete para proteger os seus pinos.

Captulo 9: Caractersticas Especiais


1. um evento de hardware que quando ocorre provoca um desvio no
programa para a localidade 0x04, na qual o evento ser tratado. O
desvio s ocorre se a interrupo estiver habilitada.
2. 10.

3. Ligar a chave individual de interrupo (INTCON ou PIE1), ligar a chave


de habilitao de interrupo de perifricos, se fonte for um perifrico,
o bit PEIE (INTCON<6>) e ligar a chave geral de tratamento de
interrupo, o bit GIE(INTCON<7>).
4. 0x004.
5. Detectar que o evento originou a interrupo efetuando testes nos bits
de sinalizao de interrupo, e salvar os contedos dos registradores
W e STATUS.
6. Reset por meio do pino /MCLR, Timeout gerado pelo WDT e por uma
interrupo.
7. Proteger o sistema contra possveis travamentos que possam ocorrer

Respostas dos execcios

devido a paralizao do oscilador principal. O WDT um circuito


temporiador que continua em funcionamento mesmo com o oscilador
principal parado, pois ele possui um oscilador prprio. Se aps um
determinado tempo, definido por programao, o WDT no for zerado,
ser gerado um Timeout que provocar um reset no sistema, fazendo
com que ele volte a funcionar.
8. Pela instruo SLEEP ou pela instruo CLRWDT.
9. D.
10. Mantr a CPU em reset at que VDD alcance tenso suficiente quando
a tenso de alimentao ligada, para que o MCU possa funcionar
corretamente.

Captulo 10: Tcnicas de Programao


1. Contador de Programa (PC).
2. Desvio incondilcional, desvio condicional, reset e interrupo.
3. Armazenar o endereo de retorno de uma sub-rotina. O stack possui 8
nveis de pilha.
4. para localidade 0x00 da memria de programa.
5. ADDLW k, ADDWF f,d, INCF f,d e INCFSZ f,d.
6. SUBLW k, SUBWF f,d, DECF f,d e DECFSZ f,d.
7. Resultado positivo ou zero: C=1. Resultado negativo: C=0.
8. Inverter os nveis lgicos de todos os bits e depois somar uma unidade.
9. IORLW k, IORWF
f,d.

f,d, ANDLW

k, ANDWF

f,d, XORLW

k, e XORWF

10. Consiste em adicionar um bit ao byte de forma que a soma de todos os


bits do byte iguais a 0 ou iguais a 1, incluindo o bit de paridade, seja
par ou mpar. O programador vai optar pela utilizao da paridade par
ou mpar.
11. a) 0101 10002, b) 0100 1000 01012 e c) 0001100002.
12. FSR e INDF. O FSR armazena o endereo da localidade de memria
que ser acessada, enquanto que o INDF armazena o contedo
armazenado no endereo de memria apontado por FSR.
13. IRP.
14. Aps a soma ele no pode estourar, sob o risco de ocorrer um desvio
para uma localidade de memria no desejada.
15. Dois LEDs acionados por dois botes
Este programa faz com que o boto 1(BT1) acione o LED 1 e o boto 2
(BT2) acione o LED 2 de forma independente e com debounce. Assim como no

Microcontroladores PIC16F628A/648A - Uma Abordagem prtica e Objetiva

programa 1, aps o tratamento de cada boto ele tem que ser solto para que
os botes voltem a ser rastreados.

;
*******************************************************************************************************

Respostas dos execcios

**************************************
;
PROGRAMA - DOIS LEDS ACIONADOS POR DOIS BOTOES
;
DESENVOLVIDO POR WAGNER DA SILVA ZANCO
;
VERSAO 1.0
;
23/06/2003
;
*******************************************************************************************************
***************************************
;
ARQUIVOS DE DEFINICOES
;
*******************************************************************************************************
**************************************
#INCLUDE <P16F628A.INC>
;ARQUIVO PADRAO MICROCHIP PARA O PIC16F628A
;
*******************************************************************************************************
**************************************
;
BITS DE CONFIGURACAO
;
*******************************************************************************************************
**************************************
__CONFIG
_BOREN_ON&_CP_ON&_PWRTE_ON&_WDT_OFF&_LVP_OFF&_DATA_CP_OFF&_MCLRE_ON&_XT_OSC
;
*******************************************************************************************************
**************************************
;
PAGINACAO DA MEMORIA
;
*******************************************************************************************************
**************************************
;COMANDOS PARA ALTERACAO DE PAGINA DE MEMORIA
#DEFINE
#DEFINE

BANK0
BANK1

BCF STATUS,RP0
BSF STATUS,RP0

;SETA BANCO 0 DE MEMORIA


;SETA BANCO 1 DE MEMORIA

;
*******************************************************************************************************
**************************************
;
VARIAVEIS
;
*******************************************************************************************************
**************************************
;ENDEREOS DAS VARIAVEIS UTILIZADAS PELO SISTEMA
CBLOCK
ENDC

0x20
DEBOUNCE
COUNT

;ENDERECO INICIAL DA MEMORIA DO USUARIO


;0x20, USADO NO DEBOUNCE
;0x21, USADO NO DEBOUNCE
;FIM DO BLOCO DE MEMORIA

;
*******************************************************************************************************
**************************************
;
CONSTANTES
;******************************************************************************************************
***************************************
;CONSTANTES UTILIZADAS PELO SISTEMA
DEB
DEB_CONT

EQU .200
EQU .50

;INICIALIZACAO DO REG DEBOUNCE


;INICIALIZACAO DO REG COUNT

;
*******************************************************************************************************
**************************************

Microcontroladores PIC16F628A/648A - Uma Abordagem prtica e Objetiva

;
ENTRADAS
;
*******************************************************************************************************
**************************************
;PINOS QUE SERAO UTILIZADOS COMO ENTRADA
#DEFINE

BOTAO1

PORTA,1

;0 --> PRESSIONADO
;1 --> LIBERADO

#DEFINE

BOTAO2

PORTA,2

;0 --> PRESSIONADO
;1 --> LIBERADO

;
*******************************************************************************************************
**************************************
;
SAIDAS
;
*******************************************************************************************************
**************************************
;PINOS QUE SERAO UTILIZADOS COMO SAIDA
#DEFINE

LED1

PORTB,0

;0 --> APAGADO
;1 --> ACESO

#DEFINE

LED2

PORTB,1

;0 --> APAGADO
;1 --> ACESO

;
*******************************************************************************************************
**************************************
;
VETOR DE RESET
;
*******************************************************************************************************
**************************************
ORG
0x00
;ENDERECO INICIAL DE PROCESSAMENTO
GOTO
INICIO
;
*******************************************************************************************************
**************************************
;
INTERRUPCAO
;
*******************************************************************************************************
**************************************
;
AS INTERRUPCOES NAO SERAO UTILIZADAS
ORG
RETFIE

0x04

;ENDERECO INICAL DA INTERRUPCAO


;RETORNA DA INTERRUPCAO

;
*******************************************************************************************************
**************************************
;
INICIO
;
*******************************************************************************************************
**************************************
INICIO
BANK1
MOVLW
MOVWF

;ALTERA PARA BANCO1


B'00000110'
TRISA

;DEFINE RA1 e RA2 COMO ENTRADA e DEMAIS


;COMO SAIDA

Respostas dos execcios

MOVLW
MOVWF

B'00000000'
TRISB

MOVLW
MOVWF

B'10000001'
OPTION_REG

MOVLW
MOVWF

B'00000000'
INTCON

BANK0
MOVLW
MOVWF

B'00000111'
CMCON

;DEFINE O PORTB COMO SAIDA


;PULL_UPS DESABILIADOS <7>
;DEMAIS BITS IRRELEVANTES
;CHAVE GERAL DE INTERRUPCOES DESLIGADAS<7>
;DEMAIS BITS IRRELEVANTES
;CONFIGURA RA3:RA0 COM I/O<2:0>

;
*******************************************************************************************************
**************************************
;
INICIALIZACAO DAS VARIAVEIS
;
*******************************************************************************************************
**************************************
CLRF
PORTA
;LIMPA PORTA
CLRF
PORTB
;LIMPA PORTB
;
*******************************************************************************************************
**************************************
MAIN
MOVLW
MOVWF
MOVLW
MOVWF

DEB
DEBOUNCE
DEB_CONT
COUNT

;INICIALIZA DEBOUNCE COM 200


;INICIALIZA COUNT COM 50

TESTA_BOTAO1
BTFSC
GOTO
GOTO

BOTAO1
TESTA_BOTAO2
FAZER_DEBOUNCE1

;BOTAO1 ESTA PRESSIONADO?


;NAO, DESVIA
;SIM, DESVIA

BOTAO2
MAIN
FAZER_DEBOUNCE2

;BOTAO2 ESTA PRESSIONADO?


;NAO, DESVIA
;SIM, DESVIA

TESTA_BOTAO2
BTFSC
GOTO
GOTO
FAZER_DEBOUNCE1
DECFSZ
GOTO

DEBOUNCE,F
TESTA_BOTAO1

MOVLW
MOVWF

DEB
DEBOUNCE

DECFSZ
GOTO
GOTO

COUNT,F
TESTA_BOTAO1
TRATA_BOTAO1

;DECREMENTA DEBOUNCE, DEBOUNCE=0?


;NAO, DESVIA
;SIM, CONTINUA
;INICIALIZA DEBOUNCE COM 200
;DECREMENTA COUNT, COUNT=0?
;NAO, DESVIA
;SIM, DESVIA

FAZER_DEBOUNCE2
DECFSZ
GOTO

DEBOUNCE,F
TESTA_BOTAO2

MOVLW
MOVWF

DEB
DEBOUNCE

10

;DECREMENTA DEBOUNCE, DEBOUNCE=0?


;NAO, DESVIA
;SIM, CONTNUA
;INICIALIZA DEBOUNCE COM 200

Microcontroladores PIC16F628A/648A - Uma Abordagem prtica e Objetiva

DECFSZ
GOTO
GOTO

COUNT,F
TESTA_BOTAO2
TRATA_BOTAO2

;DECREMENTA COUNT, COUNT=0?


;NAO, DESVIA
;SIM, DESVIA

LED1
ACENDE_LED1

;LED1 ACESO?
;NAO, DESVIA
;SIM, CONTINUA

LED1
SOLTAR_BOTAO

;APAGA LED1
; DESVIA

LED1
SOLTAR_BOTAO

;ACENDE LED1
;DESVIA

LED2
ACENDE_LED2

;LED2 ACESO?
;NAO, DESVIA
;SIM, CONTINUA

LED2
SOLTAR_BOTAO

;APAGA LED2
; DESVIA

LED2

;ACENDE LED2

TRATA_BOTAO1
BTFSS
GOTO
APAGA_LED1
BCF
GOTO
ACENDE_LED1
BSF
GOTO
TRATA_BOTAO2
BTFSS
GOTO
APAGA_LED2
BCF
GOTO
ACENDE_LED2
BSF
SOLTAR_BOTAO
BTFSS
GOTO

$-1

BTFSS
GOTO
GOTO

$-1
MAIN

BOTAO1
BOTAO2

;BOTAO1 ESTA SOLTO?


;NAO, AGUARDA SOLTAR BOTAO
;SIM, CONTINUA
;BOTAO2 ESTA SOLTO?
;NAO, AGUARDA SOLTAR BOTAO
;SIM, DESVIA

;
*******************************************************************************************************
**************************************
END
;FIM DO PROGRAMA
;
*******************************************************************************************************
**************************************

16. Dois botes acionam um LED


Neste programa ns usamos dois botes (BT1 e BT2) para acionar um
LED (LED 1). Apertando qualquer um dos botes, o LED acende se estiver
apagado e vice-versa.

Respostas dos execcios

11

;
*******************************************************************************************************
**************************************
;
PROGRAMA - DOIS BOTOES ACIONAM UM LED
;
DESENVOLVIDO POR WAGNER DA SILVA ZANCO
;
VERSAO 1.0

12

Microcontroladores PIC16F628A/648A - Uma Abordagem prtica e Objetiva

;
23/06/2003
;
*******************************************************************************************************
**************************************
;
ARQUIVOS DE DEFINICOES
;
*******************************************************************************************************
**************************************
#INCLUDE <P16F628A.INC>
; ARQUIVO PADRAO MICROCHIP PARA O PIC16F628A
;
*******************************************************************************************************
**************************************
;
BITS DE CONFIGURACAO
;
*******************************************************************************************************
**************************************
__CONFIG
_BOREN_ON&_CP_ON&_PWRTE_ON&_WDT_OFF&_LVP_OFF&_DATA_CP_OFF&_MCLRE_ON&_XT_OSC
;
*******************************************************************************************************
**************************************
;
PAGINACAO DA MEMORIA
;******************************************************************************************************
***************************************
;
COMANDOS PARA ALTERACAO DE PAGINA DE MEMORIA
#DEFINE
#DEFINE

BANK0
BANK1

BCF STATUS,RP0
BSF STATUS,RP0

;SETA BANCO 0 DE MEMORIA


;SETA BANCO 1 DE MEMORIA

;
*******************************************************************************************************
**************************************
;
VARIAVEIS
;
*******************************************************************************************************
**************************************
;ENDERECOS DAS VARIAVEIS UTILIZADAS PELO SISTEMA
CBLOCK

0x20
DEBOUNCE
COUNT

ENDC

;ENDERECO INICIAL DA MEMORIA DO USUARIO


;0X20 USADO NO DEBOUNCE
;0X21 USADO NO DEBOUNCE
;FIM DO BLOCO DE MEMRIA

;
*******************************************************************************************************
**************************************
;
CONSTANTES
;
*******************************************************************************************************
**************************************
;CONSTANTES UTILIZADAS PELO SISTEMA
DEB
DEB_CONT

EQU .200
EQU .50

;INICIALIZACAO DO REG DEBOUNCE


;INICIALIZACAO DO REG COUNT

;
*******************************************************************************************************
**************************************
;
ENTRADAS
;
*******************************************************************************************************
**************************************

Respostas dos execcios

13

;PINOS QUE SERAO UTILIZADOS COMO ENTRADA


#DEFINE

BOTAO1

PORTA,1

;0 --> PRESSIONADO
;1 --> LIBERADO

#DEFINE

BOTAO2

PORTA,2

;0 --> PRESSIONADO
;1 --> LIBERADO

;
*******************************************************************************************************
**************************************
;
SAIDAS
;
*******************************************************************************************************
**************************************
;PINOS QUE SERAO UTILIZADOS COMO SAIDA
#DEFINE

LED1

PORTB,0

;0 --> APAGADO
;1 --> ACESO

;
*******************************************************************************************************
**************************************
;
VETOR DE RESET
;******************************************************************************************************
***************************************
ORG
0x00
;ENDERECO INICIAL DE PROCESSAMENTO
GOTO
INICIO
;
*******************************************************************************************************
**************************************
;
INTERRUPCAO
;
*******************************************************************************************************
**************************************
;AS INTERRUPCOES NAO SERAO UTILIZADAS
ORG
RETFIE

0x04

;ENDERECO INICAL DA INTERRUPCAO


;RETORNA DA INTERRUPCAO

;
*******************************************************************************************************
**************************************
;
INICIO
;
*******************************************************************************************************
**************************************
INICIO
BANK1
MOVLW
MOVWF

B'00000110'
TRISA

MOVLW
MOVWF

B'00000000'
TRISB

MOVLW

B'10000000'

14

;ALTERA PARA BANCO 1


;DEFINE RA1 e RA2 COMO ENTRADA e DEMAIS
;COMO SAIDA
;DEFINE O PORTB COMO SAIDA

Microcontroladores PIC16F628A/648A - Uma Abordagem prtica e Objetiva

MOVWF

OPTION_REG

MOVLW
MOVWF

B'00000000'
INTCON

BANK0
MOVLW
MOVWF

B'00000111'
CMCON

;PULL_UPS DESABILIADOS <7>


;DEMAIS BITS IRRELEVANTES
;CHAVE GERAL DE INTERRUPCOES DESLIGADAS<7>
;DEMAIS BITS IRRELEVANTES
;ALTERA PARA BANCO 0
;CONFIGURA RA3:RA0 COM I/O<2:0>

;
*******************************************************************************************************
**************************************
;
INICIALIZACAO DAS VARIAVEIS
;
*******************************************************************************************************
**************************************
CLRF
PORTA
;LIMPA PORTA
CLRF
PORTB
;LIMPA PORTB
;
*******************************************************************************************************
**************************************
MAIN
MOVLW
MOVWF
MOVLW
MOVWF

DEB
DEBOUNCE
DEB_CONT
COUNT

;INICIALIZA DEBOUNCE COM 200


;INICIALIZA COUNT COM 50

TESTA_BOTAO1
BTFSC
GOTO
GOTO

BOTAO1
TESTA_BOTAO2
FAZER_DEBOUNCE1

;BOTAO1 ESTA PRESSIONADO?


;NAO, DESVIA
;SIM, DESVIA

BOTAO2
MAIN
FAZER_DEBOUNCE2

;BOTAO2 ESTA PRESSIONADO?


;NAO, DESVIA
;SIM, DESVIA

TESTA_BOTAO2
BTFSC
GOTO
GOTO
FAZER_DEBOUNCE1
DECFSZ
GOTO

DEBOUNCE,F
TESTA_BOTAO1

;DECREMENTA DEBOUNCE, DEBOUNCE=0?


;NAO, DESVIA
;SIM, CONTINUA
;INICIALIZA DEBOUNCE COM 200

MOVLW
MOVWF

DEB
DEBOUNCE

DECFSZ
GOTO
GOTO

COUNT,F
;DECREMENTA COUNT, COUNT=0?
TESTA_BOTAO1
;NAO, DESVIA
TRATA_BOTAO
;SIM, DESVIA

FAZER_DEBOUNCE2
DECFSZ
GOTO

DEBOUNCE,F
TESTA_BOTAO2

MOVLW
MOVWF

DEB
DEBOUNCE

;DECREMENTA DEBOUNCE, DEBOUNCE=0?


;NAO, DESVIA
;SIM, CONTINUA
;INICIALIZA DEBOUNCE COM 200

Respostas dos execcios

15

DECFSZ
GOTO

COUNT,F
;DECREMENTA COUNT, COUNT=0?
TESTA_BOTAO2
;NAO, DESVIA
;SIM, DESVIA

TRATA_BOTAO
BTFSS
GOTO

LED1
ACENDE_LED1

APAGA_LED1
BCF
GOTO

LED1
SOLTAR_BOTAO

;LED1 ACESO?
;NAO, DESVIA
;SIM, CONTINUA
;APAGA LED1
;DESVIA

ACENDE_LED1
BSF

LED1

;ACENDE LED1

SOLTAR_BOTAO
BTFSS
GOTO

BOTAO1
$-1

BTFSS
GOTO
GOTO

BOTAO2
$-1
MAIN

;BOTAO1 ESTA SOLTO?


;NAO, AGUARDA SOLTAR BOTAO1
;SIM, CONTINUA
;BOTAO2 ESTA SOLTO?
;NAO, AGUARDA SOLTAR BOTAO2
;SIM, DESVIA

;
*******************************************************************************************************
**************************************
END
;FIM DO PROGRAMA
;
*******************************************************************************************************
**************************************

Captulo 11:
Aplicao

Como

simular

Debugar

uma

1. Significa que o programa ser executado dentro do MPLAB IDE por


uma ferramenta chamada MPLAB SIM como se estivesse sendo
executado dentro do MCU. A simulao nos permite, entre outras
coisas, detectar e corrigir erros.
2. F7.
3. Temos de clicar com o boto direito do mouse na linha onde o
comando ser executado, isso far com que aparea um menu
suspenso, bastando selecionar o item Set Breakpoint. Quando o
breakpoint est ativado, aparece no canto esquerdo da linha um

16

Microcontroladores PIC16F628A/648A - Uma Abordagem prtica e Objetiva

crculo vermelho com a letra B no centro.


4. Set PC at Cursor.
5. Estmulo sncrono e estmulo assncrono.
6. S pode ser aplicado um estmulo de cada vez. Pelo menos uma
instruo deve ser executada entre o acionamento de dois estmulos.
7. Stopwatch.
8. .LST.
9. Ela mostra todas as localidades de memria RAM e os seus respectivos
contedos. Dando um clique duplo em qualquer um dos endereos
podemos alterar o seu contedo, desde que o registraodr em questo
seja de escrita e leitura.
10. Special Function
especficas.

Registers ou Registradores com finalidades

Captulo 12: Mdulos Temporizadores


1. a origem do incremento, que pode ser pelo ciclo de instruo
(temporizador) ou por um sinal externo aplicado ao pino RA4/T0CK1
(contador).
2. Retardar o incremento do registrador.
3. 8ms.
4. T1CON.
5. 1:1, 1:2, 1:4 e 1:8.
6. Quando setado, o bit TMR1ON liga o TMR1 e quando apagado, para o
TMR1.
7. TIMER 1 configurado como temporizador, incrementado pelo ciclo de
instruo <1>, fator de prescaler de 1:4 <5:4> e TMR1 ligado<0>.
8. A cada 4ms.
9. Porque no pode ser incrementado por um sinal externo. O TMR2 s
pode ser incrementado pelo ciclo de instruo.
10. Alm do prescaler, o TMR2 possui um postscaler .
11. O postscaler define, pela programao, aps quantos estouros o bit de
sinalizao de estouro do TMR2 ser setado. Uma interrupo ser
gerada se ela estiver habilitada.
12.
;
*******************************************************************************************************
**********************************************
BANK1
;SETA O BANCO 1

Respostas dos execcios

17

MOVLW.150
MOVWFPR2
BANK0
CLRF T2CON
CLRF TMR2
BANK1
BCF
INTCON,GIE
BANK0
MOVLWB'01001101'
MOVWFT2CON

;INICIALIZA PR2 COM O VALOR .150


;SETA O BANCO 0
;LIMPA T2CON
;LIMPA TMR2
;SETA O BANCO 1
;DESLIGA CHAVE GERAL DE INTERRUPCAO <7>
;SETA O BANCO 0
;POTSCALER = 1:10 <6:3>
;PRESCALER 1:4 <1:0>
;TMR2 LIGADO <2>

;
*******************************************************************************************************
**********************************************

13. Multivibrador e LEDs acionados por boto


Esta aplicao contm vrias particularidades que merecem ser vistas com
ateno. A verdade que ns temos duas aplicaes em uma. Uma delas um
multivibrador, com os LEDs 3 e 4 piscando alternadamente na freqncia de 1Hz. Na
outra, temos dois LEDs (LED 1 e LED 2) acionados, respectivamente, por dois botes
(BT1 e BT2) independentes.
A sub-rotina do multivibrador chamada por meio da interrupo de
estouro do TMR1, o que acontece a cada 0,5s, visto que o TMR1 foi
configurado para ser incrementado pelo ciclo de instruo, com um prescaler
de 1:8(TICON<5:4>), tendo sido inicializado com o valor 0BDDh (303710).
Sendo assim, o tempo que o TMR1 leva para estourar :
Tempo total de estouro do TMR1 = 8 x (65537 - 3037) = 0,5 S

8 = tempo decorrido entre dois incrementos do TMR1 (definido pelo


prescaler)

62500 (65537 - 3037) =

nmeros de incrementos at o TMR1

estourar
Para permitir que o programa trate a interrupo de estouro de TMR1,
tivemos que:

Ligar a chave geral de interrupo (INTICON<7>).


Ativar interrupo de perifricos (INTICON<6>).
Ativar a chave individual de interrupo de estouro do TMR1
(PIE1<0>).
O programa utiliza a programao estruturada com quatro chamadas
sub-rotina da rotina principal (ver fluxograma). O programa funciona em
loop, sendo de 4ms o tempo de uma volta completa. Observe que foi usado o
TMR0 para gerar a base de tempo da rotina principal (4ms), que aciona os
LEDs por meio dos botes. O TMR1 utilizado para gerar a base de tempo do
multivibrador (0,5s). Lembre-se de que o uso dos mdulos temporizadores

18

Microcontroladores PIC16F628A/648A - Uma Abordagem prtica e Objetiva

a ferramenta mais utilizada para o controle de tempo nas aplicaes com


microcontroladores.
Leia e estude o cdigo-fonte com ateno, e no deixe de observar
como os flags (bits de sinalizao) so utilizados como ponte para as subrotinas, permitindo que elas se comuniquem, sem perderem, portanto, sua
independncia. Esta a chave da programao estruturada, a independncia
entre as sub-rotinas. Isso facilita demasiadamente futuras alteraes e
ampliaes do programa, bastando incluir na rotina principal outras
chamadas sub-rotina.

Respostas dos execcios

19

20

Microcontroladores PIC16F628A/648A - Uma Abordagem prtica e Objetiva

Respostas dos execcios

21

22

Microcontroladores PIC16F628A/648A - Uma Abordagem prtica e Objetiva

*******************************************************************************************************
***************************************
;
PROGRAMA - MULTIVIBRADOR E DOIS LEDS ACIONADOS POR BOTAO
;
DESENVOLVIDO POR WAGNER DA SILVA ZANCO
;
VERSAO 1.0
;
04/04/2004
;
*******************************************************************************************************
***************************************
;
ARQUIVOS DE DEFINICOES
;
*******************************************************************************************************
***************************************
#INCLUDE <P16F628A.INC>
;ARQUIVO PADRAO MICROCHIP PARA PIC16F628A
;
*******************************************************************************************************
***************************************
;
BITS DE CONFIGURACAO
;
*******************************************************************************************************
***************************************
__CONFIG
_BOREN_ON&_CP_ON&_PWRTE_ON&_WDT_OFF&_LVP_OFF&_DATA_CP_OFF&_MCLRE_ON&_XT_OSC
;
*******************************************************************************************************
***************************************
;
PAGINACAO DA MEMORIA
;
*******************************************************************************************************
***************************************
;COMANDOS PARA ALTERACAO DE PAGINA DE MEMORIA
BANK0
MACRO
BCF STATUS,RP0
BCF STATUS,RP1
ENDM

;MACRO PARA SELECIONAR BANCO 0

BANK1
MACRO
BSF STATUS,RP0
BCF STATUS,RP1
ENDM

;MACRO PARA SELECIONAR BANCO 1

;FIM DA MACRO BANK0

;FIM DA MACRO BANK1

;
*******************************************************************************************************
***************************************
;
VARIAVEIS
;
*******************************************************************************************************
***************************************
;ENDERECOS DAS VARIAVEIS UTILIZADAS PELO SISTEMA
;VARIAVEIS SO RECONHECIDAS NO BANCO 0 DE MEMORIA
CBLOCK
0x20
DEBOUNCE_BT1
ENDC

;ENDERECO INICIAL DA MEMORIA DO USUARIO


;0x20 - ARMAZENA O TEMPO DE DEBOUNCE
;CADA UNIDADE VALE 4mSEG
;FIM DO BLOCO DE MEMRIA

;
*******************************************************************************************************
***************************************
;VARIAVEIS COM ESPELHO EM TODOS OS BANCOS DE MEMORIA.
;RECONHECIDAS EM QUALQUER BANCO.

Respostas dos execcios

23

FLAGS
W_TEMP
STATUS_TEMP

EQU 0x70 ;BITS DE SINALIZACAO


EQU 0x71 ;SALVA REG WORK
EQU 0x72 ;SALVA REG STATUS

;
*******************************************************************************************************
***************************************
;
CONSTANTES
;
*******************************************************************************************************
***************************************
;CONSTANTES UTILIZADAS PELO SISTEMA.
INIC_TMR0
DEB_BT1
INIC_TMR1H
INIC_TMR1L

EQU .131
EQU .10
EQU H'0B'
EQU H'DD'

;INICIALIZA TIMER 0
;INICIALIZA DEBOUNCE_BT1
;INICIALIZA TMR1H
;INICIALIZA TMR1L

;BITS DO REGISTRADOR FLAGS


STATUS_BT1
EQU .0
STATUS_BT2
EQU .1
DEBOUNCE_FIM EQU .2

;STATUS DO BOTAO 1
;STATUS DO BOTAO 2
;ACABOU DEBOUNCE, TECLA PRECISA SER TRATADA

;
*******************************************************************************************************
***************************************
;
FLAGS
;
*******************************************************************************************************
***************************************
;REGISTRADOR FLAGS
;
;BIT # |7 |6|5|4 |3|2|1 |0|
;
|X|X|X|X|X|X|X|Y|
STATUS_BT1 --> 1=SOLTO; 0=PRESSIONADO
;
|X|X|X|X|X|X|Y|X|
STATUS_BT2 --> 1=SOLTO; 0=PRESSIONADO
;
|X|X|X|X|X|Y|X|X|
DEBOUNCE_FIM --> 1=ACABOU DEBOUNCE
;
|X|X|X|X|Y|X|X|X|
RESERVADO
;
|X|X|X|Y|X|X|X|X|
RESERVADO
;
|X|X|Y|X|X|X|X|X|
RESERVADO
;
|X|Y|X|X|X|X|X|X|
RESERVADO
;
|Y|X|X|X|X|X|X|X|
RESERVADO
;X = DEFINIDO EM OUTRO LUGAR DA TABELA
;Y = DEFINIDO COMO MOSTRADO (0/1)
;
*******************************************************************************************************
***************************************
;
ENTRADAS
;
*******************************************************************************************************
***************************************
;PINOS QUE SERAO UTILIZADOS COMO ENTRADA
#DEFINE
#DEFINE

BOTAO1 PORTA,1
BOTAO2

PORTA,2

;0 --> PRESSIONADO
;1 --> LIBERADO
;0 --> PRESSIONADO
;1 --> LIBERADO

24

Microcontroladores PIC16F628A/648A - Uma Abordagem prtica e Objetiva

*******************************************************************************************************
***************************************
;
SAIDAS
;
*******************************************************************************************************
***************************************
;PINOS UTILIZADOS COMO SAIDA
#DEFINE

LED1

PORTB,0

;0 --> APAGADO
;1 --> ACESO

#DEFINE

LED2

PORTB,1

;0 --> APAGADO
;1 --> ACESO

#DEFINE

LED3

PORTB,2

;0 --> APAGADO
;1 --> ACESO

#DEFINE

LED4

PORTB,3

;0 --> APAGADO
;1 --> ACESO

;
*******************************************************************************************************
***************************************
;
*******************************************************************************************************
***************************************
;
VETOR DE RESET
;
*******************************************************************************************************
***************************************
ORG 0x00
;ENDERECO INICIAL DE PROCESSAMENTO
GOTO
INICIO
;
*******************************************************************************************************
***************************************
;
INTERRUPCAO
;
*******************************************************************************************************
***************************************
;A INTERRUPCAO DE TIMER 1 SERA UTILIZADA
ORG 0x04
BTFSS
RETFIE
BCF
MOVWF
SWAPF
MOVWF

;ENDEREO INICAL DA INTERRUPCAO


PIR1,TMR1IF
;INTERRUPCAO DE ESTOURO DE TMR1?
;NAO, RETORNA
;SIM, CONTINUA
PIR1,TMR1IF
;LIMPA FLAG DA INTERRUPCAO
W_TEMP
;SALVA W EM W_TEMP
STATUS,W
STATUS_TEMP
;SALVA STATUS EM STATUS_TEMP

;
*******************************************************************************************************
***************************************
;
TRATAMENTO DA INTERRUPCAO DE ESTOURO DE TMR1
;
*******************************************************************************************************
***************************************
;ESTA ROTINA FARA OS LEDS 3 E 4 PISCAREM ALTERNADAMENTE

Respostas dos execcios

25

MOVLW
MOVWF
MOVLW
MOVWF

H'0B'
TMR1H
H'DD'
TMR1L

BTFSS
GOTO
GOTO

;INICIA TMR1H COM OBh


;INICIA TMR1L COM DDh

LED3
ACENDE_LED
APAGA_LED

;LED3 ESTA ACESO


;NAO, DESVIA
;SIM, DESVIA

ACENDE_LED
BCF
BSF
GOTO

LED4
LED3
SAI_INT

;APAGA LED4
;ACENDE LED 3
;DESVIA

APAGA_LED
BCF LED3
BSF LED4
GOTO
SAI_INT

;APAGA LED3
;ACENDE LED4
;DESVIA

SAI_INT
SWAPF
MOVWF
SWAPF
SWAPF
RETFIE

STATUS_TEMP,W
STATUS
;RECUPERA STATUS
W_TEMP,F
W_TEMP,W
;RECUPERA W
;RETORNA DA INTERRUPCAO

;
*******************************************************************************************************
***************************************
;
INICIO
;
*******************************************************************************************************
***************************************
INICIO
BANK1
;ALTERA PARA BANCO1
MOVLW
B'00000110'
MOVWF
TRISA
;DEFINE RA1 e RA2 COMO ENTRADA e DEMAIS
;COMO SAIDA
MOVLW
B'00000000'
MOVWF
TRISB
;DEFINE O PORTB COMO SAIDA

<0>

MOVLW
MOVWF

B'10000100'
OPTION_REG

MOVLW
MOVWF
MOVLW

B'11000000'
INTCON
B'00000001'

MOVWF
BANK0
MOVLW
MOVWF
MOVLW

26

;PRESCALER 1:32 NO TMRO <2:0>


;TMR0 INCREMENTADO PELO CICLO DE INSTRUCAO <5>
;APLICA PRESCALER AO TMR0 <3>
;PULL_UPS DESABILIADOS <7>
;DEMAIS BITS IRRELEVANTES
;CHAVE GERAL DE INTERRUPCAO LIGADA <7>
;INTERRUPCAO DE PERFERICOS ATIVADAS <6>
;INTERRUPCAO DE ESTOURO TMR1 SERA TRATADA

PIE1
B'00110001'
T1CON
B'00000111'

;PRESCALER 1:8 <5:4>


;TMR1 INCREMENTADO PELO CLOCK INTERNO <1>
;LIGA TMR1 <0>
;DEMAIS BITS IRRELEVANTES
;CONFIGURA RA3:RA0 COM I/O <2:0>

Microcontroladores PIC16F628A/648A - Uma Abordagem prtica e Objetiva

MOVWF

CMCON

;
*******************************************************************************************************
***************************************
;
INICIALIZACAO DAS VARIAVEIS
;
*******************************************************************************************************
***************************************
CLRF
PORTA
;LIMPA PORTA
CLRF
PORTB
;LIMPA PORTB
MOVLW
B'00000011'
;INICIALIZA FLAGS
MOVWF
FLAGS
MOVLW
DEB_BT1
;INICIALIZA DEBOUNCE_BT1 COM 10
MOVWF
DEBOUNCE_BT1
MOVLW
INIC_TMR0
;INICIALIZA TIMER 0
MOVWF
TMR0
;COM 131
MOVLW
H'0B'
;INICIA TMR1H COM OBh
MOVWF
TMR1H
MOVLW
H'DD'
;INICIA TMR1L COM DDh
MOVWF
TMR1L
;
*******************************************************************************************************
***************************************
;
ROTINA PRINCIPAL
;
*******************************************************************************************************
***************************************
MAIN
CALL
TESTAR_BT
;CHAMA SUB-ROTINA PARA TESTAR BOTAO
CALL
DEBOUNCE
;CHAMA SUB-ROTINA PARA FAZER DEBOUNCE
CALL
TRATAR_BT
;CHAMA SUB-ROTINA PARA TRATAR BOTAO
CALL
TIMER_4mSEG
;CHAMA SUB-ROTINA DE TEMPO
GOTO
MAIN
;DESVIA
;
*******************************************************************************************************
***************************************
;
SUB-ROTINAS
;******************************************************************************************************
****************************************
TESTAR_BT
BTFSC
GOTO
BCF
RETURN
BSF

BOTAO1
$+3
FLAGS,STATUS_BT1

BTFSC
GOTO
BCF
RETURN
BSF
RETURN

BOTAO2
$+3
FLAGS,STATUS_BT2

FLAGS,STATUS_BT1

FLAGS,STATUS_BT2

;BOTAO1 ESTA PRESSIONADO?


;NAO, DESVIA
;SIM, APAGA FLAG STATUS DO BOTAO1
;RETORNA
;SETA FLAG STATUS DO BOTAO1
;BOTAO2 ESTA PRESSIONADO?
;NAO, DESVIA
;SIM, APAGA FLAG STATUS DO BOTAO2
;RETORNA
;SETA FLAG STATUS DO BOTAO2
;RETORNA

;
*******************************************************************************************************
***************************************
;ESTA SUB-ROTINA FAZ O DEBOUNCE, A TECLA PRESSIONADA SO SERA TRATADA QUANDO
;O TEMPO DE DEBOUNCE ACABAR, ESTANDO A TECLA AINDA PRESSIONADA. O TEMPO PROGRAMADO

Respostas dos execcios

27

;PARA O DEBOUNCE E DE 40mS, PODENDO O MESMO SER ALTERADO SE FOR NECESSARIO.


;O TEMPO DO DEBOUNCE E DEFINIDO NA VARIAVEL DEBOUNCE_BT1, SENDO DE 4mS PARA CADA
UNIDADE.
;
*******************************************************************************************************
***************************************
DEBOUNCE
BTFSC
GOTO
GOTO

FLAGS,STATUS_BT1
$+2
INICIA_DEB

;BOTAO1 PRESSIONADO?
;NAO, PULA DUAS LINHAS
;SIM, DESVIA

BTFSC
GOTO

FLAGS,STATUS_BT2
;BOTAO2 PRESSIONADO?
INICIA_DEB2
;NAO, DESVIA
;SIM, CONTINUA

INICIA_DEB
DECFSZ
RETURN
BSF

DEBOUNCE_BT1,F

;DECREMENTA DEBOUNCE_BT1, DEBOUNCE_BT1=0?


;NAO, RETORNA
FLAGS,DEBOUNCE_FIM ;SIM, SETA FLAG FIM DE DEBOUNCE

INICIA_DEB2
MOVLW
MOVWF
RETURN

DEB_BT1
DEBOUNCE_BT1

;INICALIZA DEBOUNCE_BT1 COM 10


;TEMPO DO DEBOUNCE E (10 x 4mS = 40mS)
;RETORNA

;
*******************************************************************************************************
***************************************
;ESTA SUB-ROTINA TRATA O BOTAO ACIONADO, TOMANDO A DECISAO CORRETA PARA CADA BOTAO.
;
*******************************************************************************************************
***************************************
TRATAR_BT
BTFSS
RETURN
BTFSS
GOTO
BTFSS
GOTO
BCF
RETURN

FLAGS,DEBOUNCE_FIM ;ACABOU DEBOUNCE?


;NAO, RETORNA
;SIM, CONTINUA
FLAGS,STATUS_BT1
;BOTAO1 PRESSIONADO?
TRATA_BT1
;SIM, DESVIA
;NAO, CONTINUA
FLAGS,STATUS_BT2
;BOTAO2 PRESSIONADO?
TRATA_BT2
;SIM, DESVIA
FLAGS,DEBOUNCE_FIM ;DESATIVA FLAG TERATAR BOTAO
;NAO, RETORNA

;TRATAR BOTAO 1.
TRATA_BT1
BTFSS
GOTO
GOTO

LED1
ACENDE_LED1
APAGA_LED1

;LED1 ESTA ACESO?


;NAO, DESVIA
;SIM, DESVIA

ACENDE_LED1
BSF
GOTO

LED1
SOLTAR_BOTAO

;ACENDE LED1
;DESVIA

APAGA_LED1
BCF

28

LED1

;APAGA LED1

Microcontroladores PIC16F628A/648A - Uma Abordagem prtica e Objetiva

GOTO

SOLTAR_BOTAO

;DESVIA

;TRATAR BOTAO 2.
TRATA_BT2
BTFSS
GOTO
GOTO

LED2
ACENDE_LED2
APAGA_LED2

;LED2 ESTA ACESO?


;NAO, DESVIA
;SIM, DESVIA

ACENDE_LED2
BSF
GOTO

LED2

SOLTAR_BOTAO

;ACENDE LED2
;DESVIA

SOLTAR_BOTAO

;APAGA LED2
;DESVIA

APAGA_LED2
BCF
GOTO

LED2

;AGUARDA O USUARIO SOLTAR O BOTAO PRESSIONADO.


SOLTAR_BOTAO
BTFSS
GOTO
BSF

BOTAO1
$-1
FLAGS,STATUS_BT1

;BOTAO1 SOLTO?
;NAO, AGUARDA SOLTAR BOTAO1
;SIM, RESETA FLAG

BTFSS
GOTO
BSF
BCF
RETURN

BOTAO2
;BOTAO1 SOLTO?
$-1
;NAO, AGUARDA SOLTAR BOTAO2
FLAGS,STATUS_BT2
;SIM, RESETA FLAG
FLAGS,DEBOUNCE_FIM ;DESATIVA FLAG TRATAR BOTAO
;RETORNA

;
*******************************************************************************************************
***************************************
;ESTA SUB-ROTINA FICA AGUARDANDO PASSAR 4mS. TEMPO DE UMA VOLTA COMPLETA NO
PROGRAMA
;
*******************************************************************************************************
***************************************
TIMER_4mSEG
BTFSS
GOTO
BCF

INTCON,T0IF
$-1
INTCON,T0IF

MOVLW
MOVWF
RETURN

INIC_TMR0
TMR0

;TMR0 ESTOUROU?
;NAO, ESPERA ESTOURAR
;SIM, APAGA FAG T0IF
;INICIALIZA TIMER 0
;COM 131
;NAO, RETORNA

;
*******************************************************************************************************
***************************************
END
;FIM DO PROGRAMA
;
*******************************************************************************************************
***************************************

Captulo 13: EEPROM Interna


Respostas dos execcios

29

1. EEDATA, EEADR, EECON1 e EECON2.


2.

(2), (1), (4) e (3).

3. primeiro o valor 0x55, depois o valor 0xAA.


4. Uma ficar lendo o bit WR at que ele seja apagado pelo hardware
quando a escrita terminar. A outra por meio da interrupo de fim de
escrita na EEPROM, sinalizada pelo bit EEIF (PIR1<7>).
5. DE.
6.
;
***********************************************************************************************
*******************************************
ORG
0x2100
DE
.2, .4, .6
;
*******************************************************************************************************
***********************************

7. Pisca pisca com frequncia ajustvel


Esta aplicao exibe no display os valores de 0 a 9, piscando numa
freqncia cujo perodo pode ser ajustado para qualquer valor inteiro entre
1s e 9s. No modo de funcionamento normal, os botes 1 e 2 (BT1 e BT2)
selecionam o valor que deve aparecer no display, enquanto, no modo de
programao eles (boto 1 e boto 2) configuram o perodo de piscagem,
sendo o perodo exibido no display, sem piscar.
Quando o circuito ligado pela primeira vez, aparece no display o valor
0, piscando na freqncia de 1Hz. Pressionando um dos botes:
BT1(crescente) e BT2(decrescente), ns podemos alterar o valor exibido no
display. Para entrar no modo de programao, temos de pressionar o boto 3
(BT3). No modo de programao, os botes 1 e 2 assumem uma nova funo,
que alterar o valor do perodo de piscagem.
Escolhido o novo perodo de piscagem, basta pressionar novamente o
boto 3 para sair do modo de programao e voltar ao modo de
funcionamento normal. O perodo de piscagem ser gravado no endereo
00h da memria EEPROM, para que no seja perdido quando o equipamento
for desligado.

30

Microcontroladores PIC16F628A/648A - Uma Abordagem prtica e Objetiva

Respostas dos execcios

31

32

Microcontroladores PIC16F628A/648A - Uma Abordagem prtica e Objetiva

Respostas dos execcios

33

34

Microcontroladores PIC16F628A/648A - Uma Abordagem prtica e Objetiva

Respostas dos execcios

35

;
*******************************************************************************************************
***************************************
;
PROGRAMA - PISCA PISCA COM FREQUENCIA VARIAVEL
;
DESENVOLVIDO POR WAGNER DA SILVA ZANCO
;
VERSAO 1.0
;
28/04/2004
;
*******************************************************************************************************
***************************************
;
ARQUIVOS DE DEFINICOES
;
*******************************************************************************************************
***************************************
#INCLUDE <P16F628A.INC>
;ARQUIVO PADRAO MICROCHIP PARA PIC16F628A
;
*******************************************************************************************************
***************************************
;
BITS DE CONFIGURACAO
;
*******************************************************************************************************
***************************************
__CONFIG
_BOREN_ON&_CP_ON&_PWRTE_ON&_WDT_OFF&_LVP_OFF&_DATA_CP_OFF&_MCLRE_ON&_XT_OSC
;
*******************************************************************************************************
***************************************
;
PAGINACAO DA MEMORIA
;
*******************************************************************************************************
***************************************
;COMANDOS PARA ALTERACAO DE PAGINA DE MEMORIA
BANK0
MACRO
BCF STATUS,RP0
BCF STATUS,RP1
ENDM

;MACRO PARA SELECIONAR BANCO 0

BANK1
MACRO
BSF STATUS,RP0
BCF STATUS,RP1
ENDM

;MACRO PARA SELECIONAR BANCO 1

;FIM DA MACRO BANK0

;FIM DA MACRO BANK1

;
*******************************************************************************************************
***************************************
;
VARIAVEIS
;
*******************************************************************************************************
***************************************
;ENDERECOS DAS VARIAVEIS UTILIZADAS PELO SISTEMA
;VARIAVEIS SO RECONHECIDAS NO BANCO 0 DE MEMORIA
CBLOCK

0x20

;ENDERECO INICIAL DA MEMORIA DO USUARIO

COUNT
;0x20 - AUXILIA NA CONTAGEM DE TEMPO
DEBOUNCE_BT1 ;0x21 - ARMAZENA O TEMPO DE DEBOUNCE
;CADA UNIDADE VALE 4mSEG
CONTADOR
;0x22 - ARMAZENA VALOR QUE APARECERA NO DISPLAY
TEMP
;0x23 - REGISTRADOR TEMPORARIO
TEMP2
;0x24 - REGISTRADOR TEMPORARIO 2
ENDC
;FIM DO BLOCO DE MEMRIA

36

Microcontroladores PIC16F628A/648A - Uma Abordagem prtica e Objetiva

;
*******************************************************************************************************
***************************************
;VARIAVEIS COM ESPELHO EM TODOS OS BANCOS DE MEMORIA. RECONHECIDAS EM QUALQUER
BANCO.
FLAGS
PERIODO
TEMP_ESPERA

EQU 0x70 ;BITS DE SINALIZACAO


EQU 0x71 ;ARMAZENA PERIODO
EQU 0X72 ;TEMPO DE ESPERA

;
*******************************************************************************************************
***************************************
;
CONSTANTES
;
*******************************************************************************************************
***************************************
;CONSTANTES UTILIZADAS PELO SISTEMA.
INIC_TMR0 EQU
CONTA
EQU
DEB_BT1 EQU
ENDERECO EQU

.131
.125
.10
.0

;INICIALIZA TMR0
;INICIALIZA COUNT
;INICIALIZA DEBOUNCE_BT1
;ENDERECO DE EEPROM ONDE SERA GRAVADO
;O PERIODO DE PISCAGEM
;BITS DO REGISTRADOR FLAGS
NORMAL_PROG EQU
STATUS_BT1
STATUS_BT2
STATUS_BT3
DEBOUNCE_FIM EQU
MEIO_SEG
EQU
ACENDE_DSP
ESCRITA_EEPROM

.0
EQU
EQU
EQU
.4
.5
EQU
EQU

.1
.2
.3
.6
.7

;MODO NORMAL/PROGRAMACAO
;STATUS DO BOTAO 1
;STATUS DO BOTAO 2
;STATUS DO BOTAO 3
;ACABOU DEBOUNCE
;PASSOU MEIO SEGUNDO
;ACENDE DISPLAY
;ESCRITA NA EEPROM EM ANDAMENTO

;
*******************************************************************************************************
***************************************
;
FLAGS
;
*******************************************************************************************************
***************************************
;REGISTRADOR FLAGS
;BIT #
;
;
;
;
;
;
;
;

|7|6 |5|4 |3|2|1| 0|


|X|X|X|X|X|X|X|Y|
|X|X|X|X|X|X|Y|X|
|X|X|X|X|X|Y|X|X|
|X|X|X|X|Y|X|X|X|
|X|X|X|Y|X|X|X|X|
|X|X|Y|X|X|X|X|X|
|X|Y|X|X|X|X|X|X|
|Y|X|X|X|X|X|X|X|

MODO NORMAL=0 / MODO PROGRAMACAO=1


STATUS_BT1 1=SOLTO; 0=PRESSIONADO
STATUS_BT2 1=SOLTO; 0=PRESSIONADO
STATUS_BT3 1=SOLTO; 0=PRESSIONADO
DEBOUNCE_FIM 1=ACABOU DEBOUNCE
MEIO_SEG 1=PASSOU 0,5 SEG
ACENDE_DSP 1=ACENDER DISPLAY; 0 APAGAR DISPLAY
ESCRITA_EEPROM 1=ESCRITA EM ANDAMENTO

;X = DEFINIDO EM OUTRO LUGAR DA TABELA


; = DEFINIDO COMO MOSTRADO (0/1)
;
*******************************************************************************************************
***************************************
;
ENTRADAS

Respostas dos execcios

37

;
*******************************************************************************************************
***************************************
;PINOS QUE SERAO UTILIZADOS COMO ENTRADA
#DEFINE

BOTAO1

PORTA,1

;0 --> PRESSIONADO
;1--> LIBERADO

#DEFINE

BOTAO2

PORTA,2 ;0 --> PRESSIONADO


;1 --> LIBERADO

#DEFINE

BOTAO3

PORTA,3 ;0 --> PRESSIONADO


;1 --> LIBERADO

;
*******************************************************************************************************
***************************************
;
SAIDAS
;
*******************************************************************************************************
***************************************
;O PORTB ESTA LIGADO NUM DISPLAY DE SETE SEGMENTOS, SENDO CADA SEGMENTO
;ATIVADO(ACESO) QUANDO NO RESPECTIVO PINO FOR COLOCADO NIVEL LOGICO 1.
;
A
;RB0 - SEGMENTO A
**********
;RB1 - SEGMENTO B
F*
*B
;RB2 - SEGMENTO C
* G
*
;RB3 - SEGMENTO D
**********
;RB4 - SEGMENTO E
E*
*C
;RB5 - SEGMENTO F
* D
*
;RB6 - SEGMENTO G
********** *P
;RB7 - PONTO
;
*******************************************************************************************************
***************************************
;
INICIALIZA A EEPROM
;
*******************************************************************************************************
***************************************
;ESTA DIRETIVA GRAVA NA LOCALIDADE 00H DE EEPROM O VALOR 1.
;A GRAVACAO OCORRE DURANTE A PROGRAMACAO DO CHIP.
ORG 0x2100
DE .1

;APONTA PARA O ENDERECO 00H DE EEPROM


;DADO GRAVADO NO ENDERECO 00H DE EEPROM

;
*******************************************************************************************************
***************************************
;
VETOR DE RESET
;
*******************************************************************************************************
***************************************
ORG 0x00
;ENDERECO INICIAL DE PROCESSAMENTO
GOTO
INICIO
;DESVIA
;
*******************************************************************************************************
***************************************
;
INTERRUPCAO
;
*******************************************************************************************************

38

Microcontroladores PIC16F628A/648A - Uma Abordagem prtica e Objetiva

***************************************
;AS INTERRUPCOES NAO SERAO UTILIZADAS
ORG 0x04
;ENDERECO INICAL DA INTERRUPCAO
RETFIE
;RETORNA DA INTERRUPCAO
;
*******************************************************************************************************
***************************************
;
INICIO
;
*******************************************************************************************************
***************************************
INICIO
BANK1
MOVLW
MOVWF

B'00001110'
TRISA

MOVLW
MOVWF
MOVLW
MOVWF

B'00000000'
TRISB
B'10000100'
OPTION_REG

MOVLW
MOVWF
BANK0
MOVLW
MOVWF

B'00000000'
INTCON

;ALTERA PARA BANCO1

B'00000111'
CMCON

;DEFINE RA1, RA2 e RA3 COMO ENTRADA e DEMAIS


;COMO SAIDA
;DEFINE O PORTB COMO SADA
;PRESCALER 1:32 NO TMRO <2:0>
;TMR0 INCREMENTADO PELO CICLO DE INSTRUCAO <5>
;APLICA PRESCALER AO TMR0 <3>
;PULL_UPS DESABILIADOS <7>
;DEMAIS BITS IRRELEVANTES
;INTERRUPCOES DESABILITADAS
;ATIVA BANCO 0
;CONFIGURA RA3:RA0 COM I/O <2:0>

;
*******************************************************************************************************
***************************************
;
INICIALIZACAO DAS VARIAVEIS
;
*******************************************************************************************************
***************************************
CLRF
CLRF
MOVLW
MOVWF
MOVLW
MOVWF
MOVLW
MOVWF
MOVLW
MOVWF
CLRF

PORTA
PORTB
B'00001110'
FLAGS
DEB_BT1
DEBOUNCE_BT1
INIC_TMR0
TMR0
CONTA
COUNT
CONTADOR

;LIMPA PORTA
;LIMPA PORTB
;INICIALIZA FLAGS
;INICIALIZA DEBOUNCE_BT1 COM 10
;INICIALIZA TMR0
;COM 131
;INICIALIZA COUNT COM 125
;LIMPA CONTADOR

;
*******************************************************************************************************
***************************************
;
ROTINA PRINCIPAL
;
*******************************************************************************************************
***************************************
MAIN
;

Respostas dos execcios

39

*******************************************************************************************************
***************************************
;ESTA SUB-ROTINA RESGATA DA EEPROM O VALOR DO PERIODO DE PISCAGEM.
RESG_EEPROM
BANK1
MOVLW
MOVWF
BSF
MOVF
BANK0
MOVWF
MOVWF

.0
EEADR
EECON1,RD
EEDATA,W
PERIODO
TEMP2

;ATIVA BANCO 1 DE MEMORIA


;ENDERECO DA EEPROM QUE SERA LIDO
;INICIA CICLO DE LEITURA
;W RECEBE DADO LIDO
;ATIVA BANCO 0 DE MEMORIA
;PERIODO RECEBE W
;TEMP2 RECEBE W

;
*******************************************************************************************************
***************************************
;
ROTINA_PRINCIPAL
;
*******************************************************************************************************
***************************************
ROTINA_PRINCIPAL
CALL
CALL
CALL
CALL
CALL
CALL
GOTO

TESTAR_BT
;CHAMA SUB-ROTINA PARA TESTAR BOTAO
DEBOUNCE
;CHAMA SUB-ROTINA PARA FAZER DEBOUNCE
TRATAR_BT
;CHAMA SUB-ROTINA PARA TRATAR BOTAO
ATUAL_DSP
;CHAMA SUB-ROTINA PARA ATUALIZAR O DISPLAY
TIMER_4mSEG
;CHAMA SUB-ROTINA DE TEMPO
ESCREVE_EEPROM
;CHAMA SUB-ROTINA DE GRAVACAO NA EEPROM
ROTINA_PRINCIPAL
;DESVIA

;
*******************************************************************************************************
***************************************
;
SUB-ROTINAS
;
*******************************************************************************************************
***************************************
TESTAR_BT
BTFSC
GOTO
BCF
RETURN
BSF
BTFSC
GOTO
BCF
RETURN
BSF
BTFSC
GOTO
BCF
RETURN
BSF
RETURN

BOTAO1
$+3
FLAGS,STATUS_BT1
FLAGS,STATUS_BT1
BOTAO2
$+3
FLAGS,STATUS_BT2
FLAGS,STATUS_BT2
BOTAO3
$+3
FLAGS,STATUS_BT3
FLAGS,STATUS_BT3

;BOTAO1 ESTA PRESSIONADO?


;NAO, PULA TRES LINHAS DE CODIGO PARA BAIXO
;SIM, APAGA FLAG STATUS DO BOTAO1
;RETORNA
;SETA FLAG STATUS DO BOTAO1
;BOTAO2 ESTA PRESSIONADO?
;NAO, PULA TRES LINHAS DE CODIGO PARA BAIXO
;SIM, APAGA FLAG STATUS DO BOTAO2
;RETORNA
;SETA FLAG STATUS DO BOTAO2
;BOTAO3 ESTA PRESSIONADO?
;NAO, PULA TRES LINHAS DE CODIGO PARA BAIXO
;SIM, APAGA FLAG STATUS DO BOTAO3
;RETORNA
;SETA FLAG STATUS DO BOTAO3
;RETORNA

;
*******************************************************************************************************
***************************************
;ESTA SUB-ROTINA FAZ O DEBOUNCE, A TECLA PRESSIONADA SO SERA TRATADA QUANDO
;O TEMPO DE DEBOUNCE ACABAR, ESTANDO A TECLA AINDA PRESSIONADA. O TEMPO PROGRAMADO

40

Microcontroladores PIC16F628A/648A - Uma Abordagem prtica e Objetiva

;PARA O DEBOUNCE E DE 40mS, PODENDO O MESMO SER ALTERADO SE FOR NECESSARIO.


;O TEMPO DO DEBOUNCE E DEFINIDO NA VARIAVEL DEBOUNCE_BT1, SENDO DE 4mS PARA CADA
UNIDADE.
;
*******************************************************************************************************
***************************************
DEBOUNCE
BTFSC
GOTO
GOTO
BTFSC
GOTO
GOTO
BTFSC
GOTO

FLAGS,STATUS_BT1
;BOTAO1 PRESSIONADO?
$+2
;NAO, PULA DUAS LINHAS DE CODIGO PARA BAIXO
INICIA_DEB
;SIM, DESVIA
FLAGS,STATUS_BT2
;BOTAO2 PRESSIONADO?
$+2
;NAO, PULA DUAS LINHAS DE CODIGO PARA BAIXO
INICIA_DEB
;SIM, DESVIA
FLAGS,STATUS_BT3
;BOTAO3 PRESSIONADO?
INICIA_DEB2
;NAO, RETORNA
;SIM, CONTINUA

INICIA_DEB
DECFSZ
RETURN
BSF

DEBOUNCE_BT1,F

;ACABOU DEBOUNCE?
;NAO, RETORNA
FLAGS,DEBOUNCE_FIM ;SIM, SETA FLAG FIM DE DEBOUNCE

INICIA_DEB2
MOVLW
MOVWF
RETURN

DEB_BT1
DEBOUNCE_BT1

;INICALIZA DEBOUNCE_BT1 COM 10


;TEMPO DO DEBOUNCE E (10 x 4mSEG = 40mSEG)
;RETORNA

;
*******************************************************************************************************
***************************************
;ESTA SUB-ROTINA TRATA O BOTAO ACIONADO, TOMANDO A DECISAO CORRETA PARA CADA BOTAO,
LEVANDO
;EM CONTA O MODO DE OPERACAO NO MOMENTO.
;
*******************************************************************************************************
***************************************
TRATAR_BT
BTFSS
RETURN
BTFSC
GOTO
BTFSS
GOTO
BTFSS
GOTO
BTFSS
GOTO
BCF
RETURN

FLAGS,DEBOUNCE_FIM ;ACABOU DEBOUNCE?


;NAO, RETORNA
;SIM, CONTINUA
FLAGS,NORMAL_PROG ;MODO NORMAL ATIVADO?
MODO_PROGRAMACAO
;NAO, DESVIA
;SIM, CONTINUA
FLAGS,STATUS_BT1
;BOTAO1 PRESSIONADO?
TRATA_BT1_NORMAL ;SIM, DESVIA
;NAO, CONTINUA
FLAGS,STATUS_BT2
;BOTAO2 PRESSIONADO?
TRATA_BT2_NORMAL ;SIM, DESVIA
;NAO, CONTINUA
FLAGS,STATUS_BT3
;BOTAO3 PRESSIONADO?
TRATA_BT3_NORMAL ;SIM, DESVIA
FLAGS,DEBOUNCE_FIM ;NAO, BOTAO TRATADO, APAGA FLAG DEBOUNCE_FIM
;RETORNA

;TRATAR BOTAO NO MODO NORMAL DE OPERACAO.


TRATA_BT1_NORMAL
MOVLW
XORWF

.9
CONTADOR,W

;W RECEBE 9
;W = W xor CONTADOR

Respostas dos execcios

41

BTFSC
GOTO
INCF
GOTO

STATUS,Z
SOLTAR_BOTAO
CONTADOR,F
SOLTAR_BOTAO

;CONTADOR = 9?
;SIM, DESVIA
;NAO, INCREMENTA CONTADOR
;DESVIA

TRATA_BT2_NORMAL
MOVLW
XORWF
BTFSC
GOTO
DECF
GOTO

.0
;W RECEBE 0
CONTADOR,W
;W = W xor CONTADOR
STATUS,Z
;CONTADOR = 0?
SOLTAR_BOTAO
;SIM, DESVIA
CONTADOR,F
;NO, DECREMENTA CONTADOR
SOLTAR_BOTAO
;DESVIA

TRATA_BT3_NORMAL
BSF

FLAGS,NORMAL_PROG

;ATIVA MODO DE PORGRAMACAO

;AGUARDA O USUARIO SOLTAR O BOTAO PRESSIONADO.


SOLTAR_BOTAO
BTFSS
GOTO
BSF

BOTAO1
$-1
FLAGS,STATUS_BT1

;BOTAO1 SOLTO?
;NAO, AGUARDA SOLTAR BOTAO1
;SIM, APAGA FLAG

BTFSS
GOTO
BSF

BOTAO2
$-1
FLAGS,STATUS_BT2

;BOTAO2 SOLTO?
;NAO, AGUARDA SOLTAR BOTAO2
;SIM, APAGA FLAG

BTFSS
GOTO
BSF
BCF
RETURN

BOTAO3
$-1
FLAGS,STATUS_BT3
FLAGS,DEBOUNCE_FIM

;BOTAO3 SOLTO?
;NAO, AGUARDA SOLTAR BOTAO3
;SIM, APAGA FLAG
;BOTAO TRATADO, APAGA FLAG FIM DE DEBOUNCE
;RETORNA

;TRATAR BOTAO NO MODO DE PROGRAMACAO.


MODO_PROGRAMACAO
BTFSS
GOTO

FLAGS,STATUS_BT1
TRATA_BT1_PROG

BTFSS
GOTO

FLAGS,STATUS_BT2
TRATA_BT2_PROG

BTFSS
GOTO
BCF
RETURN

FLAGS,STATUS_BT3
TRATA_BT3_PROG
FLAGS,DEBOUNCE_FIM

;BOTAO1 PRESSIONADO?
;SIM, DESVIA
;NAO, CONTINUA
;BOTAO2 PRESSIONADO?
;SIM, DESVIA
;NAO, CONTINUA
;BOTAO3 PRESSIONADO?
;SIM, DESVIA
;BOTAO TRATADO, APAGA FLAG FIM DE DEBOUNCE
;NAO, RETORNA

TRATA_BT1_PROG
MOVLW
XORWF
BTFSC
GOTO
INCF
GOTO

.9
PERIODO,W
STATUS,Z
SOLTAR_BOTAO
PERIODO,F
SOLTAR_BOTAO

;W RECEBE 9
;W = W xor PERIODO
;PERIODO = 9?
;SIM, DESVIA
;NAO, INCREMENTA PERIODO
;DESVIA

TRATA_BT2_PROG
MOVLW
XORWF

42

.1
PERIODO,W

;W RECEBE 1
;W = W xor PERIODO

Microcontroladores PIC16F628A/648A - Uma Abordagem prtica e Objetiva

BTFSC
GOTO
DECF
GOTO

STATUS,Z
SOLTAR_BOTAO
PERIODO,F
SOLTAR_BOTAO

;PERIODO = 1?
;SIM, AGUARDA SOLTAR BOTAO
;NAO, DECREMENTA PERIODO
;DESVIA

TRATA_BT3_PROG
BCF
GOTO

FLAGS,NORMAL_PROG ;ATIVA MODO NORMAL


SOLTAR_BOTAO
;DESVIA

;
*******************************************************************************************************
***************************************
;ESTA SUB-ROTINA ATUALIZA O DISPLAY DE SETE SEGMENTOS
;
*******************************************************************************************************
***************************************
ATUAL_DSP
BTFSS
GOTO
CALL
MOVWF
RETURN
BTFSS
GOTO
MOVF
MOVWF
CALL
MOVWF
RETURN

FLAGS,NORMAL_PROG ;MODO NORMAL ATIVADO?


$+4
;SIM, SALTA QUATRO LINHAS DE CODIGO PARA BAIXO
PROG_MODO
;NAO, CHAMADA A SUB-ROTINA
PORTB
;ATUALIZA DISPLAY
;RETORNA
FLAGS,ACENDE_DSP
;ACENDER DISPLAY?
APAGAR_DSP
;NAO, DESVIA
CONTADOR,W
;SIM, W RECEBE CONTADOR
TEMP
;TEMP RECEBE W
CONV_DISPLAY
;CHAMADA A SUB-ROTINA
PORTB
;ATUALIZA DISPLAY
;RETURN

APAGAR_DSP
CLRF
RETURN

PORTB

;APAGA DISPLAY
;RETORNA

PERIODO,W
TEMP

;W RECEBE PERIODO
;TEMP RECEBE W

PROG_MODO
MOVF
MOVWF

;
*******************************************************************************************************
***************************************
CONV_DISPLAY
MOVF
ADDWF

TEMP,W
PCL,F

;W RECEBE CONTEUDO DE CONTADOR


;SOMA PCL E W

;OS COMENTRIOS A SEGUIR SE REFEREM AOS VALORES VISTOS NO DISPLAY


;
.GFEDCBA
;POSICAO DOS SEGMENTOS DO DISPLAY LIGADO NO PORTB
RETLW
B'00111111'
;0
RETLW
B'00000110'
;1
RETLW
B'01011011'
;2
RETLW
B'01001111'
;3
RETLW
B'01100110'
;4
RETLW
B'01101101'
;5
RETLW
B'01111101'
;6
RETLW
B'00000111'
;7
RETLW
B'01111111'
;8
RETLW
B'01100111'
;9

Respostas dos execcios

43

;
*******************************************************************************************************
***************************************
;ESTA SUB-ROTINA EFETUA CONTAGEM DO TEMPO E SINALIZA QUANDO PASSA 0,5 S
;
*******************************************************************************************************
***************************************
TIMER_4mSEG
BTFSS
GOTO
BCF
MOVLW
MOVWF
DECFSZ
RETURN
MOVLW
MOVWF

INTCON,T0IF
$-1
INTCON,T0IF
INIC_TMR0
TMR0
COUNT,F
CONTA
COUNT

;TMR0 ESTOUROU?
;NAO, ESPERA TMR0 ESTOURAR
;SIM, APAGA FLAG T0IF
;INICIALIZA TIMER 0
;COM 131
;PASSOU 0,5 SEG?
;NAO, RETORNA
;SIM, INICIALIZA COUNT COM 125

;
*******************************************************************************************************
***************************************
;ESTA PARTE DA SUB-ROTINA CHAVEIA O BIT MEIO_SEG CADA VEZ QUE PASSAR 0,5 S
;E ACIONA O FLAG ACENDE_DSP(ACENDE DISPLAY).
BTFSS
GOTO
BCF
GOTO
BSF
DECFSZ
RETURN
MOVF
MOVWF

FLAGS,MEIO_SEG
;FLAG MEIO_SEG ATIVADO?
$+3
;NAO, SALTA TRES LINHAS DE CODIGO PARA BAIXO
FLAGS,MEIO_SEG
;SIM, APAGA FLAG MEIO_SEG
$+2
;SALTA DUAS LINHAS DE CODIGO PARA BAIXO
FLAGS,MEIO_SEG
;SET FLAG MEIO SEGUNDO
TEMP2,F
;DECREMENTA TEMP2, TEMP2=0?
;NAO, RETORNA
PERIODO,W
;SIM, W RECEBE PERIODO
TEMP2
;TEMP2 RECEBE W

BTFSS
GOTO
BCF
RETURN
BSF
RETURN

FLAGS,ACENDE_DSP
;FLAG ACENDER DISPLAY ESTA ACESO?
$+3
;NAO, SALTA TRES LINHAS DE CODIGO PARA BAIXO
FLAGS,ACENDE_DSP
;SIM, DESATIVA FLAG ACERDER DISPLAY
;RETORNA
FLAGS,ACENDE_DSP
;ATIVA FLAG ACERDER DISPLAY
;RETORNA

;
*******************************************************************************************************
***************************************
;
SUB-ROTINA DE ESCRITA NA EEPROM
;
*******************************************************************************************************
***************************************
;A SUB-ROTINA A SEGUIR E UMA PROPOSTA PARA UMA ROTINA DE ESCRITA NA EEPROM.
;O PROGRAMA IRA GRAVAR O DADO ARMAZENADO NO REG PERIODO, NA LOCALIDADE
;00H DA EEPROM E IRA SE COMPORTAR DA SEGUINTE FORMA:
;
1 - SE O CICLO DE ESCRITA TERMINAR ANTES DE 8mS E O DADO GRAVADO
;ESTIVER CORRETO, O PROGRAMA RETORNARA O VALOR 00H EM W (ESCRITA COM SUCESSO),
;INDICANDO QUE A ESCRITA FOI EFETUADA COM SUCESSO.
;
2 - SE O CICLO DE ESCRITA TERMINAR ANTES DE 8mS E O DADO GRAVADO
;ESTIVER INCORRETO, O PROGRAMA TRAVARA, INDICANDO QUE A ESCRITA FOI EFETUADA,
;MAS SEM SUCESSO, EXIBINDO NO DISPLAY UMA MENSAGEM DE ERRO.
;
3 - SE O CICLO DE ESCRITA NAO TERMINAR EM 8mS O PROGRAMA TRAVARA,
;INDICANDO QUE A ESCRITA NAO FOI CONCLUIDA PORQUE O TEMPO SE ESGOTOU, SENDO EXIBIDA

44

Microcontroladores PIC16F628A/648A - Uma Abordagem prtica e Objetiva

UMA
;MENSAGEM DE ERRO.
;******************************************************************************************************
****************************************
ESCREVE_EEPROM
BTFSS
GOTO
GOTO

FLAGS,ESCRITA_EEPROM
VERIF_PERIODO
TERMINA_ESC

;ESCRITA EM ANDAMENTO?
;NAO, DESVIA
;SIM, DESVIA

;
*******************************************************************************************************
***************************************
;VERIFICA SE PERIODO FOI ALTERADO
VERIF_PERIODO
BANK1
MOVLW
MOVWF
BSF
MOVF
XORWF
BANK0
BTFSC
RETURN

.0
EEADR
EECON1,RD
EEDATA,W
PERIODO,W
STATUS,Z

;ATIVA BANCO 1 DE MEMORIA


;ENDERECO DA EEPROM QUE SERA LIDO
;INICIA CICLO DE LEITURA
;W RECEBE DADO LIDO
;W = (W xor PERIODO)
;ATIVA BANCO 0
;PERIODO DE PISCAGEM FOI ALTERADO?
;NAO, RETORNA
;SIM, CONTINUA

;
*******************************************************************************************************
***************************************
;INICIA O CICLO DE ESCRITA
INICA_ESCRITA
BANK1
MOVLW
MOVWF
MOVF
MOVWF
BSF
BCF
MOVLW
MOVWF
MOVLW
MOVWF
BSF
MOVLW
MOVWF
BSF
BANK0
RETURN

ENDERECO
;ENDERECO ONDE SERA GRAVADO O DADO
EEADR
PERIODO,W
;DADO A SER GRAVADO EM ENDERECO(0x00)
EEDATA
EECON1,WREN
;HABILITA ESCRITA
INTCON,GIE
;DESLIGA CHAVE GERAL DE INTERRUPCAO
0X55
EECON2
;ESCREVE 55h EM EECON2
0XAA
EECON2
;ESCREVE AAh EM EECON2
EECON1,WR
;DA INICIO AO CICLO DE ESCRITA
.2
;INICIALIZA TEMP_ESPERA COM 2
TEMP_ESPERA
FLAGS,ESCRITA_EEPROM
;ATIVA FLAG ESCRITA EM ANDAMENTO
;ATIVA BANCO 0
;RETORNA

;
*******************************************************************************************************
***************************************
;TESTA O BIT WR DUAS VEZES NUM PERIODO DE 8mS.
;SE O CICLO DE ESCRITA NAO TERMINAR APOS ESTE TEMPO SERA GERADO UM CODIGO DE ERRO
TERMINA_ESC
BANK1
BTFSS
GOTO
DECFSZ

EECON1,WR
VERIFICA_DADO
TEMP_ESPERA,F

;ATIVA BANCO 1
;CICLO DE ESCRITA TERMINOU?
;SIM, VERIFICA SE DADO GRAVADO ESTA
;CORRETO
;NAO, TEMPO ESGOTADO?

Respostas dos execcios

45

GOTO
$+3
BANK0
GOTO
TEMP_ESG
BANK0
RETURN

;NAO, PULA TRES LINHAS DE CODIGO P/ BAIXO


;SIM, ATIVA BANCO 0
;DESVIA
;ATIVA BANCO 0
;SIM, RETORNA

TEMP_ESG
BANK1
BCF
BANK0
BCF
MOVLW
MOVWF
NOP
GOTO

;ATIVA BANCO 1
;DESABILITA ESCRITA
;ATIVA BANCO 0
FLAGS,ESCRITA_EEPROM
;DESATIVA FLAG ESCRITA EM ANDAMENTO
B'01001111'
;EXIBE MENSAGEM DE ERRO NO DISPLAY
PORTB
;A MENSAGEM DE ERRO (EXIBE A LETRA E).
;TRAVA O PROGRAMA NESTE PONTO
$-1
EECON1,WREN

;
*******************************************************************************************************
***************************************
;DADO ESCRITO ESTA CORRETO. SE A RESPOSTA FOR SIM, O PORGRAMA IRA TRAVAR.
VERIFICA_DADO
MOVLW
MOVWF
BANK1
MOVF
BSF
SUBWF
BTFSS
GOTO
BCF
BANK0
BCF
RETLW

.2
TEMP_ESPERA

;INICALIZA TEMP_ESPERA COM VALOR 2

;ATIVA BANXO 1
;W RECEBE DADO ESCRITO
;INICIA CICLO DE LEITURA
;W = EEDATA - W
;DADO ESCRITO E O MESMO QUE FOI LIDO?
;NAO, DESVIA
;DESABILITA ESCRITA
;SIM, ATIVA BANCO 0
FLAGS,ESCRITA_EEPROM
;DESATIVA FLAG ESCRITA EM ANDAMENTO
.0
;RETORNA 0 (CODIGO DE ESCRITA FEITA COM SUCESSO)
EEDATA,W
EECON1,RD
EEDATA,W
STATUS,Z
TRATA_ERRO
EECON1,WREN

;
*******************************************************************************************************
***************************************
;SE O DADO GRAVADO NAO E O MESMO QUE FOI LIDO, SERA GERADO UM CODIGO DE ERRO
;DE DADO INCORRETO QUE IRA TRAVAR O PROGRAMA.
TRATA_ERRO
BANK1
BCF
BANK0

EECON1,WREN

;ATIVA BANCO 1
;DESABILITA ESCRITA
;ATIVA BANCO 0

BCF
MOVLW
MOVWF
NOP
GOTO

FLAGS,ESCRITA_EEPROM
;DESATIVA FLAG ESCRITA EM ANDAMENTO
B'01001111'
;SIM, EXIBE MENSAGEM DE ERRO NO DISPLAY
PORTB
;A MENSAGEM DE ERRO (EXIBE A LETRA E).
;TRAVA O PROGRAMA NESTE PONTO
$-1

;
*******************************************************************************************************
***************************************
END
;FIM DO PROGRAMA
;
*******************************************************************************************************
***************************************

46

Microcontroladores PIC16F628A/648A - Uma Abordagem prtica e Objetiva

Captulo 14: M<dulo CCP (Capture, Compare e


PWM)
1. Capture, Compare e PWM.
2. CCP1M3:CCP1M0(CCP1CON<3:0>).
3. O TIMER 1 utilizado para medir o tempo entre dois eventos ocorridos
no pino RB3/CCP1. Esses eventos so, na verdade, transies positivas
(bordas de subida) ou transies negativas (bordas de descida)
ocorridas nesse pino, dependendo da configurao adotada para o
modo Capture.
4. Como temporizador ou como contador sincronizado.
5. Nesse modo de funcionamento do mdulo CCP, o contedo do par de
registradores TMR1H:TMR1L comparado, a todo o instante, com o
contedo do par de registradores CCPR1H:CCPR1L. Quando ocorrer a
igualdade de contedo, o pino RB3/CCP1 ser chaveado de acordo com
o modo de funcionamento do Compare no momento.
6. Este o nome dado ao modo de funcionamento do Compare que
zera(ou reseta) o TMR1 quando ocorre a igualdade.
7. No. Como o mdulo TIMER 1 deixa de funcionar no modo sleep,
devido parada do oscilador principal, ou funciona como contador no
sincronizado, o modo Compare tambm no pode funcionar.
8. Modulao por Largura de Pulso.
9. um sinal digital com frencia fixa, mas com ciclo ativo varivel.
Ciclo ativo a a parte do ciclo na qual o sinal permanece em nvel 1.
10. a relao entre o ciclo ativo e o perodo do sinal PWM.
11. Fazer o sinal PWM passar por um filtro passa baixas. A freqncia de
corte do filtro passa baixas deve ser pelo menos 10 vezes menor que a
freqncia do sinal PWM.
12. O perodo do sinal PWM gerado no pino RB3/CCP1 definido pelo valor
escrito no registrador PR2, pela Fosc e pelo fator de prescaler aplicado
ao TMR2.
13. Quando TMR2 = (PR2 + 1).
14. Nmero de passos.
15. necessrio que: 0 < (CCPR1L:CCP1CON<5:4>) < [(PR2 + 1) x 4].

Captulo 15: Mdulo Comparador


Respostas dos execcios

47

1. O comparador um circuito eletrnico que compara duas tenses


analgicas e chaveia a sada quando uma das tenses torna-se maior
que a outra.
2. Dois.
3. Oito. Por meio dos bits CM2:CM0(CMCON<2:0>).
4. Modo 0.
5. o tempo mnimo necessrio para que, aps ser aplicada na entrada
do comparador uma nova tenso, esteja garantido, na sada deste, um
nvel de tenso vlido.
6. Quando ocorre uma mudana de nvel lgico na sada de um dos
comparadores do mdulo comparador.

Captulo 16: Mdulo Referncia de Tenso


1. O mdulo referncia de tenso fornece 16 nveis diferentes de tenso
que podem estar disponveis no pino RA2/AN2 ou podem ser aplicados
simultaneamente nas entradas Vin+(no inversora) de ambos os
comparadores, quando o mdulo comparador estiver operando no
modo 2.
2. Bits VR3:VR0(VRCON<3:0>).
3. Selecionar a escala que ser utilizada na gerao da tenso de
referncia. Com VRR=1 ser utilizada a escala baxia de tenso. Com
VRR=0 ser selecionada a escala alta de tenso.
4. 0,833v.
5. Sempre que ocorrer um reset, o mdulo referncia de tenso ser
desativado (modo 0), devido ao fato de que qualquer reset zera o
registrador VRCON.
6. 10s.

Captulo 17: USART


1. Ponto a ponto ou multi ponto. A comunicao ponto a ponto
Caracteriza-se pela presena de apenas dois pontos de comunicao,
um em cada extremidade do enlace. Na comunica multi ponto
observa-se a presena de trs ou mais dispositivos de comunicao
com possibilidade de utilizao do mesmo enlace.
2. Simplex - o meio de transmisso utilizado apenas em um dos
possveis sentidos de transmisso.
Half-duplex - utilizado nos dois possveis sentidos de transmisso,
porm apenas um por vez, ou seja, se um terminal est transmitindo, o

48

Microcontroladores PIC16F628A/648A - Uma Abordagem prtica e Objetiva

outro terminal no pode transmitir e vice-versa.


Full-duplex - utilizado nos dois sentidos possveis de transmisso
simultaneamente, ou seja, os dois terminais podem transmitir ao mesmo
tempo.

3. De modo sncrono ou de modo assncrono.


4. A transmisso sncrona precisa de dois meios de transmisso: um para
o sinal de clock que ir sincronizar a transmisso e outro para os
dados. A transmisso assncrona s precisa de um meio de
transmisso: por onde vo trafegar os dados.
5. o tempo no qual o bit ficar disponvel no meio de transmisso para
ser lido pelo receptor.
6. Por meio do Start Bit. Este sempre inicia uma transmisso assncrona.
7. um conjunto de regras que devem ser seguidas pelo transmissor e
pelo receptor para que a comunicao tenha sucesso.
8. Por meio de sinais de controle, com os do tipo DTS e CTS. Este tipo de
controle de fluxo chamdo de controle de fluxo por hardware, ou out
band. O controle de fluxo de dados pode ser feito tambm por meio
de caracteres de controle de fluxo enviados pelo canal de transmisso.
Esse mtodo de controle de fluxo chamado in-band ou controle de
fluxo por software.
9. A USART pode ser configurada como um sistema assncrono full-duplex
ou como um sistema sncrono half-duplex. A tansmisso assncrona
full-duplex permite ao MCU se comunicar com computadores pessoais,
modems, etc. J a transmisso sncrona half-duplex permite ao MCU se
comunicar com perifricos como conversores A/D e D/A, chips relgiocalendrio, chips de memria EEPROM etc.
10. TXSTA. O endereo ocupado por este registrador o 98h, no banco 1
de memria RAM.
11. RCSTA. O endereo ocupado por este registrador o 18h, no banco 0
de memria RAM.
12. E.
13. Dois erros podem ser detectados pelo mdulo receptor da USART, um
por meio do bit FERR, que informa que stop bit = 0, quando deveria
ser 1. Este um erro grave na comunicao, pois mostra que o
transmissor e receptor no esto sincronizados. O outro o erro de
transbordo, sinalizado pelo bit OERR, que indica que o ltimo byte que
chegou foi perdido.
14. O baud rate define o perodo do bit, tambm chamado de intervalo de
sinalizao. O perodo do bit o tempo em que o bit permanecer na
linha de transmisso para que ele possa ser lido pelo receptor. O baud
rate representa a quantidade de bits que pode ser transmitida por

Respostas dos execcios

49

segundo (bps).
15. A melhor opo utilizar a alta taxa de transferncia, fazendo o bit
BRGH = 1. O valor a ser escrito no registrador SBRGH deve ser 12. O
erro de baud rate ser de 0,16%. A taxa de transferncia real ser de
19230,77 bps.
16. Quando o dado a ser transmitido for colocado no registrador TXREG.
17. ASCII.
18. Para o registrador RCREG.
19. A idia utilizar o nono bit para diferenciar em uma transmisso um
endereo de um dado. Setando o bit ADDEN junto com o bit RX9, ns
podemos ativar essa funcionalidade. Depois de setados os bits ADDEN
e RX9, qualquer dado que chegar pela USART com o nono bit (RX9D) =
0 ser descartado, ou seja, o dado no ser transferido para o
registrador RCREG, da mesma forma que no ser gerada a
interrupo do mdulo receptor da USART, ainda que esteja habilitada.
Um dado recm-chegado pela USART ser transferido para o
registrador RCREG quando o nono bit (RX9D)=1. Esse nono bit ser
reconhecido pelo receptor como um endereo. No mesmo instante
ser setado o bit RCIF (P1RI<5>), sendo tambm
gerada a
interrupo do mdulo receptor da USART, caso ela esteja habilitada.
20. Sincronizar o transmissor com o receptor para que o dado seja lido no
momento certo. Na transmisso sncrona, o dado estar disponvel
para leitura na borda negativa do sinal de clock.
21. O mestre aquele que gera o sinal de clock na transmisso.
22. Receptor sncrono funcinando como escravo.

Captulo 18: PIC16F648A


1. A principal diferena entre eles a memria de programa. O
PIC16F648A possui o dobro de memria de programa, ou seja, 4k
(4.096) posies de memria de programa. Outra diferena entre
esses modelos de MCU a memria RAM. O PIC16F648A possui 256
posies, enquanto o PIC16F628A possue 224 posies de memria
RAM. Alm disso, esses MCUs possuem quantidades diferentes de
memria EEPROM. O PIC16F648A possui o dobro de localidades de
EEPROM, ou seja, 256 localidades.
2. P16F648A.INC.

50

Microcontroladores PIC16F628A/648A - Uma Abordagem prtica e Objetiva

Respostas dos execcios

51