






























Estude fácil! Tem muito documento disponível na Docsity
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Prepare-se para as provas
Estude fácil! Tem muito documento disponível na Docsity
Prepare-se para as provas com trabalhos de outros alunos como você, aqui na Docsity
Encontra documentos específicos para os exames da tua universidade
Prepare-se com as videoaulas e exercícios resolvidos criados a partir da grade da sua Universidade
Responda perguntas de provas passadas e avalie sua preparação.
Ganhe pontos para baixar
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Programa de acesso a memoria cache e microcontrolador PIC18F84A
Tipologia: Notas de estudo
1 / 38
Esta página não é visível na pré-visualização
Não perca as partes importantes!































Universidade Federal do Rio Grande do Norte
Centro de Tecnologia
Departamento de Engenharia de Computação e Automação
Discente: Jaime Cristalino Jales Dantas
Matricula: 2011008771
Disciplina: Arquitetura de Computadores
Natal, 2 de outubro de 2015
A discrição e função de cada pino é mostrado na tabele a seguir
Tabela 1 - Discrição de pinos do PIC 16F84A
OSC1/CLKIN 16 Entrada para o cristal oscilador/clock externo
15 Saída para o cristal oscilador/clock externo
𝑴𝑪𝑳𝑹 4 Master Clear (reset) externo
Porta de I/O digital
Porta de I/O digital ou entrada de clock para o
contador
Pode ter
Pull-up
interno
habilitado
por
software
RB0/INT 6 Porta de I/O digital / Interrupção externa
RB2 8 Porta de I/O digital
Porta de I/O digital ou interrupção na mudança de
estado RB5 11
Porta de I/O digital, interrupção na mudança de
estado, ou clock da programação serial
Porta de I/O digital, interrupção na mudança de
estado, ou data da programação serial
VSS 5 GND - Tensão de referência negativa e I/O
VDD 14 Vcc - Alimentação positiva (+5 Volts) e I/O
O microcontrolador PIC 16F84A é um microcontrolador de 8 bits que utiliza a arquitetura RISC.
Ela é baseada em registradores, com o barramento de memória de dados separado do barramento de
memória de programa. Este conceito permite ter um conjunto de instruções simples, mas extremamente
poderoso que enfatiza as operações bit, byte e de registradores. A estrutura completa do
microcontroaldor PIC 16F84A pode ser vista no diagrama abaixo:
Figura 2 - Diagrama PIC 16F84A
Figura 3 – Estrutura simplificada PIC 16F84A
Os componentes básicos do PIC 16F84A estão listados abaixo:
Memória Flash: É a memória que fica armazenado o programa, e é escrita e apagada e eletronicamente
com o uso de software.
Memória EEPROM: É a memoria não volátil do microcontrolador, ou seja, mesmo que a alimentação
seja cortada, os dados não são perdidos. É utilizada para guardar dados internos que não podem ser
perdidos.
Memoria RAM: É a memoria volátil do microcontrolador, e é utilizada na execução do programa.
Quando a alimentação é desligada, os dados presente nessa memoria são perdidos.
Porto A e Porto B: São as I/O do microcontrolador com seus periféricos. O porto A possui 5 pinos de
I/O e o porto B possui 8 pinos de I/O.
Contador / Temporizador: É um registro de 8 bits no interior do microcontrolador PIC que roda
independentemente do programa que é instalado nele. No final de quatro ciclos de clock, ele incrementa
esse contador ate o máximo de 255, que é a máxima representação de 8 bits, e quando ele chega a esse
valor, o contador é zerado a contagem reiniciado do zero.
Unidade de Processamento Central (CPU): É responsável pela interconexão de todos os blocos
internamente no microcontrolador e também pela execução do programa.
O ciclo de instrução de um microcontrolador é composto por dois passos, o passo de busca
chamado de “fetch” e o passo de execução da instrução. Esses dois passos se dividem em diversos
passos que pode dependem de alguns fatores. A lista geral de passos é:
1 - Busca a instrução na memoria
2 - Decodificação da instrução
3 - Calculo do endereço do operando
4 - Busca do operando
5 - Operação do dado
6 - Calculo do endereço do operando
7 - Armazenação do operando
Dependendo se ha ou não interrupções, esse ciclo pode mudar um pouco. O processador ira
checar ao fim do ciclo de instrução se houve interrupções.
O microcontrolador PIC 16F84A possui um conjunto de 35 instruções. Procurou-se o otimizar o
numero de instrução o máximo possível, aumentando assim a rapidez e a simplicidade de arquitetura do
microcontrolador PIC 16F84A. Entretendo, isso também trousse uma limitação na programação, pois
existe apenas 35 diferente instruções, ou seja, em alguns casos é necessário desenvolver analises não
convencionais para solucionar um problema.
Cada instrução é composta por uma “word” de 14 bits dividida em OPCODE, a qual especifica o
tipo de instrução e um ou mais operadores que especificam a operação da instrução. As operações
podem ser divididas em orientada a byte, a bit e literais e controle. A descrição do OPCODE é mostrada
na tabela abaixo:
Tabela 2 - Campos do OPCODE
Campo Descrição
f
Registrador de endereço; Referência a
um registrador
w
Registrador temporário para as
operaçõe na ULA (acumulador)
b
Refere-se ao bit específico dentro de
um byte
Conjunto de instruções do PIC 16F84A
Tabela 3 - Instruções PIC 16F84A
ADDLW k
Soma a constante k ao valor memorizado no acumulador
W e coloca o resultado no acumulador.
ADDWF f,d
Soma o valor contido no acumulador W com o valor
contido no registrador endereçado pelo parâ metro f.
ANDLW k
Efetua o AND bit a bit entre o valor contido no
acumulador W e o valor constante k. O resultado será
memorizado no acumulador.
ANDWF f,d
Efetua o AND bit a bit entre o valor contido no
acumulador W e o valor contido no registrador endereç ado
pelo parâmetro f.
BCF f,b Zera o bit b do registrador no endereç o f.
BSF f,b Coloca em 1 no bit b do registrador que está no endereço f.
BTFSC f,b
Testa o bit b contido no registrador no endereç o f e pula a
pró xima instrução se este valer 0.
BTFSS f,b
Testa o bit b contido no registrador do endereç o f e pula a
instrução seguinte se este for 1.
CALL k
Chama uma subrotina memorizada no endereç o k. O
parâmetro k pode ser especificado utilizando-se
diretamente o valor numé rico do endereç o ou então o
relativo label.
CLRF f
Zera o valor contido no registrador endereç ado pelo
parâmetro f.
Zera o valor contido no registrador W.
Utilizada quando programarmos o PIC 16F84A com a
opção Watchdog. Nesta modalidade o microcontrolador
PIC habilita um timer que, uma vez transcorrido um
determinado tempo, efetua o reset do mesmo. Para evitar o
reset do nosso programa deveremos executar ciclicamente
a instrução CLRWDT para zerar o timer antes deste
tempo. Se não zerarmos o WDT neste tempo, o circuito de
watchdog interpretará este como um bloco de programa
em execuç ão e efetuará o reset para bloquea-lo.
COMF f,d
Efetua o complemento do valor contido no registrador
endereç ado pelo parâ metro f.
DECF f,d
Decrementa o conteú do do registrador endereçado pelo
parâmetro f.
DECFSZ f,b
Decrementa o valor de registrador do endereç o f e se o
resultado for zero pula a pró xima instrução.
GOTO k
Determina o desvio incondicional do programa em
execução para o endereç o k. O parâmetro k pode ser
especificado utilizando-se diretamente um valor numérico
do endereço ou então o relativo label.
INCF f,d Incrementa o conteú do do registrador no endereç o f.
INCFSZ f,b
Incrementa o valor do registrador f e se o resultado for
zero pula a pró xima instrução.
IORLW k
Efetua o OR inclusive entre o valor contido no acumulador
W e o valor da constante k.
IORWF f,d
Efetua o OR inclusive entre o valor contido no acumulador
W e o valor contido no registrador endereç ado pelo
parâmetro f.
MOVLW k Passa ao acumulador W um valor constante k.
MOVVF f,d
Copia o conteú do do registrador endereç ado pelo
parâmetro f para o parâ metro de destino d.
MOVWF f
Copia o conteú do do registrador W no registrador de
parâmetro f.
Esta instrução não executa nenhuma operaç ão mas é útil
para inserir atrasos de um ciclo de maquina ou mais.
Esta instrução deve ser colocada no té rmino de cada
subrotina de controle de interrupç ões para retornar o
controle ao programa principal.
RETLW k
Retorna o controle de uma rotina ao programa principal. A
diferença desta em relaç ão à instrução RETURN é que
retflw permite retornar, atravé s do acumulador W, o valor
k ao programa principal.
Esta instrução deve ser inserida no termino de cada
subrotina para retornar a execução ao programa principal.
RLF f,b
Rotaciona o bit contido no registrador do endereç o f para a
esquerda (ou seja do bit menos significativo para o mais
significativo) passando pelo CARRY do registrador
RRF f,b
Rotaciona o bit contido no registrador do endereç o f para
direita (ou seja do bit mais significativo para o menos
significativo) passando pelo bit CARRY do registrador
Bloqueia a execuç ão do programa em andamento e coloca
o PIC em standby.
SUBLW k
Subtrai a constante k do valor memorizado no acumulador
O microcontrolador PIC 16F84A possui quatro fontes de interrupções: Interrupções externas no
pino RB0/INT; Interrupções de overflow TMR0; Interrupções por mudança de estado PORTB; E
interrupções de fim de escrita EEPROM.
Quando uma interrupção ocorre ela fica como pendente, e no próximo ciclo de busca o
processador ira tratar essa interrupção. Quando a interrupção é tratada, o processador suspende a
execução do programa que esta sendo executado e salva seu contexto. Depois o processador irá
armazenar no contador do programa o endereço inicial de uma rotinha de tratamento de interrupção.
O registrador de controle de interrupções (INTCON) grava todas as interrupções como bits de
flag, e também armazena o bit de habilitação de interrupção global (GIE). O GIE habilita ou desabilita
todas as interrupções de uma só vez, e ele é resetado no RESET.
Quando uma interrupção é tratada, o bit GIE é limpado para desabilitar qualquer interrupção
futura, o endereço de retorno é colocado numa STACK e o PROGRAM COUNTER (PC) é carregado
com 0004h. Para interrupções externas (RB0/INT or PORTB) a latência será três à quatro ciclos de
instrução. A latência depende quando a interrupção ocorre e é a mesma para um ou dois ciclos. A fonte
da interrupção pode ser determinada através dos bits de flag. O bit de flag deve ser limpado através de
software antes da reabilitação do “sistema” de interrupções para evitar infinitas interrupções. Uma
interrupt flag é um bit que indica qual foi o tipo de interrupção.
Portanto, o INTCON pode habilitar ou desabilitar os bits de interrupções independentemente (
tipos de interrupções). A figura a seguir mostra como funciona o quadro de interrupções do PIC 16F84A
Figure 4 - Lógica de interrupção
4.1 - Interrupções externas
Esse tipo de interrupção é gerado por um sinal externo conectado ao pino RB0/INT. Portando,
essa porta serve como entrada para um sinal que pode ser processado internamento do microcontrolador.
Interrupções externas no pino RB0/INT é elevado (de 0 para 1) quando o bit INTEDG é setado e baixa (
de 1 para 0) quando o bit INTEDG é limpado. Quando uma borda válida (subida ou descida) aparece no
pino RB0/INT, o bit INTF é setado. Esse tipo de interrupção pode ser desabilitada limpando-se o bit de
controle INTE. O bit de flag INTF deve ser limpo através de software via Rotina de Serviço de
Interrupção antes de habilitar essa interrupção. A interrupção externa pode ligar o processador do modo
“SLEEP” se o bit INTE for setado antes dele entrar no modo “SLEEP”. O status do bit GIE decide se as
conexões do processador para o vetor de interrupção também ligaram ou não.
4.2 - Interrupções de overflow TMR
Esse tipo de interrupção ocorre quando o contador TMR0 estoura. Esse contador é geralmente
utilizado para contar o tempo, e ele pode ser incrementado tanto pelo clock como por um sinal externo.
Um overflow em TMR0 ira setar o bit T01F. A interrupção pode se habilitada ou desabilitada setando ou
limpando o bit de habilitação T01E.
Parte 2 – Acesso à memória cache
Cada “word” na arquitetura computacional estudada representa 1 byte, que por sua vez é o
mesmo que 8 bits. Portanto, temos que:
A memória cache é representada de um conjunto que espaços que nós chamamos cada um desses
espaços como uma linha de uma pilha. Cada linha da memoria cache contem um campo para o
endereço “tag” e outro campo para o dado em si. O dado armazenado na memória cache é
geralmente um bloco de vários endereços, e não apenas um endereço. Sendo assim, cada linha da
cache pode armazenar um bloco de n “words”. Para sabermos quantas linhas uma memória cache
possui, basta dividir o número total de “words” pelo número de “words” que cada linha armazena.
Portanto, temos que:
A memoria principal armazena apenas uma “word” de 8 bits em cada endereço dela. No
mapeamento direto, nos temos que o a quantidade de “linhas” da memoria principal é muito maior
que a quantidade de linhas da memoria cache. O nosso problema consistia em uma memória
principal de 1024 posições e uma memória cache que variava segundo os casos descritos a seguir.
1.1 Caso 1: Cache com 128 words
Nesse caso, a memória cache é composta por 128 “words”.
Tamanho da memória cache em bits:
Quantidade de linhas:
Caso A: Linha com 4 words
Tamanho do endereço das “words” em bits:
!"#$%
= 𝑄𝑡𝑑𝑃𝑜𝑠𝑖çõ𝑒𝑠
!"#$%
Logo, para acessar uma “word” em uma linha da cache com 4 “words” por bloco, se faz
necessário um endereço de 2 bits para diferenciar a “word” nessa linha.
Analisando o mapeamento da memória principal para esse caso, veremos que cada 4 endereços
da memória principal representa um bloco, que será armazenada em uma linha da memória cache.
Os endereços 0 !"
ao 3
!"
serão colocados na linha 0
!"
da memoria cache, já que ela comporta um
bloco de 4 “words”. Quando chegar no endereço 127
!"
, ele armazena esse endereço na ultima
posição da memória cache, a posição 31 !"
. A memória cache pode armazenar até 32 blocos
simultâneos, logo o próximo endereço da memoria principal será armazenado na posição 0
!"
da
cache. Caso já haja um outro bloco nessa linha da cache, ele será removido e colocado o novo bloco
atualizando a respectiva “tag”. Logo, a linha 0
!
da memória cache armazena um conjunto
predefinido de possíveis “tags” da memória principal (a “tag” da cache é igual a “tag” da memória
principal). Para esse caso, a representação do endereço da “word” será de 2 bits, já que são 4
“words” por bloco. Logo, a memória cache vai endereçar cada “word” a partir da do endereço de
dois bits reservado para o campo “word”. Vale salientar, que toda essa sequencia de tag, endereço da
“word” e mapeamento da memória principal na cache é obtida do endereço completo de um
elemento na memoria principal.
Caso B: Linha com 8 words
Tamanho do endereço das “words” em bits:
!"#$%
= 𝑄𝑡𝑑𝑃𝑜𝑠𝑖çõ𝑒𝑠
!"#$%
Logo, para acessar uma “word” em uma linha da cache com 8 “words” por bloco, se faz
necessário um endereço de 3 bits para diferenciar a “word” nessa linha.
O tamanho do endereço das “words” em bits segue o mesmo raciocínio da cache acima de 128
words com 4 words por linha. Logo, para acessar uma “word” em uma linha da cache com 4
“words” por bloco, se faz necessário um endereço de 2 bits para diferenciar a “word” nessa linha.
As configurações seguintes segue o mesmo raciocínio aplicado na cache de 128 words.
Analisando o mapeamento da memória principal para esse caso, veremos que cada 4 endereços
da memória principal representa um bloco, que será armazenada em uma linha da memória cache.
Os endereços 0 !"
ao 3
!"
serão colocados na linha 0
!"
da memoria cache, já que ela comporta um
bloco de 4 “words”. Quando chegar no endereço 255 !"
, ele armazena esse endereço na ultima
posição da memória cache, a posição 63 !"
. A memória cache pode armazenar até 64 blocos
simultâneos, logo o próximo endereço da memoria principal será armazenado na posição 0
!"
da
cache. Caso já haja um outro bloco nessa linha da cache, ele será removido e colocado o novo bloco,
atualizando a respectiva “tag”. Logo, a linha 0 !
da memória cache armazena um conjunto
predefinido de possíveis “tags” da memória principal (a “tag” da cache é igual a “tag” da memória
principal). Para esse caso, a representação do endereço da “word” será de 2 bits, já que são 4
“words” por bloco. Logo, a memória cache vai endereçar cada “word” a partir do endereço de dois
bits reservado para o campo “word”. Vale salientar, que toda essa sequencia de tag, endereço da
“word” e mapeamento da memória principal na cache é obtida do endereço completo de um
elemento na memoria principal.
Caso B: Linha com 8 words
Para esse caso e os demais casos, o mapeamento na da cache na memória principal será análogo
a analise descrita acima mudando o tamanho do bloco e a quantidade de linhas da cache.
Caso C: Linha com 16 words
Caso A: Linha com 32 words
1.3 Caso 3: Cache com 512 words
Nesse caso, a memória cache é composta por 512 “words”.
Tamanho da memória cache em bits:
Quantidade de linhas:
Caso A: Linha com 4 words
O mapeamento da memória cache da memória principal será análogo ao descrito no caso 2,
mudando apenas a quantidade de linhas da cache.
Caso B: Linha com 8 words
Para esse caso e os demais casos, o mapeamento na da cache na memória principal será análogo a
analise descrita acima mudando o tamanho do bloco e a quantidade de linhas da cache.
Caso C: Linha com 16 words