You are on page 1of 145

CAPÍTULO 1

Blocos funcionais do microcomputador

¾ Introdução
¾ O microcomputador
¾ Blocos Funcionais
1 - OS BLOCOS FUNCIONAIS DO MICROCOMPUTADOR

1.1 - Introdução

Os avanços tecnológicos conseguidos na fabricação de semicondutores permitiram o


surgimento dos microprocessadores. Com isso, foi possível que os computadores se tornassem
cada vez mais compactos e seus custos mais acessíveis, permitindo uma ampliação nas
possibilidades de suas utilizações.
Onde não se imaginava utilizar sistemas computadorizados há poucos anos atrás, hoje já
se faz um amplo uso do computador. Como a indústria tem como principal objetivo, um aumento
na qualidade de seus produtos e aumentar a quantidade de produtos fabricados no mesmo tempo,
é indispensável que os profissionais do ramo eletrônico tenham um bom conhecimento sobre seu
funcionamento.
1.2 - O microcomputador

É um equipamento cuja função é executar automaticamente uma seqüência de operações


para as quais foi anteriormente programado. Os microcomputadores são equipamentos capazes
de executarem diferentes tarefas para atender às várias necessidades do usuário, os quais podem
ter finalidades gerais.
Quando utilizamos em aplicações gerais como os microcomputadores comercializados,
definimos como sendo os de finalidades gerais. Para poderem atender uma aplicação
determinada, são projetados os de finalidades específicas.
Os dados nos computadores são armazenados e expressos em linguagem binária que
utiliza os dígitos 0 e 1. Essas condições são obtidas por meio de flip-flop, que são dispositivos de
armazenamento nos sistemas de computadores. O bit pode ser definido como uma unidade
básica de representação de dados em qualquer sistema de computador. Os computadores
processam dados com extensão de 8 bits ou um de seus múltiplos, 16, 32, 64.
Determinados números de bits são denominados de palavra “Word”, o qual pode conter,
1, 2, 4, 8, 16, 32 e 64 bits. A palavra de 4 bits é chamada de “nibble” e a palavra de 8 bits de
“byte”. Uma palavra pode representar um dado ou uma diretriz chamada de instrução. O que
torna imprescindível citarmos as definições de:
Hardware: Consiste de circuitos eletrônicos responsáveis pela execução direta de instruções em
linguagem de máquina: C. Is, placas de circuitos impressos, cabos, fontes de alimentação etc.
Software: O grupo ou conjunto de instruções apresentadas ao computador chama-se programa, o
qual consiste de algoritmos, que é o processo pelo qual as operações lógicas são executadas pela
máquina.
Firmware: Consiste de um software embutido em circuitos eletrônicos.
É comum dizer que qualquer operação feita por software pode também ser construída por
hardware e qualquer instrução executada pelo hardware pode também ser simulada por software.

2
1.3 - Blocos funcionais

Qualquer sistema de microcomputador é formado basicamente pelos seguintes blocos


funcionais:
- unidade de memória
- unidade central de processamento (UCP)
- unidade de entrada / saída
- dispositivo de interface
- DMA
Abaixo um diagrama da estrutura geral de um microcomputador.

CPU

INTERFACE

DISPOSITIVO
MEMÓRIA DMA DE I/0

Figura 1 – Sistema de Microcomputador típico e suas interfaces


Os blocos funcionais representados no diagrama acima são construídos com circuitos
integrados (C. Is). Os circuitos integrados são componentes que possuem um elevado nível de
integração de componentes em uma única pastilha, esse processo é denominado de LSI “Large
Scale Integration”, ou seja “Integração em larga escala”. O conjunto de C.Is. que forma os blocos
funcionais de um computador é também conhecido como “hardware”.
Microprocessador
O microprocessador ou Unidade Central de Processamento (CPU) é um dispositivo
digital baseado numa única pastilha (CHIP). Esta pastilha, por si só, tem a capacidade de
controlar e manipular dispositivos externos como: memórias, portas de I/O (entrada/saída) e
outros circuitos.
Os microprocessadores utilizam sistemas seqüenciais síncronos, ou seja, utilizando um
CLOCK. A cada pulso de clock ou grupo de pulsos (pode ser de 3 em 3, por exemplo) executam-
se uma função específica.
Hoje temos microprocessadores rodando com clock de 400 MHz da INTEL, que pode
executar centenas de milhões de instruções por segundo.

3
Um microprocessador pode ser divido segundo seus blocos funcionais:
• registradores e contadores;
• unidade lógica e aritmética;
• unidade de controle e sincronização.
Os registradores e contadores são utilizados para o armazenamento temporário dos bits
dentro do microprocessador. Este tipo de tarefa é executado pelo registrador e decodificador de
instrução, pelo contador de programa e pelo acumulador.
A Unidade Lógica Aritmética (ULA) é responsável pelas operações lógicas e
aritméticas entre os bits, gerando uma outra palavra como saída. Estas operações são executadas
entre o acumulador e o registrador temporário do microprocessador com os quais a ULA se
comunica internamente e o resultado é armazenado no próprio acumulador.
A unidade de controle e sincronização coordena e controla todas os blocos funcionais
do computador em uma seqüência lógica e sincronizada. Ela recebe as instruções vindas do
programa armazenado na memória de programa já decodificado pelo decodificador de instruções
e emite os sinais de sincronização e controle para as diversas partes do computador.

Unidade de Memória
A unidade de memória é à parte do sistema na qual são armazenados os dados e os
programas que podem ser executados pelo computador.
A unidade de memória possui dois tipos de memória:
• Memória de Leitura (ROM - Read Only Memory);
• Memória de Acesso Aleatório (RAM - Randomic Acess Memory).
Na ROM, correspondente à parte de unidade de memória que armazena as instruções
que constituem o programa monitor. A memória RAM é à parte da memória responsável pelo
armazenamento dos dados que serão usados durante a execução do programa.
Para que seja possível localizar uma entre muitos dados armazenados na memória é
necessário que as posições destes dados sejam numeradas. Essas posições são chamadas de
endereços. No próximo capitulo vamos estudar os diversos tipos e principais características das
memórias.

Unidade de I/O
As unidades de I/O são as interfaces pelos quais o usuário comunica-se com o
computador e vice-versa. As unidades de I/O possuem conexão com dispositivos chamados
unidades periféricas, tais como: teclados, terminais de vídeo, impressoras, etc.

Interface
A interface é um dispositivo que auxilia na transferência de informações entre a
Unidade Central de Processamento e dispositivos periféricos. Ela é usada principalmente em
sistemas que possuem somente uma CPU e vários dispositivos periféricos.

DMA
“DMA” ou Direct Memory Acess (Acesso Direto à Memória) é o processo de
comunicação direta entre dispositivos periféricos e memória.
Este processo se deve ao fato da necessidade de se aumentar à velocidade de
transferência de dados.

4
1.4 – Exercícios
1 – Qual o principal objetivo da aplicação do microcontrolador na industria ?
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________

2 – Qual a função do microcomputador e qual sua finalidade ?


__________________________________________________________________
__________________________________________________________________
__________________________________________________________________

3 – Defina:

a – Hardware
__________________________________________________________________
__________________________________________________________________
b – Software
__________________________________________________________________
__________________________________________________________________
c – firmware
__________________________________________________________________
__________________________________________________________________

4 – Quais os blocos básicos que compõe o microcomputador ? Defina-os.


__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________

5
Anotações:
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________

6
CAPÍTULO 2

Memória

¾ RAM
¾ ROM

7
2 – MEMÓRIA

Memória é à parte do sistema onde são armazenados os programas e dados necessários à


realização das operações efetuadas pelo computador. A memória é equivalente a milhares de
registradores, cada um armazenando uma palavra binária. Os microcomputadores de 8 bits
utilizam memórias de semicondutores com até 65536 posições, cada uma capaz de armazenar
um byte de informação. Além das memórias de semicondutores, outros dispositivos mais
comuns também podem ser citados: Cartão de papel perfurado, fita magnética, disco magnético,
tambor magnético, núcleo magnético, memória de bolha.
Memórias que possuem a característica de podermos acessar qualquer registrador da
memória de modo aleatório sem antes percorrermos toda a estrutura da memória através de
endereço dos registradores desejados, são conhecidas como memórias de acesso randômico.
Diferente das memórias de acesso seqüenciais onde é muito mais rápido acessarmos a memória
seqüencialmente já que para acessarmos dados em diferentes posições da memória há a
necessidade de se percorrer a estrutura ate chegarmos no ponto desejado, implicando num tempo
maior de leitura. Dentre os vários tipos de memória, as mais comuns são as memórias RAM e as
memórias ROM.
2.1 – Memórias RAM

RAM: “Random Access Memory” – Memória de Acesso Randômico – também conhecida como
memória de leitura e gravação, a qual é um tipo de memória que se pode ler e escrever dados
binários. A RAM é utilizada para armazenar programas temporários e dados que serão alterados
no decorrer da execução do programa. Os dados na memória RAM são retidos apenas enquanto a
fonte permanece ligada, a RAM é uma memória volátil.

Endereço
An
.
A0
Saída / Entrada
RAM de dados

Controle

Figura 2 – Ilustração de memória RAM


As RAMs podem ser do tipo dinâmicas ou estáticas.
RAM dinâmica: (DRAM “Dynamic Random Access Memory”). É a memória que perde a
informação armazenada mesmo quando a alimentação é constante. Isso acontece porque cada
célula da DRAM apresenta um transistor MOSFET e um capacitor que armazena um dado (1 –
bit). O transistor fica em série com o capacitor de armazenamento e cumpre a função de uma
chave que permite a entrada ou saída da carga do capacitor quando o pino WE é ativado.
Devido às fugas de carga do capacitor, há necessidade de reposição dessas cargas através
de um pulso de “REFRESH”, vindo do microprocessador. Esse processo requer que todas as
células de armazenamento sejam endereçadas pelo menos uma vez a cada 2 milissegundos. Um
circuito contador externo a memória é geralmente incorporado ao sistema para ativar o
barramento de endereço, quando o microprocessador não está acessando a memória.

8
Existem vários tipos de memórias DRAM que diferem no modo que elas se comunicam
com o sistema, mas cujo principio de armazenamento é o mesmo, abaixo citamos algumas delas:
• EDO – (Extended Data Output). Pode manter a saída de dados de um endereço enquanto
seta um novo endereço. Utilizada em sistemas de fonte de informação.
• VRAM – (Vídeo RAM). Utilizadas em aceleradores de vídeo.
• RDRAM - (Rambus DRAM). Fabricada pela Rambus Inc, por isso RDRAM, possui
algumas desvantagens em alguns aspectos, em compensação tem uma taxa de
transferência de dados muito alta, cerca de 1000Mbps contra 200Mbps das DRAM
comuns. É utilizada principalmente em aceleradores de vídeo e em certos videogames,
como o Ultra 64 da Nintendo.
• PSRAM – (Pseodo Static Ram). Memória RAM dinâmica que simula uma RAM
estática. É uma alternativa barata para substituir as RAMs estáticas, que são mais caras. É
utilizada em sistemas embutidos.
• SDRAM – (Synchronous DRAM). Soma um sinal de clock separado. Pode conter
estados de maquinas mais complexos.
• CDRAM – (Cached DRAM). Combinam a memória principal e memória cachê num
único chip. O controlador da memória cachê deve ser adicionado externamente.
RAM estática: (SRAM “Static Random Access Memory”). É uma memória que não necessita
de circuitos adicionais em um microprocessador e as informações permanecem registradas
enquanto não houver nova escrita, ou não faltar alimentação aos biestáveis utilizados na
construção da célula de memória. Enquanto a alimentação for mantida constante, o biestável
permanece travado e pode armazenar o bit indefinidamente. É mais rápida que a DRAM, mas
por causa de sua pouca densidade de informação temos menor capacidade de armazenamento do
que uma DRAM. Geralmente são mais caras que as DRAM e são utilizadas principalmente em
locais onde a velocidade é extremamente importante como na memória cachê.

2.2 - Memórias RAM com dispositivos de três estados


Dispositivos três estados (ou “tri-state”) são dispositivos lógicos nos quais existem três
estados de saída possíveis: O estado lógico 0, o estado lógico 1 e um estado lógico de alta
impedância, no qual a saída não tem efeito, pois está desconectada do resto do circuito e não tem
influência sobre ele. A condição de três estados pode ser mais bem compreendida analisando-se
uma saída “totem-pole tri-state” no circuito abaixo.

Saida
em tri
Saída state

Figura 3 – Circuito tri-state com transistores

9
Os transistores T3 e T4 funcionam como chaves lógicas que levam a saída a nível 1 e 0
respectivamente. Todavia, quando a entrada desabilitadora está em nível 0 coloca os dois
transistores em corte por meio do diodo D. Este drena o potencial de T2 para massa. Assim, a
saída fica em alta impedância em relação à fonte (nível 1) e ao terra (nível 0). O símbolo do
dispositivo de três estados é apresentado abaixo.

Entrada Saída

D
Figura 4 – Símbolo
Dispositivos de três estados podem ser acrescentados às linhas de dados de uma memória
para que vários chips do sistema possam usar o mesmo barramento de comunicação. Essas
chaves de três estados já incorporadas ao C. I. permitem conectar ou desconectar as linhas de
saída do barramento de dados.

2.3 - Tempos de acesso

Tempo de acesso da RAM é o tempo necessário para que o dado registrado em uma
posição endereçada seja transferido para os terminais de saída (tempo de acesso à leitura); ou o
tempo necessário para que o dado colocado nos terminais de entrada seja gravado na posição
endereçada (tempo de acesso à escrita). O tempo de acesso depende do chip utilizado e é
fornecido pelo manual do fabricante. A tabela abaixo mostra os tempos relacionados à tecnologia
de fabricação do chip.
Tecnologia Tempo de acesso (em ns)
TTL 60 a 200
ECL 10 a 40
PMOS estática 500 a 1000
NMOS estática 300 a 600
CMOS estática 400 a 700
PMOS dinâmica 400 a 700
NMOS dinâmica 200 a 550

2.4 – RAM
Entre as milhares memórias do tipo RAMs comercializadas atualmente, a 6116 de
tecnologia de fabricação MOS, será apresentada como exemplo. Essa memória é equivalente a
2128. Possui as seguintes características.
• Capacidade: 2K x 8 bits
• Alimentação: simples de 5v
• Tempo de acesso de chip enable (CE): 400 ns (Máximo)
• Nível de tensão: compatível com nível TTL
• Saída / entrada de dados comum
• Não requer clocks ou “strobe”
10
Descrição da pinagem

Figura 5 – Pinagem da memória RAM 6116 ou 2128

A correspondência entre pinos e sinais de entrada / saída é comentada na tabela a seguir.


Pino Sinal Função
1 A7 Bit 7 de endereço
2 A6 Bit 6 de endereço
3 A5 Bit 5 de endereço
4 A4 Bit 4 de endereço
5 A3 Bit 3 de endereço
6 A2 Bit 2 de endereço
7 A1 Bit 1 de endereço
8 A0 Bit 0 de endereço
9 D0 Bit 0 de dado
10 D1 Bit 1 de dado
11 D2 Bit 2 de dado
12 Vss Alimentação – GND = referencia 0 volt
13 D3 Bit 3 de dado
14 D4 Bit 4 de dado
15 D5 Bit 5 de dado
16 D6 Bit 6 de dado
17 D7 Bit 7 de dado
18 CE Habilita o chip quando em nível zero.
19 A10 Bit 10 de endereço
20 OE Habilita barramento de dado quando em nível zero (tri-state).

11
21 WE Habilita escrita quando em nível zero; habilita leitura quando em nível 1
22 A9 Bit 9 de endereço
23 A8 Bit 8 de endereço
24 VCC Alimentação – Vcc = +5v

A tabela abaixo mostra os níveis necessários para ativar os pinos CE / OE e WE.


Seleção Leitura / Escrita Saída
CE / OE WE D0 a D7
H L Tri-state
H H Tri-state
L L Escrita (entrada de dados)
L H Leitura (saída de dados)

2.5 – ROM
ROM: “Ready Only Memory” – “Memória somente de leitura” – Memória não volátil, ou seja,
sua informação é mantida mesmo sem alimentação. A memória ROM é equivalente a um grupo
de registradores, onde cada um é capaz de armazenar permanentemente uma palavra. Os
microcomputadores podem usar mais de uma ROM.
O número dessas memórias depende da extensão do programa a ser armazenado. As
ROMs são usadas para armazenar não só programas principais como também sub-rotinas e
microprogramas.
São também bastante úteis para o armazenamento de tabelas trigonométricas, tabelas de
divisão e multiplicação, tabelas de logaritmos, tabela de raiz quadrada ou programas de partida e
gerenciamento do sistema (programa monitor). Veja abaixo o esquema de uma ROM.

Endereço
An
.
A0
Saída de leitura
ROM S de dados

Controle

Figura 6 – Esquema de uma memória ROM

As entradas A0 até An formam as linhas de endereço, e a saída de leitura S corresponde


ao dado gravado na posição selecionada pelo endereço.
A ROM (“Read Only Memory”) é uma memória só de leitura, ou seja, uma vez gravada a
informação não pode mais ser apagada. Para gravação, o processo é realizado no fabricante, que
confecciona uma mascara que permite a produção das memórias. Os CD-ROM’s também
possuem seu conteúdo fixo, logo são memórias ROM.

12
A PROM (“Programmable Read Only Memory”) permite que o próprio usuário armazene os
dados / programas desejados. Isso é feito com o auxílio de um programador PROM. A memória
possui uma malha de linhas cruzadas em forma de grade semelhante à da ROM. Em cada
interseção da grade está localizado um dispositivo (Diodo, transistor bipolar ou MOS) e em serie
com cada dispositivo existe um elemento de interrupção (fusível ou diodo). Os elos fusíveis são
queimados por meio da saturação de um transistor localizado na interseção linha / coluna cujo
endereço foi selecionado pelo circuito de decodificação. Nas PROMs que utilizam diodos, os
cruzamentos linha / coluna da grade são unidos por dois diodos ligados em serie oposta.
Abaixo temos uma figura que mostra a estrutura e o esquema elétrico de uma PROM que se
utiliza diodos.

Figura 7 – Estrutura de uma memória PROM por diodos

A EPROM (“Erasable Programmable Read Only Memory”), isto é, uma memória programável
e apagável apenas de leitura. É uma ROM que pode ser apagada e reprogramada um número
indeterminado de vezes. As informações são apagadas pela exposição do chip à luz ultravioleta
(UV) de alta intensidade, a qual penetra por uma abertura de cristal (quartzo) existente no centro
do circuito integrado. A EPROM não pode ser apagada seletivamente, isto é, não pode ter apenas
parte de seus bits apagados. Quando exposta a UV, todos os bits são apagados.
A EEPROM ou EAROM (“Eletrically Erasable Programmable Read Only Memory”) ou
(“Eletrically Alterable Programmable Read Only Memory”), não necessitam de UV para serem
apagadas e sim de impulsos elétricos. Uma outra vantagem é o fato de não ser necessário retirar
esta memória do circuito para ser reprogramada. Apesar de serem memórias que apresentam
características não voláteis, as informações que se encontram armazenadas tendem a se
deteriorar com o tempo, o que não ocorre com as outras memórias da família ROM. Tem como
grande desvantagem um custo elevado e que podem ser apagada somente 10 mil vezes.
A FLASH MEMORY são memórias com características similares a EEPROM e EPROM, em
um produto que oferece as vantagens destas memórias sem o alto custo, onde temos:
- Não volátil, apagável eletricamente total ou por setor, no próprio circuito, grande densidade,
alta velocidade de acesso e o já citado baixo custo.
A célula de memória Flash é semelhante à célula de uma EPROM, e é constituída por um
único transistor. Na memória Flash, uma fina camada de oxido de silício forma a porta do
transistor, permitindo apagar eletricamente a memória e uma maior densidade que as EEPROMs,
com um custo menor.
13
2.6 - EPROM
As memórias bipolares são mais rápidas que as memórias MOSFETs. Entre as milhares
memórias ROMs comercializadas atualmente, a 2732-A de tecnologia de fabricação EPROM-
MOS, será apresentada como exemplo. Possui as seguintes características.

• Capacidade: 4K x 8 bits
• Alimentação: fonte única de 5v
• Tempo de acesso: 450 ns (Máximo)
• Tempo de programação total: 200s
• Nível de tensão de programação: +21 v

Descrição da pinagem

Figura 7 – Pinagem da memória ROM 27C32.


A correspondência entre pinos e sinais de entrada / saída é comentada na tabela a seguir.
Pino Sinal Função
1 A7 Bit 7 de endereço
2 A6 Bit 6 de endereço
3 A5 Bit 5 de endereço
4 A4 Bit 4 de endereço
5 A3 Bit 3 de endereço
6 A2 Bit 2 de endereço
7 A1 Bit 1 de endereço
8 A0 Bit 0 de endereço
9 D0 Bit 0 de dado
10 D1 Bit 1 de dado
11 D2 Bit 2 de dado

14
12 Vss Alimentação – GND = referencia 0 volt
13 D3 Bit 3 de dado
14 D4 Bit 4 de dado
15 D5 Bit 5 de dado
16 D6 Bit 6 de dado
17 D7 Bit 7 de dado
18 CE Habilita o chip quando em nível zero.
19 A10 Bit 10 de endereço
20 OE / Vpp Habilita barramento de dado quando em nível zero (tri-state). Passa
para o modo de programação quando em +21 v
21 A11 Bit 11 de endereço
22 A9 Bit 9 de endereço
23 A8 Bit 8 de endereço
24 VCC Alimentação – Vcc = +5v

Antes de programar uma memória EPROM, é necessário verificar se esta apagada, onde
deve apresentar todos os endereços em nível 1 e a leitura em qualquer posição de memória
devera apresentar o dado FFh.
Para apagar esta memória o fabricante recomenda a exposição do CI à luz ultravioleta de
intensidade 12mW por cm2, por um intervalo de tempo aproximado de 600s. A tabela abaixo
mostra os níveis necessários para ativar os pinos CE / OE e WE.

Pinos Função leitura Saída não- Baixo Programação Inibição


habilitada consumo (escrita)
18 CE / PGM VIL Irrelevante VIH VIL VIH
20 OE / Vpp VIL VIH Irrelevante 21 v 21 v
24 Vcc 5v 5v 5v 5v 5v
9 a 11 Saída de Saída Q HI - Z HI - Z Entrada de HI –Z
dados dados
13 a 17

2.7 – Memória virtual

O Windows, para poder acelerar o desempenho do microcomputador, cria uma área de


memória virtual no espaço disponível do disco rígido. Assim, quando a memória RAM esta
totalmente ocupada e o processador necessita de mais espaço para trabalhar, ele seleciona parte
dos programas que não deve ser usado naquele momento e transfere para a área de memória
virtual. Esse processo, apesar de ajudar no desempenho, é mais lento do que se o micro tivesse
memória RAM suficiente para executar todas as instruções. O tempo de acesso ao disco rígido é
bem maior que o tempo de acesso à memória RAM. Toda informação da memória virtual é
apagada quando o micro é desligado.

15
2.8 – Exercícios

1 – O que é memória e qual a sua função?


__________________________________________________________________
__________________________________________________________________
__________________________________________________________________

2 – Defina memória RAM. Comente sobre suas principais características.


__________________________________________________________________
__________________________________________________________________
__________________________________________________________________

3 – Qual a diferença entre uma memória RAM dinâmica e uma RAM estática ?
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________

4 – Qual a aplicação em que devemos utilizar uma memória RAM estática ? E a


dinâmica ?
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________

5 – Comente sobre o dispositivo “tri-state”. Em quais componentes já temos esta


implementação ?
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________

6 – Determine a capacidade de acesso das memórias abaixo relacionadas.

a – Memória com pinos de endereçamento de A0 até A11 e 8 bits de dados.


__________________________________________________________________
b – Memória com pinos de endereçamento de A0 até A13 e 8 bits de dados.
__________________________________________________________________

16
c – Memória com pinos de endereçamento de A0 até A15 e 8 bits de dados.

7 – Defina memória ROM. Comente sobre suas principais características.


__________________________________________________________________
__________________________________________________________________
__________________________________________________________________

8 – Quais os tipos de memória ROM ? Comente sobre cada um dos tipos.


__________________________________________________________________
__________________________________________________________________
__________________________________________________________________

9 – Antes de efetuarmos a programação em uma programação em uma memória


EPROM, o que é necessário verificar.
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________

10 – Defina memória virtual e indique suas principais características.


__________________________________________________________________
__________________________________________________________________
__________________________________________________________________

17
Anotações:
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
18
CAPÍTULO 3

Conceito básico de microprocessador

¾ Microprocessador
¾ Dispositivo de entrada e saída
¾ Sistema de barramento
¾ Flags condição

19
3 – CONCEITOS BASICO MICROPROCESSADORES

Antes de iniciarmos, é relevante citarmos a história dos microprocessadores, onde abaixo


temos um breve resumo com destaques para algumas datas consideradas importantes. Na década
de 40 o surgimento da válvula e o transistor (1948), na década de 50 a comercialização do
transistor, na década de 60 os circuitos integrados do tipo SSI (“Small Scale Integrated” ou
pequena escala de integração), na década de 70 os circuitos integrados do tipo MSI (“Medium
Scale Integrated” ou media escala de integração). Em 1971 surgem os circuitos integrados do
tipo LSI (“Large Scale de Integrated” ou com grande escala de integração), com o primeiro
microprocessador de 4 bits o INTEL 4004, em 1972 a INTEL lança o 8008 uma CPU de 8 bits.
Já em 1974 a INTEL começa a ter concorrentes, com o microprocessador 8080, dez vezes mais
rápido que o anterior, a MOTOROLA lança o 6800 que durante muito tempo esteve presente nos
primeiros microcomputadores. A partir daí tivemos em 1976 a TEXAS com o primeiro CPU de
16 bits, em 1977 a MOSTEK com o 6502 (Apple I, II e II plus) e a ZILOG com o Z80 (TRS80),
um dos mais utilizados até hoje, em 1978 os circuitos integrados VLSI permitiram o surgimento
de novos microprocessadores como o MOTOROLA 6809 a INTEL com o 8088 / 8086 e os
microprocessadores BIT-SLICE (de 2 a 64 bits).
Década de 80:
1980 – MOTOROLA 68.000 em 1981 – MOTOROLA 68.010
1982 – INTEL 80186 / 80188 e o 80286 (com 130.000 transistores integrados)
1984 – MOTOROLA 68.020
1985 – INTEL 80386 ( 80386DX, ou i386)
1986 – MOTOROLA 68.030
1988 – INTEL 80386SX e em 1989 o i486 (1.200.000 transistores)
Década de 90:
1991 – INTEL i386SL, i486SX (os primeiros com tecnologia RISC)
1992 – INTEL i486 DX2/50 e o i486 DX2/66
1993 – INTEL Pentium
1995 – INTEL Pentium Pro
1997 – INTEL Pentium II
1998 – INTEL Pentium II 300, 266 MHz
1999 – INTEL Pentium III 600, 700 MHz
2000 – INTEL Pentium III 1000 MHz
2001 / 2002 – INTEL Pentium IV de até 2,7 GHz (Aproximadamente)
2003 / 2004 – INTEL Pentium IV de ate 3,6 GHz e o Athlon 64 da AMD

3.1 – Microprocessador

O microprocessador ou Unidade Central de Processamento (CPU) é um dispositivo


digital baseado numa única pastilha (CHIP). Esta pastilha, por si só, tem a capacidade de
controlar e manipular dispositivos externos como: memórias, portas de I/O (entrada/saída) e
outros circuitos.
20
Os microprocessadores utilizam sistemas seqüenciais síncronos, ou seja, utilizando um
CLOCK. A cada pulso de clock ou grupo de pulsos (pode ser de 3 em 3, por exemplo) executam-
se uma função específica.
Hoje temos microprocessadores rodando com clock de 3GHz da INTEL, que pode
executar centenas de milhões de instruções por segundo.
Um microprocessador pode ser divido segundo seus blocos funcionais:
• registradores e contadores;
• unidade lógica e aritmética;
• unidade de controle e sincronização.

Os registradores e contadores são utilizadas para o armazenamento temporário dos bits


dentro do microprocessador. Este tipo de tarefa é executado pelo registrador e decodificador de
instrução, pelo contador de programa e pelo acumulador.
A Unidade Lógica Aritmética (ULA) é responsável pelas operações lógicas e
aritméticas entre os bits, gerando uma outra palavra como saída. Estas operações são executadas
entre o acumulador e o registrador temporário do microprocessador com os quais a ULA se
comunica internamente e o resultado é armazenado no próprio acumulador.
A unidade de controle e sincronização coordena e controla todos os blocos funcionais
do computador em uma seqüência lógica e sincronizada. A UCP chama as instruções da
memória, decodifica-as e executa-as, além de alimentar as portas de entrada / saída a fim de
operacionalizar as instruções recebidas, ou seja, ela recebe as instruções vindas do programa
armazenado na memória de programa já decodificadas pelo decodificador de instruções e emite
os sinais de sincronização e controle para as diversas partes do computador.

3.2 - Dispositivos de entrada / saída


É o meio pelo qual o usuário se comunica com o computador. É através desses
dispositivos que o operador fornece informações ao sistema e recebe da máquina os resultados
das operações executadas pelo computador. Existem componentes que viabilizam a interface
com o usuário, tais como: portas seriais, portas paralelas, conversores análogo-digitais etc. Esses
componentes estão interligados através de um sistema de barramento.

3.3 - Sistema de barramento

Podemos definir o barramento como um conjunto de linhas físicas que possuem funções
específicas dentro do sistema. É composto de 3 barramentos independentes: o barramento de
endereços, o barramento de dados e o barramento de controle.
Barramento de endereços: é apenas saída tri-states ativas em nível alto, responsável pelo
caminho de comunicação dentro do sistema.
Barramento de dados: Funciona como barramento bidirecional para intercâmbio de dados entre
a UCP e a memória ou entre a UCP e periféricos de entrada e saída. Na saída de dados da CPU,
estes são gerados pelo microprocessador e enviados a uma unidade selecionada pelo barramento
de endereços. Na entrada de dados, estes são gerados por uma unidade particular e enviados ao
microprocessador.
Barramento de controle: É responsável por enviar e receber sinais de controle necessários à
transferência de dados no sistema. É composto basicamente de 4 tipos de sinais, sendo os de
leitura e escrita em memória e os de entrada e saída através de dispositivos externos.

21
Abaixo temos a arquitetura padrão de um microprocessador.

Sinais de controle
do Sistema

Decodificador de Controle da
Instruções CPU

Sinais de Controle
Registrador de
Instruções

Controle do
ALU Registrador da Controle de
Barramento de
(Aritmetic Logic Unit) CPU Endereços
Dados

Barramento Barramento
de Dados de
de 8 bits Endereços
de 16 bits

Figura 8 – Arquitetura padrão de um microprocessador


Podemos destacar os seguintes blocos da arquitetura apresentada.
Registrador da CPU ou acumulador – Registrador principal, que contem o dado a ser
processado. É o responsável por armazenar os resultados de adições, subtrações e outras
operações executadas pelo sistema.
Controle da CPU também responsável pelo Apontador de Pilha – (“Stack Pointer – SP”) –
Registrador que aponta para o endereço de retorno de sub-rotina, sendo este ultimo armazenado
em uma pilha de memória. É necessário na inicialização carregar no apontador o endereço inicial
da pilha.
Controle de endereços ou Contador de Programa – (“Program Counter – PC”) – Registrador
que armazena o endereço de memória da próxima instrução a ser executada. O conteúdo do
contador de programa é incrementado após a execução da instrução ou trocado por outro valor se
a instrução em curso for de desvio de seqüência.
Decodificador de instrução – Circuito combinacional utilizado para determinar qual a próxima
instrução a ser executada. Isto é feito a partir do código de operação armazenado previamente no
registrador de instrução.
Registrador da CPU também responsável pelas Flags – Conjunto de flip-flops destinados a
guardar as condições resultantes da execução de instruções. Tais flags são fundamentais no
sentido em que se constituem no único mecanismo que o programador Assembly dispõe para
desvios de processamento e implementação de algoritmos.
22
Registradores auxiliares – Conjunto de registradores de rascunho que podem ser usados em
conjunto ou separadamente para operações intermediarias, sem que seja necessário o acesso
sistemático a memória.
Registrador de instrução (RI) – Registrador que armazena a instrução que esta sendo
executada.
Controle da CPU ou Unidade de Controle – Circuito seqüencial interno ao microprocessador
que é utilizado para gerar os sinais de controle, necessários à execução das instruções
previamente decodificadas.
Unidade Lógica Aritmética (ULA) – Circuito combinacional utilizado para operações lógicas e
aritméticas envolvendo dois operando.
É importante salientar alguns aspectos referentes às condições dos Flags, que são células
de 1 bit e que contem informações sobre os resultados das operações e indicam também a
ocorrência de condições específicas dessas operações. As Flags são acionadas (setadas) pela
ULA e a ela estão associadas. Cada microprocessador tem seus próprios bits de Flag. Abaixo
temos mencionado as Flags mais comuns a serem encontradas na maioria dos
microprocessadores.

3.4 - Flags condição

Um Flag é considerado “setado” quando se força o valor do bit para 1 e é “resetado”, forçando-
se o bit do Flag para 0. Uma instrução que afeta Flag o modifica da seguinte forma.
Carry: Se o resultado da instrução provoca um “carry” na adição ou um “borrow” na subtração
ou comparação, então a Flag de carry será setada. Se C = 1 resultado da operação com “carry ou
borrow”, se não C = 0 então não ocorreu “carry ou borrow”.
Carry auxiliar: Quando a instrução causou um “carry” do bit 3 para o bit 4. Se AC = 1 significa
que foi 1 na operação realizada, se AC = 0 não houve o “carry”.
Paridade: Se a soma dos bits do resultado da operação é 0. Se P = 1 significa que a paridade é
par, se P = 0 significa que a paridade é impar.
Sinal: Se o bit mais significativo do resultado da operação tem valor 1 então o sinal da operação
é negativo. Se S = 1 resultado negativo, se não S = 0 operação positiva.
Zero: Se o resultado da instrução tem valor zero. Se Z = 1 resultado zero da operação, se não Z
= 0 resultado da operação diferente de zero.
Condição
Flags Função setado ressetado setado se:
C Bit de carry C NC vai um do bit 7
N soma/subtração - - operação de subtração
P/V paridade/over-flow PE PO paridade par/over-flow
H half-carry - - vai um do bit 3
Z zero Z NZ resultado zero
S sinal M P resultado negativo
X não usado - - -

Observação:
M = “minus” (menos)
P = “plus” (mais)
23
Os bits de flags estão posicionados do seguinte modo dentro do registrador F:

Posição do bit 7 6 5 4 3 2 1 0
Flags S Z X H X P/V N C

O nível lógico de cada bit do registrador F indica a condição de cada uma das flags e
forma uma palavra binária. Assim, por exemplo, se o byte do registrador F apresentar a
combinação 0100 0001, ocorre a seguinte situação:

7 6 5 4 3 2 1 0
S Z X H X P/V N C
0 1 0 0 0 0 0 1

ou seja:
• bit 0 está em nível 1 informando que houve carry;
• bit 1 está em nível 0 indicando que se trata de uma operação de soma;
• os bits 2 e 4 em zero indicam condição de não-paridade e não-half-carry;
• os bits 3 e 5 não são utilizados (nível 0);
• bit 6 (flag de zero) em nível 1 informa que a operação lógica ou aritmética deu resultado
zero;
• bit 7 (flag de sinal) em nível 0 indica que o resultado da operação é positivo.

Nesse caso, a palavra armazenada no registrador F é 41H porque 0100 = 4 e 0001 = 1.


Sempre que o conteúdo do registrador F for verificado, o resultado mostrado no display
de dados aparecerá em código hexadecimal. A tradução desse resultado para a linguagem binária
fornece a condição das flags naquele momento.

24
3.5 – Exercícios

1 – Qual a função dos dispositivos de entrada e saída (I/O)?


__________________________________________________________________
__________________________________________________________________
__________________________________________________________________

2 – O microprocessador é composto de três barramentos independentes. Quais são?


Comente sobre eles.
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________

3 – Com base na arquitetura padrão de um microprocessador, explique a função de


cada bloco:

• Acumulador_________________________________________________
___________________________________________________________
• Apontador da pilha___________________________________________
___________________________________________________________
• Contador de programa_________________________________________
___________________________________________________________
• Decodificador de instrução_____________________________________
___________________________________________________________
• Flags______________________________________________________
___________________________________________________________
• Registradores auxiliares_______________________________________
___________________________________________________________
• Registrador de instrução _______________________________________
___________________________________________________________
• Unidade de controle__________________________________________
___________________________________________________________
• Unidade Lógica Aritmética (ULA)_______________________________
___________________________________________________________

25
4 – Para as somas abaixo relacionadas indique quais os Flags setados.

a– + D6 b– + C3 c– + A2 d– + B5
7C 3D 5E 42

26
Anotações:
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
27
CAPÍTULO 4

O Microcontrolador

¾ A arquitetura do Microcontrolador
¾ Ciclos de máquina
¾ Introdução às interrupções
¾ O PIC 16F628
¾ Registradores especiais

28
4 – O MICROCONTROLADOR

O microcontrolador é um dispositivo que tem a função de controlar algum processo ou


aspecto do ambiente. Componente de aplicação específica e uma vez implementado permite
poucos recursos para alteração do processo em que foi utilizado. Como exemplo podemos citar o
Televisor, Forno microondas, videocassete, celulares, brinquedos etc. Os microcontroladores
estão revolucionando o projeto de equipamento eletrônico, não somente os sistemas
convencionais estão se tornando mais sofisticados e baratos, como novas funcionalidades estão
sendo possíveis de serem implementadas com um custo compatível com o mercado.
Os microprocessadores destinados ao mercado de computadores pessoais podiam e
podem ser empregados como controladores, porém seu custo continua elevado para o tipo de
tarefa que se deseja executar no controle dedicado. Por exemplo, utilizarmos um Pentium 4 no
controle do número de lâmpadas acessas simultaneamente em uma residência.
Em virtude deste mercado, os fabricantes de circuitos lançaram então os
microcontroladores, dispositivos que possuem integrados em uma única pastilha a CPU, RAM,
EPROM ou EEPROM, E/S e controladores de interrupção, PWM’s etc. O surgimento destes
dispositivos a um baixo custo provocou uma revolução nos métodos de projetos de sistemas de
controle para o uso doméstico ou industrial. Os sistemas puramente mecânicos estão sendo
alterados por circuitos eletrônicos mais confiáveis e baratos.
O microcontrolador é programável, pois toda a lógica de operação é estruturada na forma
de um programa e gravada dentro do componente. Após isso, toda vez em que alimentarmos o
microcontrolador o programa interno será executado.

4.1 - A arquitetura de um microcontrolador


Para podermos entender mais facilmente a estrutura do microcontrolador, podemos
imaginar como um dispositivo composto de seis partes: Clock, CPU, Porta de entrada, Porta de
saída, Memória de dados, Memória de programa. Os dados dentro de um microcontrolador são
manipulados em unidades chamadas palavras. Os microcontroladores PIC’s apresentam estrutura
de máquina interna do tipo “Havard”, enquanto grande parte dos microcontroladores tradicionais
apresenta uma arquitetura do tipo “Von-Newman”.
A diferença está na forma como os dados e os programas são processados pelo
microcontrolador, onde na arquitetura “Von-Newman” existe apenas um barramento interno,
geralmente de 8 bits, por onde passam as instruções e os dados. Já na arquitetura do tipo
“Havard” existem dois barramentos internos, sendo um de dados e outro de instruções. No caso
do PIC, o barramento de dados é sempre de 8 bits e o de instruções de 12, 14 ou 16 bits. O PIC
16F628, que será por nos estudado, possui palavras de dados de oito bits de tamanho, e palavras
de instrução de 14 bits. Esse tipo de arquitetura permite que enquanto uma instrução é executada
outra seja “buscada” da memória, o que torna o processamento mais rápido. Além disso, como o
barramento de instrução é maior que 8 bits, o OPCODE da instrução já inclui o dado e o local
onde ela vai operar (quando necessário), o que significa que apenas uma posição de memória é
utilizada por instrução, economizando assim muita memória de programa. A largura de memória
de programa de 24 bits, além de implementar diversas facilidades os coloca como dispositivos
intermediários aos DSP, de fato são chamados de DSC (“Digital Signal Controller” –
Controlador Digital de Sinais).
Os PIC’s utilizam uma tecnologia chamada RISC (“Reduced Instruction Set Computer” -
Computador com Set de Instruções Reduzidas). Desta forma, os PIC’s possuem cerca de 35
instruções, muito menos que os microcontroladores convencionais CISC que chegam a possuir
mais de 100 instruções.
29
As linhas mais finas que partem do centro em direção à periferia do microcontrolador
correspondem aos fios que interligam os blocos interiores aos pinos do invólucro do
microcontrolador. O gráfico que se segue representa a parte principal de um microcontrolador.

Abaixo temos uma tabela com alguns exemplos da família PIC:

12 Bits 14 Bits 16 Bits


16C56 16F62x 18F242
16C57 16C7x 18F252
16C58 16F7x 18F258
16C505 16F8x 18F442
16HV540 16F87x 18F458

30
Analisando a estrutura abaixo podemos definir:

Entrada Saída

CPU

Memória de
Clock Dados

Memória de
Programas

Figura 9 – O Microcontrolador Básico


Clock – é o responsável pelo sincronismo entre todas as operações de um microcontrolador.
Todos eventos que ocorrem dentro de um microcontrolador obedecem a uma lógica
preestabelecida pelo fabricante e são processados em tempos determinados pela freqüência do
clock. Normalmente, quanto maior a freqüência de clock de um microcontrolador, mais rápida é
a execução das instruções. No caso dos microcontroladores, o clock é também utilizado como
referência de tempo para execução de tarefas que devem ser repetidas a determinado intervalo de
tempo, como por exemplo, a leitura de interfaces RS232C.

CPU – Vamos agora adicionar mais 3 locais de memória a um bloco específico para que
possamos ter as capacidades de multiplicar, dividir, subtrair e mover o seus conteúdos de um
local de memória para outro. A parte que vamos acrescentar é chamada "central processing unit"
(CPU) ou Unidade Central de Processamento. Os locais de memória nela contidos chamam-se
registros.

Os registros são, portanto, locais de memória cujo papel é ajudar a executar várias
operações matemáticas ou quaisquer outras operações com dados, quaisquer que sejam os locais
em que estes se encontrem.

31
Vamos olhar para a situação atual. Nós temos duas entidades independentes (memória e
CPU) que estão interligadas, deste modo, qualquer troca de dados é retardada bem como a
funcionalidade do sistema é diminuída. Se, por exemplo, nós desejarmos adicionar os conteúdos
de dois locais de memória e tornar a guardar o resultado na memória, nós necessitamos de uma
ligação entre a memória e o CPU. Dito mais simplesmente, nós precisamos de obter um
"caminho" através do qual os dados possam passar de um bloco para outro.
A unidade central de processamento coordena todas as atividades dentro do microcontrolador.
Ela organiza a execução das instruções e realiza as operações lógicas e aritméticas sobre os
dados e envia os resultados para os diversos registros ou portas de entrada e saída.

Portas de entrada e saída – Estas localizações que acabamos de adicionar, chamam-se "portos".
Existem vários tipos de portos: de entrada, de saída e de entrada/saída. Quando trabalhamos com
portos primeiro de tudo é necessário escolher a porta com que queremos trabalhar e, em seguida,
enviar ou receber dados para ou desse porto.

Quando se está a trabalhar com ele, a porta funciona como um local de memória. Qualquer coisa
de que se está a ler ou em que se está a escrever e que é possível identificar facilmente nos pinos
do microcontrolador. São os pontos através dos quais o microcontrolador interage com o
ambiente externo. As portas assumem valores discretos, normalmente referenciados como 0 ou
1, correspondente a 0 v ou 5 v de saída. Alguns microcontroladores possuem uma ou mais portas
de entrada especiais chamadas de “Interrupts”. Estas portas não exigem que a CPU fique
vigiando a ocorrência do evento na porta, porque interrompem o programa sendo executado cada
vez que ocorre um dado evento. Os “Interrupts” são uma das características mais utilizadas nos
projetos em que se necessite de uma rapidez de resposta a eventos assíncronos, que podem
ocorrer a qualquer instante.

Memória de dados – A memória é a parte do microcontrolador cuja função é guardar dados.


A maneira mais fácil de explicar é descrevê-la como uma grande prateleira cheia de gavetas. Se
supusermos que marcamos as gavetas de modo a elas não se confundirem umas com as outras,
então o seu conteúdo será facilmente acessível. Basta saber a designação da gaveta e o seu
conteúdo será conhecido.

32
Os componentes de memória são exatamente a mesma coisa. Para um determinado
endereço, nós obtemos o conteúdo desse endereço. Dois novos conceitos foram apresentados:
endereçamento e memória. A memória é o conjunto de todos os locais de memória (gavetas) e
endereçamento nada mais é que selecionar um deles. Isto significa que precisamos de selecionar
o endereço desejado (gaveta) e esperar que o conteúdo desse endereço nos seja apresentado
(abrir a gaveta). Além de ler de um local da memória (ler o conteúdo da gaveta), também é
possível escrever num endereço da memória (introduzir um conteúdo na gaveta). Isto é feito
utilizando uma linha adicional chamada linha de controle. Nós iremos designar esta linha por
R/W (read/write) - ler/escrever. A linha de controle é usada do seguinte modo: se r/w=1, é
executada uma operação de leitura, caso contrário é executada uma operação de escrita no
endereço de memória. A memória é o primeiro elemento, mas precisamos de mais alguns para
que o nosso microcontrolador possa trabalhar. É normalmente implementada na forma de RAM
em que podemos ler e gravar com facilidade. A capacidade de memória RAM no
microcontrolador é bem pequena, ela possui um barramento de 8bits, pois somente teremos o
transito de dados entre a memória e a CPU. A memória RAM é dividida em duas partes distintas,
uma para abrigar os registradores de funções especiais (SFR) e outra para abrigar os
registradores de propósitos gerais (GPR).

Memória de programa – é onde residem as instruções que devem ser executadas pela CPU. O
programa é gravado apenas uma vez e a partir daí o microcontrolador executa apenas este
programa. A maior parte dos microcontroladores PIC, utiliza a memória EEPROM ou FLASH,
que pode ser apagada por meios elétricos. Existem quatro tecnologias típicas de implementação:
a ROM do tipo mascara, são identificados pelo sufixo “CR”; o OTP, identificado pelo sufixo
“C”; a EPROM identificada pela janela característica e que pode ser do tipo “JW” com
encapsulamento DIP ou “CL” para encapsulamento do tipo PLCC. E a memória FLASH. Uma
característica importante da memória do microcontrolador PIC é que ela pode ser acessada por
software. Também devido a características da arquitetura RISC, a instrução de chamada e de
desvio tem disponíveis somente 11 bits para os endereços usados. Por esse motivo a memória de
programa é dividida em paginas. Usamos o PCLATH para direcionar os endereços.

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

“PC - Program Counter”

33
4.2 - Ciclos de Máquina

Nos microcontroladores PIC, o sinal do clock é internamente dividido por quatro,


portanto para um clock externo de 4 MHz, temos um clock interno de 1 MHz e
conseqüentemente, cada ciclo de máquina dura 1µs.
A divisão do clock por quatro, forma as fases Q1, Q2, Q3 e Q4. O PC (program counter)
é incrementado automaticamente na fase Q1 do ciclo de máquina e a instrução seguinte é
buscada da memória de programa e armazenada no registrador de instruções no ciclo Q4. Ela é
decodificada e executada no próximo ciclo, no intervalo de Q1 até Q4. Esta característica de
buscar informações num ciclo de máquina e executá-la no próximo é conhecida como
PIPELINE. Ela permite que quase todas as instruções sejam executadas em apenas um ciclo,
gastando assim 1 µs (para um clock de 4 Mhz) e tornando o sistema muito mais rápido. As
únicas exceções referem-se às instruções que geram “saltos” no PC, como chamadas de rotinas e
retorno. Ao executar essas instruções, o PIPELINE deve ser primeiramente limpo para depois
poder ser carregado novamente com o endereço correto, consumindo para isso 2 ciclos de
máquina. Esse PIPELINE é facilmente implementado devido à arquitetura de “Havard”.
Vetor de reset – Trata-se do primeiro endereço da memória de programa que será executado
quando o PIC começar a rodar, quando alimentado ou por “reset”. Na maioria dos modelos, o
“reset” aponta para o endereço 0x00, mas em alguns modelos mais antigos ele pode apontar para
o último endereço disponível.
Vetor de interrupção –As rotinas de interrupção serão armazenadas na área de programação ,
juntamente com todo o resto do programa. No entanto, existe um endereço que é reservado para
o início do tratamento de todas as interrupções, nos modelos de PIC que possuem este recurso,
esse endereço de vetor de interrupção é a posição 0x04.
Pilha – A pilha é o local, totalmente separado da memória de programação, em que serão
armazenados os endereços de retorno quando utilizarmos instruções de chamadas de rotinas.
Quando o programa é desviado para o começo de uma rotina por meio da instrução correta, o
endereço seguinte ao ponto que estava sendo rodado é armazenado na pilha para que, ao fim da
rotina, o programa possa retornar. O tamanho da pilha também varia de acordo com o modelo de
PIC, e esse tamanho determina a quantidade de rotinas que podem ser chamadas ao mesmo
tempo. Caso se tente chamar um número de rotinas maior que o tamanho da pilha, o endereço de
retorno mais antigo será perdido. A estrutura para implementação da pilha é chamada de
memória LIFO (Last In First Out). Quando a CPU armazena uma nova informação na pilha o
comando é PUSH (empurrar), o desempilhamento é feito através da instrução POP (Pull
Operation – Operação de puxar).
Registradores especiais – Nessa região da memória encontram-se todos os registradores
especiais, denominados SFRs (special function register), utilizados pelo microcontrolador para
execução do programa e processamento da ULA. Esses registradores ocupam espaço na RAM e
podem ser acessados da mesma maneira que as variáveis do sistema, com mudança somente do
endereço de acesso. A quantidade de SFRs depende do modelo de PIC, mas eles sempre são
armazenados na parte baixa da memória (início dos endereços) e às vezes podem estar
espalhadas em mais de um banco de memória.
Registradores de uso geral – Trata-se de uma área destinada ao armazenamento de variáveis
definidas pelo usuário para serem escritas e lidas pelo programa. O tamanho dessa memória varia
de acordo com o modelo de PIC e também pode ocupar mais de um banco.
EEPROM – A maior parte dos modelos de PIC, possuem esta memória interna.

34
4.3 - Introdução às Interrupções
Como o próprio nome diz, uma interrupção serve para interromper o programa
imediatamente e desta forma realizar uma outra atitude instantaneamente. As interrupções são
ações tratadas diretamente pelo “Hardware”, o que as torna muito rápidas e disponíveis em
qualquer ponto do sistema. Quando uma interrupção acontece, o programa é paralisado e uma
função específica é executada e depois o programa continua a ser executado no mesmo ponto em
que estava. No PIC temos vários tipos de interrupções que podem ser provocadas de modo
diferentes e com diferentes atuações.
Nos modelos mais antigos, não possuíam nem interrupção e nos modelos mais novos da
família PIC, podemos encontrar até 18 tipos diferentes de interrupções, como estamos estudando
o PIC 16F628, somente iremos estudar quatro tipos de interrupções.
Interrupção de TIMER 0 - Essa interrupção acontece sempre que um contador de tempo
interno, denominado TMR0 (Timer 0), estoura, ou seja, como ele é um contador de 8 bits,
sempre que ele passar de 0xFF para 0x00. Utilizado principalmente para contagem de tempo. O
TMR0 pode tanto ser incrementado pelo clock da máquina, como também por um sinal externo,
o que neste caso ele passa a ser um contador de pulsos, com outra finalidade. O flag sinalizador
da interrupção
E chamado de T0IF e o bit de controle é chamado de T0IE. Ambos se encontram no registrador
INTCON.
Interrupção EXTERNA – Essa interrupção é gerada por um sinal externo ligado a uma porta
específica do PIC, no caso a porta RB0, caso ela seja definida como entrada. Deste modo se
podemos identificar e processar imediatamente um sinal externo.
Para que possa ser identificado, é necessário que se defina se a identificação será realizada na
borda de subida ou descida do sinal, é necessário configurar a porta. A flag de sinalização da
interrupção externa é chamada de INTF e o controle de habilitação é chamado de INTE e ambos
se encontram no registrador INTCON.
Interrupção por MUDANÇA DE ESTADO – A interrupção por mudança de estado ocorre se
existe a mudança do sinal sem se importar se foi na borda de subida ou descida. Esta interrupção
esta ligada as porta RB4, RB5, RB6 e RB7 simultaneamente. Por isso se essas portas forem
configuradas como entradas, a mudança de estado em qualquer uma delas irá gerar uma
interrupção. Esse tipo de interrupção pode ser utilizado, por exemplo, para criar um sincronismo
com a rede, para controle de um triac ou outro sistema qualquer. O flag sinalizador desta
interrupção é chamado de RBIF e o sinal de controle é chamado de RBIE. Ambos se encontram
sempre no registrador INTCON.
Interrupção de FIM NA ESCRITA NA EEPROM – Os PICs possuem uma memória
EEPROM interna e essa interrupção serve para detectarmos o final de uma rotina de escrita nessa
memória. A utilização da interrupção não é obrigatória para que a escrita funcione, mas como a
EEPROM é lenta na hora de escrever, em alguns sistemas a sua utilização pode ser necessária
para evitar uma parada durante a escrita na EEPROM. O flag sinalizador da interrupção é o EEIF
e o bit de controle é chamado de EEIE.
Interrupções - Sempre que uma interrupção acontece (qualquer uma), o programa guarda o
endereço da próxima linha a ser executada na pilha, e desvia para um endereço fixo da memória
de programação. Basta então, nesse endereço (0x04), escrever a rotina que irá reconhecer e tratar
a interrupção acontecida, sempre que o microcontrolador desvia para esse endereço, o bit GIE é
desligado, quando se executa uma instrução de retorno de interrupção RETFIE, faz com que o bit
GIE seja habilitado permitindo uma nova ocorrência de interrupção.

35
Quando a rotina de interrupção for terminada, o programa automaticamente voltará ao ponto em
que estava antes de ocorrer à interrupção. O atraso de tempo existente entre a ocorrência de um
evento de interrupção e o efetivo desvio para o vetor de interrupção é chamado de latência de
interrupções. Existem outros modos de interrupção, mas não será analisado.

4.4 – O PIC 16F628

O microcontrolador PIC 16F628 é versátil, compacto e possui como principais


características:

• Microcontrolador de 18 pinos o que facilita a compatibilidade com outros em nível de


hardware e software (como o 16F84).
• Baixo custo
• 15 pinos de I/O (Entrada ou Saída).
• Memória de programação FLASH de 2048 x 14 bits.
• Memória SRAM de 224 x 8 bits disponíveis.
• Memória EEPROM interna de 128 x 8 bits.
• 1 canal PWM com captura e amostragem (CCP).
• Facilidade de programação com 35 instruções.
• Capacidade de corrente de 25 mA por pino de I/O
• Oscilador 4 MHz.
• Tensão de operação entre 3.0 a 5.5 V (2.0 a 5.5 para versão LF).

4.5 - Descrição dos pinos

1 RA2/AN2/Vref RA1/AN1 18
2 RA3/AN3/CMP1 RA0/AN0 17
3 RA4/T0CKI/CMP2 RA7/OSC1/CLKIN 16
4 RA5/MCLR/THV RA6/OSC2/CLKOUT 15
5 Vss Vdd 14
6 RB0/INT RB7/T1OSI 13
7 RB1/RX/DT RB6/T1OSO/T1CKI 12
8 RB2/TX/CK RB5 11
9 RB3/CCP1 RB4/PGM 10
PIC 16F62X

Figura 10 – Pinagem do PIC 16F62X

36
Pino Função Tipo Descrição
1 RA2/AN2/Vref Entrada e saída Porta A bit 2 / Entrada do comparador
analógico / Saída da referencia de tensão.
2 RA3/AN3/CMP1 Entrada e saída Porta A bit3 / Entrada comparador analógico
/ Saída comparador 1.
3 RA4/T0CKI/CMP2 Entrada e saída Porta A bit 4 / Entrada clock externo do timer
0 / Saída comparador 2. Saída em dreno
aberto.
4 RA5/MCLR/THV Entrada Porta A bit 5 / Reset CPU / tensão de
programação.
5 Vss Alimentação Terra.
6 RB0/INT Entrada e saída Porta B bit 0 / Entrada de interrupção
externa.
7 RB1/RX/DT Entrada e saída Porta B bit 1 / Recepção USART (modo
assíncrono) / Dados (modo síncrono).
8 RB2/TX/CK Entrada e saída Porta B bit 2 / Transmissão USART (modo
assíncrono) / Clock (modo síncrono)
9 RB3/CCP1 Entrada e saída Porta B bit 3 / Entrada e saída do modulo
CCP.
10 RB4/PGM Entrada e saída Porta B bit 4 / E entrada de programação
LVP.
11 RB5 Entrada e saída Porta B bit 5.

12 RB6/T1OSO/T1CKI Entrada e saída Porta B bit 6 / Saída oscilador TMR1 /


Entrada de clock TMR1.
13 RB7/T1OSI Entrada e saída Porta B bit 7 / Entrada do oscilador de
TMR1.
14 Vdd Alimentação Alimentação Positiva.
15 RA6/OSC2/CLKOUT Entrada e saída Porta A bit 6 / Entrada para cristal oscilador /
Saída de clock.
16 RA7/OSC1/CLKIN Entrada e saída Porta A bit 7 / Entrada para cristal oscilador /
Entrada de clock externo.
17 RA0/AN0 Entrada e saída Porta A bit 0 / Entrada comparador
analógico.
18 RA1/AN1 Entrada e saída Porta A bit 1 / Entrada comparador
analógico.

37
4.6 - Considerações iniciais sobre o Hardware
Alimentação – Como vimos na pinagem do 16F628, falamos sobre os pinos Vss e Vdd.
Portanto, se tivermos uma fonte segura de 5 Vcc, ligando o GND ao pino 5 e o +5 V ao pino 14.
É importante que essa fonte não tenha grandes variações de tensão (riplle) e ruídos. O PIC
16F628, apesar de ter sua tensão nominal em 5 Vcc, pode ser alimentado de 2.0 a 6.0 V, mas
essa tensão não deve ficar variando durante sua utilização. Utilizar o capacitor com valor entre
100pF e 100nF em paralelo com os pinos de alimentação.
Osciladores – O oscilador do PIC 16F628 pode ser externo ou interno e sem ele o programa não
é executado e nada funciona. O oscilador interno é capaz de operar em sete modos diferentes e
somente em um modo externo. 1.Como um cristal de baixa potencia (até 200KHz) – 2.Cristal /
Ressonador cerâmico (até 4MHz) – 3.Cristal / Ressonador cerâmico de alta freqüência (até
20MHz) – 4.Resistor externo sem saída de clock – 5.Resistor externo com saída de clock –
6.Oscilador RC interno sem saída de clock – 7.Oscilador RC interno com saída de clock –
8.Clock externo.
Cristal / Ressonador – Quando utilizamos um ressonador ou um cristal de quartzo mais dois
capacitores, é possível implementar um oscilador de clock para o PIC. Devemos configurar o
microcontrolador de acordo com o modo do oscilador em função da freqüência do cristal ou
ressonador utilizado. Onde quando utilizarmos uma freqüência menor que 200KHz (modo LP),
uma freqüência entre 200KHz e 4MHz (modo XT) e uma freqüência maior que 4MHz (modo
HS). Os capacitores entre 10 e 33 pF.

PIC16F628 C1
1 18
2 17
3 16
4 15 XTAL
5 14
6 13 C2
7 12
8 11
9 10

Figura 11 – Oscilador a cristal

Oscilador / Resistor – É utilizado um resistor conectado ao pino RA7 ao terra para gerar o clock
para a CPU. O oscilador trabalha com uma freqüência desde 10KHz a 8MHz e o resistor deve
estar entre 38K e 1MΩ. Para definirmos esta operação o bit OSCF no registrador PCON, deve
estar em 1.

RA7 / OSC1 / CLKIN

R RA6 / OSC2 / CLKOUT

Figura 12 – Oscilador resistor

38
Oscilador Interno – É um oscilador de 4MHz derivado de um clock obtido a partir de um
oscilador RC interno. Esse oscilador possui razoável precisão com um valor típico de 4Mhz, com
mínimo de 3,65 e máximo de 4,28Mhz. Permite uma maior disponibilidade dos pinos do PIC,
pois RA6 e RA7 estão liberados. Para definirmos esta operação o bit OSCF no registrador
PCON, deve estar em 0, se estiver em 1 estaremos com um clock de 37KHz.
É necessário implementar no programa na etapa de configuração do microcontrolador a seguinte
instrução “_INTRC_OSC_NOCLKOUT“ e retira-se a instrução _XT_OSC.
Clock Externo – Quando utilizarmos um clock externo para o PIC é necessário configurar o
modo do oscilador para EC.

RA7 / OSC1 / CLKIN

RA6 / OSC2 / CLKOUT

Figura 13 – Clock externo

Detector baixa tensão – É um detector de baixa tensão, conhecido também como detector de
“Brown – out”, onde caso a tensão de alimentação diminuir abaixo do valor de Vz, um reset do
MCU é implementado fazendo com que a CPU reinicialize o programa. Caso seja utilizada uma
tensão baixa de alimentação é necessário desabilitar o bit BODEN = 0 para que não seja
detectado.

Figura 14 – Detector baixa tensão

Temporizador de Power-Up – O temporizador de power-up (PWRT) pode ser utilizado para


fazer com que o chip permaneça em reset por aproximadamente 72ms após o chip ter sido
ligado. Deve ser utilizado sempre que possível devido ao fato do tempo de demora de
estabilização da fonte de alimentação para todos os componentes envolvidos no circuito. Esse
temporizador pode ser habilitado ou desabilitado somente durante a programação do chip.

Módulo Comparador Analógico – O modula comparador analógico consiste em um conjunto


de dois comparadores analógicos internos, que podem realizar comparações entre si ou de
tensões analógicas externas. O modulo possui apenas o um registrador CMCON, responsável
pela configuração e controle dos comparadores internos.

39
4.7 - Registradores especiais

Como vimos o microcontrolador PIC possui uma série de registradores especiais que são
denominados SFR (Special Function Registers) que servem exatamente para guardar a
configuração e o estado de funcionamento atual da máquina. Para efeito de padronização, cada
bit dentro desses registradores receberá um nome, sendo também especificado se esse bit pode
ser lido (R-Read) e/ou escrito (W-Write). Veremos agora para que serve e como é composto
cada um desses registradores.
4.8 - Registradores Gerais
Conhecendo o STATUS – Esse registrador serve para mostrar o estado da ULA, a forma do
último reset e também para configurar a pagina de programação atual, quando necessário.

Registrador: STATUS Endereços: 03h, 83h, 103h e 183h


Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
R/W R/W R/W R R R/W R/W R/W
IRP RP1 RP0 /TO /PD Z DC C

IRP – Seletor de banco de memória usado para endereçamento indireto.


0 = Banco 0 e 1 (00h – FFh). 1 = Banco 2 e 3 (100h – 1FFh)
* Manter sempre em 0 no 16F628

RP1 e RP0 – Seletor de banco de memória usado para endereçamento indireto.


00 = Banco 0 (00h – 7Fh). 01 = Banco 1 (80h – FFh).
10 = Banco 2 (100h – 17Fh). 11 = Banco 3 (180h – 1FFh).
* Cada banco possui 128 bits. O PIC 16F628 só possui os bancos 0 e 1. RP1 deve ser 0.

/TO – Indicação de Time-out.

0 = Indica que ocorreu um estouro de WatchDog (WDT).


1 = Indica que ocorreu um power-up ou foi executada a instrução CLRWDT ou SLEEP.

/PD – Indicação de Power-down.


0 = Indica que a instrução SLEEP foi executada.
1 = Indica que ocorreu um Power-up ou foi executada a instrução CLRWDT.

Z – Indicação de zero.
0 = Indica que o resultado da ultima operação (lógica ou aritmética) não foi zero.
1 = Indica que a ultima operação (lógica ou aritmética) resultou em zero.

40
DC – Digit Carry/borrow.
0 = A ultima operação da ULA não ocasionou um estouro de dígito.
1 = A ultima operação da ULA ocasionou um estouro (carry) entre o bit 3 e 4, isto é o
resultado ultrapassou os 4 bits menos significativos.
C – Carry.
0 = A ultima operação da ULA não ocasionou um estouro (carry)
1 = A ultima operação da ULA ocasionou um estouro (carry) no bit mais significativo.

Conhecendo o CMCON – O modulo comparador permite implementar diversos circuitos


através dos comparadores analógicos, inclusive conversores A/D, como o de rampa ou
conversores. Cada implementação é realizada através do registrador CMCON. Este registrador é
implementado no PIC 16F628.

Registrador: CMCON Endereços: 1Fh


Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
R R R/W R/W R/W R/W R/W R/W
C2OUT C1OUT C2INV C1INV CIS CM2 CM1 CM0

C2OUT – Bit indicativo do estado da saída do comparador 2.


0 = em “C2INV” 0 – entrada Vin+ < Vin -, 1 – entrada Vin+ > Vin -.
1 = em “C2INV” 0 – entrada Vin+ > Vin -, 1 – entrada Vin+ < Vin -.

C1OUT – Bit indicativo do estado da saída do comparador 1.


0 = em “C1INV” 0 – entrada Vin+ < Vin -, 1 – entrada Vin+ > Vin -.
1 = em “C1INV” 0 – entrada Vin+ > Vin -, 1 – entrada Vin+ < Vin -.

C2INV – Seleção de inversão do sinal de saída do comparador 2.


0 – Saída não invertida 1 – Saída invertida.

C1INV – Seleção de inversão do sinal de saída do comparador 1.


0 – Saída não invertida 1 – Saída invertida.

CIS – Seleção de entrada dos comparadores nos modos 1 e 2.

CM2, CM1 e CM0 – Seleção do modo de operação dos comparadores:

41
CM2 CM1 CM0 Modo
0 0 0 0
0 0 1 1
0 1 0 2
0 1 1 3
1 0 0 4
1 0 1 5
1 1 0 6
1 1 1 7

Modo 0 – Neste modo os comparadores se encontram em reset, é o modo inicial de configuração


dos comparadores. Neste modo, as saídas estão desligadas, mas os pinos RA0, RA1, RA2 e RA3
estão conectados às entradas dos comparadores, ou seja, como entradas analógicas.

Modo 1 – Dois comparadores com três entradas Multiplexadas onde temos 2 entradas conectadas
à entrada inversora de C1 e ambos comparadores compartilham a mesma referência externa
conectada à entrada inversora de RA2/AN2/Vref.

Modo 2 – Dois comparadores com quatro entradas multiplexadas onde temos os comparadores
configurados com a entrada não inversora conectada ao módulo de referência de tensão interna
(VREF). As entradas inversoras de cada comparador são multiplexadas.

Modo 3 – Dois comparadores com uma referência externa comum onde temos uma configuração
na qual os dois comparadores possuem uma referência de tensão externa conectado ao pino
RA2/AN2/Vref. Deste modo o pino RA3/AN3/CMP1 pode ser utilizado como I/O digital.

Modo 4 – Neste modo temos os dois comparadores independentes.

Modo 5 – Apenas o comparador C2 está em funcionamento e o comparador C1 permanece


desligado, liberando os pinos RA0/AN0 e RA3/AN3/CMP1 para utilização como I/O digital.

Modos 6 – Neste modo têm os dois comparadores compartilhando a mesma referência externa
comum (RA2/AN2/Vref). As saídas C1OUT e C2OUT encontram-se disponíveis externamente
nos pinos RA3/AN3/CMP1 e RA4/T0CKI/CMP2 respectivamente.

Modo 7 – Neste modo os comparadores se encontram desligados e os pinos de RA0 a RA3


podem ser utilizados para I/O digital.

42
Conhecendo o OPTION – Esse registrador serve para configurar uma série de opções para a
operação do microcontrolador. Apesar de este registrador receber o nome OPTION, ele será
referenciado em nossos programas pelo nome OPTION-REG, pois os PICs mais antigos
possuíam uma instrução chamada OPTION.

Registrador: OPTION Endereços: 81h e 181h


Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
R/W R/W R/W R/W R/W R/W R/W R/W
/RBPU INTEDG TOCS TOSE PSA PS2 PS1 PS0

/RBPU – Habilitação dos pull-ups internos para o PORTB.


0 = Pull-ups habilitado para todo pino do PORTB configurado como entrada.
1 = Pull-ups desabilitado.

INTEDG – Configuração da borda que gerará a interrupção externa no RB0.


0 = A interrupção irá ocorrer na borda de descida.
1 = A interrupção irá ocorrer na borda de subida.

TOCS – Configuração do incremento para o TMR0.


0 = TMR0 será incrementado internamente pelo clock da máquina.
1 = TMR0 será incrementado externamente pela mudança no pino RA4/T0CKI.

TOSE – Configuração da borda que incrementará o TMR0 no pino RA4/T0CKI quando TOCS =
1.
0 = Incremento na borda de subida. 1 = Incremento na borda de descida.

PSA – Configuração de aplicação do prescaler.


0 = O prescaler será aplicado ao TMR0. 1 = O prescaler será aplicado ao WDT.
* Para o TMR0 ser incrementado a cada ciclo de máquina é necessário que PSA = 1

PS2, PS1 e PS0 – Configuração do valor de prescaler.

Bits 2, 1, 0 TMR0 WDT


000 1:2 1:1
001 1:4 1:2
010 1:8 1:4
011 1:16 1:8
100 1:32 1:16

43
101 1:64 1:32
110 1:128 1:64
111 1:256 1:128

Conhecendo o PCON – Esse registrador serve para sinalização de dois estados de reset. O reset
por queda de tensão de alimentação (Brown-out) e o reset de inicialização (Power-on reset).
Além disso, o bit 3 desse registrador controla o clock do chip quando nos modos de oscilador
interno ou resistor externo.

Registrador: PCON Endereço: 8Eh


Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
- - - - R/W - R/W R/W
- - - - OSCF - /POR /BOD

OSCF – Bit de controle do modo de operação do oscilador de clock interno.


0 = Clock de 37 KHz – somente nos modos de clock interno ou resistor externo.
1 = Clock de 4 MHz interno ou conforme resistor externo.

/POR – Sinalizador de reset de inicialização.


0 = Houve um reset do tipo POR – reset de inicialização.
1 = Não ocorreu o reset de inicialização.

/BOD – Sinalizador de reset por queda de tensão de alimentação (Brown-out).


0 = Houve reset por queda da tensão alimentação.
1 = Não houve reset por queda de tensão de alimentação.

Conhecendo o INTCON – Esse registrador serve para configurar e identificar as interrupções.

Registrador: INTCON Endereços: 0Bh e 8Bh


Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
R/W R/W R/W R/W R/W R/W R/W R/W
GIE EEIE T0IE INTE RBIE T0IF INTF RBIF

GIE – Habilitação geral das interrupções (chave geral).


0 = Nenhuma interrupção será tratada.
1 = As interrupções habilitadas serão tratadas individualmente.

44
EEIE – Habilitação da interrupção de final de escrita na EEPROM (chave individual).
0 = A interrupção não será tratada. 1 = A interrupção será tratada.

T0IE – Habilitação da interrupção de estouro de TMR0 (chave individual).


0 = A interrupção não será tratada. 1 = A interrupção será tratada.

INTE – Habilitação da interrupção externa no pino RB0 (chave individual).


0 = A interrupção não será tratada. 1 = A interrupção será tratada.

RBIE – Habilitação da interrupção por mudança de estado nos pinos RB4 a RB7 (chave
individual).
0 = A interrupção não será tratada. 1 = A interrupção será tratada.

T0IF – Identificação da interrupção de estouro de TMR0.


0 = Esta interrupção não ocorreu. 1 = Esta interrupção ocorreu.

INTF – Identificação da interrupção externa no pino RB0.


0 = Esta interrupção não ocorreu. 1 = Esta interrupção ocorreu.

RBIF – Identificação da interrupção por mudança de estado nos pinos RB4 a RB7.
0 = Esta interrupção não ocorreu. 1 = Esta interrupção ocorreu.

Conhecendo o PIE1 – Possui a função de habilitação / desabilitação das chamadas interrupções


periféricas.
Registrador: PIE1 Endereços: 8Ch
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
R/W R/W R/W R/W - R/W R/W R/W
EEIE CMIE RCIE TXIE - CCP1IE TMR2IE TMR1IE

EEIE – Habilitação de interrupção por término de escrita na EEPROM interna.


0 = Esta interrupção não ocorreu. 1 = Esta interrupção ocorreu.

CMIE – Habilitação de interrupção de mudança de estados dos comparadores analógicos.


0 = Esta interrupção não ocorreu. 1 = Esta interrupção ocorreu.

45
RCIE – Habilitação de interrupção de mudança de estado dos comparadores.
0 = Esta interrupção não ocorreu. 1 = Esta interrupção ocorreu.

TXIE – Habilitação de interrupção de transmissão USART.


0 = Esta interrupção não ocorreu. 1 = Esta interrupção ocorreu.

CCP1IE – Habilitação de interrupção do modulo CCP.


0 = Esta interrupção não ocorreu. 1 = Esta interrupção ocorreu.

TMR2IE – Habilitação de interrupção de transbordo do timer 2.


0 = Esta interrupção não ocorreu. 1 = Esta interrupção ocorreu.

TMR1IE – Habilitação de interrupção de transbordo do timer 1.


0 = Esta interrupção não ocorreu. 1 = Esta interrupção ocorreu.

O bit 3 do registrador deve ser sempre mantido em “0”. Para habilitar a CPU, utilizando uma das
interrupções devemos setar o bit PEIE e o bit GIE no INTCON.

Conhecendo o PIR1 – Localizado no banco “0” e abriga os flags sinalizadores de interrupções


periféricas.
Registrador: PIR1 Endereços: 0Ch
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
R/W R/W R/W R/W - R/W R/W R/W
EEIE CMIF RCIF TXIF - CCP1IF TMR2IF TMR1IF

EEIF – Sinalizador de término de escrita na EEPROM.


0 = A escrita ainda não terminou ou não foi iniciada.
1 = A escrita terminou.

CMIF – Sinalizador de mudança de estado na saída dos comparadores analógicos.


0 = Não houve mudança de estado nos comparadores.
1 = Houve mudança na saída dos comparadores.

RCIF – Sinalizador de recepção de caractere na USART.


0 = Não houve recepção de novos caracteres.
1 = Um novo caractere foi recebido.

TXIF – Sinalizador de transmissão na USART.


0 = Não houve transmissão na USART ou o TSR esta ocupado.
1 = O caractere armazenado no TXREG foi repassado para o TSR.

46
CCPIF – Sinalizador de comparação / captura no módulo CCP.
0 = Não houve comparação válida / captura no módulo CCP.
1 = Houve comparação / captura no módulo CCP.

TMR2IF – Sinalizador de transbordo no timer 2.


0 – Não houve transbordo de contagem no TMR2.
1 – Houve transbordo de contagem no TMR2.

TMR1IF - Sinalizador de transbordo no timer 1.


0 – Não houve transbordo de contagem no TMR1.
1 – Houve transbordo de contagem no TMR1.

Conhecendo o PCL – O PCL é um registrador que armazena os 8 bits menos significativos do


PC (program counter), o qual indica a próxima linha do programa que será executado no
momento. A cada ciclo de máquina o PC é automaticamente alterado, para que o programa possa
ser executado. Esse registrador também pode ser alterado pelo programa, mas isto deve ser feito
com extremo cuidado para que o sistema não se perca e/ou trave.

Registrador: PCL Endereços: 02h e 82h


Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
R/W R/W R/W R/W R/W R/W R/W R/W
Parte baixa do PC

Conhecendo o PCLATH – Como a área de memória de programação do PIC 16F628 é maior


que 256 bytes, não é possível acessá-la completamente com somente os 8 bits do PCL. Por isso,
o PCLATH possui os 5 bits mais altos do PC. No PIC 16F628, esse registrador é controlado
diretamente pelo hardware e não precisa ser acessado pelo programa.

Registrador: PCLATH Endereços: 0Ah e 8Ah


Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
- - - R/W R/W R/W R/W R/W
Parte Alta do PC

4.8.1 - Registradores Portas


Conhecendo os TRIS – Esses registradores servem para configurar os pinos das portas como
entrada ou saída. Quando é colocado “1” em um bit do TRIS, o pino relacionado a ele é
configurado como entrada. Para configurar o pino como saída, deve-se colocar “0” no bit
relacionado. Basta relacionar “1” a palavra “Imput” (entrada) e “0” a palavra “Output” (saída).
Para configurar o PORTA, deve ser utilizado o TRISA e para configurar o PORTB, deve ser
utilizado o TRISB.

47
Registrador: TRISA Endereços: 85h
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
R/W R/W R/W R/W R/W R/W R/W R/W
Ref. RA7 Ref. RA6 Ref. RA5 Ref. RA4 Ref. RA3 Ref. RA2 Ref. RA1 Ref. RA0

Registrador: TRISB Endereços: 86h e 186h


Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
R/W R/W R/W R/W R/W R/W R/W R/W
Ref. RB7 Ref. RB6 Ref. RB5 Ref. RB4 Ref. RB3 Ref. RB2 Ref. RB1 Ref. RB0

As portas PORTA e PORTB – Como vimos o PIC 16F628 possui duas portas PORTA e
PORTB. O estado dessas portas é acessado diretamente em duas posições distintas da memória.
Quando um pino dessas portas é configurado como entrada ao lermos o seu bit relacionado,
encontraremos diretamente o nível lógico aplicado a esse pino. Da mesma maneira, ao
configurarmos um pino como saída, podemos alterar seu estado, escrevendo diretamente no bit
relacionado.

Registrador: PORTA Endereços: 05h


Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
R/W R/W R/W R/W R/W R/W R/W R/W
RA7 RA6 RA5 RA4 RA3 RA2 RA1 RA0

Registrador: PORTB Endereços: 06h e 106h


Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
R/W R/W R/W R/W R/W R/W R/W R/W
RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0

4.8.2 – Contadores

O bloco de temporização que nos interessa bastante porque pode dar-nos informações
acerca da hora, duração, protocolo, etc. A unidade básica do temporizador é um contador que é
na realidade um registro cujo conteúdo aumenta de uma unidade num intervalo de tempo fixo,
assim, anotando o seu valor durante os instantes de tempo T1 e T2 e calculando a sua diferença,
nós ficamos a saber a quantidade de tempo decorrida. Esta é uma parte muito importante do
microcontrolador, cujo domínio vai requerer muita da nossa atenção.

48
Conhecendo o TMR0 – O TMR0 é um contador de 8 bits que pode ser acessado diretamente na
memória, tanto par leitura quanto para a escrita. A diferença entre ele e os demais registradores é
que seu incremento é automático e pode ser feito pelo clock da máquina ou por um sinal externo.
É importante lembrar que o estouro desse contador pode gerar uma interrupção. É acessado por
três registradores, o OPTION_REG, o TMR0 e o INTCON.

Registrador: TMR0 Endereços: 01h


Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
R/W R/W R/W R/W R/W R/W R/W R/W
Contador automático de 8 bits

Conhecendo o TMR1 – O TMR1 é um módulo de 16 bits capaz de operar em três modos


básicos, como temporizador síncrono, contador síncrono e assíncrono, com funções de prescaler
interno, possibilidade de conexão de cristal externo e de reset gerado pelo módulo CCP. Possui
uma filosofia similar ao do timer “0”, porém se destaca a presença de um registrador de controle
destinado especificamente ao timer “1”, o T1CON e os registradores específicos para o
armazenamento de contagem, (TMR1L e TMR1H). Relacionado aos registradores INTCON,
PIR, PIE e T1CON, além dos já citados.

Conhecendo o TMR2 – O TMR2 é um temporizador de 8 bits com princípio de funcionamento


similar ao do timer “0” e com características de pré-divisor, pós-divisor, capacidade de ligar ou
desligar a contagem do módulo e o registrador de período (PR2). Tem o propósito básico de
fornecer a base de tempo para o módulo CCP1. Relacionado aos registradores INTCON, PIR,
PIE, TMR2, T2CON e PR2.

Conhecendo o WDT – O watchdog outra coisa que nos vai interessar é a fluência da execução
do programa pelo microcontrolador durante a sua utilização. Suponha que como resultado de
qualquer interferência (que ocorre frequentemente num ambiente industrial), o nosso
microcontrolador pára de executar o programa ou, ainda pior, desata a trabalhar incorretamente.

Claro que, quando isto acontece com um computador, nós simplesmente carregamos no
botão de reset e continuamos a trabalhar. Contudo, no caso do microcontrolador nós não
podemos resolver o nosso problema deste modo, porque não temos botão. Para ultrapassar este
obstáculo, precisamos de introduzir no nosso modelo um novo bloco chamado watchdog (cão de
guarda). Este bloco é de fato outro contador que está continuamente a contar e que o nosso
programa põe a zero sempre que é executado corretamente. No caso de o programa "encravar", o
zero não vai ser escrito e o contador, por si só, encarregar-se-á de fazer o reset do
microcontrolador quando alcançar o seu valor máximo. Isto vai fazer com que o programa corra
de novo e desta vez corretamente. Este é um elemento importante para que qualquer programa se
execute fiavelmente, sem precisar da intervenção do ser humano.

49
O Watchdog Timer (WDT), popularmente conhecido como “cão de guarda”, também é um
contador incrementado automaticamente, só que com um clock independente. O PIC possui um
RC interno só para a operação WDT. Isto significa que seu tempo de incremento é constante,
independentemente do oscilador utilizado para gerar o clock da máquina. O tempo normal de
estouro do WDT é cerca de 18ms, mas pode variar de acordo com a tensão de alimentação e a
temperatura. Uma outra característica desse contador é que ele não é acessível ao programador,
nem para a escrita e nem para a leitura. O programador só pode utilizar um comando (CLRWT)
para zerá-lo, o que é muito importante, pois se o WDT estourar (passar de 0xFF para 0x00), o
sistema será automaticamente resetado, tornando a utilização do WDT muito importante para
evitarmos que o sistema trave em determinadas situações. É importante saber também que o
WDT pode ser desligado, como uma escolha de configuração na hora de gravar o
microcontrolador, porém não permite que seja desligado durante a execução do programa.

Conhecendo o PRESCALER – Acabamos de ver que o TMR0 pode ser incrementado pelo
clock da máquina ou por um sinal externo, assim como o WDT é incrementado automaticamente
e estoura a cada 18 ms. Desta maneira, é fácil efetuarmos cálculos de tempo com esses
contadores. Só que ambos executam ações específicas no caso de estouro (interrupção ou reset).
Como alterar então o tempo de estouro de cada um desses contadores? Para o TMR0 fica mais
fácil, pois alterando o oscilador, alteramos também os seus incrementos. Mas isso é viável? E
para o WDT, como podemos alterar seu tempo? Esta é a função do Prescaler. Trata-se de um
divisor configurável que pode ser aplicado a um dos dois contadores. Temos aqui então a maior
limitação do Prescaler, pois ele só pode ser aplicado a um dos contadores de cada vez (bit PSA
do OPTION). Com esse divisor ativo, o tempo de estouro é multiplicado na ordem inversa. Por
exemplo:
Um sistema este rodando a 4 MHz. Desta forma, temos um ciclo de máquina e
conseqüentemente, uma instrução sendo rodada a cada 1µs. Sem o prescaler, o TMR0 também
seria incrementado a cada 1µs. estourando em 256 µs. Se configurarmos o Prescaler em 1:4, o
TMR0 só será incrementado a cada 4 ciclos de máquina, neste caso correspondem a 4 µs. O
estouro aparecerá então em 1024 µs.
A mesma analogia pode ser aplicada ao WDT. Sem Prescaler, o WDT estoura em
aproximadamente 18 ms. Se configurarmos o Prescaler em 1:4, ele irá estourar aproximadamente
em 72 ms.
Para podermos configurar o Prescaler em 1:1 para o TMR0, é necessário aplicar o
Prescaler ao WDT e desta maneira, o TMR0 ficará sem Prescaler, o que resultará em incremento
de 1:1.

4.8.3 - EEPROM
Conhecendo o EEADR – Trata-se de um registrador em que será especificado o endereço para
escrita ou leitura da EEPROM interna do PIC 16F628, o qual possui uma memória de 128 bytes.

Registrador: EEADR Endereços: 9Bh


Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
R/W R/W R/W R/W R/W R/W R/W R/W
Endereço de acesso a EEPROM

50
Conhecendo o EEDATA – Esse registrador possui duas funções distintas: nas operações de
escrita da EEPROM, ele deve ser preenchido com o dado a ser armazenado, já nas operações de
leitura, ele armazena o dado lido.

Registrador: EEDATA Endereços: 9Ah


Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
R/W R/W R/W R/W R/W R/W R/W R/W
Dado para escrita / leitura da EEPROM

Conhecendo os EECONS – Existem dois registradores de configuração da EEPROM: EECON1


e EECON2. Vejamos primeiramente o EECON1 que é responsável pelas operações de escrita e
leitura da EEPROM.

Registrador: EECON1 Endereços: 9Ch


Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
R/W R/W R/W R/W R/W R/W R/W R/W
- - - EEIF WRERR WREN WR RD

EEIF – Identificação da interrupção de final da escrita na EEPROM.


0 = Esta interrupção não ocorreu
1 = Esta interrupção ocorreu
* Esse bit se encontra neste registrador por não haver mais espaço no registrador
INTCOM.

WRERR – Identificação de erro durante a escrita na EEPROM.


0 = Não ocorreu erro, a escrita foi completada
1 = Um erro ocorreu por uma escrita não terminada (um reset pode ter ocorrido).

WREN – Habilitação de escrita na EEPROM (bit de segurança).


0 = Não disponibiliza escrita na EEPROM.
1 = Disponibiliza escrita na EEPROM.

WR – Ciclo de escrita na EEPROM.


0 = Este bit só pode ser zerado pelo hardware, quando o ciclo de escrita termina.
1 = Inicia o ciclo de escrita.

RD – Ciclo de leitura na EEPROM.


0 = Este bit só pode ser zerado pelo hardware, quando o ciclo de leitura termina.
1 = Inicia o ciclo de leitura.
51
Em relação ao EECON2, devemos comentar que não se trata de um registrador
verdadeiramente implementado na memória. Ele só é utilizado durante a inicialização do ciclo de
escrita na EEPROM por uma questão de segurança, evitando assim que a memória seja alterada
acidentalmente.
Registrador: EECON2 Endereços: 9Dh
Utilizado para inicializar corretamente a escrita na EEPROM

4.8.4 - Endereçamento indireto

Conhecendo o FSR e o INDF – O FSR é um registrador em que pode ser escrito um outro
endereço de memória que será acessado indiretamente, como se ele fosse apenas um ponteiro. Já
o INDF não é um registrador realmente verdadeiro, trata-se somente de um espelho do endereço
apontado pelo FSR.

Registrador: FSR Endereços: 04h e 84h


Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
R/W R/W R/W R/W R/W R/W R/W R/W
Ponteiro para endereçamento indireto

Registrador: INDF Endereços: 00h e 80h


Valor do endereçamento indireto

52
4.9 – Exercícios

1 – Qual a função do microcontrolador ?


__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________

2 – Compare o microcontrolador com o microprocessador e indique suas principais


diferenças.
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________

3 – Imaginando o microcontrolador como um dispositivo de seis partes, indique


quais são e como defini-las.
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________

4 – Sabendo que o microcontrolador PIC utiliza uma tecnologia RISC, defina-a e


indiquem quais as suas vantagens.
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________

53
5 – Dentre os ciclos de máquina, a divisão do clock por quatro, forma as fases Q1,
Q2, Q3, Q4. Explique a função Pipeline, com base nas informações anteriores.
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________

6 – Qual a função do vetor de reset, vetor de interrupção e a pilha ?


__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________

7 – Qual a diferença entre os registradores especiais e os registradores de uso geral


?
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________

8 – Para que serve a interrupção nos microcontroladores PIC ?


__________________________________________________________________
__________________________________________________________________
__________________________________________________________________

9 – Dentre os tipos de interrupção para os microcontroladores PIC, selecionamos


somente quatro. Quais são e explique-as.
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________

54
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________

10 – Explique o procedimento executado pelo microcontrolador, sempre que uma


interrupção acontece.
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________

11 – Cite as principais características do microcontrolador 16F628.


__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________

12 – Comente sobre os circuitos osciladores para o microcntrolador PIC.


__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________

13 - Explique o comportamento do detector de baixa tensão para o


microcontrolador PIC.
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________

55
14 – Indique qual a função dos registradores abaixo relacionados.

a – STATUS _______________________________________________________
__________________________________________________________________

b – OPTION________________________________________________________
__________________________________________________________________

c – PCON__________________________________________________________
__________________________________________________________________

d – INTCON________________________________________________________
__________________________________________________________________

e – PIE1___________________________________________________________
__________________________________________________________________

f – PIR1___________________________________________________________
__________________________________________________________________

g – PCL___________________________________________________________
__________________________________________________________________

h – PCLATH________________________________________________________
__________________________________________________________________

i – TRIS___________________________________________________________
__________________________________________________________________

j – PORTA e PORTB_________________________________________________
__________________________________________________________________
__________________________________________________________________

56
k – TMR0__________________________________________________________
__________________________________________________________________

l – TMR1__________________________________________________________
__________________________________________________________________

m – TRM2_________________________________________________________
__________________________________________________________________

n – WDT___________________________________________________________
__________________________________________________________________

o – PRESCALER____________________________________________________
__________________________________________________________________

p – EEPROM_______________________________________________________
__________________________________________________________________

q – EEDATA_______________________________________________________
__________________________________________________________________

r – EECONS________________________________________________________
__________________________________________________________________

s – FSR e INDF_____________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________

57
Anotações:
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________

58
CAPÍTULO 5

Resumo e condições dos bancos de memória após o reset

¾ Programação e linguagem de máquina


¾ Noções de fluxograma de programação
¾ O resumo das instruções

59
5 – RESUMOS E CONDICOES DOS BANCOS DE MEMORIA APÓS
RESET
Hex Nome Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 Power-on Outros Reset

BANK 0
00 INDF Valor do endereço indireto (não é um registrador verdadeiro) ---- ---- ---- ----
01 TMR0 Contador TMR0 de 8 bits xxxx xxxx uuuu uuuu
02 PCL Parte baixa (8 bits menos significativos) do PC 0000 0000 0000 0000
03 STATUS IRP RP1 RP0 /TO /PD Z DC C 0001 1xxx 000q quuu
04 FSR Ponteiro para o endereçamento indireto à memória xxxx xxxx uuuu uuuu
05 PORTA RA7 RA6 RA5 RA4 RA3 RA2 RA1 RA0 xxxx 0000 xxxx 0000
06 PORTB RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0 xxxx xxxx uuuu uuuu
07 Não implementado no PIC 16f628. O valor lido é sempre zero.

08 Não implementado no PIC 16f628. O valor lido é sempre zero.

09 Não implementado no PIC 16f628. O valor lido é sempre zero.

0A PCLATH - - - Parte alta do PC ---0 0000 ---0 0000


0B INTCON GIE EEIE TOIE INTE RBIE TOIF INTF RBIF 0000 000x 0000 000u
0C PIR1 EEIE CMIF RCIF TXIF - CCP1IF TMR2IF TMR1IF 0000 -000 0000 –000
0D Não implementado no PIC 16f628. O valor lido é sempre zero.

0E TMR1L Registrador de acesso ao “LSB” do timer 1 xxxx xxxx xxxx xxxx


0F TMR1H Registrador de acesso ao “MSB” do timer 1 xxxx xxxx xxxx xxxx
10 T1CON - - T1CKPS TICKPS T10SCE T1SYN TMR1C TMR10 --00 0000 --uu uuuu
11 TMR2 Registrador de acesso ao conteúdo do timer 2 0000 0000 0000 0000
12 T2CON - TOU TOU TOU TOU TMR T2CK T2CK -000 0000 -uuu uuuu
TPS3 TPS2 TPS1 TPS0 20N PS0 PS0

13 Não implementado no PIC 16f628. O valor lido é sempre zero.

14 Não implementado no PIC 16f628. O valor lido é sempre zero.

15 CCPR1L Registrador de captura / comparação / PWM (LSB) xxx xxxx xxxx xxxx
16 CCPR1H Registrador de captura / comparação / PWM (LSB) xxx xxxx xxxx xxxx
17 CCP1CON - - CCP1X CCP1Y CCP1 CCP1 CCP1 CCP1 --00 0000 --00 0000
M3 M2 M1 M0

18 RCSTA SPEN RX9 SREN CREN ADEN FERR OERR RX9D 0000 –00x 0000 –00x

19 TXREG Registrador de transmissão de dados USART 0000 0000 0000 0000


1A RCREG Registrador de recepção de dados USART 0000 0000 0000 0000
1B Não implementado no PIC 16f628. O valor lido é sempre zero.

1C Não implementado no PIC 16f628. O valor lido é sempre zero.

1D Não implementado no PIC 16f628. O valor lido é sempre zero.

60
1E Não implementado no PIC 16f628. O valor lido é sempre zero.

1F CMCON C2OUT C1OUT C2INV C1INV CIS CM2 CM1 CM0 0000 0000 0000 0000
BANK 1
80 INDF Valor do endereçamento indireto ---- ---- ---- ----
81 OPTION /RBPU INTEDG T0CS T0SE PSA PS2 PS1 PS0 1111 1111 1111 1111
82 PCL Parte baixa (8 bits menos significativos) do PC 0000 0000 0000 0000
83 STATUS IRP RP1 RP0 /TO /PD Z DC C 0001 1xxx 000q quuu
84 FSR Ponteiro para o endereçamento indireto xxxx xxxx uuuu uuuu
85 TRISA RA7 RA6 - RA4 RA3 RA2 RA1 RA0 1111 1111 1111 1111
86 TRISB RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0 1111 1111 1111 1111
87 Não implementado no PIC 16f628. O valor lido é sempre zero. ---- ---- ---- ----
88 Não implementado no PIC 16f628. O valor lido é sempre zero. ---- ---- ---- ----
89 Não implementado no PIC 16f628. O valor lido é sempre zero. ---- ---- ---- ----
8A PCLATH - - - Parte alta do PC ---0 0000 ---0 0000
8B INTCON GIE EEIE TOIE INTE RBIE TOIF INTF RBIF 0000 000x 0000 000u
8C PIE1 EEIE CMIE RCIE TXIE - CCP1IE TMR2IE TMR1IE 0000 -000 0000 –000
8D Não implementado no PIC 16f628. O valor lido é sempre zero. ---- ---- ---- ----
8E PCON - - - - OSCF - /POR /BOD ---- 1-0x ---- 1-uq
8F Não implementado no PIC 16f628. O valor lido é sempre zero. ---- ---- ---- ----
90 Não implementado no PIC 16f628. O valor lido é sempre zero. ---- ---- ---- ----
91 Não implementado no PIC 16f628. O valor lido é sempre zero. ---- ---- ---- ----
92 PR2 Registrador de período do timer 2 1111 1111 1111 1111
93 Não implementado no PIC 16f628. O valor lido é sempre zero. ---- ---- ---- ----
94 Não implementado no PIC 16f628. O valor lido é sempre zero. ---- ---- ---- ----
95 Não implementado no PIC 16f628. O valor lido é sempre zero. ---- ---- ---- ----
96 Não implementado no PIC 16f628. O valor lido é sempre zero. ---- ---- ---- ----
97 Não implementado no PIC 16f628. O valor lido é sempre zero. ---- ---- ---- ----
98 TXSTA CSRC TX9 TXEN SYNC - BRGH TRMT TX9D 0000 -010 0000 -010
99 SPBRG Registrador do gerador de Baud Rate (BRG) 0000 0000 0000 0000
9A EEDATA Registrador de dados da EEPROM xxxx xxxx xxxx xxxx
9B EEADR - Registrador de endereçamento da EEPROM xxxx xxxx xxxx xxxx
9C EECON1 - - - - WRERR WREN WR RD ---- x000 ---- q000
9D EECON2 Registrador de controle auxiliar da EEPROM ---- ---- ---- ----
9E Não implementado no PIC 16f628. O valor lido é sempre zero. ---- ---- ---- ----
9F VIRCON VRE VROE VRR - VR3 VR2 VR1 VR0 000- 0000 000- 0000

61
BANK 2
100 INDF Valor do endereçamento indireto ---- ---- ---- ----
101 /RBPU INTEDG T0CS T0SE PSA PS2 PS1 PS0 1111 1111 1111 1111
102 PCL Parte baixa (8 bits menos significativos) do PC 0000 0000 0000 0000
103 STATUS IRP RP1 RP0 /TO /PD Z DC C 0001 1xxx 000q quuu
104 FSR Ponteiro para o endereçamento indireto xxxx xxxx uuuu uuuu
105 Não implementado no PIC 16f628. O valor lido é sempre zero. ---- ---- ---- ----
106 PORT B RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0 1111 1111 1111 1111
107 Não implementado no PIC 16f628. O valor lido é sempre zero. ---- ---- ---- ----
108 Não implementado no PIC 16f628. O valor lido é sempre zero. ---- ---- ---- ----
109 Não implementado no PIC 16f628. O valor lido é sempre zero. ---- ---- ---- ----
10A PCLATH - - - Parte alta do PC ---0 0000 ---0 0000
10B INTCON GIE EEIE TOIE INTE RBIE TOIF INTF RBIF 0000 000x 0000 000u
11F Não implementado no PIC 16f628. O valor lido é sempre zero. ---- ---- ---- ----
BANK 3
180 INDF Valor do endereçamento indireto ---- ---- ---- ----
181 /RBPU INTEDG T0CS T0SE PSA PS2 PS1 PS0 1111 1111 1111 1111
182 PCL Parte baixa (8 bits menos significativos) do PC 0000 0000 0000 0000
183 STATUS IRP RP1 RP0 /TO /PD Z DC C 0001 1xxx 000q quuu
184 FSR Ponteiro para o endereçamento indireto xxxx xxxx uuuu uuuu
185 Não implementado no PIC 16f628. O valor lido é sempre zero. ---- ---- ---- ----
186 PORT B RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0 1111 1111 1111 1111
187 Não implementado no PIC 16f628. O valor lido é sempre zero. ---- ---- ---- ----
188 Não implementado no PIC 16f628. O valor lido é sempre zero. ---- ---- ---- ----
189 Não implementado no PIC 16f628. O valor lido é sempre zero. ---- ---- ---- ----
18A PCLATH - - - Parte alta do PC ---0 0000 ---0 0000
18B INTCON GIE EEIE TOIE INTE RBIE TOIF INTF RBIF 0000 000x 0000 000u
19F Não implementado no PIC 16f628. O valor lido é sempre zero. ---- ---- ---- ----

* u – inalterado, x – desconhecido, q – depende de condição. Os endereços entre 10Ch até 11Fh


no banco 2 e os endereços 18Ah até 19Fh não são implementados.

62
5.1 - Programação e linguagem de máquina
Para que um circuito microprocessado execute as tarefas para as quais foi projetado, é
necessário que o programador informe ao sistema o que deseja que ele faça. Isso é feito com o
auxilio de instruções organizadas numa seqüência lógica e coerente. Essa seqüência de
instruções recebe o nome de programa. Os microcontroladores somente executam programas
cujas instruções estejam codificadas em linguagem binária, também conhecidas como código de
máquina.
Quando se programa um circuito microprocessado, utilizamos uma linguagem que
abrevia os códigos (hexadecimal) em instruções mnemônicas. Os mnemônicos são mais fáceis de
memorizar e facilitam a identificação das instruções. A programação é realizada em linguagem
assembly e deve conter o código de operação, o operando e o comentário da instrução.
5.2 - Noções de fluxograma de programação
Um fluxograma constitui-se de um conjunto de símbolos interligados por setas que
indicam o sentido do fluxo do programa. Cada símbolo do fluxograma tem uma forma própria
que define sua função. Abaixo temos uma tabela que apresenta apenas os símbolos mais
utilizados e suficientes para desenvolver as atividades de programação.
Símbolo Descrição
Processamento
Uma instrução ou grupo de instrução que executam uma função de
processamento de programa

Terminal
O ponto de início, término ou interrupção de um programa.

Decisão
Símbolo utilizado para indicar a possibilidade de desvios para
diversos outros pontos do programa de acordo com situações
variáveis.

Processamento Predefinido
Um grupo de operações não incluídas no diagrama de blocos. Ex:
sub-rotinas.

Conexão de página
Uma conexão utilizada para indicar uma entrada ou saída, ou para
outra página do diagrama.

Direção de Fluxo
A direção do fluxo de dados ou de processamento.

63
Set de instruções, termos mais utilizados – Antes de apresentar o set de instruções é necessário
que alguns termos utilizados na construção dos nomes das instruções sejam apresentados.
WORK – Trata-se de um registrador temporário para operações na ULA. No Assembler do PIC,
ele é conhecido com W ou acumulador.
FILE – Referência a um registrador (posição de memória) propriamente dito. Utilizaremos a
letra F para sua representação nos nomes de instruções e f nos argumentos delas.
LITERAL – Um numero qualquer que pode ser escrito na forma decimal, hexadecimal ou
binária. Utilizaremos a letra L para sua representação nos nomes de instruções e k nos
argumentos delas.
DESTINO – O local onde deve ser armazenado o resultado da operação. Existem somente dois
destinos possíveis: F, que guardará o resultado no próprio registrador passado como argumento,
ou W, que colocará o resultado em Work. Na verdade, a sintaxe das instruções, o destino deve
ser expresso pelos números 0 (W) e 1 (F). No entanto, como veremos mais adiante, as letras F e
W são definidas no “include” para facilitar a programação.
BIT – Bit especifico dentro de um byte, utilizaremos a letra B para sua representação nos nomes
de instruções de bit.
TESTE – Quando queremos testar o estado de um bit, para descobrirmos se ele é zero ou um.
Utilizaremos a letra T para representá-lo nos nomes das instruções.
SKIP – Significa “pulo” e é utilizado para criar desvios, pulando a próxima linha. Utilizaremos a
letra S para representá-lo nos nomes das instruções.
SET – Refere-se ao ato de setar um bit, significa levá-lo ao estado Um. Utilizaremos a letra S
para representá-lo nos nomes das instruções.
CLEAR – Refere-se ao “clear” de um bit, significa levá-lo ao estado Zero. Utilizaremos a letra C
para representá-lo nos nomes das instruções.
ZERO – Algumas instruções podem gerar desvios se o resultado da operação efetuada for zero.
Neste caso, utilizaremos a letra Z para indicar tal condição.
Outros termos utilizados são específicos das ações realizadas pelas instruções e são
praticamente auto-explicativos. Citados abaixo.
ADD – Soma. AND – Lógica “E”.
CLR – Limpar, zerar (Clear) COM - Complemento
DEC – Decremento de uma unidade INC – Incremento de uma unidade
IOR – Lógica “OU” MOV – Mover, transferir para algum lugar.
RL – Rotacionar 1 bit para esquerda (Left) RR – Rotacionar 1 bit para direita (Right)
SUB – Subtração XOR – Lógica “OU exclusivo”.
SWAP – Inversão entre as partes alta e baixa de um registrador.
Para facilitar a compreensão das 35 instruções que compõe o PIC 16F628, vamos organizá-los
em quatro grupos conforme as suas aplicações.
- Operações com registradores. - Operações com literais.
- Operações com bits - Controles.

64
5.3 - O resumo das instruções
A linha de PICs de 14 bits compartilha o mesmo conjunto de instruções. Isto facilita em
muito a migração de um dispositivo para o outro, visto que poderemos reutilizar muito o
software. O que diferencia são os registradores internos dos dispositivos.
Operações com registradores
Instrução Argumentos Descrição
ADDWF f,d Soma W e f guardando o resultado em d.
ANDWF f,d Lógica “E” entre W e f, guardando o resultado em d.
CLRF f Limpa f.
COMF f,d Calcula o complemento de f, guardando o resultado em d.
DECF f,d Decrementa f, guardando o resultado em d.
DECFSZ f,d Decrementa f, guardando o resultado em d e pula a próxima linha se
o resultado for zero.
INCF f,d Incrementa f, guardando o resultado em d.
INCFSZ f,d Incrementa f, guardando o resultado em d e pula a próxima linha se
o resultado for zero.
IORWF f,d Lógica “OU” entre W e f, guardando o resultado em d.
MOVF f,d Move o conteúdo de f para d (cópia).
MOVWF f Move o conteúdo de W para f (cópia).
RLF f,d Rotaciona o conteúdo de f um bit para esquerda.
RRF f,d Rotaciona o conteúdo de f um bit para direita.
SUBWF f,d Subtrai W d f (f - W), guardando o resultado em d.
SWAPF f,d Executa uma inversão entre as partes alta e baixa de f, guardando o
resultado em d.
XORWF f,d Lógica “OU exclusivo” entre W e f, guardando o resultado em d.
Operações com literais
Instrução Argumentos Descrição
ADDLW k Soma k com W, guardando o resultado em W.
ANDLW k Lógica “E” entre K e W, guardando o resultado em W.
IORLW k Lógica “OU” entre K e W, guardando o resultado em W.
MOVLW k Move k para W.
SUBLW k Subtrai W de k (k – W), guardando o resultado em W.
XORLW k Lógica “OU exclusivo” entre K e W, guardando o resultado em W.
Operações com bits
Instrução Argumentos Descrição
BCF f,b Impõe 0 (zero) ao bit b do registrador f.

65
BSF f,b Impõe 1 (um) ao bit b do registrador f.
BTFSC f,b Testa o bit b do registrador f, e pula a próxima linha se ele for 0
(zero).
BTFSS f,b Testa o bit b do registrador f, e pula a próxima linha se ele for 1
(um).
Controle
Instrução Argumentos Descrição
CLRW - Limpa W.
NOP - Gasta um ciclo de máquina sem fazer absolutamente nada.
CALL R Executa a rotina R.
CLRWDT - Limpa o registrador WDT para não acontecer o reset.
GOTO R Desvia para o ponto R, mudando o PC.
RETFIE - Retorna de uma interrupção.
RETLW K Retorna de uma rotina, com k em W.
RETURN - Retorna de uma rotina, sem afetar o W.
SLEEP - Coloca o PIC em modo de sleep (dormindo) para economia de
energia.

66
Anotações:

__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
_____________________________________________________________________________

67
CAPÍTULO 6

Simulações com microprocessador PIC16F628

¾ O programador JDM
¾ O programa ICPROG transferência de dados
¾ As instruções detalhadas do PIC

68
6 – SIMULAÇÕES COM MICROPROCESSADOR PIC16F628
6.1 – Programador JDM – PIC
Para que possamos gravar e ler microcontroladores PIC, se faz necessário à utilização de
um programa com função de programador e leitor de PIC. Sugerimos a utilização do
programador JDM. Abaixo temos o hardware necessário para essa implementação e para a
utilização do programador, temos que instalar o programa ICPROG. Explicado em seguida.
Lista de Material
1 – Conector DB9 fêmea de 90° para circuito impresso.
1 – Soquete de 18 pinos torneados para circuito integrado.
2 – Transistores BC548
1 – Diodo zener 8V2 de ½ W.
1 – Diodo zener 5V1 de ½ W.
1 – Led de Ø3mm (qualquer cor).
4 – Diodos 1N4148
1 - Capacitor radial de 100µf / 40V.
1 – Capacitor radial 22 µf / 16V.
1 – Resistor de 5,6 KΩ.
1 – Resistor de 10 KΩ.
1 – Resistor de 1,5 KΩ.
1 – Cabo de comunicação serial.

J1 R12 R11
D13
6 1 16F628
2
7 3
8 4 Q2
9 RA2 RA1
5 RA3 RA0
RA4 OSC1
MCLR OSC2
VSS VDD
Q1 RB0 RB7
RB1 RB6
RB2 RB5
R10 RB3 RB4

D16
D11 8V2

C2 C3 D18 D17
+

D12
100uF 22uF LED11 5V1
D14

Figura 15 – Esquema elétrico

69
6.2 – O programa ICPROG de transferência de dados para PIC

O gravador baseado no JDM (Jens Dyekjaer Madson) utiliza também as instruções da


Microchip. Suporta a maioria dos microcontroladores PIC de 8, 18, 28 e 40 pinos com
encapsulamento DIP que possuam o recurso de programação (gravação) serial. A gravação é
simples e rápida, ele é conectado diretamente ao PC via interface serial RS-232 (conector DB-9)
e não utiliza fonte de alimentação externa. Permite a gravação "ICSP" (in-circuit serial
programming) ou seja, pode-se gravar o PIC já montado na placa de aplicação, reduzindo o
tempo de desenvolvimento e permitindo a gravação de dispositivos com qualquer
encapsulamento inclusive SMD. É fornecido montado e testado com cabo para conexão ao PC.

Os requisitos mínimos são:


Hardware - 8Mb de memória RAM e um processador 386
Software - Sistema Operacional Windows 95, 89, ME, NT, 2000 ou XP.

INSTALAÇÃO DO ICPROG

Para instalar o Software, basta criar uma pasta no disco local do seu PC e guardar o
arquivo icprog.exe. Se o seu sistema Operacional for NT ou 2000 será também necessário
guardar o Driver na mesma pasta (icprog.sys). Todos os arquivos deveram ser colocados dentro
da mesma pasta no seu disco local.
Para abrir a aplicação, faça duplo clique no ícone do icprog. Em sistemas baseados em
NT, será necessário instalar o respectivo NT Driver (mais adiante será explicado como o
instalar).
Ao abrir a aplicação pela 1ª vez, será apresentada uma janela de configuração de
Hardware, esta janela pode ser mais tarde alterada conforme as necessidades, de inicio pode
fechar a janela, clique no botão 'OK' para começar a utilizar a aplicação.

Figura 16 – Hardware settings

70
Em Sistemas Operacionais NT e 2000 é necessário instalar um arquivo de Driver para
que o Software consiga comunicar com as portas de interface do PC (porta série e paralela), pois
o Sistema Operacional (Windows) não permite o acesso direto das aplicações ao Hardware do
PC.
Este Driver é instalado dentro do IC-Prog, bastando para isso abrir a aplicação e acessar o
menu :
Settings :
Options
Misc

Figura 17 - Options

Como citado acima é necessário ter instalado no computador o programa ICPROG. Para
simulação também é importante que você tenha instalado no computador o programa MPLAB.
Desenvolva o programa no editor preferido (Sugestão MPLAB 6.62) em seguida compile
o programa para que possa ser gerado *.HEX. O programa de extensão *.HEX devera ser
carregado através do compilador ICPROG e transferido para o microcontrolador 16f628.
A tela de abertura se encontra na figura 18, onde muitas vezes se faz necessário que seja
alterada a linguagem que esta sendo utilizada para manipulação do ICPROG, nesta
implementação é necessário entrar no item configuração, opções e linguagem. Utilizar
português. Já na tela abaixo vemos como carregar o programa de extensão HEX, onde já foi
compilado utilizando-se o MPLAB ou do MPASM.

71
Figura 18 – Tela de carregamento de arquivo no ICPROG

Após ter carregado o arquivo de extensão HEX deve ser transferido para o
microcontrolador PIC. Com o cabo já conectado clicar no item comando e em programar tudo,
em seguida o programa é transferido e verificado se não houve erro durante transferência.

selecione o tipo de
Programador antes de
utilizar e as definições de
programação.

selecione o IC a
programar

72
selecione o Buffer de
informação

Abra o arquivo de que


contem a programação e o
arquivo de dados (caso
exista).

Ajuste a configuração do
IC.
( tipo de oscilador,
fusíveis, etc. )

Transfira a programação
para o hardware ( IC ).

Se não forem detectados


erros o IC ficou
corretamente programado

73
A lista abaixo, informa quais os Microcontroladores suportados pelo programador JDM.

IC-Prog
C. I. Tipo Fabricante ver: ver: ver: ver: Observações
1.05A 1.05 1.04C 1.04A

PIC12C508/A Microcontrolador Microchip • • • •


PIC12C509/A Microcontrolador Microchip • • • •
PIC 12CE518 Microcontrolador Microchip • • • •
PIC12CE519 Microcontrolador Microchip • • • •
PIC 12C671 Microcontrolador Microchip • • • •
PIC12C672 Microcontrolador Microchip • • • •
PIC12CE673 Microcontrolador Microchip • • • •
PIC12CE674 Microcontrolador Microchip • • • •
PIC12F629 Microcontrolador Microchip •
PIC12F675 Microcontrolador Microchip •
PIC16C433 Microcontrolador Microchip • • • •
PIC16C54 Microcontrolador Microchip • • • •
PIC16C56 Microcontrolador Microchip • • • •
PIC16C 58 Microcontrolador Microchip • • • •
PIC16C61 Microcontrolador Microchip • • • •
PIC16C62A/B Microcontrolador Microchip • • • •
PIC16C63/A Microcontrolador Microchip • • • •
16C64A Microcontrolador Microchip • • • •
16C65A/B Microcontrolador Microchip • • • •
PIC16C66 Microcontrolador Microchip • • • •
PIC16C67 Microcontrolador Microchip • • • •
PIC16C71 Microcontrolador Microchip • • • •
PIC16C72/A Microcontrolador Microchip • • • •
PIC16C/F73A/B Microcontrolador Microchip • • • •
PIC16C/F74A/B Microcontrolador Microchip • • • •
PIC16C/F76 Microcontrolador Microchip • • • •
PIC16C/F77 Microcontrolador Microchip • • • •
PIC16F83 Microcontrolador Microchip • • • •
PIC16C/F84/A Microcontrolador Microchip • • • •
PIC16C505 Microcontrolador Microchip • • • •
PIC16C605 Microcontrolador Microchip • •
PIC16C620 Microcontrolador Microchip • • • •
PIC16C621 Microcontrolador Microchip • • • •
PIC16C622 /A Microcontrolador Microchip • • • •
PIC16CE625 Microcontrolador Microchip • • • •
PIC16F627 Microcontrolador Microchip • • • •
PIC16F628 Microcontrolador Microchip • • • •
74
PIC16C711 Microcontrolador Microchip • • • •
PIC16C712 Microcontrolador Microchip •
PIC16C715 Microcontrolador Microchip • • • •
PIC16C765 Microcontrolador Microchip • • • •
PIC16F870 Microcontrolador Microchip • • • •
PIC16F871 Microcontrolador Microchip • • • •
PIC16F872 Microcontrolador Microchip • • • •
PIC16F873 Microcontrolador Microchip • • • •
PIC16F873 A Microcontrolador Microchip •
PIC16F874 Microcontrolador Microchip • • • •
PIC16F874A Microcontrolador Microchip •
PIC 16F876 Microcontrolador Microchip • • • •
PIC16F876 Microcontrolador Microchip •
PIC16F877 Microcontrolador Microchip • • • •
PIC16F877A Microcontrolador Microchip •
PIC16C923 Microcontrolador Microchip • • • •
PIC16C924 Microcontrolador Microchip • • • •
PIC18F242 Microcontrolador Microchip • •
PIC18F248 Microcontrolador Microchip • •
PIC18F252 Microcontrolador Microchip • • •
PIC18F258 Microcontrolador Microchip • •
PIC18F442 Microcontrolador Microchip • •
PIC18F448 Microcontrolador Microchip • •
PIC18F452 Microcontrolador Microchip • •
PIC18F458 Microcontrolador Microchip • •

6 . 3 – Display de Cristal Liquido


Display de Cristal Liquido
Uma outra aplicação muito utilizada com microcontrolador é o display de LCD, onde
podemos escrever caracteres alfanuméricos segundo código ASCII, esses dispositivos já
possuem internamente um microcontrolador dedicado, por isso chamamos de LCD inteligente, e
já possui armazenado o código ASCII, bastando via software enviar comandos de inicialização,
de escrita ou até mesmo de leitura.
Existe uma gama muito grande de LCD no mercado, mas a maioria tem o hardware
compatível. Nosso exemplo de aplicação vai utilizar o modo que utiliza o menor número de
pinos possível, usaremos 4 bits para enviar os comandos e os dados. Apesar dos dados serem de
8 bits, esse modo permite que você divida os 8 bits em duas palavras de 4 bits, e o LCD
inteligente monta os 8 bits automaticamente.

75
Vejamos os pinos do LCD na tabela abaixo:

76
6.4 – O Conjunto de instruções do microcontrolador PIC

ADDLW Efetua a soma de um literal no registrador W


Sintaxe [label] ADDLW k
Operação (W) + k – (W)
Status C, DC, Z
Codificação 0011 111x kkkk kkkk
Descrição O conteúdo do registrador W é somado com
literal k e o resultado colocado no registrador
W
Ciclos 1

ADDWF Efetua a soma do registrador W ao registro f


Sintaxe [label] ADDWF f,d
Operação (W) + (f) – (destino)
Status C, DC, Z
Codificação 0011 0111 dfff ffff
Descrição Soma o conteúdo do registro W ao registro f.
Se <d é igual a zero o resultado é colocado no
registro W. Se <d é igual a 1 o resultado é
armazenado no registro f.
Ciclos 1

ANDLW Operação lógica <E entre o literal k e o


registro W
Sintaxe [label] ANDLW k
Operação (W) .AND. (k) – (W)
Status Z
Codificação 0011 1001 kkkk kkkk
Descrição Realiza a operação de lógica E (AND) entre o
conteúdo do registrador W com literal o k e o
resultado colocado no registrador W
Ciclos 1

77
ANDWF Operação lógica <E entre o registro W com o
registro f.
Sintaxe [label] ANDWF f,d
Operação (W) .AND. (f) – (destino)
Status Z
Codificação 0000 0101 dfff ffff
Descrição Realiza a operação de lógica <E (AND) entre
o conteúdo do registrador W e do registrador
f. Se <d é igual a zero o resultado é colocado
no registrador W. Se <d é igual a 1 o
resultado é armazenado no registro f.
Ciclos 1

BCF Limpa um bit do registro f


Sintaxe [label] BCF f.d
Operação 0 – (f<b)
Status Nenhum
Codificação 0001 00bb bfff ffff
Descrição Faz o bit <b do registro f ser igual a zero.
Ciclos 1

BSF Seta o bit f


Sintaxe [label] BSF f.d
Operação 1 – (f<b)
Status Nenhum
Codificação 0001 01bb bfff ffff
Descrição Faz o bit <b do registro f ser igual a um.
Ciclos 1

78
BTFSC Teste bit f e pula se for zero
Sintaxe [label] BTFSC f, d
Operação Desvia se f<b for igual à zero.
Status Nenhum
Codificação 0001 10bb bfff ffff
Descrição Se o bit <b no registro <f for igual à zero,
pula a próxima instrução.
Ciclos 1 se não houver o desvio, 2 se ocorrer o
desvio.

BTFSS Teste bit f e pula se for um


Sintaxe [label] BTFSS f, d
Operação Desvia se f<b for igual a um.
Status Nenhum
Codificação 0001 11bb bfff ffff
Descrição Se o bit <b no registro <f for igual a um, pula
a próxima instrução.
Ciclos 1 se não houver o desvio, 2 se ocorrer o
desvio.

CALL Chama uma sub-rotina


Sintaxe [label] Call k
Operação (PC) +1 – TOS
k – (PC <10C0),
(PCLATH <4 -3) – (PC <12 – 11)
Status Nenhum
Codificação 0010 0kkk kkkk kkkk
Descrição Chama uma sub-rotina. Primeiro, o endereço
de retorno (PC +1) é colocado no stack. O
endereço de 11 bits é armazenado nos bits
<100 do PC. Os bits superiores do PC são
carregados do registro PCLATH.
Ciclos 2

79
CLRF Limpa o registro f
Sintaxe [label] CLRF f
Operação 0 – (f)
1–Z
Status Z
Codificação 0001 0001 1fff ffff
Descrição O conteúdo do registro <f é feito igual a zero
e o bit Z é feito igual a um.
Ciclos 1

CLRW Limpa o registro W


Sintaxe [label] CLRFW
Operação 0 – (W)
1–Z
Status Z
Codificação 0001 0001 0000 0011
Descrição O conteúdo do registro <W é feito igual a
zero e o bit Z é feito igual a um.
Ciclos 1

CLRWDT Limpa o registro do watch dog


Sintaxe [label] CLRWDT
Operação 0 – (WDT)
0 – WDT preescalador
1 – TO (invertido)
1 – PD (invertido)
Status TO, PD
Codificação 0000 0000 0110 0100
Descrição Faz o temporizador watch dog timer igual a
zero. Também zera o preescalador do watch
dog. Os bits de estado TO e PD são feitos
igual a 1.
Ciclos 1

80
COMF Complementa o registro f
Sintaxe [label] COMF f,d
Operação (naof) – destino
Status Z
Codificação 0001 1001 dfff ffff
Descrição O conteúdo do registro <f é complementado.
Se <d for igual a zero o resultado é colocado
no registro W. Se <d for igual a 1 o resultado
é colocado no registro <f.
Ciclos 1

DECF Decrementa f
Sintaxe [label] DECF f,d
Operação (f) – 1 – (destino)
Status Z
Codificação 0000 0011 dfff ffff
Descrição Decrementa o registro <f. Se <d for igual a
zero o resultado será colocado no registro W.
Se <d for igual a 1 o resultado será colocado
no registro <f.
Ciclos 1

DECFSZ Decrementa f e pula se o resultado for zero


Sintaxe [label] DECFSZ f,d
Operação (f) – 1 – (destino), desvia se resultado igual a
zero.
Status Nenhum
Codificação 0000 1011 dfff ffff
Descrição Decrementa o conteúdo do registro <f. Se <d
for igual a 0 e o resultado será colocado no
registro W. Se <d for igual a 1 o resultado
será colocado no registro <f. Se o resultado
for zero a próxima instrução é descartada.
Ciclos 1 se não ocorrer o desvio.
2 se ocorrer o desvio.

81
GOTO Desvia para o endereço especificado
Sintaxe [label] GOTO k
Operação k – (PC) < 100
PCLATH <4 3 – (PC <12 11)
Status Nenhum
Codificação 0010 1kkk kkkk kkkk
Descrição Desvia o programa pra o endereço k. Os onze
bits k são carregados para o registro do PC
<100. Os bits superiores do PC são
carregados a partir do registro PCLATH.
Ciclos 2

INCF Incrementa f
Sintaxe [label] INCF f,d
Operação (f) + 1 – (destino)
Status Z
Codificação 0000 1010 dfff ffff
Descrição Incrementa o conteúdo do registro <f. Se <d
for igual a zero o resultado será colocado no
registro W. Se <d for igual a 1 o resultado
será colocado no registro <f.
Ciclos 1

INCFSZ Incrementa f e pula se o resultado for zero


Sintaxe [label] INCFSZ f,d
Operação (f) – 1 – (destino), desvia se resultado igual a
zero.
Status Nenhum
Codificação 0000 1111 dfff ffff
Descrição Incrementa o conteúdo do registro <f. Se <d
for igual a 0 e o resultado será colocado no
registro W. Se <d for igual a 1 o resultado
será colocado no registro <f. Se o resultado
for zero a próxima instrução é descartada.
Ciclos 1 se não ocorrer o desvio.
2 se ocorrer o desvio.
82
IORLW Ou inclusivo entre k e registrador W
Sintaxe [label] IORLW k
Operação (W) .OR. (k) – (W).
Status Z
Codificação 0011 1000 kkkk kkkk
Descrição Realiza a operação lógica OU entre o registro
k e o registro W. O resultado é colocado no
registro W.
Ciclos 1

IORWF Ou inclusivo entre f e registrador W


Sintaxe [label] IORWF f,d
Operação (W) .OR. (f) – (destino)
Status Z
Codificação 0011 0100 dfff ffff
Descrição Realiza a operação lógica OU entre o registro
f e o registro W. Se <d for igual a zero o
resultado é colocado no registro W. Se <d for
igual a 1 o resultado é colocado no registro f.
Ciclos 1

MOVLW Move literal para o registro W


Sintaxe [label] MOVLW k
Operação k – (W)
Status Nenhum
Codificação 0011 00xx kkkk kkkk
Descrição Carrega o valor do literal k para o registrador
W.
Ciclos 1

83
MOVF Movimenta f
Sintaxe [label] MOVF f,d
Operação (f) – destino
Status Z
Codificação 0000 1000 dfff fffff
Descrição O conteúdo do registro f é colocado no
destino. Se d for igual a 0 o destino será o
registrador W. Se d for igual a 1 o destino
será o próprio registrador. Esta instrução pode
ser utilizada para verificarmos se o conteúdo
de um registrador é zero, pois o flag Z é
alterado.
Ciclos 1

MOVWF Movimenta o registro W para o f


Sintaxe [label] MOVWF f
Operação (W) – (f)
Status Nenhum
Codificação 0000 0000 1fff fffff
Descrição Movimenta os dados do registrador W para o
registro f.
Ciclos 1

NOP Nenhuma operação


Sintaxe [label] NOP
Operação Nada
Status Nenhum
Codificação 0000 0000 0000 0000
Descrição Não executa nenhuma instrução. É útil
quando utilizado como ajuste fino de laços de
temporização.
Ciclos 1

84
RETFIE Retorno de uma interrupção.
Sintaxe [label] RETFIE
Operação TOS - (PC)
1 – GIE
Status Nenhum
Codificação 0000 0000 0000 1001
Descrição O topo do stack (TOS) é carregado no PC. Os
interrupts são habilitados de uma forma
global pelo flag GIOE. O apontador do stack
pointer é diminuído de um (POP).
Ciclos 2

RETLW Retorna com um literal na W.


Sintaxe [label] RETLW k
Operação k – (W)
TOS – (PC)
Status Nenhum
Codificação 1100 01xx kkkk kkkk
Descrição O registrador W é carregado como valor de
k. O contador de programa assume o valor do
topo do stack. Equivale a uma instrução de
retorno de sub-rotina sendo que o registro W
retorna com o valor desejado.
Ciclos 2

RETURN Retorna da sub-rotina.


Sintaxe [label] RETURN
Operação TOS – (PC)
Status Nenhum
Codificação 0000 0000 0000 1000
Descrição O contador de programa assume o valor do
topo do stack. O apontador do stack é
atualizado (POP).
Ciclos 2

85
RLF Desloca f para esquerda usando o carry.
Sintaxe [label] RLF f,d
Operação Veja a descrição
Status C
Codificação 0000 1101 dfff ffff
Descrição O conteúdo do registro <f é deslocado de um
bit para a esquerda, sendo que o bit 7 é
enviado para carry. O conteúdo do carry é
enviado para o bit 0. Se <d for igual a zero o
resultado é colocado no registrador W, se for
igual a 1 o resultado é colocado no registro
<f.
Ciclos 1

RRF Desloca f para direita usando o carry.


Sintaxe [label] RRF f,d
Operação Veja a descrição
Status C
Codificação 0000 1100 dfff ffff
Descrição O conteúdo do registro <f é deslocado de um
bit para a direita, sendo que o bit 0 é enviado
para carry. O conteúdo do carry é enviado
para o bit 7. Se <d for igual a zero o resultado
é colocado no registrador W, se for igual a 1 o
resultado é colocado no registro <f.
Ciclos 1

86
SLEEP Vai para o modo de repouso (stand by)
Sintaxe [label] SLEEP
Operação 00 – WDT
0 – pré-escalador do WDT
1 – TO barra
0 – PD barra
Status TO, PD barra
Codificação 0000 0000 0110 0011
Descrição O bit de power down, (PD) é feito igual a
zero. O bit de estouro de tempo (time-out) é
feito igual a 1. Os temporizadores do watch
dog timer e seu pré-escalador são zerados. O
processador assume o modo SLEEP, com o
oscilador parado. Para sair deste modo
somente com reset ou interrupção.
Ciclos 1

SUBLW Subtrai de um literal o valor do registrador W.


Sintaxe [label] SUBLW k
Operação k – (W) – (W)
Status C, DC, Z
Codificação 0011 110x kkkk kkkk
Descrição Subtrai do valor do literal <k o conteúdo do
registrador W. O resultado é colocado em W.
Ciclos 2

87
SUBWF Subtrai o registro <f do conteúdo do registro
W
Sintaxe [label] SUBWF f,d
Operação (f) – (W) –(dest)
Status C, DC, Z
Codificação 0000 0010 dfff ffff
Descrição Subtrai do registrador f o conteúdo do
registrador W. Se <d é igual a zero o
resultado é colocado no registro W. Se <d é
igual a 1 o resultado é armazenado no registro
f.
Ciclos 1

SWAPF Inverte bits em f


Sintaxe [label] SWAPF f,d
Operação (f<3,0) – (dest <7.4)
(f<7,4) – (dest <3,0)
Status Nenhum
Codificação 0000 1110 dfff ffff
Descrição Troca de posição os nibles do registrador f. Se
<d é igual a zero o resultado é colocado no
registro W. Se <d é igual a 1 o resultado é
armazenado no registro f.
Ciclos 1

XORLW Ou exclusivo entre k e o registro W


Sintaxe [label] XORLW k
Operação (W) . XOR. (k) – (W)
Status Z
Codificação 0011 1010 kkkk kkkk
Descrição Realiza a operação lógica OU EXCLUSIVO
entre o registrador k e o registro W. O
resultado é colocado no registro W.
Ciclos 1

88
XORWF Ou exclusivo entre o registro W e f
Sintaxe [label] XORWF f,d
Operação (W) . XOR. (f) – (destino)
Status Z
Codificação 0011 0100 dfff ffff
Descrição Realiza a operação lógica OU EXCLUSIVO
entre o registro f e o registro W. Se ,d for
igual a 0 o resultado é colocado no registro
W. Se <d for igual a 1 o resultado é colocado
no registro f.
Ciclos 1

89
; * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * * * * * * * * * * * * * * * * * * * * * * * * *
;* NOME DO PROJETO *
;* CLIENTE *
; TRAB00 DATA: 10/10/XX *
; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * * * * * * * * * *
;* DESCRIÇÃO DO ARQUIVO *
; *-----------------------------------------------------------------------------------------------------------*
;* MODELO PARA PIC 16F628 OU 16F627 *
; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * * * * * * * * *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* ARQUIVOS DE DEFINIÇÕES *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

#INCLUDE <P16F628.INC> ;ARQUIVO PADRÃO MICROCHIP PARA 16F628


__CONFIG _BODEN_ON & _CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF &
_MCLRE_ON & _XT_OSC

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* PAGINAÇÃO DE MEMÓRIA *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;DEFINIÇÃO DE COMANDOS PARA ALTERAÇÃO DA PÁGINA DE MEMÓRIA

#DEFINE BANK0 BCF STATUS,RP0 ;SETA BANK 0 DE MEMÓRIA


#DEFINE BANK1 BSF STATUS,RP0 ;SETA BANK 1 DE MAMÓRIA

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* VARIÁVEIS *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; DEFINIÇÃO DOS NOMES E ENDEREÇOS DE TODAS AS VARIÁVEIS UTILIZADAS
; PELO SISTEMA

CBLOCK 0x20 ;ENDEREÇO INICIAL DA MEMÓRIA DE


;USUÁRIO
W_TEMP ;REGISTRADORES TEMPORÁRIOS PARA USO
STATUS_TEMP ;JUNTO ÀS INTERRUPÇÕES NOVAS VARIÁVEIS
ENDC ;FIM DO BLOCO DE MEMÓRIA

90
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* FLAGS INTERNOS *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; DEFINIÇÃO DE TODOS OS FLAGS UTILIZADOS PELO SISTEMA
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* CONSTANTES *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; DEFINIÇÃO DE TODAS AS CONSTANTES UTILIZADAS PELO SISTEMA
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* ENTRADAS *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; DEFINIÇÃO DE TODOS OS PINOS QUE SERÃO UTILIZADOS COMO ENTRADA
; RECOMENDAMOS TAMBÉM COMENTAR O SIGNIFICADO DOS ESTADOS (0 E 1)
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* SAÍDAS *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; DEFINIÇÃO DE TODOS OS PINOS QUE SERÃO UTILIZADOS COMO SAÍDA
; RECOMENDAMOS TAMBÉM COMENTAR O SIGNIFICADO DOS ESTADOS (0 E 1)
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* VETOR DE RESET *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

ORG 0x00 ;ENDEREÇO INICIAL DE PROCESSAMENTO


GOTO INICIO

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* INÍCIO DA INTERRUPÇÃO *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; ENDEREÇO DE DESVIO DAS INTERRUPÇÕES. A PRIMEIRA TAREFA É SALVAR
;OS VALORES DE "W" E "STATUS" PARA RECUPERAÇÃO FUTURA

ORG 0x04 ;ENDEREÇO INICIAL DA INTERRUPÇÃO


MOVWF W_TEMP ;COPIA W PARA W_TEMP
SWAPF STATUS,W
MOVWF STATUS_TEMP ;COPIA STATUS PARA STATUS_TEMP

91
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* ROTINA DE INTERRUPÇÃO *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; AQUI SERÁ ESCRITA AS ROTINAS DE RECONHECIMENTO E TRATAMENTO DAS
; INTERRUPÇÕES
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* ROTINA DE SAÍDA DA INTERRUPÇÃO *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; OS VALORES DE "W" E "STATUS" DEVEM SER RECUPERADOS ANTES DE
; RETORNAR DA INTERRUPÇÃO

SAI_INT
SWAPF STATUS_TEMP,W
MOVWF STATUS ;MOVE STATUS_TEMP PARA STATUS
SWAPF W_TEMP,F
SWAPF W_TEMP,W ;MOVE W_TEMP PARA W
RETFIE

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* ROTINAS E SUBROTINAS *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; CADA ROTINA OU SUBROTINA DEVE POSSUIR A DESCRIÇÃO DE ;FUNCIONAMENTO E
UM NOME COERENTE ÀS SUAS FUNÇÕES.
SUBROTINA1
;CORPO DA ROTINA
RETURN

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* INICIO DO PROGRAMA *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

INICIO
BANK0 ;ALTERA PARA O BANCO 0
MOVLW B'00000111' ;DEFINE O MODO DE OPERAÇÃO
MOVWF CMCON ;DO COMPARADOR ANALÓGICO

BANK1 ;ALTERA PARA O BANCO 1


MOVLW B'00000000'

92
MOVWF TRISA ;DEFINE ENTRADAS E SAÍDAS DO PORTA
MOVLW B'00000000'
MOVWF TRISB ;DEFINE ENTRADAS E SAÍDAS DO PORTB
MOVLW B'10000100'
MOVWF OPTION_REG ;DEFINE OPÇÕES DE OPERAÇÃO
MOVLW B'00000000'
MOVWF INTCON ;DEFINE OPÇÕES DE INTERRUPÇÕES
BANK0 ;RETORNA PARA O BANCO

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* INICIALIZAÇÃO DAS VARIÁVEIS *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* ROTINA PRINCIPAL *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
MAIN
;CORPO DA ROTINA PRINCIPAL
GOTO MAIN

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

93
; * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * * * * * * * * * * * * * * * * * * * * * * * * *
;* NOME DO PROJETO *
;* CLIENTE *
; TRAB01 DATA: 10/10/XX *
; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * * * * * * * * * *
;* DESCRIÇÃO DO ARQUIVO *
; *-----------------------------------------------------------------------------------------------------------*
;* SISTEMA MUITO SIMPLES PARA REPRESENTAR UM LED ACESO *
;* *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* ARQUIVOS DE DEFINIÇÕES *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
#INCLUDE <P16F628.INC> ;ARQUIVO PADRÃO MICROCHIP PARA 16F628
__CONFIG _BODEN_ON & _CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF &
_MCLRE_ON & _XT_OSC
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* PAGINAÇÃO DE MEMÓRIA *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;DEFINIÇÃO DE COMANDOS DE USUÁRIO PARA ALTERAÇÃO DA PÁGINA DE MEMÓRIA

#DEFINE BANK0 BCF STATUS,RP0 ;SETA BANK 0 DE MEMÓRIA


#DEFINE BANK1 BSF STATUS,RP0 ;SETA BANK 1 DE MAMÓRIA

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* VARIÁVEIS *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; DEFINIÇÃO DOS NOMES E ENDEREÇOS DE TODAS AS VARIÁVEIS UTILIZADAS
; PELO SISTEMA
CBLOCK 0x20 ;ENDEREÇO INICIAL DA MEMÓRIA DE
;USUÁRIO
W_TEMP ;REGISTRADORES TEMPORÁRIOS PARA
STATUS_TEMP ;INTERRUPÇÕES
TEMPO01 ;ESTAS VARIÁVEIS CONTAM O TEMPO DE PISCAGEM
TEMPO02 ;DOS LEDS
ENDC ;FIM DO BLOCO DE MEMÓRIA

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* FLAGS INTERNOS *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ****
94
; DEFINIÇÃO DE TODOS OS FLAGS UTILIZADOS PELO SISTEMA

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* CONSTANTES *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; DEFINIÇÃO DE TODAS AS CONSTANTES UTILIZADAS PELO SISTEMA

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* ENTRADAS *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; DEFINIÇÃO DE TODOS OS PINOS QUE SERÃO UTILIZADOS COMO ENTRADA
; RECOMENDAMOS TAMBÉM COMENTAR O SIGNIFICADO DE SEUS ESTADOS (0 E 1)

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* SAÍDAS *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; DEFINIÇÃO DE TODOS OS PINOS QUE SERÃO UTILIZADOS COMO SAÍDA
; RECOMENDAMOS TAMBÉM COMENTAR O SIGNIFICADO DE SEUS ESTADOS (0 E 1)

#DEFINE LED PORTB,0 ;PORTA DO LED


; 0 -> APAGADO
; 1 -> ACESO
#DEFINE LED1 PORTB,1 ;PORTA DO LED1
; 0 -> APAGADO
; 1 -> ACESO

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* VETOR DE RESET *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
ORG 0x00 ;ENDEREÇO INICIAL DE PROCESSAMENTO
GOTO INICIO
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* INÍCIO DA INTERRUPÇÃO *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; AS INTERRUPÇÕES NÃO SERÃO UTILIZADAS, POR ISSO PODEMOS SUBSTITUIR
; TODO O SISTEMA EXISTENTE NO ARQUIVO MODELO PELO APRESENTADO ABAIXO
; ESTE SISTEMA NÃO É OBRIGATÓRIO, MAS PODE EVITAR PROBLEMAS FUTUROS
ORG 0x04 ;ENDEREÇO INICIAL DA INTERRUPÇÃO
RETFIE ;RETORNA DA INTERRUPÇÃO
95
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; ROTINA DE DELAY *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

DELAY
MOVLW .1000
MOVWF TEMPO02

DL1
MOVLW .200
MOVWF TEMPO01

DL2
NOP
NOP
DECFSZ TEMPO01,F
GOTO DL2

DECFSZ TEMPO02,F
GOTO DL1
RETURN

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* INICIO DO PROGRAMA *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
INICIO
BANK0 ;ALTERA PARA O BANCO 0

CLRF PORTA ;LIMPA O PORTA


CLRF PORTB ;LIMPA O PORTB

BANK1 ;ALTERA PARA O BANCO 1


MOVLW B'00000000'
MOVWF TRISA ;DEFINE TODO O PORTA COMO SAÍDA
MOVLW B'00000000'
MOVWF TRISB ;DEFINE TODO O PORTB COMO SAÍDA
MOVLW B'10000000'
MOVWF OPTION_REG ;PRESCALER 1:2 NO TMR0
;PULL-UPS DESABILITADOS
96
;AS DEMAIS CONFG. SÃO IRRELEVANTES
MOVLW B'00000000'
MOVWF INTCON ;TODAS AS INTERRUPÇÕES DESLIGADAS
BANK0 ;RETORNA PARA O BANCO 0

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* INICIALIZAÇÃO DAS VARIÁVEIS *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

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

BSF LED ;ACENDE O LED0


BSF LED1 ;ACENDE O LED1
CALL DELAY

BCF LED
BCF LED1
CALL DELAY

GOTO MAIN ;RETORNA AO LOOP PRINCIPAL

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

END ;OBRIGATÓRIO

97
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* BOTÃO E LED - EX1 *
;* KIT PIC 16F628 *
;* TRAB02 DATA: 10/10/01 *
;* * * * * * * * * * * * * * * * * * * * * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* DESCRIÇÃO DO ARQUIVO *
;*-------------------------------- ------------------------------------------------------------------------*
;* SISTEMA MUITO SIMPLES PARA REPRESENTAR O ESTADO DE *
;* UM BOTÃO ATRAVÉS DE UM LED. *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* * * * * * * * * * * * * * * * * * * * * * * * * ** * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* ARQUIVOS DE DEFINIÇÕES *
;* * * * * * * * * * * * * * * * * * * * * * * * * * ** * * * * * * * * * * * * * * * * * * * * * * * * * *

#INCLUDE <P16F628.INC> ;ARQUIVO PADRÃO MICROCHIP PARA 16F628


__CONFIG _BODEN_ON & _CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF &
_MCLRE_ON & _XT_OSC

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* PAGINAÇÃO DE MEMÓRIA *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;DEFINIÇÃO DE COMANDOS DE USUÁRIO PARA ALTERAÇÃO DA PÁGINA DE MEMÓRIA

#DEFINE BANK0 BCF STATUS,RP0 ;SETA BANK 0 DE MEMÓRIA


#DEFINE BANK1 BSF STATUS,RP0 ;SETA BANK 1 DE MAMÓRIA

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* VARIÁVEIS *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; DEFINIÇÃO DOS NOMES E ENDEREÇOS DE TODAS AS VARIÁVEIS UTILIZADAS
; PELO SISTEMA

CBLOCK 0x20 ;ENDEREÇO INICIAL DA MEMÓRIA DE USUÁRIO


W_TEMP ;REGISTRADORES TEMPORÁRIOS PARA
STATUS_TEMP ;INTERRUPÇÕES
;ESTAS VARIÁVEIS NEM SERÃO UTILIZADAS
ENDC ;FIM DO BLOCO DE MEMÓRIA

98
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* FLAGS INTERNOS *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; DEFINIÇÃO DE TODOS OS FLAGS UTILIZADOS PELO SISTEMA
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* CONSTANTES *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; DEFINIÇÃO DE TODAS AS CONSTANTES UTILIZADAS PELO SISTEMA
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* ENTRADAS *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; DEFINIÇÃO DE TODOS OS PINOS QUE SERÃO UTILIZADOS COMO ENTRADA
; RECOMENDAMOS TAMBÉM COMENTAR O SIGNIFICADO DE SEUS ESTADOS (0 E 1)

#DEFINE BOTAO PORTA,2 ;PORTA DO BOTÃO


; 0 -> PRESSIONADO
; 1 -> LIBERADO

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* SAÍDAS *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; DEFINIÇÃO DE TODOS OS PINOS QUE SERÃO UTILIZADOS COMO SAÍDA
; RECOMENDAMOS TAMBÉM COMENTAR O SIGNIFICADO DE SEUS ESTADOS (0 E 1)
#DEFINE LED PORTB,0 ;PORTA DO LED
; 0 -> APAGADO
; 1 -> ACESO
#DEFINE LED1 PORTB,1 ;PORTA DO LED1
; 0 -> APAGADO
; 1 -> ACESO
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* VETOR DE RESET *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
ORG 0x00 ;ENDEREÇO INICIAL DE PROCESSAMENTO
GOTO INICIO

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* INÍCIO DA INTERRUPÇÃO *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

99
; AS INTERRUPÇÕES NÃO SERÃO UTILIZADAS, POR ISSO PODEMOS SUBSTITUIR
; TODO O SISTEMA EXISTENTE NO ARQUIVO MODELO PELO APRESENTADO ABAIXO

; ESTE SISTEMA NÃO É OBRIGATÓRIO, MAS PODE EVITAR PROBLEMAS FUTUROS


ORG 0x04 ;ENDEREÇO INICIAL DA INTERRUPÇÃO
RETFIE ;RETORNA DA INTERRUPÇÃO

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* INICIO DO PROGRAMA *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
INICIO
BANK0 ;ALTERA PARA O BANCO 0
MOVLW B'00000111' ;DEFINE O MODO DE OPERAÇÃO
MOVWF CMCON ;DO COMPARADOR ANALÓGICO

CLRF PORTA ;LIMPA O PORTA


CLRF PORTB ;LIMPA O PORTB

BANK1 ;ALTERA PARA O BANCO 1


MOVLW B'00000100' ;DEFINE RA2 COMO ENTRADA E DEMAIS
MOVWF TRISA ;COMO SAÍDAS

MOVLW B'00000000'
MOVWF TRISB ;DEFINE TODO O PORTB COMO SAÍDA
MOVLW B'10000000'
MOVWF OPTION_REG ;PRESCALER 1:2 NO TMR0
;PULL-UPS DESABILITADOS
;AS DEMAIS CONFG. SÃO IRRELEVANTES
MOVLW B'00000000'
MOVWF INTCON ;TODAS AS INTERRUPÇÕES DESLIGADAS
BANK0 ;RETORNA PARA O BANCO 0

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* INICIALIZAÇÃO DAS VARIÁVEIS *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* ROTINA PRINCIPAL *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ****
100
MAIN
BTFSC BOTAO ;O BOTÃO ESTÁ PRESSIONADO?
GOTO BOTAO_LIB ;NÃO, ENTÃO TRATA BOTÃO LIBERADO
GOTO BOTAO_PRES ;SIM, ENTÃO TRATA BOTÃO PRESSIONADO

BOTAO_LIB
BCF LED ;APAGA O LED
BCF LED1
GOTO MAIN ;RETORNA AO LOOP PRINCIPAL

BOTAO_PRES
BSF LED ;ACENDE O LED
BSF LED1
GOTO MAIN ;RETORNA AO LOOP PRINCIPAL

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* FIM DO PROGRAMA *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
END ;OBRIGATÓRIO

101
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* CONTADOR SIMPLIFICADO - EX2 *
;* KIT PIC 16F628 *
;* TRAB03 DATA: 30/10/01 *
;* * * * * * * * * * * * * * * * * * * * * * * * * ** * * * * * * * * * * * * * * * * * * *
;* DESCRIÇÃO DO ARQUIVO *
;*---------------- -------------------------------------------------------------------------*
;* SISTEMA MUITO SIMPLES PARA INCREMENTAR ATÉ UM DETERMINADO *
;* VALOR (MAX) DE DEPOIS DECREMENTAR ATÉ OUTRO (MIN). *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* ARQUIVOS DE DEFINIÇÕES *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
#INCLUDE <P16F628.INC> ;ARQUIVO PADRÃO MICROCHIP PARA 16F628
__CONFIG _BODEN_ON & _CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF &
_MCLRE_ON & _XT_OSC

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* PAGINAÇÃO DE MEMÓRIA *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;DEFINIÇÃO DE COMANDOS DE USUÁRIO PARA ALTERAÇÃO DA PÁGINA DE MEMÓRIA

#DEFINE BANK0 BCF STATUS,RP0 ;SETA BANK 0 DE MEMÓRIA


#DEFINE BANK1 BSF STATUS,RP0 ;SETA BANK 1 DE MAMÓRIA

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* VARIÁVEIS *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; DEFINIÇÃO DOS NOMES E ENDEREÇOS DE TODAS AS VARIÁVEIS UTILIZADAS
; PELO SISTEMA

CBLOCK 0x20 ;ENDEREÇO INICIAL DA MEMÓRIA DE USUÁRIO


W_TEMP ;REGISTRADORES TEMPORÁRIOS PARA
STATUS_TEMP ;INTERRUPÇÕES VARIÁVEIS NEM SERÃO UTILIZADAS
CONTADOR ;ARMAZENA O VALOR DA CONTAGEM
FLAGS ;ARMAZENA OS FLAGS DE CONTROLE
FILTRO ;FILTRAGEM PARA O BOTÃO
ENDC ;FIM DO BLOCO DE MEMÓRIA

102
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* FLAGS INTERNOS *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; DEFINIÇÃO DE TODOS OS FLAGS UTILIZADOS PELO SISTEMA

#DEFINE SENTIDO FLAGS,0 ;FLAG DE SENTIDO


; 0 -> SOMANDO
; 1 -> SUBTRAINDO

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* CONSTANTES *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; DEFINIÇÃO DE TODAS AS CONSTANTES UTILIZADAS PELO SISTEMA

MIN EQU .10 ;VALOR MÍNIMO PARA O CONTADOR


MAX EQU .30 ;VALOR MÁXIMO PARA O CONTADOR
T_FILTRO EQU .230 ;FILTRO PARA BOTÃO

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* ENTRADAS *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; DEFINIÇÃO DE TODOS OS PINOS QUE SERÃO UTILIZADOS COMO ENTRADA
; RECOMENDAMOS TAMBÉM COMENTAR O SIGNIFICADO DE SEUS ESTADOS (0 E 1)

#DEFINE BOTAO PORTA,2 ;PORTA DO BOTÃO


; 0 -> PRESSIONADO
; 1 -> LIBERADO

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* SAÍDAS *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; DEFINIÇÃO DE TODOS OS PINOS QUE SERÃO UTILIZADOS COMO SAÍDA
; RECOMENDAMOS TAMBÉM COMENTAR O SIGNIFICADO DE SEUS ESTADOS (0 E 1)
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* VETOR DE RESET *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
ORG 0x00 ;ENDEREÇO INICIAL DE PROCESSAMENTO
GOTO INICIO

103
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* INÍCIO DA INTERRUPÇÃO *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; AS INTERRUPÇÕES NÃO SERÃO UTILIZADAS, POR ISSO PODEMOS SUBSTITUIR
; TODO O SISTEMA EXISTENTE NO ARQUIVO MODELO PELO APRESENTADO ABAIXO
; ESTE SISTEMA NÃO É OBRIGATÓRIO, MAS PODE EVITAR PROBLEMAS FUTUROS

ORG 0x04 ;ENDEREÇO INICIAL DA INTERRUPÇÃO


RETFIE ;RETORNA DA INTERRUPÇÃO

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* INICIO DO PROGRAMA *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

INICIO
BANK1 ;ALTERA PARA O BANCO 1
MOVLW B'00000100'
MOVWF TRISA ;DEFINE RA2 COMO ENTRADA E DEMAIS COMO
SAÍDAS
MOVLW B'00000000'
MOVWF TRISB ;DEFINE TODO O PORTB COMO SAÍDA
MOVLW B'10000000'
MOVWF OPTION_REG ;PRESCALER 1:2 NO TMR0
;PULL-UPS DESABILITADOS
;AS DEMAIS CONFG. SÃO IRRELEVANTES
MOVLW B'00000000'
MOVWF INTCON ;TODAS AS INTERRUPÇÕES DESLIGADAS
BANK0 ;RETORNA PARA O BANCO 0
MOVLW B'00000111' ;DEFINE O MODO DE OPERAÇÃO
MOVWF CMCON ;DO COMPARADOR ANALÓGICO

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* INICIALIZAÇÃO DAS VARIÁVEIS *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
CLRF PORTA ;LIMPA O PORTA
CLRF PORTB ;LIMPA O PORTB
MOVLW MIN
MOVWF CONTADOR ;INICIA CONTADOR = V_INICIAL

104
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* ROTINA PRINCIPAL *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

MAIN
MOVLW T_FILTRO
MOVWF FILTRO ;INICIALIZA FILTRO = T_FILTRO
CHECA_BT
BTFSC BOTAO ;O BOTÃO ESTÁ PRESSIONADO?
GOTO MAIN ;NÃO, ENTÃO CONTINUA ESPERANDO SIM
DECFSZ FILTRO,F ;DECREMENTA O FILTRO DO BOTÃO
GOTO CHECA_BT ;NÃO, CONTINUA ESPERANDO SIM
TRATA_BT
BTFSS SENTIDO ;DEVE SOMAR (SENTIDO=0)?
GOTO SOMA ;SIM , ;NÃO
SUBTRAI
DECF CONTADOR,F ;DECREMENTA O CONTADOR
MOVLW MIN ;MOVE O VALOR MÍNIMO PARA W
SUBWF CONTADOR,W ;SUBTRAI O VALOR DE W (MIN) DE CONTADOR
BTFSC STATUS,C ;TESTA CARRY. RESULTADO NEGATIVO?
GOTO ATUALIZA ;NÃO, ENTÃO CONTA >= MIN
;SIM, ENTÃO CONTA < MIN
INCF CONTADOR,F ;INCREMENTA CONTADOR NOVAMENTE
;POIS PASSOU DO LIMITE
BCF SENTIDO ;MUDA SENTIDO PARA SOMA
GOTO MAIN ;VOLTA AO LOOP PRINCIPAL
SOMA
INCF CONTADOR,F ;INCREMENTA O CONTADOR

MOVLW MAX ;MOVE O VALOR MÁXIMO PARA W


SUBWF CONTADOR,W ;SUBTRAI O VALOR DE W (MIN) DE CONTADOR
BTFSS STATUS,C ;TESTA CARRY. RESULTADO NEGATIVO?
GOTO ATUALIZA ;SIM, ENTÃO CONTA < MAX
;NÃO, ENTÃO CONTA >= MAX
BSF SENTIDO ;MUDA SENTIDO PARA SUBTRAÇÃO
GOTO MAIN ;VOLTA AO LOOP PRINCIPAL

105
ATUALIZA
MOVF CONTADOR,W ;COLOCA CONTADOR EM W
MOVWF PORTB ;ATUALIZA O PORTB PARA
;VISUALIZARMOS O VALOR DE CONTADOR
BTFSS BOTAO ;O BOTÃO CONTINUA PRESSIONADO?
GOTO $-1 ;SIM, ENTÃO ESPERA LIBERAÇÃO PARA
;QUE O CONTADOR NÃO DISPARE
GOTO MAIN ;NÃO, VOLTA AO LOOP PRINCIPAL
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* FIM DO PROGRAMA *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

END ;OBRIGATÓRIO

106
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* PISCA-PISCA - EX3 *
;* KIT PIC 16F628 *
;* TRAB04 DATA: 30/10/XX *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* DESCRIÇÃO DO ARQUIVO *
;*--------------------------- -----------------------------------------------------*
;* PISCA-PISCA VARIÁVEL PARA DEMONSTRAR A IMPLEMENTAÇÃO DE *
;* DELAYS E A INVERSÃO DE PORTAS. *
;* * * * * * * * * * * * * * * * ** * * * * * ** * * * ** * * * * * ** * * * ** * * * * * ** ** * * * * * * * *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* ARQUIVOS DE DEFINIÇÕES *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

#INCLUDE <P16F628.INC> ;ARQUIVO PADRÃO MICROCHIP PARA 16F628


__CONFIG _BODEN_ON & _CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF &
_MCLRE_ON & _XT_OSC

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* PAGINAÇÃO DE MEMÓRIA *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;DEFINIÇÃO DE COMANDOS DE USUÁRIO PARA ALTERAÇÃO DA PÁGINA DE MEMÓRIA

#DEFINE BANK0 BCF STATUS,RP0 ;SETA BANK 0 DE MEMÓRIA


#DEFINE BANK1 BSF STATUS,RP0 ;SETA BANK 1 DE MAMÓRIA

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* VARIÁVEIS *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; DEFINIÇÃO DOS NOMES E ENDEREÇOS DE TODAS AS VARIÁVEIS UTILIZADAS
; PELO SISTEMA

CBLOCK 0x20 ;ENDEREÇO INICIAL DA MEMÓRIA DE USUÁRIO


W_TEMP ;REGISTRADORES TEMPORÁRIOS PARA
STATUS_TEMP ;INTERRUPÇÕES ESTAS VARIÁVEIS NEM

107
CONTADOR ;BASE DE TEMPO PARA A PISCADA
FILTRO ;FILTRAGEM PARA O BOTÃO
TEMPO1 ;REGISTRADORES AUXILIARES DE TEMPO
TEMPO2
TEMPO3
ENDC ;FIM DO BLOCO DE MEMÓRIA

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* FLAGS INTERNOS *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; DEFINIÇÃO DE TODOS OS FLAGS UTILIZADOS PELO SISTEMA
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* CONSTANTES *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; DEFINIÇÃO DE TODAS AS CONSTANTES UTILIZADAS PELO SISTEMA

MIN EQU .10


MAX EQU .240
STEP EQU .5
MULTIPLO EQU .5

;A CONSTANTE DISPLAY REPRESENTA O SÍMBOLO QUE APARECERÁ PISCANDO NO


;DISPLAY. 1=LED LIGADO E 0=LED DESLIGADO. A RELAÇÃO ENTRE BITS E
;SEGMENTOS É A SEGUINTE: 'EDC.BAFG'

DISPLAY EQU B''11011010' ;(LETRA H)

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* ENTRADAS *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; DEFINIÇÃO DE TODOS OS PINOS QUE SERÃO UTILIZADOS COMO ENTRADA
; RECOMENDAMOS TAMBÉM COMENTAR O SIGNIFICADO DE SEUS ESTADOS (0 E 1)

#DEFINE BT1 PORTA,1 ;BOTÃO 1 - INCREMENTA


; 0 -> PRESSIONADO
; 1 -> LIBERADO

108
#DEFINE BT2 PORTA,2 ;BOTÃO 2 - DECREMENTA
; 0 -> PRESSIONADO
; 1 -> LIBERADO

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* SAÍDAS *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; DEFINIÇÃO DE TODOS OS PINOS QUE SERÃO UTILIZADOS COMO SAÍDA
; RECOMENDAMOS TAMBÉM COMENTAR O SIGNIFICADO DE SEUS ESTADOS (0 E 1)
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* VETOR DE RESET *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

ORG 0x00 ;ENDEREÇO INICIAL DE PROCESSAMENTO


GOTO INICIO

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* INÍCIO DA INTERRUPÇÃO *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; AS INTERRUPÇÕES NÃO SERÃO UTILIZADAS, POR ISSO PODEMOS SUBSTITUIR
; TODO O SISTEMA EXISTENTE NO ARQUIVO MODELO PELO APRESENTADO ABAIXO
; ESTE SISTEMA NÃO É OBRIGATÓRIO, MAS PODE EVITAR PROBLEMAS FUTUROS

ORG 0x04 ;ENDEREÇO INICIAL DA INTERRUPÇÃO


RETFIE ;RETORNA DA INTERRUPÇÃO

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* ROTINA DE DELAY *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; ESTA ROTINA AGUARDA TANTOS MILISEGUNDOS QUANTO O VALOR PASSADO
; POR W. POR EXEMPLO, SE W = .200, ELA AGUARDARÁ 200 MILISEGUNDOS.
; O DELAY PRINCIPAL DURA 1ms, POIS POSSUI 5 INSTRUÇÕES (5us) E É
; RODADO 200 VEZES (TEMPO1). PORTANTO 200 * 5us = 1ms.
; O DELAY PRINCIPAL É RODADO TANTAS VEZES QUANTO FOR O VALOR DE
; TEMPO2, O QUAL É INICIADO COM O VALOR PASSADO EM W.

109
DELAY
MOVWF TEMPO2 ;INICIA TEMPO 2 COM VALOR EM W
DL1
MOVLW .200
MOVWF TEMPO1
DL2 ;ESTE DELAY DURA 1ms (5*200)
NOP
NOP
DECFSZ TEMPO1,F ;DECREMENTA TEMPO1. ACABOU?
GOTO DL2 ;NÃO, CONTINUA AGUARDANDO SIM

DECFSZ TEMPO2,F ;DECREMENTA TEMPO2. ACABOU?


GOTO DL1 ;NÃO, CONTINUA AGUARDANDO SIM
RETURN

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* INICIO DO PROGRAMA *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

INICIO
BANK0 ;ALTERA PARA O BANCO 0
MOVLW B'00000111'
MOVWF CMCON ;DEFINE O MODO DE OPERAÇÃO DO
;COMPARADOR ANALÓGICO
BANK1 ;ALTERA PARA O BANCO 1
MOVLW B'00000110'
MOVWF TRISA ;DEFINE RA1 E 2 COMO ENTRADA E DEMAIS
SAÍDAS
MOVLW B'00000000'
MOVWF TRISB ;DEFINE TODO O PORTB COMO SAÍDA
MOVLW B'10000000'
MOVWF OPTION_REG ;PRESCALER 1:2 TMR0
;PULL-UPS DESABILITADOS
;AS DEMAIS CONFG. SÃO IRRELEVANTES
MOVLW B'00000000'
MOVWF INTCON ;TODAS AS INTERRUPÇÕES DESLIGADAS
BANK0 ;RETORNA PARA O BANCO 0

110
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* INICIALIZAÇÃO DAS VARIÁVEIS *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

CLRF PORTA ;LIMPA O PORTA


MOVLW DISPLAY
MOVWF PORTB ;ACENDE O VALOR CERTO NO DISPLAY
MOVLW MIN
MOVWF CONTADOR ;INICIA CONTADOR COM VALOR MIN.

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

MAIN
MOVLW MULTIPLO
MOVWF TEMPO3 ;INICIA COMTADOR DE MULTIPLICAÇÃO,
;POIS OS TEMPOS GERADOS POR DELAY
;SÃO MUITO PEQUENOS, GERANDO FREQ.
;MUITO ALTAS PARA A VISUALIZAÇÃO.
MAIN1
MOVF CONTADOR,W ;COLOCA CONTADOR EM W
;PARA CHAMAR A ROTINA DE DELAY
CALL DELAY ;CHAMA ROTINA DE DELAY
BTFSS BT1 ;BOTÃO 1 PRESSIONADO?
GOTO INCREMENTA ;SIM, DEVE INCREMENTAR NÃO
BTFSS BT2 ;BOTÃO 2 PRESSIONADO?
GOTO DECREMENTA ;SIM, DEVE DECREMENTAR NÃO

DECFSZ TEMPO3,F ;DECREMENTA CONTADOR MULT. ACABOU?


GOTO MAIN1 ;NÃO, CONTINUA AGUARDANDO SIM
MOVLW DISPLAY ;APÓS TRANSCORRIDO O TEMPO, IRÁ
;INVERTER OS LEDS CORRETOS ATRAVÉS
;DA MÁSCARA "DISPLAY" E DA OPERAÇÃO XOR
XORWF PORTB,F ;INVERTE LEDS -> PISCA
GOTO MAIN ;COMEÇA NOVAMENTE

111
DECREMENTA
MOVLW STEP
SUBWF CONTADOR,F ;DECREMENTA O CONTADOR EM STEP
MOVLW MIN ;MOVE O VALOR MÍNIMO PARA W
SUBWF CONTADOR,W ;SUBTRAI O VALOR DE W (MIN) DE CONTADOR
BTFSC STATUS,C ;TESTA CARRY. RESULTADO NEGATIVO?
GOTO MAIN ;NÃO, ENTÃO CONTA >= MIN
;SIM, ENTÃO CONTA < MIN
MOVLW MIN
MOVWF CONTADOR ;ACERTA CONTADOR NO MÍNIMO, POIS
;PASSOU DO VALOR
BTFSS BT2 ;BOTÃO 2 CONTINUA PRESSIONADO?
GOTO $-1 ;SIM, AGUARDA LIBERAÇÃO SE NÃO
GOTO MAIN ;VOLTA AO LOOP PRINCIPAL

INCREMENTA
MOVLW STEP
ADDWF CONTADOR,F ;INCREMENTA O CONTADOR EM STEP
MOVLW MAX ;MOVE O VALOR MÁXIMO PARA W
SUBWF CONTADOR,W ;SUBTRAI O VALOR DE W (MIN) DE CONTADOR
BTFSS STATUS,C ;TESTA CARRY. RESULTADO NEGATIVO?
GOTO MAIN ;SIM, ENTÃO CONTA < MAX
;NÃO, ENTÃO CONTA >= MAX
MOVLW MAX
MOVWF CONTADOR ;ACERTA CONTADOR NO MÁXIMO, POIS
;PASSOU DO VALOR
BTFSS BT1 ;BOTÃO 1 CONTINUA PRESSIONADO?
GOTO $-1 ;SIM, AGUARDA LIBERAÇÃO SE NÃO
GOTO MAIN ;VOLTA AO LOOP PRINCIPAL
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* FIM DO PROGRAMA *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
END ;OBRIGATÓRIO

112
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* CONTADOR MELHORADO - EX4 *
;* KIT PIC 16F628 *
;* TRAB05 DATA: 30/10/XX *
;* * * * * * * * * * * * * * * * * ** * * * * * * * * * * * * * * * * * * * * * * *
;* DESCRIÇÃO DO ARQUIVO *
;*-------------- -------------------------------------------------------------------*
;* CONTADOR QUE UTILIZA DOIS BOTÕES PARA INCREMENTAR E DECRE- *
;* MENTAR O VALOR CONTROLADO PELA VARIÁVEL "CONTADOR". ESTA *
;* VARIÁVEL ESTÁ LIMITADA PELAS CONSTANTES "MIN" E "MAX". *
;* O VALOR DO CONTADOR É MOSTRADO NO DISPLAY. *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* ARQUIVOS DE DEFINIÇÕES *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

#INCLUDE <P16F628.INC> ;ARQUIVO PADRÃO MICROCHIP PARA 16F628


__CONFIG _BODEN_ON & _CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF &
_MCLRE_ON & _XT_OSC

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* PAGINAÇÃO DE MEMÓRIA *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;DEFINIÇÃO DE COMANDOS DE USUÁRIO PARA ALTERAÇÃO DA PÁGINA DE MEMÓRIA

#DEFINE BANK0 BCF STATUS,RP0 ;SETA BANK 0 DE MEMÓRIA


#DEFINE BANK1 BSF STATUS,RP0 ;SETA BANK 1 DE MAMÓRIA

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* VARIÁVEIS *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; DEFINIÇÃO DOS NOMES E ENDEREÇOS DE TODAS AS VARIÁVEIS UTILIZADAS
; PELO SISTEMA

CBLOCK 0x20 ;ENDEREÇO INICIAL DA MEMÓRIA DE USUÁRIO


W_TEMP ;REGISTRADORES TEMPORÁRIOS PARA
STATUS_TEMP ;INTERRUPÇÕES VARIÁVEIS NAO UTILIZADAS
CONTADOR ;ARMAZENA O VALOR DA CONTAGEM

113
FLAGS ;ARMAZENA OS FLAGS DE CONTROLE
FILTRO1 ;FILTRAGEM PARA O BOTÃO 1
FILTRO2 ;FILTRAGEM PARA O BOTÃO 2
ENDC ;FIM DO BLOCO DE MEMÓRIA
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* FLAGS INTERNOS *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; DEFINIÇÃO DE TODOS OS FLAGS UTILIZADOS PELO SISTEMA

#DEFINE ST_BT1 FLAGS,0 ;STATUS DO BOTÃO 1


#DEFINE ST_BT2 FLAGS,1 ;STATUS DO BOTÃO 2

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* CONSTANTES *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; DEFINIÇÃO DE TODAS AS CONSTANTES UTILIZADAS PELO SISTEMA

MIN EQU .0 ;VALOR MÍNIMO PARA O CONTADOR


MAX EQU .15 ;VALOR MÁXIMO PARA O CONTADOR
T_FILTRO EQU .255 ;FILTRO PARA BOTÃO

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* ENTRADAS *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; DEFINIÇÃO DE TODOS OS PINOS QUE SERÃO UTILIZADOS COMO ENTRADA
; RECOMENDAMOS TAMBÉM COMENTAR O SIGNIFICADO DE SEUS ESTADOS (0 E 1)

#DEFINE BOTAO1 PORTA,1 ;PORTA DO BOTÃO


; 0 -> PRESSIONADO
; 1 -> LIBERADO
#DEFINE BOTAO2 PORTA,2 ;PORTA DO BOTÃO
; 0 -> PRESSIONADO
; 1 -> LIBERADO

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* SAÍDAS *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

114
; DEFINIÇÃO DE TODOS OS PINOS QUE SERÃO UTILIZADOS COMO SAÍDA
; RECOMENDAMOS TAMBÉM COMENTAR O SIGNIFICADO DE SEUS ESTADOS (0 E 1)
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* VETOR DE RESET *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

ORG 0x00 ;ENDEREÇO INICIAL DE PROCESSAMENTO


GOTO INICIO

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* INÍCIO DA INTERRUPÇÃO *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; AS INTERRUPÇÕES NÃO SERÃO UTILIZADAS, POR ISSO PODEMOS SUBSTITUIR
; TODO O SISTEMA EXISTENTE NO ARQUIVO MODELO PELO APRESENTADO ABAIXO
; ESTE SISTEMA NÃO É OBRIGATÓRIO, MAS PODE EVITAR PROBLEMAS FUTUROS

ORG 0x04 ;ENDEREÇO INICIAL DA INTERRUPÇÃO


RETFIE ;RETORNA DA INTERRUPÇÃO

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* ROTINA DE CONVERSÃO BINÁRIO -> DISPLAY *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; ESTA ROTINA IRÁ RETORNAR EM W, O SIMBOLO CORRETO QUE DEVE SER
; MOSTRADO NO DISPLAY PARA CADA VALOR DE CONTADOR. O RETORNO JÁ ESTÁ
; FORMATADO PARA AS CONDIÇÕES DE LIGAÇÃO DO DISPLAY AO PORTB.

CONVERTE
MOVF CONTADOR,W ;COLOCA CONTADOR EM W
ANDLW B'00001111' ;MASCARA VALOR DE CONTADOR
;CONSIDERAR SOMENTE ATÉ 15
ADDWF PCL,F
; B'GFABCDE.' ; POSIÇÃO CORRETA DOS SEGUIMENTOS
RETLW B'01111110' ; 00 - RETORNA SÍMBOLO CORRETO 0
RETLW B'00011000' ; 01 - RETORNA SÍMBOLO CORRETO 1
RETLW B'10110110' ; 02 - RETORNA SÍMBOLO CORRETO 2
RETLW B'10111100' ; 03 - RETORNA SÍMBOLO CORRETO 3
RETLW B'11011000' ; 04 - RETORNA SÍMBOLO CORRETO 4
RETLW B'11101100' ; 05 - RETORNA SÍMBOLO CORRETO 5

115
RETLW B'11101110' ;06 - RETORNA SÍMBOLO CORRETO 6
RETLW B'00111000' ; 07 - RETORNA SÍMBOLO CORRETO 7
RETLW B'11111110' ; 08 - RETORNA SÍMBOLO CORRETO 8
RETLW B'11111100' ; 09 - RETORNA SÍMBOLO CORRETO 9
RETLW B'11111010' ; 10 - RETORNA SÍMBOLO CORRETO A
RETLW B'11001110' ; 11 - RETORNA SÍMBOLO CORRETO b
RETLW B'01100110' ; 12 - RETORNA SÍMBOLO CORRETO C
RETLW B'10011110' ; 13 - RETORNA SÍMBOLO CORRETO d
RETLW B'11100110' ; 14 - RETORNA SÍMBOLO CORRETO E
RETLW B'11100010' ; 15 - RETORNA SÍMBOLO CORRETO F
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* INICIO DO PROGRAMA *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

INICIO
BANK0 ;ALTERA PARA O BANCO 0
MOVLW B'00000111'
MOVWF CMCON ;DEFINE O MODO DE OPERAÇÃO DO
;COMPARADOR ANALÓGICO
BANK1 ;ALTERA PARA O BANCO 1
MOVLW B'00000110'
MOVWF TRISA ;DEFINE RA1 E 2 COMO ENTRADA
;E DEMAIS COMO SAÍDAS
MOVLW B'00000000'
MOVWF TRISB ;DEFINE TODO O PORTB COMO SAÍDA
MOVLW B'10000000'
MOVWF OPTION_REG ;PRESCALER 1:2 NO TMR0
;PULL-UPS DESABILITADOS
;AS DEMAIS CONFG. SÃO
IRRELEVANTES
MOVLW B'00000000'
MOVWF INTCON ;TODAS INTERRUPÇÕES DESLIGADAS
BANK0 ;RETORNA PARA O BANCO 0

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* INICIALIZAÇÃO DAS VARIÁVEIS *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ****
116
CLRF PORTA ;LIMPA O PORTA
CLRF PORTB ;LIMPA O PORTB
CLRF FLAGS ;LIMPA TODOS OS FLAGS
MOVLW MIN
MOVWF CONTADOR ;INICIA CONTADOR = MIN
GOTO ATUALIZA ;ATUALIZA O DISPLAY INICIALMENTE

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

MAIN
MOVLW T_FILTRO
MOVWF FILTRO1 ;INICIALIZA FILTRO1 = T_FILTRO
MOVWF FILTRO2 ;INICIALIZA FILTRO2 = T_FILTRO

CHECA_BT1
BTFSC BOTAO1 ;O BOTÃO 1 ESTÁ PRESSIONADO?
GOTO BT1_LIB ;NÃO, ENTÃO TRATA COMO LIBERADO SE SIM
DECFSZ FILTRO1,F ;DECREMENTA FILTRO DO BOTÃO TERMINOU?
GOTO CHECA_BT1 ;NÃO, CONTINUA ESPERANDO SE SIM
BTFSS ST_BT1 ;BOTÃO JÁ ESTAVA PRESSIONADO?
GOTO DEC ;NÃO, EXECUTA AÇÃO DO BOTÃO
GOTO CHECA_BT2 ;SIM, CHECA BOTÃO 2
BT1_LIB
BCF ST_BT1 ;MARCA BOTÃO 1 COMO LIBERADO

CHECA_BT2
BTFSC BOTAO2 ;O BOTÃO 2 ESTÁ PRESSIONADO?
GOTO BT2_LIB ;NÃO, ENTÃO TRATA COMO LIBERADO SE SIM
DECFSZ FILTRO2,F ;DECREMENTA O FILTRO BOTÃO TERMINOU?

GOTO CHECA_BT2 ;NÃO, CONTINUA ESPERANDO SE SIM


BTFSS ST_BT2 ;BOTÃO JÁ ESTAVA PRESSIONADO?
GOTO INC ;NÃO, EXECUTA AÇÃO DO BOTÃO
GOTO MAIN ;SIM, VOLTA AO LOOPING
117
BT2_LIB
BCF ST_BT2 ;MARCA BOTÃO 2 COMO LIBERADO
GOTO MAIN ;RETORNA AO LOOPING

DEC ;AÇÃO DE DECREMENTAR


BSF ST_BT1 ;MARCA BOTÃO 1 COMO JÁ PRESSIONADO
MOVF CONTADOR,W ;COLOCA CONTADOR EM W
XORLW MIN ;APLICA XOR ENTRE CONTADOR E MIN
BTFSC STATUS,Z ;RESULTOU EM ZERO?
GOTO MAIN ;SIM, RETORNA SEM AFETAR CONT. SE NÃO
DECF CONTADOR,F ;DECREMENTA O CONTADOR
GOTO ATUALIZA ;ATUALIZA O DISPLAY

INC ;AÇÃO DE INCREMENTAR


BSF ST_BT2 ;MARCA BOTÃO 2 COMO JÁ PRESSIONADO
MOVF CONTADOR,W ;COLOCA CONTADOR EM W
XORLW MAX ;APLICA XOR ENTRE CONTADOR E MAX
BTFSC STATUS,Z ;RESULTOU EM ZERO?
GOTO MAIN ;SIM, RETORNA SEM AFETAR CONT. SE NÃO
INCF CONTADOR,F ;INCREMENTA O CONTADOR
GOTO ATUALIZA ;ATUALIZA O DISPLAY

ATUALIZA
CALL CONVERTE ;CONVERTE CONTADOR NO NÚMERO
MOVWF PORTB ;ATUALIZA O PORTB PARA
GOTO MAIN ;NÃO, VOLTA AO LOOP PRINCIPAL

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

END ;OBRIGATÓRIO

118
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* TIMER DE SEGUNDOS - EX5 *
;* KIT PIC 16F628 *
;* TRAB06 DATA: 30/10/XX *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* DESCRIÇÃO DO ARQUIVO *
;*------------------------------------------- --------------------------------------*
;* TIMER DECRESCENTE EM SEGUNDOS. O VALOR INICIAL É DETERMINADO *
;* PELA CONSTANTE V_INICIO E PODE ESTAR ENTRE 1 E 9 SEGUNDOS.
;* O BOTÃO 1 DISPARA O TIMER, MOSTRANDO O TEMPO RESTANTE NO *
;* DISPLAY. O BOTÃO 2 PARALIZA O TIMER. O LED É UTILIZADO PARA *
;* INDICAR O ESTADO ATUAL DO TIMER: ACESO=RODANDO E ;APAGADO=PARADO *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* ARQUIVOS DE DEFINIÇÕES *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

#INCLUDE <P16F628.INC> ;ARQUIVO PADRÃO MICROCHIP PARA 16F628


__CONFIG _BODEN_ON & _CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF &
_MCLRE_ON & _XT_OSC

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* PAGINAÇÃO DE MEMÓRIA *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;DEFINIÇÃO DE COMANDOS DE USUÁRIO PARA ALTERAÇÃO DA PÁGINA DE MEMÓRIA

#DEFINE BANK0 BCF STATUS,RP0 ;SETA BANK 0 DE MEMÓRIA


#DEFINE BANK1 BSF STATUS,RP0 ;SETA BANK 1 DE MAMÓRIA

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* VARIÁVEIS *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; DEFINIÇÃO DOS NOMES E ENDEREÇOS DE TODAS AS VARIÁVEIS UTILIZADAS
; PELO SISTEMA

CBLOCK 0x20 ;ENDEREÇO INICIAL DA MEMÓRIA DE USUÁRIO


W_TEMP ;REGISTRADORES TEMPORÁRIOS PARA
STATUS_TEMP ;INTERRUPÇÕES

119
TEMPO ;ARMAZENA O VALOR DO TEMPO
FLAGS ;ARMAZENA OS FLAGS DE CONTROLE
TEMP1 ;REGISTRADORES AUXILIARES
TEMP2
FILTRO1 ;FILTROS DOS BOTÕES
FILTRO2
ENDC ;FIM DO BLOCO DE MEMÓRIA

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* FLAGS INTERNOS *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; DEFINIÇÃO DE TODOS OS FLAGS UTILIZADOS PELO SISTEMA
#DEFINE F_FIM FLAGS,0 ;FLAG DE FIM DE TEMPO
#DEFINE ST_BT1 FLAGS,1 ;STATUS DO BOTÃO 1
#DEFINE ST_BT2 FLAGS,2 ;STATUS DO BOTÃO 2

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* CONSTANTES *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; DEFINIÇÃO DE TODAS AS CONSTANTES UTILIZADAS PELO SISTEMA
V_INICIO EQU .15 ;VALOR INICIAL DO TIMER (1 A 15 SEG.)
T_FILTRO EQU .255 ;VALOR DO FILTRO DOS BOTÕES

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* ENTRADAS *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; DEFINIÇÃO DE TODOS OS PINOS QUE SERÃO UTILIZADOS COMO ENTRADA
; RECOMENDAMOS TAMBÉM COMENTAR O SIGNIFICADO DE SEUS ESTADOS (0 E 1)

#DEFINE BOTAO1 PORTA,1 ;PORTA DO BOTÃO


; 0 -> PRESSIONADO
; 1 -> LIBERADO
#DEFINE BOTAO2 PORTA,2 ;PORTA DO BOTÃO
; 0 -> PRESSIONADO
; 1 -> LIBERADO

120
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* SAÍDAS *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; DEFINIÇÃO DE TODOS OS PINOS QUE SERÃO UTILIZADOS COMO SAÍDA
; RECOMENDAMOS TAMBÉM COMENTAR O SIGNIFICADO DE SEUS ESTADOS (0 E 1)

#DEFINE LED PORTA,3 ;LED


;0 -> DESLIGADO
;1 -> LIGADO
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* VETOR DE RESET *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
ORG 0x00 ;ENDEREÇO INICIAL DE PROCESSAMENTO
GOTO INICIO

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* INÍCIO DA INTERRUPÇÃO *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; UTILIZAREMOS SOMENTE A INTERRUÇÃO DE TMR0, MAS EFETUAREMOS O TESTE
; PARA TERMOS CERTEZA DE QUE NENHUM PROBLEMA ACONTECEU. É NECESSÁRIO
; SALVAR E RECUPERAR OS VALOR DE W E STATUS.

ORG 0x04 ;ENDEREÇO INICIAL DA INTERRUPÇÃO


MOVWF W_TEMP ;SALVA W EM W_TEMP
SWAPF STATUS,W
MOVWF STATUS_TEMP ;SALVA STATUS EM STATUS_TEMP
BTFSS INTCON,T0IF ;É INTERRUPÇÃO DE TMR0?
GOTO SAI_INT ;NÃO, SAI SE AÇÃO SE SIM

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* TRATAMENTO DA INTERRUPÇÃO DE TMR0 *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; ESTA ROTINA IRÁ CONTAR O TEMPO, E QUANDO PASSAR 1 SEGUNDO, A VARI-
; ÁVEL "TEMPO" SERÁ DECREMENTADA.
; 1 SEGUNDO = 64us (PRESCALER) X 125 (TMR0) X 125 (TEMP1)

121
BCF INTCON,T0IF ;LIMPA FLAG DA INT.
MOVLW .256-.125
MOVWF TMR0 ;REINICIA TMR0
DECFSZ TEMP1,F ;DECREM. CONTADOR AUXILIAR SE FIM?
GOTO SAI_INT ;NÃO, SAI SEM AÇÃO SE SIM
MOVLW .125
MOVWF TEMP1 ;REINICIALIZA TEMPO AUXILIAR
BTFSC F_FIM ;JÁ CHEGOU AO FIM?
GOTO SAI_INT ;SIM, ENTÃO NÃO DECREMENTA O TEMPO
;NÃO
DECFSZ TEMPO,F ;DECREMENTA TEMPO. ACABOU?
GOTO SAI_INT ;NÃO, SAI DA INTERRUPÇãO SE SIM
BSF F_FIM ;MARCA FIM DO TEMPO
GOTO SAI_INT ;SAI DA INTERRUPÇÃO

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* FIM DA INTERRUPÇÃO *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

SAI_INT
SWAPF STATUS_TEMP,W
MOVWF STATUS ;RECUPERA STATUS
SWAPF W_TEMP,F
SWAPF W_TEMP,W ;RECUPERA W
RETFIE ;RETORNA DA INTERRUPÇÃO

;* * * * * * * * * * * * * * * * * * * * * * * * * * ** * * * * * * * * * * * * * *
;* ROTINA DE CONVERSÃO BINÁRIO -> DISPLAY *
;* * * * * * * * * * * * * ** * * * * * * * * * * * * * * * * * * * * * * * * * * *
; ESTA ROTINA IRÁ RETORNAR EM W, O SIMBOLO CORRETO QUE DEVE SER
; MOSTRADO NO DISPLAY PARA CADA VALOR DE CONTADOR. O RETORNO JÁ ESTÁ
; FORMATADO PARA AS CONDIÇÕES DE LIGAÇÃO DO DISPLAY AO PORTB.
CONVERTE
MOVF TEMPO,W ;COLOCA CONTADOR EM W
ANDLW B'00001111' ;MASCARA VALOR DE CONTADOR
;CONSIDERAR SOMENTE ATÉ 15
ADDWF PCL,F

122
; B'GFABCDE.' ; POSIÇÃO CORRETA DOS SEGUIMENTOS
RETLW B'01111110' ; 00 - RETORNA SÍMBOLO CORRETO 0
RETLW B'00011000' ; 01 - RETORNA SÍMBOLO CORRETO 1
RETLW B'10110110' ; 02 - RETORNA SÍMBOLO CORRETO 2
RETLW B'10111100' ; 03 - RETORNA SÍMBOLO CORRETO 3
RETLW B'11011000' ; 04 - RETORNA SÍMBOLO CORRETO 4
RETLW B'11101100' ; 05 - RETORNA SÍMBOLO CORRETO 5
RETLW B'11101110' ; 06 - RETORNA SÍMBOLO CORRETO 6
RETLW B'00111000' ; 07 - RETORNA SÍMBOLO CORRETO 7
RETLW B'11111110' ; 08 - RETORNA SÍMBOLO CORRETO 8
RETLW B'11111100' ; 09 - RETORNA SÍMBOLO CORRETO 9
RETLW B'11111010' ; 10 - RETORNA SÍMBOLO CORRETO A
RETLW B'11001110' ; 11 - RETORNA SÍMBOLO CORRETO b
RETLW B'01100110' ; 12 - RETORNA SÍMBOLO CORRETO C
RETLW B'10011110' ; 13 - RETORNA SÍMBOLO CORRETO d
RETLW B'11100110' ; 14 - RETORNA SÍMBOLO CORRETO E
RETLW B'11100010' ; 15 - RETORNA SÍMBOLO CORRETO F

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* ROTINA DE ATUALIZAÇÃO DO DISPLAY *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; ESTA ROTINA CONVERTE O VALOR DE TEMPO ATRAVÉS DA ROTINA CONVERTE
; E ATUALIZA O PORTB PARA ACENDER O DISPLAY CORRETAMENTE

ATUALIZA
CALL CONVERTE ;CONVERTE CONTADOR NO NÚMERO DO
;DISPLAY
MOVWF PORTB ;ATUALIZA O PORTB PARA
;VISUALIZARMOS O VALOR DE CONTADOR
;NO DISPLAY
RETURN ;NÃO, RETORNA

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* ROTINA DE DESLIGAR O TIMER *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; EXECUTA AS AÇÕES NECESSÁRIAS PARA DESLIGAR O TIMER

DESL_TIMER
123
BCF INTCON,GIE ;DESLIGA CHAVE GERAL DE INT.
BCF LED ;APAGA O LED
RETURN ;RETORNA

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* ROTINA DE LIGAR O TIMER *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; ESTA ROTINA EXECUTA AS AÇÕES NECESSÁRIAS PARA LIGAR O TIMER

LIGA_TIMER
BTFSC INTCON,GIE ;TIMER JÁ ESTA LIGADO?
RETURN ;SIM, RETORNA DIRETO SE NÃO
BCF INTCON,T0IF ;LIMPA FLAG DE INT. DE TMR0
MOVLW .256-.125
MOVWF TMR0 ;INICIA TMR0 CORRETAMENTE
MOVLW .125
MOVWF TEMP1 ;INICIA TEMP1 CORRETAMENTE
BSF INTCON,GIE ;LIGA CHAVE GERAL DE INTERRUPÇÕES
BSF LED ;ACENDE O LED
RETURN ;RETORNA

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* INICIO DO PROGRAMA *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
INICIO
BANK0 ;ALTERA PARA O BANCO 0
MOVLW B'00000111'
MOVWF CMCON ;DEFINE O MODO DE OPERAÇÃO
;DO COMPARADOR ANALÓGICO
BANK1 ;ALTERA PARA O BANCO 1
MOVLW B'00000110'
MOVWF TRISA ;DEFINE RA1 E 2 COMO ENTRADA E DEMAIS
;COMO SAÍDAS
MOVLW B'00000000'
MOVWF TRISB ;DEFINE TODO O PORTB COMO SAÍDA

MOVLW B'10000101'
124
MOVWF OPTION_REG ;PRESCALER 1:64 NO TMR0
;PULL-UPS DESABILITADOS
;AS DEMAIS CONFG. SÃO IRRELEVANTES
MOVLW B'00100000'
MOVWF INTCON ;HABILITADA SOMENTE INTERRUPÇÃO TMR0
;CHAVE GERAL INTERRUÇÕES DESLIGADAS
BANK0 ;RETORNA PARA O BANCO 0

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* INICIALIZAÇÃO DAS VARIÁVEIS *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

CLRF PORTA ;LIMPA O PORTA


CLRF PORTB ;LIMPA O PORTB
CLRF FLAGS ;LIMPA TODOS OS FLAGS
MOVLW V_INICIO
MOVWF TEMPO ;INICIA TEMPO = V_INICIO
CALL ATUALIZA ;ATUALIZA O DISPLAY INICIALMENTE

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

MAIN
BTFSC F_FIM ;CHEGOU AO FIM?
CALL DESL_TIMER ;SIM, ENTÃO DESLIGA O TIMER SE NÃO
CALL ATUALIZA ;ATUALIZA O DISPLAY
MOVLW T_FILTRO
MOVWF FILTRO1 ;INICIALIZA FILTRO1 = T_FILTRO
MOVWF FILTRO2 ;INICIALIZA FILTRO2 = T_FILTRO

CHECA_BT1
BTFSC BOTAO1 ;O BOTÃO 1 ESTÁ PRESSIONADO?
GOTO BT1_LIB ;NÃO, ENTÃO TRATA COMO LIBERADO
;SIM

DECFSZ FILTRO1,F ;DECREMENTA O FILTRO DO BOTÃO


;TERMINOU?
125
GOTO CHECA_BT1 ;NÃO, CONTINUA ESPERANDO SE SIM
BTFSS ST_BT1 ;BOTÃO JÁ ESTAVA PRESSIONADO?
GOTO ACAO_BT1 ;NÃO, EXECUTA AÇÃO DO BOTÃO
GOTO CHECA_BT2 ;SIM, CHECA BOTÃO 2

BT1_LIB
BCF ST_BT1 ;MARCA BOTÃO 1 COMO LIBERADO
CHECA_BT2
BTFSC BOTAO2 ;O BOTÃO 2 ESTÁ PRESSIONADO?
GOTO BT2_LIB ;NÃO, ENTÃO TRATA COMO LIBERADO SIM
DECFSZ FILTRO2,F ;DECREMENTA O FILTRO DO BOTÃO
;TERMINOU?
GOTO CHECA_BT2 ;NÃO, CONTINUA ESPERANDO SE SIM
BTFSS ST_BT2 ;BOTÃO JÁ ESTAVA PRESSIONADO?
GOTO ACAO_BT2 ;NÃO, EXECUTA AÇÃO DO BOTÃO
GOTO MAIN ;SIM, VOLTA AO LOOPING
BT2_LIB
BCF ST_BT2 ;MARCA BOTÃO 2 COMO LIBERADO
GOTO MAIN ;RETORNA AO LOOPING
ACAO_BT1 ;AÇÃO PARA O BOTÃO 1
BSF ST_BT1 ;MARCA BOTÃO 1 COMO JÁ PRESSIONADO
CALL LIGA_TIMER ;LIGA O TIMER
GOTO MAIN
ACAO_BT2 ;AÇÃO PARA O BOTÃO 2
BSF ST_BT2 ;MARCA BOTÃO 2 COMO JÁ PRESSIONADO
CALL DESL_TIMER ;DESLIGA O TIMER
GOTO MAIN ;NÃO, VOLTA AO LOOP PRINCIPAL

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

END ;OBRIGATÓRIO

126
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* CONTADOR FINAL - EX6 *
;* KIT PIC 16F628 *
;* TRAB07 30/10/01 *
;* * * * * * * * * * * * * * * * * * * * ** * * * * * * * * * * * * * * * * * * * *
;* DESCRIÇÃO DO ARQUIVO *
;*-----------------------------------------------------------------*
;* CONTADOR QUE UTILIZA DOIS BOTÕES PARA INCREMENTAR E DECRE- *
;* MENTAR O VALOR CONTROLADO PELA VARIÁVEL "CONTADOR". ESTA *
;* VARIÁVEL ESTÁ LIMITADA PELAS CONSTANTES "MIN" E "MAX". *
;* O VALOR DO CONTADOR É MOSTRADO NO DISPLAY E ARMAZENADO NA *
;* EEPROM PARA NÃO SER PERDIDO MESMO NO CASO DE RESET. *
;* * * * * * * * * * * * * * * * * * * * * * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* ARQUIVOS DE DEFINIÇÕES *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

#INCLUDE <P16F628.INC> ;ARQUIVO PADRÃO MICROCHIP PARA 16F628


__CONFIG _BODEN_ON & _CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF &
_MCLRE_ON & _XT_OSC

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* PAGINAÇÃO DE MEMÓRIA *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;DEFINIÇÃO DE COMANDOS DE USUÁRIO PARA ALTERAÇÃO DA PÁGINA DE MEMÓRIA

#DEFINE BANK0 BCF STATUS,RP0 ;SETA BANK 0 DE MEMÓRIA


#DEFINE BANK1 BSF STATUS,RP0 ;SETA BANK 1 DE MAMÓRIA

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* VARIÁVEIS *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; DEFINIÇÃO DOS NOMES E ENDEREÇOS DE TODAS AS VARIÁVEIS UTILIZADAS
; PELO SISTEMA

CBLOCK 0x20 ;ENDEREÇO INICIAL DA MEMÓRIA DE USUÁRIO


W_TEMP ;REGISTRADORES TEMPORÁRIOS PARA
STATUS_TEMP ;INTERRUPÇÕES VARIÁVEIS NÃO UTILIZADAS

127
CONTADOR ;ARMAZENA O VALOR DA CONTAGEM
FLAGS ;ARMAZENA OS FLAGS DE CONTROLE
FILTRO1 ;FILTRAGEM PARA O BOTÃO 1
FILTRO2 ;FILTRAGEM PARA O BOTÃO 2
ENDC ;FIM DO BLOCO DE MEMÓRIA

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* FLAGS INTERNOS *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; DEFINIÇÃO DE TODOS OS FLAGS UTILIZADOS PELO SISTEMA

#DEFINE ST_BT1 FLAGS,0 ;STATUS DO BOTÃO 1


#DEFINE ST_BT2 FLAGS,1 ;STATUS DO BOTÃO 2

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* CONSTANTES *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; DEFINIÇÃO DE TODAS AS CONSTANTES UTILIZADAS PELO SISTEMA

MIN EQU .0 ;VALOR MINIMO PARA O CONTADOR


MAX EQU .15 ;VALOR MÁXIMO PARA O CONTADOR
T_FILTRO EQU .255 ;FILTRO PARA BOTÃO
POS_MEM EQU .0 ;ENDEREÇO DA EEPROM ONDE SERÁ
;ARMAZENADO O VALOR DO CONTADOR

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* ENTRADAS *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; DEFINIÇÃO DE TODOS OS PINOS QUE SERÃO UTILIZADOS COMO ENTRADA
; RECOMENDAMOS TAMBÉM COMENTAR O SIGNIFICADO DE SEUS ESTADOS (0 E 1)
#DEFINE BOTAO1 PORTA,1 ;PORTA DO BOTÃO
; 0 -> PRESSIONADO
; 1 -> LIBERADO

#DEFINE BOTAO2 PORTA,2 ;PORTA DO BOTÃO


; 0 -> PRESSIONADO
; 1 -> LIBERADO

128
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* SAÍDAS *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; DEFINIÇÃO DE TODOS OS PINOS QUE SERÃO UTILIZADOS COMO SAÍDA
; RECOMENDAMOS TAMBÉM COMENTAR O SIGNIFICADO DE SEUS ESTADOS (0 E 1)
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* INICIALIZAÇÃO DA EEPROM *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

ORG H'2100'+POS_MEM ;INÍCIO DA EEPROM


DE .5 ;VALOR INICIAL PARA CONTADOR = 5
;VIDE DIRETRIZ "DE" NO APÊNDICE B

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* VETOR DE RESET *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

ORG 0x00 ;ENDEREÇO INICIAL DE PROCESSAMENTO


GOTO INICIO

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* INÍCIO DA INTERRUPÇÃO *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; AS INTERRUPÇÕES NÃO SERÃO UTILIZADAS, POR ISSO PODEMOS SUBSTITUIR
; TODO O SISTEMA EXISTENTE NO ARQUIVO MODELO PELO APRESENTADO ABAIXO
; ESTE SISTEMA NÃO É OBRIGATÓRIO, MAS PODE EVITAR PROBLEMAS FUTUROS
ORG 0x04 ;ENDEREÇO INICIAL DA INTERRUPÇÃO
RETFIE ;RETORNA DA INTERRUPÇÃO

;* * * * * * * * * * * ** * * * * * * * * * * * * * * ** * * * * * * * * * * * * * * * * * * * * *
;* ROTINA DE CONVERSÃO BINÁRIO -> DISPLAY *
;* * * * * * * * * * * * * * * * * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; ESTA ROTINA IRÁ RETORNAR EM W, O SIMBOLO CORRETO QUE DEVE SER
; MOSTRADO NO DISPLAY PARA CADA VALOR DE CONTADOR. O RETORNO JÁ ESTÁ
; FORMATADO PARA AS CONDIÇÕES DE LIGAÇÃO DO DISPLAY AO PORTB.

129
CONVERTE
MOVF CONTADOR,W ;COLOCA CONTADOR EM W
ANDLW B'00001111' ;MASCARA VALOR DE CONTADOR
;CONSIDERAR SOMENTE ATÉ 15
ADDWF PCL,F
; B'GFABCDE.' ; POSIÇÃO CORRETA DOS SEGUIMENTOS
RETLW B'01111110' ; 00 - RETORNA SÍMBOLO CORRETO 0
RETLW B'00011000' ; 01 - RETORNA SÍMBOLO CORRETO 1
RETLW B'10110110' ; 02 - RETORNA SÍMBOLO CORRETO 2
RETLW B'10111100' ; 03 - RETORNA SÍMBOLO CORRETO 3
RETLW B'11011000' ; 04 - RETORNA SÍMBOLO CORRETO 4
RETLW B'11101100' ; 05 - RETORNA SÍMBOLO CORRETO 5
RETLW B'11101110' ; 06 - RETORNA SÍMBOLO CORRETO 6
RETLW B'00111000' ; 07 - RETORNA SÍMBOLO CORRETO 7
RETLW B'11111110' ; 08 - RETORNA SÍMBOLO CORRETO 8
RETLW B'11111100' ; 09 - RETORNA SÍMBOLO CORRETO 9
RETLW B'11111010' ; 10 - RETORNA SÍMBOLO CORRETO A
RETLW B'11001110' ; 11 - RETORNA SÍMBOLO CORRETO b
RETLW B'01100110' ; 12 - RETORNA SÍMBOLO CORRETO C
RETLW B'10011110' ; 13 - RETORNA SÍMBOLO CORRETO d
RETLW B'11100110' ; 14 - RETORNA SÍMBOLO CORRETO E
RETLW B'11100010' ; 15 - RETORNA SÍMBOLO CORRETO F

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* ROTINA DE LEITURA NA E2PROM *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; ESTA ROTINA LÊ O BYTE DO ENDEREÇO ACERTADO POR EEADR E COLOCA
; O VALOR EM W.

LE_E2PROM
BANK1 ;BANCO 1
BSF EECON1,RD ;PREPARA LEITURA
MOVF EEDATA,W ;COLOCA DADO EM W
BANK0
RETURN ;RETORNA

130
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* ROTINA DE ESCRITA NA E2PROM *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; ESTA ROTINA ESCREVE O DADO PASSSADO EM W NO ENDEREÇO ACERTADO
; ANTERIORMENTE EM EEADR

ESCR_E2PROM
BANK1 ;BANCO 1
MOVWF EEDATA ;ACERTA DADO PASSADO EM W
BCF INTCON,GIE ;DESABILITA INTERRUPÇÕES
BSF EECON1,WREN ;HABILITA ESCRITA
MOVLW 0X55 ;INICIALIZAÇÃO DA ESCRITA
MOVWF EECON2
MOVLW 0XAA
MOVWF EECON2
BSF EECON1,WR ;INICIA ESCRITA
BCF EECON1,WREN
BTFSC EECON1,WR ;ACABOU ESCRITA?
GOTO $-1 ;NÃO, AGUARDA

BANK0 ;SIM, BANCO 0


BSF INTCON,GIE ;HABILITA INTERRUPÇÕES
RETURN ;RETORNA

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* ROTINA DE LEITURA DO VALOR DO CONTADOR *
;* * * * * * * * * * * * * * ** * * * * * * * * * * * * * * * * * * * * * * * * * *
; ESTA ROTINA LÊ O VALOR DA MEMÓRIA E COLOCA O RESULTADO NA
; VARIÁVEL "CONTADOR".

LE_CONTA
MOVLW POS_MEM
BANK1
MOVWF EEADR ;ACERTA O ENDEREÇO PARA LEITURA
CALL LE_E2PROM ;EFETUA A LEITURA DA EEPROM
MOVWF CONTADOR ;ATUALIZA O CONTADOR
RETURN ;RETORNA

131
;* * * * * * * * * * * * * * * * * * * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* ROTINA DE ESCRITA DO VALOR DO CONTADOR *
;* * * * * * * * * * * * * * * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; ESTA ROTINA ESCREVE O VALOR ATUAL DE CONTADOR NA MEMÓRIA EEPROM

ESCR_CONTA
MOVLW POS_MEM
BANK1
MOVWF EEADR ;ACERTA O ENDEREÇO PARA LEITURA
BANK0
MOVF CONTADOR,W ;COLOCA CONTADOR EM W
CALL ESCR_E2PROM ;EFETUA A ESCRITA EEPROM
RETURN ;RETORNA

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* INICIO DO PROGRAMA *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
INICIO
BANK1 ;ALTERA PARA O BANCO 1
MOVLW B'00000110'
MOVWF TRISA ;DEFINE RA1 E 2 COMO ENTRADA E DEMAIS
;COMO SAÍDAS
MOVLW B'00000000'
MOVWF TRISB ;DEFINE TODO O PORTB COMO SAÍDA
MOVLW B'10000000'
MOVWF OPTION_REG ;PRESCALER 1:2 NO TMR0
;PULL-UPS DESABILITADOS
;AS DEMAIS CONFG. SÃO IRRELEVANTES
MOVLW B'00000000'
MOVWF INTCON ;TODAS AS INTERRUPÇÕES DESLIGADAS
BANK0 ;RETORNA PARA O BANCO 0
MOVLW B'00000111'
MOVWF CMCON ;DEFINE O MODO DE OPERAÇÃO
;DO COMPARADOR ANALÓGICO

132
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* INICIALIZAÇÃO DAS VARIÁVEIS *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

CLRF PORTA ;LIMPA O PORTA


CLRF PORTB ;LIMPA O PORTB
CLRF FLAGS ;LIMPA TODOS OS FLAGS
CALL LE_CONTA ;INICIALIZA CONTADOR COM VALOR
;DA EEPROM
GOTO ATUALIZA ;ATUALIZA O DISPLAY INICIALMENTE

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* ROTINA PRINCIPAL *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
MAIN
MOVLW T_FILTRO

MOVWF FILTRO1 ;INICIALIZA FILTRO1 = T_FILTRO


MOVWF FILTRO2 ;INICIALIZA FILTRO2 = T_FILTRO

CHECA_BT1
BTFSC BOTAO1 ;O BOTÃO 1 ESTÁ PRESSIONADO?
GOTO BT1_LIB ;NÃO, ENTÃO TRATA COMO LIBERADO
;SIM
DECFSZ FILTRO1,F ;DECREMENTA O FILTRO DO BOTÃO
;TERMINOU?
GOTO CHECA_BT1 ;NÃO, CONTINUA ESPERANDO
;SIM
BTFSS ST_BT1 ;BOTÃO JÁ ESTAVA PRESSIONADO?
GOTO DEC ;NÃO, EXECUTA AÇÃO DO BOTÃO
GOTO CHECA_BT2 ;SIM, CHECA BOTÃO 2
BT1_LIB
BCF ST_BT1 ;MARCA BOTÃO 1 COMO LIBERADO
CHECA_BT2
BTFSC BOTAO2 ;O BOTÃO 2 ESTÁ PRESSIONADO?
GOTO BT2_LIB ;NÃO, ENTÃO TRATA COMO LIBERADO
;SIM

133
DECFSZ FILTRO2,F ;DECREMENTA O FILTRO DO BOTÃO
;TERMINOU?
GOTO CHECA_BT2 ;NÃO, CONTINUA ESPERANDO
;SIM
BTFSS ST_BT2 ;BOTÃO JÁ ESTAVA PRESSIONADO?
GOTO INC ;NÃO, EXECUTA AÇÃO DO BOTÃO
GOTO MAIN ;SIM, VOLTA AO LOOPING
BT2_LIB
BCF ST_BT2 ;MARCA BOTÃO 2 COMO LIBERADO
GOTO MAIN ;RETORNA AO LOOPING
DEC ;AÇÃO DE DECREMENTAR
BSF ST_BT1 ;MARCA BOTÃO 1 COMO JÁ PRESSIONADO
MOVF CONTADOR,W ;COLOCA CONTADOR EM W
XORLW MIN ;APLICA XOR ENTRE CONTADOR E MIN
;PARA TESTAR IGUALDADE. SE FOREM
;IGUAIS, O RESULTADO SERÁ ZERO
BTFSC STATUS,Z ;RESULTOU EM ZERO?
GOTO MAIN ;SIM, RETORNA SEM AFETAR CONT.
;NÃO
DECF CONTADOR,F ;DECREMENTA O CONTADOR
CALL ESCR_CONTA ;ATUALIZA O VALOR DE CONTADOR NA
;EEPROM
GOTO ATUALIZA ;ATUALIZA O DISPLAY
INC ;AÇÃO DE INCREMENTAR
BSF ST_BT2 ;MARCA BOTÃO 2 COMO JÁ PRESSIONADO
MOVF CONTADOR,W ;COLOCA CONTADOR EM W
XORLW MAX ;APLICA XOR ENTRE CONTADOR E MAX
;PARA TESTAR IGUALDADE. SE FOREM
;IGUAIS, O RESULTADO SERÁ ZERO
BTFSC STATUS,Z ;RESULTOU EM ZERO?
GOTO MAIN ;SIM, RETORNA SEM AFETAR CONT.
;NÃO
INCF CONTADOR,F ;INCREMENTA O CONTADOR
CALL ESCR_CONTA ;ATUALIZA O VALOR DE CONTADOR NA
;EEPROM

134
ATUALIZA ;ATUALIZAÇÃO DO DISPLAY
CALL CONVERTE ;CONVERTE CONTADOR NO NÚMERO DO
;DISPLAY
MOVWF PORTB ;ATUALIZA O PORTB PARA
;VISUALIZARMOS O VALOR DE CONTADOR
;NO DISPLAY
GOTO MAIN ;NÃO, VOLTA AO LOOP PRINCIPAL

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* FIM DO PROGRAMA *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
END ;OBRIGATÓRIO

135
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* DIMMER *
;* KIT PIC 16F628 *
;* DATA: 11/06/XX *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* DESCRIÇÃO DO ARQUIVO *
;*-----------------------------------------------------------------*
;* CONTADOR QUE UTILIZA DOIS BOTÕES PARA INCREMENTAR E DECRE- *
;* MENTAR O VALOR CONTROLADO PELA VARIÁVEL "CONTADOR". ESTA *
;* VARIÁVEL ESTÁ LIMITADA PELAS CONSTANTES "MIN" E "MAX". *
;* O VALOR DO CONTADOR É MOSTRADO NO DISPLAY. *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* ARQUIVOS DE DEFINIÇÕES *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

#INCLUDE <P16F628.INC> ;ARQUIVO PADRÃO MICROCHIP PARA 16F628


__CONFIG _BODEN_ON & _CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF &
_MCLRE_ON & _XT_OSC

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* PAGINAÇÃO DE MEMÓRIA *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;DEFINIÇÃO DE COMANDOS DE USUÁRIO PARA ALTERAÇÃO DA PÁGINA DE MEMÓRIA

#DEFINE BANK0 BCF STATUS,RP0 ;SETA BANK 0 DE MEMÓRIA


#DEFINE BANK1 BSF STATUS,RP0 ;SETA BANK 1 DE MAMÓRIA

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* VARIÁVEIS *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; DEFINIÇÃO DOS NOMES E ENDEREÇOS DE TODAS AS VARIÁVEIS UTILIZADAS
; PELO SISTEMA

CBLOCK 0x20 ;ENDEREÇO INICIAL DA MEMÓRIA DE USUÁRIO


W_TEMP ;REGISTRADORES TEMPORÁRIOS PARA
STATUS_TEMP ;INTERRUPÇÕES

136
INTENSIDADE ;ARMAZENA O VALOR DA CONTAGEM
FLAGS ;ARMAZENA OS FLAGS DE CONTROLE
FILTRO11 ;FILTRAGEM 1 PARA O BOTÃO 1

FILTRO12 ;FILTRAGEM 2 PARA O BOTÃO 1


FILTRO21 ;FILTRAGEM 1 PARA O BOTÃO 2
FILTRO22 ;FILTRAGEM 2 PARA O BOTÃO 2
TEMPO ;INTERVALOS DE 1 MS
ENDC ;FIM DO BLOCO DE MEMÓRIA

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* FLAGS INTERNOS *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; DEFINIÇÃO DE TODOS OS FLAGS UTILIZADOS PELO SISTEMA
#DEFINE ST_BT1 FLAGS,0 ;STATUS DO BOTÃO 1
#DEFINE ST_BT2 FLAGS,1 ;STATUS DO BOTÃO 2

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* CONSTANTES *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; DEFINIÇÃO DE TODAS AS CONSTANTES UTILIZADAS PELO SISTEMA
MIN EQU .0 ;VALOR MÍNIMO PARA O INTENSIDADE
MAX EQU .15 ;VALOR MÁXIMO PARA O INTENSIDADE
T_FILTRO EQU .20 ;FILTRO PARA BOTÃO

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* ENTRADAS *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; DEFINIÇÃO DE TODOS OS PINOS QUE SERÃO UTILIZADOS COMO ENTRADA
; RECOMENDAMOS TAMBÉM COMENTAR O SIGNIFICADO DE SEUS ESTADOS (0 E 1)
#DEFINE BOTAO1 PORTA,1 ;PORTA DO BOTÃO
; 0 -> PRESSIONADO
; 1 -> LIBERADO
#DEFINE BOTAO2 PORTA,2 ;PORTA DO BOTÃO
; 0 -> PRESSIONADO
; 1 -> LIBERADO

137
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* SAÍDAS *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; DEFINIÇÃO DE TODOS OS PINOS QUE SERÃO UTILIZADOS COMO SAÍDA
; RECOMENDAMOS TAMBÉM COMENTAR O SIGNIFICADO DE SEUS ESTADOS (0 E 1)

#DEFINE LAMPADA PORTA,0 ;DEFINE LAMPADA NO PINO17


;0 LAMP. APAGADA
;1 LAMP. ACESA
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* VETOR DE RESET *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

ORG 0x00 ;ENDEREÇO INICIAL DE PROCESSAMENTO


GOTO INICIO

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* INÍCIO DA INTERRUPÇÃO *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; AS INTERRUPÇÕES NÃO SERÃO UTILIZADAS, POR ISSO PODEMOS SUBSTITUIR
; TODO O SISTEMA EXISTENTE NO ARQUIVO MODELO PELO APRESENTADO ABAIXO
; ESTE SISTEMA NÃO É OBRIGATÓRIO, MAS PODE EVITAR PROBLEMAS FUTUROS

ORG 0x04 ;ENDEREÇO INICIAL DA INTERRUPÇÃO


MOVWF W_TEMP ;SALVA W EM W_TEMP
SWAPF STATUS,W
MOVWF STATUS_TEMP ;SALVA STATUS EM STATUS_TEMP
BTFSS INTCON,T0IF ;É INTERRUPÇÃO DE TMR0?
GOTO SAI_INT ;NÃO, SAI SE AÇÃO SE SIM

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* TRATAMENTO DA INTERRUPÇÃO DE TMR0 *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; ESTA ROTINA IRÁ CONTAR O TEMPO, E QUANDO PASSAR 1 SEGUNDO, A VARI-
; ÁVEL "TEMPO" SERÁ DECREMENTADA.
; 1 SEGUNDO = 64us (PRESCALER) X 125 (TMR0) X 125 (TEMP1)

138
BCF INTCON,T0IF ;LIMPA FLAG DA INT.
MOVLW .256-.250 ;SETA TIMER P250MS
MOVWF TMR0 ;REINICIA TMR0
INCF TEMPO,F ;INCREMENTA TEMPO
MOVLW .16 ;COLOCA 16 EM WORK
XORWF TEMPO,W ;COMPARA TEMPO COM 16
BTFSC STATUS,Z ;TESTA BIT Z DO REG. STATUS
CLRF TEMPO ;ZERA TEMPO
MOVLW .15 ;COLOCA 15 EM W
XORWF INTENSIDADE,W ;COMPARA INTENSIDADE COM 15
BTFSC STATUS,Z ;TESTA BIT Z DO REG. STATUS
GOTO LIGA_LAMPADA
MOVF INTENSIDADE,W ;MOVE INTENSIDADE PARA W
SUBWF TEMPO,W ;SUBTRAI TEMPO DE INTENSIDADE
BTFSS STATUS,C ;TESTA BIC C DO REG. STATUS

;VERIFICA TEMPO MENOR QUE INTENSIDADE


GOTO LIGA_LAMPADA
BCF LAMPADA ;DESLIGA LAMPADA
GOTO SAI_INT
LIGA_LAMPADA
BSF LAMPADA ;LIGA LAMPADA
GOTO SAI_INT ;SAI DA INTERRUPÇÃO

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* FIM DA INTERRUPÇÃO *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

SAI_INT
SWAPF STATUS_TEMP,W
MOVWF STATUS ;RECUPERA STATUS
SWAPF W_TEMP,F
SWAPF W_TEMP,W ;RECUPERA W
RETFIE ;RETORNA DA INTERRUPÇÃO

139
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* ROTINA DE CONVERSÃO BINÁRIO -> DISPLAY *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; ESTA ROTINA IRÁ RETORNAR EM W, O SIMBOLO CORRETO QUE DEVE SER
; MOSTRADO NO DISPLAY PARA CADA VALOR DE INTENSIDADE. O RETORNO JÁ ESTÁ
; FORMATADO PARA AS CONDIÇÕES DE LIGAÇÃO DO DISPLAY AO PORTB.
CONVERTE
MOVF INTENSIDADE,W ;COLOCA INTENSIDADE EM W
ANDLW B'00001111' ;MASCARA VALOR DE INTENSIDADE
;CONSIDERAR SOMENTE ATÉ 15
ADDWF PCL,F
; B'GFABCDE.' ; POSIÇÃO CORRETA DOS SEGUIMENTOS
RETLW B'01111110' ; 00 - RETORNA SÍMBOLO CORRETO 0
RETLW B'00011000' ; 01 - RETORNA SÍMBOLO CORRETO 1
RETLW B'10110110' ; 02 - RETORNA SÍMBOLO CORRETO 2
RETLW B'10111100' ; 03 - RETORNA SÍMBOLO CORRETO 3
RETLW B'11011000' ; 04 - RETORNA SÍMBOLO CORRETO 4
RETLW B'11101100' ; 05 - RETORNA SÍMBOLO CORRETO 5
RETLW B'11101110' ; 06 - RETORNA SÍMBOLO CORRETO 6
RETLW B'00111000' ; 07 - RETORNA SÍMBOLO CORRETO 7
RETLW B'11111110' ; 08 - RETORNA SÍMBOLO CORRETO 8
RETLW B'11111100' ; 09 - RETORNA SÍMBOLO CORRETO 9
RETLW B'11111010' ; 10 - RETORNA SÍMBOLO CORRETO A
RETLW B'11001110' ; 11 - RETORNA SÍMBOLO CORRETO b
RETLW B'01100110' ; 12 - RETORNA SÍMBOLO CORRETO C
RETLW B'10011110' ; 13 - RETORNA SÍMBOLO CORRETO d
RETLW B'11100110' ; 14 - RETORNA SÍMBOLO CORRETO E
RETLW B'11100010' ; 15 - RETORNA SÍMBOLO CORRETO F

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* INICIO DO PROGRAMA *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
INICIO
BANK0 ;ALTERA PARA O BANCO 0
MOVLW B'00000111'
MOVWF CMCON ;DEFINE O MODO DE OPERAÇÃO DO
;COMPARADOR ANALÓGICO

140
BANK1 ;ALTERA PARA O BANCO 1
MOVLW B'00000110'
MOVWF TRISA ;DEFINE RA1 E 2 COMO ENTRADA E DEMAIS
;COMO SAÍDAS
MOVLW B'00000000'
MOVWF TRISB ;DEFINE TODO O PORTB COMO SAÍDA
MOVLW B'10000001'
MOVWF OPTION_REG ;PRESCALER 1:4 NO TMR0
;PULL-UPS DESABILITADOS
;AS DEMAIS CONFG. SÃO IRRELEVANTES
MOVLW B'10100000'
MOVWF INTCON ;CHAVE GERAL E TMR0 ATIVADAS
BANK0 ;RETORNA PARA O BANCO 0

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* INICIALIZAÇÃO DAS VARIÁVEIS *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
CLRF PORTA ;LIMPA O PORTA
CLRF PORTB ;LIMPA O PORTB
CLRF FLAGS ;LIMPA TODOS OS FLAGS
MOVLW MIN
MOVWF INTENSIDADE ;INICIA INTENSIDADE = MIN
MOVLW .256-.250 ;SETA TIMER P250MS
MOVWF TMR0 ;REINICIA TMR0
GOTO ATUALIZA ;ATUALIZA O DISPLAY INICIALMENTE

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* ROTINA PRINCIPAL *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
MAIN
CLRF FILTRO11
CLRF FILTRO21
MOVLW T_FILTRO
MOVWF FILTRO12 ;INICIALIZA FILTRO1 = T_FILTRO
MOVWF FILTRO22 ;INICIALIZA FILTRO2 = T_FILTRO

141
CHECA_BT1
BTFSC BOTAO1 ;O BOTÃO 1 ESTÁ PRESSIONADO?
GOTO BT1_LIB ;NÃO, ENTÃO TRATA COMO LIBERADO
;SIM
DECFSZ FILTRO11,F ;DECREMENTA O FILTRO DO BOTÃO
;TERMINOU?
GOTO CHECA_BT1 ;NÃO, CONTINUA ESPERANDO
;SIM
DECFSZ FILTRO12,F ;DECREMENTA O FILTRO DO BOTÃO
;TERMINOU?
GOTO CHECA_BT1 ;NÃO, CONTINUA ESPERANDO
;SIM
BTFSS ST_BT1 ;BOTÃO JÁ ESTAVA PRESSIONADO?
GOTO DEC ;NÃO, EXECUTA AÇÃO DO BOTÃO
GOTO CHECA_BT2 ;SIM, CHECA BOTÃO 2
BT1_LIB
BCF ST_BT1 ;MARCA BOTÃO 1 COMO LIBERADO
CHECA_BT2
BTFSC BOTAO2 ;O BOTÃO 2 ESTÁ PRESSIONADO?
GOTO BT2_LIB ;NÃO, ENTÃO TRATA COMO LIBERADO
;SIM
DECFSZ FILTRO21,F ;DECREMENTA O FILTRO DO BOTÃO
;TERMINOU?
GOTO CHECA_BT2 ;NÃO, CONTINUA ESPERANDO
;SIM
DECFSZ FILTRO22,F ;DECREMENTA O FILTRO DO BOTÃO
;TERMINOU?
GOTO CHECA_BT2 ;NÃO, CONTINUA ESPERANDO
;SIM
BTFSS ST_BT2 ;BOTÃO JÁ ESTAVA PRESSIONADO?
GOTO INC ;NÃO, EXECUTA AÇÃO DO BOTÃO
GOTO MAIN ;SIM, VOLTA AO LOOPING
BT2_LIB
BCF ST_BT2 ;MARCA BOTÃO 2 COMO

LIBERADO
GOTO MAIN ;RETORNA AO LOOPING

142
DEC ;AÇÃO DE DECREMENTAR
BSF ST_BT1 ;MARCA BOTÃO 1 COMO JÁ PRESSIONADO
MOVF INTENSIDADE,W ;COLOCA INTENSIDADE EM W
XORLW MIN ;APLICA XOR ENTRE INTENSIDADE E MIN
;PARA TESTAR IGUALDADE. SE FOREM
;IGUAIS, O RESULTADO SERÁ ZERO
BTFSC STATUS,Z ;RESULTOU EM ZERO?
GOTO MAIN ;SIM, RETORNA SEM AFETAR CONT.
;NÃO
DECF INTENSIDADE,F ;DECREMENTA O INTENSIDADE
GOTO ATUALIZA ;ATUALIZA O DISPLAY
INC ;AÇÃO DE INCREMENTAR
BSF ST_BT2 ;MARCA BOTÃO 2 COMO JÁ PRESSIONADO
MOVF INTENSIDADE,W ;COLOCA INTENSIDADE EM W
XORLW MAX ;APLICA XOR ENTRE INTENSIDADE E MAX
;PARA TESTAR IGUALDADE. SE FOREM
;IGUAIS, O RESULTADO SERÁ ZERO
BTFSC STATUS,Z ;RESULTOU EM ZERO?
GOTO MAIN ;SIM, RETORNA SEM AFETAR CONT.
;NÃO
INCF INTENSIDADE,F ;INCREMENTA O INTENSIDADE
GOTO ATUALIZA ;ATUALIZA O DISPLAY

ATUALIZA
CALL CONVERTE ;CONVERTE INTENSIDADE NO NÚMERO DO
;DISPLAY
MOVWF PORTB ;ATUALIZA O PORTB PARA
;VISUALIZARMOS O VALOR DE INTENSIDADE
;NO DISPLAY
GOTO MAIN ;NÃO, VOLTA AO LOOP PRINCIPAL

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

END ;OBRIGATÓRIO

143
Esquema elétrico
15V
+V
J1 R11
Q2 Q5 Q6 Q3 Q4
1 J5 R28
6 2 R12
7 3
8 4
9 5 L1 Gnd Gnd Gnd Gnd
D12 D17 DISP2
DISP4 DISP3 DISP1
D14 5V1
abcdefg. abcdefg. abcdefg. abcdefg.

D11

D16
Q1 8V2 R10 Q7
D15
D13 C3 D18 LED10
+

C2 R16 R15
100uF 22uF LED11
LED12
D21
LED13 R26
D19 LED14 R27
J3 R13
D20 2K2
R30 R31
S4 S3 S2 S1
R8 LED8 R14
R29
S5 U7 R7 LED7
R18 RA0 RB7 R6
RA1 RB6
RA2 RB5 R5 LED6
R19 RA3 RB4 16F628
R20 RA4 RB3 R4
RB2 LED5
R21 RB1 R3 RA2 RA1
RB0 R2 RA3 RA0
R17 R22 R23 R24 XTAL LED4 RA4 OSC1
R25 RA5 R1 MCLR OSC2
RA6 VDD VSS VDD
RA7 VCC LED3 RB0 RB7
RB1 RB6
LigDesl 15V RB2 RB5
+V LED2 RB3 RB4
U6
LED1
D9 IN OUT
Con. VE
R9 5V J4
+

COM J2
C1 +V
LigDesl
D10 LED9
VE
Lista básica de materiais necessários à montagem do Kit de microcontrolador PIC
– Modelo WM002

1 – Microcontrolador PIC16F628
1 – Conector DB9 fêmea 90° para circuito impresso (necessário)
4 – Displays de sete segmentos catodo comum (400 X 600 Mils)
1 – Soquetes de 18 pinos torneados para CI
1 – Barra com 80 pinos torneados para CI
5 – Teclas para circuito impresso (tipo TACT) (confirmar tamanho) Média
1 – Diodo Zener 8V2 ½ W – D4
1 – Diodo Zener 5V1 ½ W – D3
4 – Diodo 1N4148 – D1, D2, D5, D6
7 – Transistor BC548 – Q1, Q2, Q3, Q5, Q7
2 – Transistores PNP uso geral BC557 – Q4, Q6
9 – Resistores de 470 ohms, 1/8 W ou mais. – R1, até R8, R27
10 – resistores de 2K2 ohms – R13, R14, R15, R16, R26, R29, R30, R31,R32,R33
8 – resistores de 330 ohms – R18, R19, R20, R21, R22, R23, R24, R25
2 – Resistores de 10 K ohms – R17 e R2 WM003
1 – Resistor de 10 ohms – R28
1 – Resistor de 1K ohms – R9
1 – Resistor de 1K5 ohms – R1 WM003
1 – Regulador de tensão LM 7805 (5V 1A)
1 – Cabo de comunicação serial
1 – Ressonador cerâmico de 4MHz
1 – Capacitor de 1000 µF 25V, eletrolítico radial. – C1
1 – Capacitor de 100 µF 25V, eletrolítico radial. – C2 WM003
1 – Capacitor de 22 µF 25V, eletrolítico radial. – C1 WM003
1 – Ponte retificadora de 0,5 A 30 V redonda.
1 – Chave 1 pólo 2 posições para circuito impresso (ver amostra)
14 – Leds Ø 3 mm (5 – verde, 2 – amarelo, 2 – verde e 5- outra cor)
2 – Conectores fêmea RJ11 com 6 vias para placa de circuito impresso
2 – Conectores RJ11 com 6 vias
0,5m – Cabo para RJ11 com 6 vias
6 – Jumper fêmea de 2,54 mm
1 – Conector para ligar a alimentação
1 – Fonte de 9,0 VCC 0,3A ou somente o trafo com cabo de ligação
Barra de pinos com espaçamento de 2,54 mm (30 pinos)
1 – Soquete tipo rosca para lâmpada de 12vcc
1 – Lâmpada de 12V com rosca

You might also like