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 bit RP0 do registrador STATUS (seta para 0), selecionando o Banco 0 da memória de dados.
  • BSF STATUS,RP0: Seta o bit RP0 do registrador STATUS (seta para 1), 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 registrador TRISx define o pino correspondente como entrada.
  • Um bit configurado com 0 no registrador TRISx 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 decimal 10 à constante simbólica MIN.
  • MAX EQU .240: Atribui o valor decimal 240 à constante simbólica MAX.

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ção RETURN), 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ímbolo BOTAO como o bit 0 da Porta A (RA0).
  • #DEFINE LED PORTB,0: Define o símbolo LED como o bit 0 da Porta B (RB0).
  • MAIN: Rótulo que marca o início do programa principal.
  • BTFSC BOTAO: Testa o bit BOTAO (RA0). Se o bit for 0 (botão pressionado, assumindo pull-up), a próxima instrução é pulada.
  • GOTO BL: Se BOTAO for 0 (pressionado), pula para o rótulo BL.
  • GOTO BP: Se BOTAO for 1 (não pressionado), a instrução GOTO BL é pulada, e o programa salta para o rótulo BP.
  • BL: Rótulo para a rotina de "LED desligado".
  • BCF LED: Limpa o bit LED (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 bit LED (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 decimal 236 para o registrador de trabalho W.
  • MOVWF X: Move o conteúdo de W para o registrador X.
  • VOLTA: Rótulo para o início do loop.
  • CALL BIP: Chama a sub-rotina BIP.
  • INCFSZ X,F: Incrementa o registrador X. Se o resultado for zero, a próxima instrução é pulada. O resultado é armazenado de volta em X (F indica o próprio registrador).
  • GOTO VOLTA: Se X ainda não for zero após o incremento, salta de volta para VOLTA para continuar o loop.
  • GOTO PRINCIPAL: Se X se tornou zero, a instrução GOTO VOLTA é pulada, e o programa salta para o rótulo PRINCIPAL.

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 decimal 15 para o registrador de trabalho W.
  • MOVWF X: Move o conteúdo de W para o registrador X.
  • VOLTA: Rótulo para o início do loop.
  • CALL BIP: Chama a sub-rotina BIP.
  • DECFSZ X,F: Decrementa o registrador X. Se o resultado for zero, a próxima instrução é pulada. O resultado é armazenado de volta em X (F indica o próprio registrador).
  • GOTO VOLTA: Se X ainda não for zero após o decremento, salta de volta para VOLTA para continuar o loop.
  • GOTO PRINCIPAL: Se X se tornou zero, a instrução GOTO VOLTA é pulada, e o programa salta para o rótulo PRINCIPAL.

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 decimal 50 para o registrador de trabalho W.
  • SUBWF X,W: Subtrai W de X (X - W) e armazena o resultado em W. Esta operação afeta o flag C (Carry).
  • BTFSS STATUS,C: Testa o bit C (Carry) do registrador STATUS. Se C for 0 (indicando que X < W, ou seja, houve "borrow"), a próxima instrução é pulada.
  • GOTO MENOR: Se C for 0 (X < W), salta para o rótulo MENOR.
  • GOTO MAIOR: Se C for 1 (X >= W), a instrução GOTO MENOR é pulada, e o programa salta para o rótulo MAIOR.

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 registrador Y para o registrador de trabalho W.
  • SUBWF X,W: Subtrai W de X (X - W) e armazena o resultado em W. Esta operação afeta os flags C e Z.
  • BTFSS STATUS,C: Testa o bit C (Carry) do registrador STATUS. Se C for 0 (indicando que X < Y), a próxima instrução é pulada.
  • GOTO MENOR: Se C for 0 (X < Y), salta para o rótulo MENOR.
  • BTFSS STATUS,Z: Se C for 1 (X >= Y), a instrução GOTO MENOR é pulada. Então, testa o bit Z (Zero) do registrador STATUS. Se Z for 0 (indicando que X != Y), a próxima instrução é pulada.
  • GOTO MAIOR: Se Z for 0 (X > Y), salta para o rótulo MAIOR.
  • GOTO IGUAL: Se Z for 1 (X == Y), a instrução GOTO MAIOR é pulada, e o programa salta para o rótulo IGUAL.

Entradas relacionadas: