Fundamentos e Operação de Microcontroladores PIC: Perguntas e Respostas
Classificado em Computação
Escrito em em português com um tamanho de 18,41 KB
O que é PIC (Peripheral Interface Controller)?
É uma interface controladora de periféricos.
O que é um Microcontrolador?
É um microprocessador que possui internamente vários circuitos eletrônicos que, em um microprocessador comum, precisariam ser externos para sua funcionalidade. Exemplos incluem: memória de dados e memória de programa, portas de entrada e saída de dados, circuito de reset, circuitos de comunicação serial e paralela, entre outros.
Arquiteturas Harvard vs. Von Neumann
A arquitetura Harvard possui dois barramentos distintos: um para dados e outro para instruções. Já o modelo Von Neumann utiliza um único barramento para instruções e dados. A arquitetura Harvard permite que, enquanto uma instrução é executada, outra seja buscada na memória, o que resulta em um processamento mais rápido.
O que Caracteriza a Arquitetura RISC?
- Poucas instruções
- Instruções com formato fixo
- Complexidade no compilador
Contador de Programa (Program Counter)
É um registrador da Unidade Central de Processamento (CPU) que indica a posição atual na sequência de execução de um processo.
Qual a Função do Registrador Stack (Pilha)?
É uma região de memória utilizada para armazenamento temporário de dados, como endereços de retorno de função e variáveis locais.
Para que Serve o Oscilador Ligado ao Microcontrolador?
Serve para produzir um sinal eletrônico repetitivo, essencial para a correta precisão e sincronização do sistema.
Do Ponto de Vista de Precisão, Qual é o Melhor Oscilador: RC, Ressonador ou Cristal?
O circuito a cristal é o mais preciso, pois os cristais são os osciladores mais estáveis e exatos que podemos utilizar.
O Microcontrolador PIC Possui Oscilador Interno e Pode Trabalhar Independentemente de um Circuito Externo. Esta Afirmação é Verdadeira? Se Sim, Qual a Vantagem e a Desvantagem Desta Configuração?
Sim, a afirmação é verdadeira.
Vantagens:
- Menos suscetível a ruídos externos.
- Permite enviar o sinal de clock para comunicação síncrona ou processos síncronos com outros microcontroladores ou periféricos.
Desvantagens:
- Menor velocidade de processamento comparado a um oscilador externo.
O que é um Pipeline?
É uma técnica de segmentação de instruções que permite à CPU buscar uma ou mais instruções adicionais enquanto a instrução atual está sendo executada, otimizando o processamento.
Na Arquitetura do PIC16F, Quais São as Duas Memórias Internas e Para que Serve Cada Uma?
- Memória Flash de Programa: Utilizada para armazenar o software (código) do microcontrolador.
- Memória RAM (File Registers): Utilizada para armazenar dados temporários e variáveis durante a execução das instruções do microcontrolador.
No Mapa da Memória de Programa do PIC16F628A, Onde Estão Localizados o Vetor de Reset e o Vetor de Interrupção?
- Vetor de Reset: Endereço
000h
- Vetor de Interrupção: Endereço
0004h
Quando a Memória é Dividida em Várias Páginas, Como Chamamos Este Conceito?
Chamamos de Paginação de Memória.
O PIC16F877A Utiliza Paginação de Memória de Programa (4 Páginas). Como Chamar Estas Páginas Manualmente?
Para gerenciar e chamar estas páginas manualmente, utilizam-se as instruções CALL
e GOTO
, direcionando para os endereços desejados dentro de cada página.
Qual é o Primeiro Endereço da Memória de Uso Geral Disponível para o Usuário nos PICs 16F628A e 16F877A?
O primeiro endereço da memória de uso geral (GPR - General Purpose Registers) disponível para o usuário é 0x20
(ou 32
em decimal).
Em Qual Registrador Estão Localizados os Bits Z, C e DC?
Estão localizados no Registrador STATUS.
Quais São as Funções dos Bits Z, C e DC do Registrador STATUS?
- Z (Zero Flag): Indica se o resultado da última operação aritmética ou lógica foi zero.
0
: O resultado não foi zero.1
: O resultado foi zero.
- DC (Digit Carry/Borrow Flag): Indica um "carry" (transporte) ou "borrow" (empréstimo) entre o bit 3 e o bit 4 de uma operação. É útil em operações BCD (Binary-Coded Decimal).
0
: Não houve carry/borrow entre o bit 3 e 4.1
: Houve carry/borrow entre o bit 3 e 4.
- C (Carry/Borrow Flag): Indica um "carry" (transporte) ou "borrow" (empréstimo) do bit mais significativo (MSB) de uma operação.
0
: Não houve carry/borrow.1
: Houve carry/borrow (o resultado ultrapassou os 8 bits disponíveis).
Considerando que o Bit RP1 do Registrador STATUS é Zero, Para que Servem os Comandos BCF STATUS,RP0
e BSF STATUS,RP0
?
BCF STATUS,RP0
: Limpa o bitRP0
do registradorSTATUS
(seta para0
), selecionando o Banco 0 da memória de dados.BSF STATUS,RP0
: Seta o bitRP0
do registradorSTATUS
(seta para1
), selecionando o Banco 1 da memória de dados.
Para que Servem os Registradores TRISA e TRISB?
Esses registradores são utilizados para configurar a direção dos pinos das portas A e B, respectivamente, como entrada ou saída:
- Um bit configurado com
1
no registradorTRISx
define o pino correspondente como entrada. - Um bit configurado com
0
no registradorTRISx
define o pino correspondente como saída.
Em Qual Banco da Memória de Dados Encontramos o Registrador TRISA?
O registrador TRISA
é encontrado no Banco 1 da memória de dados (endereço 85h
).
O que Foi Configurado no PIC Pela Sequência de Comandos Abaixo?
MOVLW B'00001110'
MOVWF TRISA
Esta sequência configura os pinos RA1
, RA2
e RA3
da Porta A como entrada, e os demais pinos (RA0
, RA4
, RA5
, RA6
, RA7
) como saída.
Para que Servem as Definições do MPLAB a Seguir?
EQU
: É uma diretiva do compilador que associa um nome simbólico a um valor numérico constante.#DEFINE
: É uma diretiva do pré-processador que associa um nome a uma expressão (realiza substituição de texto).ORG
: É uma diretiva que define o endereço de origem (offset) para a próxima instrução ou dado na memória de programa.#INCLUDE
: É uma diretiva que insere o conteúdo de outro arquivo (definições, texto ou código-fonte) no ponto onde a diretiva é encontrada.
O que Está Sendo Realizado na Sequência Abaixo?
MIN EQU .10
MAX EQU .240
MIN EQU .10
: Atribui o valor decimal10
à constante simbólicaMIN
.MAX EQU .240
: Atribui o valor decimal240
à constante simbólicaMAX
.
O que Foi Configurado no PIC Pelo Comando __CONFIG
Abaixo?
__CONFIG _BODEN_ON & _CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _MCLRE_ON & _XT_OSC
Este comando configura os bits de configuração do PIC no ambiente MPLAB, definindo o estado (ativo/desativado) de diversas funcionalidades:
_BODEN_ON
: Brown-Out Detect (BOD) ativado._CP_OFF
: Code Protection (Proteção de Código) desativada._PWRTE_ON
: Power-Up Timer Enable (PWRT) ativado._WDT_OFF
: Watchdog Timer (WDT) desativado._LVP_OFF
: Low Voltage Programming (LVP) desativada._MCLRE_ON
: Master Clear Enable (MCLR) ativado (pino RA5/MCLR como reset externo)._XT_OSC
: Oscilador tipo XT (Cristal) selecionado.
Qual a Diferença Entre as Instruções GOTO
e CALL
?
GOTO
: É uma instrução de salto incondicional. Ela desvia o fluxo de execução do programa para um novo endereço, sem guardar o endereço de retorno. Pode ser usada para criar loops infinitos ou pular seções de código.CALL
: É uma instrução de chamada de sub-rotina. Ela desvia o fluxo de execução para um novo endereço (o início da sub-rotina), mas antes disso, salva o endereço da próxima instrução na pilha (Stack). Isso permite que, ao final da sub-rotina (com a instruçãoRETURN
), o programa retorne ao ponto de onde foi chamado.
Análise de Trechos de Código Assembly
Exemplo 1: Controle de LED com Botão
#DEFINE BOTAO PORTA,0
#DEFINE LED PORTB,0
MAIN
BTFSC BOTAO
GOTO BL
GOTO BP
BL
BCF LED
GOTO MAIN
BP
BSF LED
GOTO MAIN
#DEFINE BOTAO PORTA,0
: Define o símboloBOTAO
como o bit 0 da Porta A (RA0
).#DEFINE LED PORTB,0
: Define o símboloLED
como o bit 0 da Porta B (RB0
).MAIN
: Rótulo que marca o início do programa principal.BTFSC BOTAO
: Testa o bitBOTAO
(RA0
). Se o bit for0
(botão pressionado, assumindo pull-up), a próxima instrução é pulada.GOTO BL
: SeBOTAO
for0
(pressionado), pula para o rótuloBL
.GOTO BP
: SeBOTAO
for1
(não pressionado), a instruçãoGOTO BL
é pulada, e o programa salta para o rótuloBP
.BL
: Rótulo para a rotina de "LED desligado".BCF LED
: Limpa o bitLED
(RB0
), desligando o LED.GOTO MAIN
: Retorna ao início do programa principal para testar o botão novamente.BP
: Rótulo para a rotina de "LED ligado".BSF LED
: Seta o bitLED
(RB0
), ligando o LED.GOTO MAIN
: Retorna ao início do programa principal para testar o botão novamente.
Exemplo 2: Rotina de Contagem (Incremento)
MOVLW .236
MOVWF X
VOLTA
CALL BIP
INCFSZ X,F
GOTO VOLTA
GOTO PRINCIPAL
MOVLW .236
: Move o valor decimal236
para o registrador de trabalhoW
.MOVWF X
: Move o conteúdo deW
para o registradorX
.VOLTA
: Rótulo para o início do loop.CALL BIP
: Chama a sub-rotinaBIP
.INCFSZ X,F
: Incrementa o registradorX
. Se o resultado for zero, a próxima instrução é pulada. O resultado é armazenado de volta emX
(F
indica o próprio registrador).GOTO VOLTA
: SeX
ainda não for zero após o incremento, salta de volta paraVOLTA
para continuar o loop.GOTO PRINCIPAL
: SeX
se tornou zero, a instruçãoGOTO VOLTA
é pulada, e o programa salta para o rótuloPRINCIPAL
.
Exemplo 3: Rotina de Contagem (Decremento)
MOVLW .15
MOVWF X
VOLTA
CALL BIP
DECFSZ X,F
GOTO VOLTA
GOTO PRINCIPAL
MOVLW .15
: Move o valor decimal15
para o registrador de trabalhoW
.MOVWF X
: Move o conteúdo deW
para o registradorX
.VOLTA
: Rótulo para o início do loop.CALL BIP
: Chama a sub-rotinaBIP
.DECFSZ X,F
: Decrementa o registradorX
. Se o resultado for zero, a próxima instrução é pulada. O resultado é armazenado de volta emX
(F
indica o próprio registrador).GOTO VOLTA
: SeX
ainda não for zero após o decremento, salta de volta paraVOLTA
para continuar o loop.GOTO PRINCIPAL
: SeX
se tornou zero, a instruçãoGOTO VOLTA
é pulada, e o programa salta para o rótuloPRINCIPAL
.
Na Rotina Anterior (Exemplo 3), o que Acontece se Mudarmos DECFSZ X,F
para INCFSZ X,F
?
Se a instrução DECFSZ X,F
for substituída por INCFSZ X,F
, o registrador X
será incrementado em 1
a cada passagem pelo loop. O loop continuará até que X
atinja o valor 0
(após um estouro de FFh
para 00h
), momento em que a próxima instrução (GOTO VOLTA
) será pulada.
Como a Instrução DECFSZ
Afeta os Flags Z e C do Registrador STATUS?
A instrução DECFSZ
(Decrement File Register, Skip if Zero) não afeta os flags Z
(Zero) e C
(Carry) do registrador STATUS
. Ela apenas decrementa o registrador especificado e, se o resultado for zero, pula a próxima instrução. Os flags Z
e C
são afetados por operações aritméticas e lógicas que explicitamente os modificam, como SUBWF
ou ADDWF
.
Exemplo 4: Comparação de Valores (X
vs. W
)
MOVLW .50
SUBWF X,W
BTFSS STATUS,C
GOTO MENOR
GOTO MAIOR
MOVLW .50
: Move o valor decimal50
para o registrador de trabalhoW
.SUBWF X,W
: SubtraiW
deX
(X - W
) e armazena o resultado emW
. Esta operação afeta o flagC
(Carry).BTFSS STATUS,C
: Testa o bitC
(Carry) do registradorSTATUS
. SeC
for0
(indicando queX < W
, ou seja, houve "borrow"), a próxima instrução é pulada.GOTO MENOR
: SeC
for0
(X < W
), salta para o rótuloMENOR
.GOTO MAIOR
: SeC
for1
(X >= W
), a instruçãoGOTO MENOR
é pulada, e o programa salta para o rótuloMAIOR
.
Exemplo 5: Comparação de Valores (X
vs. Y
)
MOVF Y,W
SUBWF X,W
BTFSS STATUS,C
GOTO MENOR
BTFSS STATUS,Z
GOTO MAIOR
GOTO IGUAL
MOVF Y,W
: Move o conteúdo do registradorY
para o registrador de trabalhoW
.SUBWF X,W
: SubtraiW
deX
(X - W
) e armazena o resultado emW
. Esta operação afeta os flagsC
eZ
.BTFSS STATUS,C
: Testa o bitC
(Carry) do registradorSTATUS
. SeC
for0
(indicando queX < Y
), a próxima instrução é pulada.GOTO MENOR
: SeC
for0
(X < Y
), salta para o rótuloMENOR
.BTFSS STATUS,Z
: SeC
for1
(X >= Y
), a instruçãoGOTO MENOR
é pulada. Então, testa o bitZ
(Zero) do registradorSTATUS
. SeZ
for0
(indicando queX != Y
), a próxima instrução é pulada.GOTO MAIOR
: SeZ
for0
(X > Y
), salta para o rótuloMAIOR
.GOTO IGUAL
: SeZ
for1
(X == Y
), a instruçãoGOTO MAIOR
é pulada, e o programa salta para o rótuloIGUAL
.