Escolar Documentos
Profissional Documentos
Cultura Documentos
INTRODUÇÃO.................................................................................................................................................................. 1
TEMA E PROBLEMA DE PESQUISA..........................................................................................................................2
OBJECTIVOS.................................................................................................................................................................3
HIPÓTESES....................................................................................................................................................................4
JUSTIFICATIVA............................................................................................................................................................5
METODOLOGIA...........................................................................................................................................................6
DESENVOLVIMENTO..................................................................................................................................................7
COMPONENTES E MATÉRIAS UTILIZADOS UTILIZADOS.........................................................................8
FUNDAMENTAÇÃO TEÓRICA............................................................................................................................8
PIC16F628A...........................................................................................................................................................8
CRISTAL OSCILADOR 4MHZ........................................................................................................................10
DISLPAY DE 7 SEGMENTOS CATODO COMUM 2 DIGITOS/TELAS....................................................11
CÓDIGO ASSEMBLY E IMPLEMENTAÇÃO DO CIRCUITO.......................................................................13
EXPLICAÇÃO DETALHADA DO CÒDIGO..................................................................................................14
CONCLUSÂO..............................................................................................................................................................28
REFERÊNCIAS............................................................................................................................................................29
LISTA DE FIGURAS
Ao longo deste estudo, serão abordados os objetivos propostos, a fundamentação teórica que sustenta
a escolha do PIC16F628A, a descrição detalhada do circuito montado, o código em Assembly utilizado para
programação, as simulações realizadas no MPLAB e Proteus, bem como os resultados obtidos, culminando
em uma análise crítica e conclusiva. Este trabalho aspira contribuir significativamente para o entendimento e
a aplicação prática do PIC16F628A, consolidando-se como um marco na exploração da multiplexação de
displays de 7 segmentos.
1
TEMA E PROBLEMA DE PESQUISA
2
OBJECTIVOS
OBJECTIVO GERAL
OBJECTIVOS ESPECÍFICOS
5. Efetuar testes práticos do circuito, utilizando o osciloscópio para validar o correto funcionamento da
multiplexação e analisar as formas de onda geradas.
3
HIPÓTESES
b) Correta Configuração das Portas e Pinos: A configuração das portas e pinos do PIC16F628A será
corretamente implementada, garantindo a interação adequada entre o microcontrolador e o display de
7 segmentos catodo comum.
4
JUSTIFICATIVA
Este projeto visa criar um circuito de multiplexação para displays de 7 segmentos, utilizando o
microcontrolador PIC16F628A e explorando programação em Assembly. A importância dessa investigação
reside na aplicação prática dos conceitos de programação e controle de dispositivos, permitindo um
mergulho aprofundado na linguagem Assembly e nas características específicas do PIC16F628A.
5
METODOLOGIA
Ao combinar elementos de pesquisa exploratória, dedutiva, indutiva e analítica, busca-se obter uma
compreensão holística do processo de multiplexação de displays de 7 segmentos com o PIC16F628A. A
abordagem experimental proporcionará insights práticos, enquanto a análise detalhada dos resultados
enriquecerá a compreensão do leitor sobre o funcionamento do circuito proposto.
6
DESENVOLVIMENTO
A etapa inicial consistiu na montagem física do circuito em uma protoboard. As conexões entre os displays,
resistores, PIC16F628A, cristal oscilador e outros componentes foram organizadas para assegurar uma
integração eficiente. A disposição estratégica dos elementos visou minimizar interferências e otimizar a
resposta do circuito.
A implementação prática foi complementada por uma bateria rigorosa de testes. O circuito, com ênfase na
multiplexação dos displays, foi minuciosamente avaliado quanto ao correto funcionamento, precisão e
estabilidade. Os testes realizados permitiram identificar e corrigir eventuais falhas, assegurando a robustez
do projeto.
Antes da execução prática, o circuito foi submetido a simulações detalhadas no Proteus e MPLAB. Essa
etapa visou validar as expectativas teóricas, explorando diferentes cenários e condições de operação. A
simulação proporcionou uma visão abrangente do comportamento do circuito em ambiente virtual, antes da
aplicação prática.
Este relatório apresentará em detalhes o processo de montagem, desde as especificações do projeto até a
disposição física dos componentes. As etapas de simulação no Proteus e MPLAB serão descritas, seguidas
pela análise dos resultados obtidos nos testes práticos.
7
COMPONENTES E MATÉRIAS UTILIZADOS UTILIZADOS
Display de 7 Segmentos Cátodo Comum: Display numérico para a exibição de dígitos, fundamental para a
representação visual das informações.
Resistores:
7 x Resistores de 220 ohms: Limitam a corrente nos LEDs do display, assegurando uma operação
segura.
1 x Resistor de 10k ohms: Parte do circuito de pull-up para o botão, garantindo uma leitura estável.
Botão: Fornece uma interface de entrada para interações do usuário, como iniciar ou interromper a
contagem.
Microcontrolador PIC16F628A: O cérebro do projeto, responsável pelo controle da multiplexação e pela
gestão da exibição nos displays.
Conexões GND (terra) e VCC (alimentação): GND é a referência de terra, e VCC é a alimentação para o
circuito.
Conexão BUS: Permite a comunicação e troca de dados entre os diversos componentes do circuito.
Portas NOT (portas lógicas inversoras): Componentes lógicos essenciais para a implementação de certas
operações no circuito.
Osciloscópio: Instrumento de medição utilizado para visualização e análise das formas de onda no circuito.
Cristal de 4MHz: Fornecer uma referência de tempo estável para o PIC16F628A, garantindo sincronia nas
operações.
Capacitor Cerâmico: Utilizado para filtrar flutuações na alimentação, melhorando a estabilidade do sistema.
Além desses componentes eletrônicos, também são utilizados outros materiais, como fios de conexão
(condutores e jumpers), protoboard para montagem do circuito.
FUNDAMENTAÇÃO TEÓRICA
PIC16F628A
8
O PIC16F628a é um microcontrolador fabricado pela Microchip Technology
(www.microchip.com), com as seguintes características:
composto de 18 pinos;
possui somente 35 instruções no seu microcódigo;
sinal de clock de freqüência até 20 MHz;
memória de programa do tipo Flash de 2048 words (1 word = 32 bits);
224 bytes de memória RAM para dados;
128 bytes de memória EEPROM para dados;
instruções de 14 bits com 200ns de tempo de execução;
dados de 8 bits por endereço de memória;
15 registradores especiais;
16 pinos os quais podem ser configurados como entrada e/ou saída;
outras características especiais como programação in-circuit serial, proteção por código,
watchdog timer (temporizador cão de guarda), módulo CCP, comparador interno, USART,....
Pinagem do PIC16F628a:
Os pinos de RA0 à RA7 e de RB0 à RB7 podem ser configurados como entradas ou saídas digitais. A
alimentação se dá no pino Vdd, ligado normalmente em 5V com faixa de tolerância de 2 à 6V e o pino Vss é
a referência de terra. O pino OSC1/CLKIN é utilizado para sinal de clock poduzido por cristal ou um
circuito externo e o pino OSC2/CLKOUT para sinal de clock por cristal (utilizado em conjunto com
OSC1/CLKIN). O pino MCLR é uma entrada de sinal de reset em nível baixo (zero). O PIC16F628a é
composto pelos subsistemas digitais conforme diagrama de blocos abaixo:
9
Figura 2 DIAGRAMA DE BLOCOS DO PIC16F628A
ARQUITETURA HARVARD
O PIC16F628a possui uma arquitetura denominada Harvard para acesso aos dados e às instruções do
programa, a qual é caracterizada por utilizar um bus (via de acesso) para comunicação dos dados e outro bus
distinto para comunicação com o programa. A maioria dos microcomputadores e microcontroladores no
mercado utilizam um único bus, tanto para dados quanto para instruções do programa. Nota-se a diferença
no uso desta arquitetura na visualização da memória do microcontrolador PIC: existe uma memória para o
programa e outra para os dados a serem utilizados. A memória RAM de um microcomputador PIC, em que
dados e instruções do programa estão na mesma memória, denominada memória principal (geralmente a
RAM do computador).
10
INSTRUÇÕES RISC
12
RLF d Rotaciona os bits armazenados 1 00 1101 dfff ffff
em “f” para a
esquerda com Carry
RRF f, d Rotaciona os bits 1 00 1100 dfff ffff
armazenados em “f” para a
direita com Carry
SUBWF f, d Subtração do conteúdo em 1 00 0010 dfff ffff
“W” de “f”
SWAPF f, d Troca o primeiro nibble (4 1 00 1110 dfff ffff
bits) com o último nibble
armazenados em “f”
XORWF f, d Operação lógica “OU 1 00 0110 dfff ffff
EXCLUSIVO” do conteúdo de
“W” com o conteúdo de “f”
OPERAÇÕES DE REGISTRADORES ORIENTADAS A BIT
BCF f, b Muda para “0” o valor do bit 1 01 00bb bfff ffff
“b” de “f”
BSF f, b Muda para “1” o valor do bit 1 01 01bb bfff ffff
“b” de “f”
BTFSC f, b Verifica o valor do bit “b” do 1 (2) 01 10bb bfff ffff
registrador “f” e pula a próxima
instrução se for igual
a “0”
BTFSS f, b Verifica o valor do bit “b” do 1 (2) 01 11bb bfff ffff
registrador “f” e pula a próxima
instrução se for igual
a “1”
OPERAÇÕES DE CONTROLE E LITERAIS
ADDLW k Adiciona um número “k” ao 1 11 111x kkkk kkkk
conteúdo do registrador “W”
ANDLW k Operação lógica “E” de um 1 11 1001 kkkk kkkk
número “k” com “W”
CALL k Chamada de uma subrotina 2 10 0kkk kkkk kkkk
indicada por “k”
CLRWDT Limpa o temporizador cão de 1 00 0000 0110 0100
Guarda
GOTO k Vai ao endereço dado por “k” 2 10 1kkk kkkk kkkk
IORLW k Operação OU INCLUSIVO de 1 11 1000 kkkk kkkk
um número “k” com “W”
MOVLW k Move um número de valor “k” 1 11 00xx kkkk kkkk
para “W”
RETFIE Retorno de uma interrupção 2 00 0000 0000 1001
RETLW k Retorna com um valor “k” no 2 11 01xx kkkk kkkk
registrador “W”
RETURN Retorno de uma subrotina ao 2 00 0000 0000 1000
programa principal
SLEEP Entra no modo standby 1 00 0000 0110 0011
SUBLW k Subtrai o conteúdo do 1 11 110x kkkk kkkk
registrador “W” de um número
“k”
XORLW k Operação lógica “OU 1 11 1010 kkkk kkkk
EXCLUSIVO” de um número “k”
com o conteúdo do
registrador “W”
Os microcontroladores da linha PIC possuem pinos que podem ser configurados como entrada ou
saída digital. Cada conjunto de oito destes pinos é denominado Port, geralmente classificado por uma letra
do alfabeto (PortA, PortB, PortC). Para isto, existem implementados na memória RAM do PIC registradores
especiais para configurar e ler/modificar o valor destes pinos. No PIC16F628a, dois destes registradores, o
TRISA e o TRISB, são responsáveis pela configuração destes pinos para funcionamento como entrada ou
saída digital. A abreviatura TRIS para estes registradores provem de tri-state (três estados) porque alguns
pinos podem funcionar de três modos diferentes: como entrada digital, saída digital ou com outra função
específica.
Cada registrador acima configura um pino como entrada digital se o bit respectivo possuir valor “1”;
ou saída digital, se o bit respectivo possuir o valor “0”. Os exemplos abaixo mostram os valores que devem
estar presentes nos registradores TRISA eTRISB dada a respectiva configuração dos pinos:
pinos RA0 a RA7 configurados como entradas digitais e pinos RB0 a RB7 como saídas digitais:
TRISA 1 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0
TRISB
1. Timer0:
O Timer0 é um timer de 8 bits que pode operar de forma assíncrona ou síncrona com o clock do
sistema (Fosc/4 ou Fosc/8). Ele é frequentemente utilizado em aplicações que requerem
temporização mais curta e precisa.
Modos de Operação:
Temporizador: Pode ser configurado como um temporizador de contagem descendente de 8
bits.
Contador: Pode operar como um contador ascendente de 8 bits.
Interrupções:
O Timer0 pode gerar uma interrupção quando seu valor atinge um determinado limite,
proporcionando uma funcionalidade útil para a temporização precisa.
2. Timer1:
O Timer1 é um timer/contador de 16 bits, oferecendo maior resolução em comparação com o
Timer0. Ele opera em modo de 16 bits e pode ser configurado para funcionar em diversas fontes de
clock.
Modos de Operação:
Temporizador: Pode ser configurado como um temporizador de contagem descendente de
16 bits.
Contador: Opera como um contador ascendente de 16 bits.
Fontes de Clock:
Pode utilizar o clock do sistema (Fosc/4), um oscilador externo ou o sinal de clock do pino
T1CKI.
Interrupções:
O Timer1 pode gerar interrupções quando seu valor atinge um limite predefinido, oferecendo
um recurso valioso para aplicações que requerem temporização mais longa.
Modo Síncrono e Assíncrono:
Pode operar em modo síncrono ou assíncrono, proporcionando flexibilidade na configuração
conforme a necessidade da aplicação.
Configuração Geral dos Timers:
A configuração dos timers envolve a manipulação de registradores específicos, como TMR0,
TMR1L, TMR1H, T0CS (Timer0 Clock Source), T0SE (Timer0 Source Edge Select), entre outros.
Prescaler:
Ambos os timers possuem um prescaler que permite dividir a frequência do clock antes de
aplicá-la ao contador. Isso é útil para ajustar a faixa de contagem ou economizar energia.
Figura 4 Diagrama de Bloco do Timer0
O cristal de 4MHz é uma fonte de clock externa que pode ser utilizada como a base de tempo para o
microcontrolador PIC16F628A. Ao conectar um cristal externo ao microcontrolador, em conjunto com
capacitores apropriados, é possível obter uma precisão de clock superior em comparação com o clock
interno do dispositivo.
1. Precisão e Estabilidade:
Cristais externos oferecem maior precisão e estabilidade em comparação com osciladores internos.
Isso é particularmente importante em aplicações que demandam sincronização precisa, como em
sistemas de comunicação ou temporização crítica.
2. Configuração do Microcontrolador:
O cristal de 4MHz é conectado aos pinos XTAL1 e XTAL2 do PIC16F628A. Para utilizar um cristal
externo, é necessário configurar o microcontrolador para usar a fonte de clock externa. Isso
geralmente é feito através do bit OSCON.IRCF para selecionar a frequência desejada.
3. Maior Capacidade de Processamento:
Ao utilizar um clock externo mais rápido, como o proporcionado por um cristal de 4MHz, o
microcontrolador pode processar instruções mais rapidamente, resultando em uma capacidade de
processamento maior.
DISLPAY DE 7 SEGMENTOS CATODO COMUM 2 DIGITOS/TELAS
O Módulo de Usuário LED7SEG é um componente versátil capaz de multiplexar até oito displays de
7 segmentos, oferecendo compatibilidade com cátodo comum, ânodo comum ou qualquer polaridade de
inversor. Este módulo é particularmente útil quando se deseja otimizar o uso de pinos de E/S, sendo capaz de
acionar até oito displays com apenas 16 pinos ou no caso específico deste projeto 2 displays com apenas.
Essa abordagem permite a economia de pinos de controle, pois apenas um conjunto de segmentos é
compartilhado entre os dígitos em um determinado momento. A taxa de multiplexação é crucial para garantir
que a alternância seja rápida o suficiente para que os dígitos pareçam estar ligados simultaneamente aos
olhos humanos, evitando cintilação perceptível. Portanto, a seleção adequada da taxa de multiplexação é
essencial para o funcionamento eficaz do display de 7 segmentos de cátodo comum de 2 dígitos em um
sistema multiplexado.
CÓDIGO ASSEMBLY E IMPLEMENTAÇÃO DO CIRCUITO
1.Configuração e Inicialização
O código começa com a configuração dos bits de fusíveis para o PIC16F628A.
Há definições para o mapeamento de hardware, registradores de uso geral e instruções para a
páginação de memória.
2.Interrupção
O programa utiliza a interrupção do Timer0 (`T0IF`). A cada estouro do Timer0, ele alterna entre os
dígitos mais significativos e menos significativos do display.
Os dígitos são controlados pelos pinos `digit1` e `digit2`, e os dados são enviados para o display
através do `PORTB`.
3.Loop Principal
No loop principal (`loop`), os valores `13` são constantemente carregados nas variáveis `dez` e `uni`,
o que indica que o display deve exibir "13".
4.Sub-rotina `send_disp`
Essa sub-rotina converte os valores binários das variáveis `dez` e `uni` nos segmentos necessários
para exibir os dígitos de 0 a 9 no display de 7 segmentos.
5.Observações Gerais
O código faz uso de bancos de memória (`bank0` e `bank1`) para acessar diferentes conjuntos de
registradores.
Os registradores `W_TEMP` e `STATUS_TEMP` são utilizados para salvar e recuperar o contexto
durante a rotina de interrupção.
6.Configuração de Hardware
A configuração inicial inclui a definição dos pinos de saída (`TRISA` e `TRISB`), configuração do
Timer0 (`OPTION_REG`), desabilitação de comparadores (`CMCON`), e habilitação das interrupções
globais e do Timer0 (`INTCON`).
7.Loop Infinito
O loop infinito (`loop`) parece configurar constantemente as variáveis `dez` e `uni` para "13". A
razão para isso pode ser mais clara no contexto geral do projeto.
1-CONFIGURAÇÕES INICIAIS
#include <p16f628a.inc>
Paginação de Memória:
Define macros para facilitar a seleção de bancos de memória. bank0 e bank1 são utilizadas para selecionar o
banco 0 e o banco 1, respectivamente.
2- MAPEAMENTO DO HARDWARE
Mapeamento de hardware:
- `LED1`: Define o pino do LED1 como o pino RA3 do registrador PORTA.
- `LED2`: Define o pino do LED2 como o pino RA2 do registrador PORTA.
- `S1`: Define o pino do botão S1 como o pino RB0 do registrador PORTB.
- `S2`: Define o pino do botão S2 como o pino RA5 do registrador PORTA.
- `digit1`: Define o pino do dígito mais significativo do display como o pino RA1 do registrador
PORTA.
- `digit2`: Define o pino do dígito menos significativo do display como o pino RA0 do registrador
PORTA.
Essas definições tornam o código mais legível e fácil de entender, pois os nomes simbólicos (`LED1`,
`LED2`, etc.) são usados em vez de números de pinos brutos. Isso é útil porque, se a configuração de
hardware precisar ser modificada posteriormente, apenas essas definições precisam ser ajustadas, facilitando
a manutenção do código.
Esses mapeamentos são usados ao longo do código para se referir aos diferentes pinos do
microcontrolador, proporcionando uma abstração que torna o código mais claro e modular. Por exemplo, em
vez de usar constantemente números de pino brutos, o programador pode usar esses nomes simbólicos para
melhorar a legibilidade do código e facilitar futuras modificações no hardware.
A seção de "Registradores de Uso Geral" destina-se a reservar uma área específica de memória para
o armazenamento temporário de dados. Isso é feito por meio da definição de um bloco de registradores
utilizando a diretiva `cblock`.
cblock H'20'
W_TEMP ; Registrador para armazenar o conteúdo temporário de W
STATUS_TEMP ; Registrador para armazenar o conteúdo temporário de
STATUS
counter ; Registrador auxiliar de contagem
timer ; Registrador para atualizar o valor do display
dez ; Dezena do número exibido no display
uni ; Unidade do número exibido no display
endc
1. cblock H'20:
A diretiva `cblock` define um bloco de registradores de uso geral. `H'20'` especifica o endereço de
início do bloco. Isso cria um espaço de armazenamento em que o programador pode atribuir nomes
simbólicos para facilitar o acesso e manipulação de dados temporários.
2. `W_TEMP`:
`W_TEMP` é um registrador destinado a armazenar temporariamente o conteúdo do registrador W
(registrador de trabalho). Durante a execução de certas operações, o conteúdo do registrador W pode
ser temporariamente transferido para `W_TEMP` e, posteriormente, restaurado.
3. `STATUS_TEMP`:
`STATUS_TEMP` é um registrador usado para armazenar temporariamente o conteúdo do
registrador de status. O registrador de status contém informações sobre o estado do microcontrolador,
incluindo sinalizadores de status e informações sobre o banco de memória atual.
4. `counter`:
`counter` é um registrador auxiliar de contagem. Pode ser utilizado para contar eventos ou iterações
em determinadas partes do código.
5. `timer`:
`timer` é um registrador usado para rastrear o tempo ou a contagem. Parece ser utilizado para
controlar a multiplexação do display, conforme mencionado na seção de interrupção do Timer0.
6. `dez` e `uni`:
`dez` e `uni` são registradores destinados a armazenar a dezena e a unidade do número que será
exibido no display, respectivamente.
Esses registradores são definidos para facilitar o armazenamento temporário de dados durante a
execução do programa. O uso de nomes simbólicos melhora a legibilidade do código e facilita a
manutenção, pois os registradores são referenciados por seus nomes significativos em vez de endereços
brutos de memória.
4- VETOR DE RESET
A diretiva `org` (origem) define o endereço no qual o vetor de RESET começa. No caso, `H'0000'`
representa o endereço de memória 0000h, que é onde o programa começa a ser executado quando o
microcontrolador é ligado ou é realizado um reset.
2. `goto inicio`
A instrução `goto` é uma instrução de desvio incondicional. `inicio` é uma label (rótulo) que
marca o início do programa principal. Essa instrução desvia a execução do programa para o
ponto rotulado como `inicio`.
O vetor de RESET é a primeira parte do código a ser executada quando o microcontrolador é ligado
ou é realizado um reset. Sua principal função é iniciar a execução do programa principal, e no caso deste
código, o programa principal é marcado pela label `inicio`.
Ao usar a instrução `goto inicio`, o código pula diretamente para o início do programa, evitando a
execução de quaisquer instruções no vetor de RESET além daquela que direciona para o início. Essa é uma
prática comum em programação de microcontroladores, onde o vetor de RESET é usado apenas para
direcionar a execução para a parte principal do programa.
5-VETOR DE INTERRUPÇÃO
org H'0004' ; As interrupções deste processador apontam para
este endereço
; -- Salva Contexto --
movwf W_TEMP ; Copia o conteúdo de Work para W_TEMP
swapf STATUS,W ; Move o conteúdo de STATUS com os nibbles
invertidos para Work
bank0 ; Seleciona o banco 0 de memória (padrão do RESET)
movwf STATUS_TEMP ; Copia o conteúdo de STATUS com os nibbles
invertidos para STATUS_TEMP
; -- Final do Salvamento de Contexto --
digit2_off:
copy_uni:
exit_ISR:
swapf STATUS_TEMP,W ; Copia em Work o conteúdo de STATUS_TEMP com os
nibbles invertidos
movwf STATUS ; Recupera o conteúdo de STATUS
swapf W_TEMP,F ; W_TEMP = W_TEMP com os nibbles invertidos
swapf W_TEMP,W ; Recupera o conteúdo de Work
retfie ; Retorna da interrupção
1. `org H'0004'`:
- Assim como no vetor de RESET, a diretiva `org` define o endereço onde o vetor de
interrupção começa. No caso, `H'0004'` representa o endereço de memória 0004h.
2. Salvando o Contexto (início):
Antes de realizar qualquer operação no vetor de interrupção, o código salva o contexto atual.
`movwf W_TEMP`: Move o conteúdo do registrador de trabalho (W) para o registrador
temporário W_TEMP.
`swapf STATUS,W`: Move o conteúdo do registrador de status com os nibbles invertidos
para o registrador W.
`bank0`: Seleciona o banco 0 de memória.
`movwf STATUS_TEMP`: Move o conteúdo de W para o registrador STATUS_TEMP.
4. Manipulação da Interrupção:
- Diversas operações são realizadas dependendo das condições.
- O código manipula a multiplexação dos dígitos do display e a limpeza de flags de
interrupção.
O vetor de interrupção é responsável por tratar a interrupção gerada pelo Timer0. Ele salva o
contexto, verifica a condição da interrupção, executa ações específicas e, em seguida, recupera o contexto
antes de retornar à execução normal do programa.
6- PROGRAMA PRINCIPAL
inicio:
bank1 ; Muda para o banco 1 de memória
movlw H'F0' ; Move o literal F0h para work
movwf TRISA ; Configura RA3, RA2, RA1 e RA0 como saída
movlw H'01' ; Move o literal 01h para work
movwf TRISB ; Configura todo PORTB como saída, exceto RB0
movlw H'D3' ; Move o literal D3h para work
movwf OPTION_REG ; Timer0 incrementa com ciclo de máquina,
prescaler 1:32
bank0 ; Muda para o banco 0 de memória
movlw H'07' ; Move o literal 07h para work
movwf CMCON ; Desabilita comparadores
movlw H'A0' ; Move o literal A0h para work
movwf INTCON ; Habilita a interrupção global e do timer0
clrf dez ; Limpa dezena
clrf uni ; Limpa unidade
loop:
movlw D'1'
movwf dez
movlw D'3'
movwf uni
1. `inicio`:
- `inicio` é uma label que marca o início do programa principal.
2. Configurações Iniciais:
- `bank1`: Muda para o banco 1 de memória.
- `movlw H'F0'`: Move o literal F0h para o registrador de trabalho (W).
- `movwf TRISA`: Configura os pinos RA3, RA2, RA1 e RA0 como saída.
- `movlw H'01'`: Move o literal 01h para W.
- `movwf TRISB`: Configura todo o registrador PORTB como saída, exceto RB0.
- `movlw H'D3'`: Move o literal D3h para W.
- `movwf OPTION_REG`: Configura o Timer0 para incrementar com o ciclo de máquina e
prescaler 1:32.
- `bank0`: Muda de volta para o banco 0 de memória.
- `movlw H'07'`: Move o literal 07h para W.
- `movwf CMCON`: Desabilita os comparadores.
- `movlw H'A0'`: Move o literal A0h para W.
- `movwf INTCON`: Habilita a interrupção global e do Timer0.
3. Limpeza e Inicialização:
- `clrf dez`: Limpa o registrador de dezena.
- `clrf uni`: Limpa o registrador de unidade.
4. Loop Infinito:
- `loop` é uma label que marca o início de um loop infinito.
- `movlw D'1'`: Move o literal 1 para W.
- `movwf dez`: Atribui 1 ao registrador de dezena.
- `movlw D'3'`: Move o literal 3 para W.
- `movwf uni`: Atribui 3 ao registrador de unidade.
1. `send_disp:`:
`send_disp` é uma label que marca o início da sub-rotina de conversão.
Essa sub-rotina é usada para converter valores binários (de 0 a 9) em representações adequadas para um
display de 7 segmentos. O valor binário que precisa ser convertido é usado como índice para a tabela, e o
byte correspondente (representando os segmentos acesos para exibir o dígito) é retornado pela sub-rotina.
8- RECUPERAÇÂO DO CONTEXTO E FINALIZAÇÂO
exit_ISR:
1. `exit_ISR:`:
`exit_ISR` é uma label que marca o início da rotina de saída da interrupção.
2. `Swapf STATUS_TEMP,W`:
`Swapf STATUS_TEMP,W` copia o conteúdo do registrador `STATUS_TEMP` com os nibbles
invertidos para o registrador `W`. Isso é feito para recuperar o conteúdo original de `STATUS` no
final da rotina.
4. `goto exit_ISR`:
`goto exit_ISR` faz um loop de volta para a label `exit_ISR` se o contador `timer` não atingiu zero.
5. `bsf LED1`:
`bsf LED1` (Bit Set File) liga o LED1 (assumindo que o LED1 está conectado ao pino RA3) se o
contador `timer` atingiu zero.
6. `swapf W_TEMP,F`:
`swapf W_TEMP,F` inverte os nibbles em `W_TEMP`. Este passo não é claramente explicado no
código fornecido, e o propósito exato pode depender de detalhes não apresentados.
7. `swapf W_TEMP,W`:
`swapf W_TEMP,W` recupera o conteúdo de `W_TEMP`.
8. `retfie`:
`retfie` é uma instrução que retorna da interrupção.
Essa parte do código lida com a recuperação do contexto após a interrupção do Timer0. Ela verifica se o
contador `timer` ainda não atingiu zero. Se ainda houver contagem, a rotina de saída da interrupção continua
no loop. Quando o contador atinge zero, o LED1 é ligado, e o contexto é recuperado antes de retornar da
interrupção.
Figura 9 Simulação do circuito do projeto no proteus
Ao consolidar o conhecimento teórico em uma aplicação real, o projeto contribui para a compreensão
profunda de conceitos fundamentais de arquitetura de computadores. As considerações finais abordarão não
apenas os resultados e desafios encontrados, mas também a aplicação prática dos conceitos estudados,
destacando a relevância do projeto para o aprendizado e desenvolvimento técnico na área de
microcontroladores e sistemas embarcados.
Ao alcançar esses objetivos, conseguiu-se não apenas implementar o projeto com sucesso, mas
também adquirir conhecimentos práticos sobre a utilização do PIC16F628A em aplicações de controle e
exibição, contribuindo para o avanço na compreensão e aplicação de microcontroladores em projetos
eletrônicos.
REFERÊNCIAS
a) Microchip Technology Inc. (2003). PIC16F627A/628A/648A Data Sheet 18/20/28-Pin Flash-Based, 8-Bit
CMOS Microcontrollers with nanoWatt Technology. [Online]. Disponível em:
https://ww1.microchip.com/downloads/en/DeviceDoc/40044F.pdf
b) WR Kits. (2016, 30 de maio). DISPLAYS MULTIPLEXADOS | Assembly para PIC #056 [Vídeo].
YouTube. https://www.youtube.com/watch?
v=YnPCLhgVJvE&list=PLZ8dBTV2_5HQd6f4IaoO50L6oToxQMFYt&index=56
c) Infineon Technologies AG. (2017). 7-Segment LED Controller Datasheet. [Online]. Disponível em:
https://www.infineon.com/dgdl/Infineon-7_Segment_LED_Controller-UM-v01_00-EN.pdf?
fileId=5546d462576f34750157750826c4223b
d) Docsity. (n.d.). Descrição rápida sobre o PIC16F628A. [Online]. Disponível em:
https://www.docsity.com/pt/descricao-rapida-sobre-o-pic16f628a/4434569/
e) SlideShare. (2014, 24 de abril). Pic16f628a | PDF. [Online]. Disponível em:
https://www.slideshare.net/secret/2SKzH5XmUqJfSC
f) Passei Direto. (n.d.). Análise de Circuitos Digitais – PIC16F628A. [Online]. Disponível em:
https://www.passeidireto.com/arquivo/23338332/datasheet-pic-16-f-628-a