1
SEL-0415 Introdução à Organização de Computadores
Profa. Luiza Maria Romeiro Codá
Departamento de Engenharia Elétrica e de Computação - EESC-USP
Aula de Exercícios 2a Prova –Parte 2
Microcontrolador 8051
Microcontrolador 8051
Microcontrolador 8051
descrição dos pinos
Microcontrolador 8051
descrição dos pinos
Microcontrolador 8051
Função especial da porta P3
5
Microcontrolador 8051(cont)
6
Registradores de 8 bits
Registradores de 16 bits
Registradores de uso do programador
Reset da CPU
7
O reset da CPU é feito através do pino RST mantendo-se um nível alto por, no
mínimo, 24 períodos de oscilador. A CPU responde executando um reset interno
O reset da CPU coloca os seguintes valores nos registradores:
Microcontrolador 8051(cont)
8RAM Interna
RAM
interna
8052
RAM
interna
8051
Fonte: file:///C:/Users/CASA/Downloads/gk_mc1_a2_sw8051%20(2).pdfBanco de registradores é alterado alternado os bit 3 e 4 do
registrado PSW (PSW.3 e PSW.4)
Microcontrolador 8051: RAM interna
Banco de Registradores: selecionado pelos bits RSO e RS1 do PSW
Nº do
banco
RS0 RS1
endereço
0
0
0
00h a 07H
1
0
1
08H a 0Fh
2
1
0
10H a 17H
3
1
1
18 a 1FH
9Microcontrolador 8051: RAM interna
10
Organização das memórias do Microcontrolador 8051
Organização das memórias do Microcontrolador 8051
FLUXOGRAMA
13
Nome do programa
Processamento
Fim do programa
Definição das condições iniciais
Definição da saída do resultado
Representação típica de um fluxograma de uma rotina de um
programa simples.
Progama de adição
Soma de 2 números armazenados na RAM interna utilizando
a instrução ADD A,Rn
14 SOMA
(A) (45h)
(R0) (5Ah)
(A) (A) + (R0)
(6Dh) (A)
FIMPrograma Fonte
ORG 0
MOV A,45h
MOV R0,5Ah
ADD A,R0
MOV 6Dh,A
SJMP $
END
O programa soma o conteúdo da posição 45h com o conteúdo da posição 5Ah RAM interna e
armazena o resultado na posiçãp 6Dh da RAM interna
Endereço da EEPROM
Conteúdo da EEPROM
0000h 74h opcode
0001h 45h Endereço Ram int
0002h A8h opcode
0003h 5Ah Endereço Ram int
0004h 28h opcode
0005h F5h opcode
0006h 6Dh Endereço Ram int
0007h 80h Opcode
0008h FEh Endereço salto
Programa de adição de 2 números armazenados na RAM interna
utilizando a instrução ADD A,Rn e ADD A, @R0
15
SOMA
(A) (45h)
(R0) #5Ah
(A) (A) + ((R0))
(6Dh) (A)
FIM
Programa Fonte
MOV A,45h
MOV R0,#5Ah
ADD A,@R0
MOV 6Dh,A
SJMP $
SOMA
(A) (45h)
(R0) (5Ah)
(A) (A) + (5Ah)
(6Dh) (A)
FIM
Programa Fonte
MOV A,45h
MOV R0,5Ah
ADD A,R0
MOV 6Dh,A
SJMP $
Fonte: Microcontolador 8051- Prentice Hall
Endereço da EEPROM
Conteúdo da EEPROM
0000h 74h opcode
0001h 45h Endereço Ram int
0002h 78h opcode
0003h 5Ah Endereço Ram int
0004h 28h opcode
0005h F5h opcode
0006h 6Dh Endereço Ram int
0007h 80h Opcode
0008h FEh Endereço salto
Endereço da EEPROM
Conteúdo da EEPROM
0000h 74h opcode
0001h 45h Endereço Ram int
0002h 78h opcode
0003h 5Ah Endereço Ram int
0004h 26h opcode
0005h F5h opcode
0006h 6Dh Endereço Ram int
0007h 80h Opcode
FLUXOGRAMA
16
Representação típica de um fluxograma de uma rotina de um programa com loop
.
Nome do programa
Processamento
Fim do programa
Definição das condições iniciais
Definição da saída do resultado
Bloco de tomada de decisão (?). Teste de
uma variável.
Se o teste for falso: processamento de certas informações (toma-se decisão)
não: a condição não foi satisfeita
sim: a condição foi satisfeira
Programa que calcula a quantidade de números menores que 38h de um buffer de
memória que se encontra na posição 60H.
17
Num < 38h
(R0)#60h (R1)#1Bh (7BH)#00h (C)#0b (A)((R0)) (A)(A)-(C)-#38h (C)=0 ? [(A)#38h ?] (7Bh)(7Bh)+1 (R1)(R1)-1 (R1)0 ?N
S
S
FIM
N
(R0)(R0)+1• R0 contém endereço (60H) inicial da tabela;
• R1 é o contador de números verificados;
• 7BH é a posição que vai conter a quantidade de numero <38H; • Carry é zerado;
• O número a ser verificado é copiado para A;
• Verifica se número em A -38H gera carry
• Se carry = 1 número testado ≤ 38H • Então o conteúdo da posição 7BH é
incrementado;
• busca-se outro número para testar • Verifica se todos os números foram
estados caso através do valor de R1 • Se R1 = 0 finaliza programa
• Se R1 ≠ 0, busca-se outro número •
• Se Carry = 0 número testado ≥ 38H • busca-se outro número para testar • Verifica se todos os números foram
estados caso através do valor de R1 • Se R1 = 0 finaliza programa
Programa que calcula a quantidade de números
menores que 38h de um buffer de memória.
Programa Fonte
19
; Inicio do programa que calcula a qte de elementos < #38h ORG 0
AJMP INICIO ;salta para o endereço inicial do programa ORG 100h
INICIO: MOV R0,#60h ;Endereço inicial do buffer de memória
MOV R1,#1Bh ;Quantidades de elementos do buffer de memória MOV 7Bh,#00 ;Zera o contador que armazena a qte de num < #38h ADR2: CLR C ;Limpa o conteúdo do carry-bit
MOV A,@R0 ;Armazena no (A) um elemento do buffer
SUBB A,#38h ;Subtrai o (A) da constante #38h e define o flag (C)
JNC ADR1 ;Se (C)=0 (A>=#38h) => (PC)=ADR1 [não soma um no (7Ah)] INC 7Bh ;Se (C)=1 (A<#38h), soma um no (7Bh)
ADR1: INC R0 ;Aponta para a próxima posição de memória a ser analisada
DJNZ R1,ADR2 ;Se a qte de elementos a serem analisadas é
0, então salta para ADR2 SJMP $ ; Termina o programa se (R1)=0. Fica em Loop nesta posiçãoEND ; Fim físico do programa
Programa que calcula a quantidade de números menores que 38h
de um buffer de memória.
20
ORG 0
AJMP INICIO
ORG 0100h
INICIO: MOV
R0,#60h
MOV
R1,#1Bh
MOV
7Bh,#00
ADR2:
CLR
C
MOV
A,@R0
SUBB
A,#38h
JNC
ADR1
INC
7Bh
ADR1:
INC
R0
DJNZ
R1,ADR2
SJMP $
END
Informações sobra as instruções
Instrução
OPCODE
Nºbytes
AJMP pag + 01XX
21H
2
MOV R0, #data
78h
2
MOV R1, #data
79h
2
MOV data addr,data
75h
3
CLR C
C3h
1
MOC A,@R0
E6h
1
SUBB A, #data
94h
2
JNC addr rel
50h
2
INC data addr
05h
2
INC R0
08h
1
DJNZ R1,end rel
D9h
2
Programa que calcula a quantidade de números
menores que 38h de um buffer de memória.
21
Conteúdo da memória de programa
Endereço da EEPROM Conteúdo da EEPROM 0000H 21H 0001H 00H 0100h 78h 0101h 60h 0102h 79h 0103h 1Bh 0104h 75h 0105h 7Bh 0106h 00h 0107h C3h 0108h E6h 0109h 94h 010Ah 38h 010Bh 50h 010Ch 03h 010Dh 05h 010Eh 7Bh 010Fh 08h 0110h D9h 0111h F5h
ORG 0
AJMP INICIO
ORG 0100h
INICIO: MOV R0,#60h
MOV R1,#1Bh
MOV 7Bh,#00
ADR2: CLR C
MOV A,@R0
SUBB A,#38h
JNC ADR1
INC 7Bh
ADR1: INC R0
DJNZ R1,ADR2
SJMP $
END
22
ORG 0
AJMP INICIO
ORG 0100h
INICIO: MOV
R0,#60h
MOV
R1,#1Bh
MOV
7Bh,#00
ADR2:
CLR
C
MOV
A,@R0
SUBB
A,#38h
JNC
ADR1
INC
7Bh
ADR1:
INC
R0
DJNZ
R1,ADR2
END
Cálculo do Endereço Relativo para Salto
Endereço da EEPROM Conteúdo da EEPROM End rel para salto P frente End rel para salto P trás 0000H 21H 0001H 00H 0100h 78h 0101h 60h 0102h 79h 0103h 1Bh 0104h 75h 0105h 7Bh 0106h 00h 0107h C3h F5h 0108h E6h F6h 0109h 94h F7h 010Ah 38h F8h 010Bh 50h F9h 010Ch 03h 00h FAh 010Dh 05h 01h FBh 010Eh 7Bh 02h FCh 010Fh 08h 03h FDh 0110h D9h FEh 0111h F5h FFh
23
Conteúdo da memória RAM interna
MOV R0,#60h : RAM interna posição 00h(pois bloco 0 de registradores
que está ativo) é armazenado 60h
MOV R1,#1Bh : RAM interna posição 01h(pois bloco 0 de registradores
que está ativo) é armazenado 1Bh
MOV 7Bh,#00 : RAM interna posição 7Bh é armazenado 00h quantidade de dados
memores que 38h
ADR2:
CLR
C
: O carry C do PSW é zerado
MOV
A,@R0: o conteúdo da posição 60h da RAM interna é
copiado para o registrador acumulador (primeiro dado a ser verificado)
SUBB A,#38h : é extraído do valor do acumulador o valor 38h
JNC
ADR1: o programa é desviado para o endereço que contém a instrução
INC R0 no endereço 010Fh (PC = 010Fh) se o bit Carry do PSW for diferente de zero,
caso em que A é maior que 38h
INC
7Bh
:incrementa o conteúdo do endereço7Bh (se 00h será 01h)
ADR1:
INC
R0
: R0 é incrementado (de 60 p 61h) para apontar p o prox dado
DJNZ R1,ADR2: decrementa o valor de R1(que inicialmente é 1Bh passando para
1Ah e salta para a posição ADR2 no endereço 0107h (PC=0107h) se R1 não for zero
END
24
Modo de endereçamento das instruções do 8051
Endereçamento Direto:
O endereço do operando é especificado por um campo na instrução.
Somente Os Bytes menos significativos da RAM de dados interna e região de SFR podem ser
diretamente acessdas; (Ex; MOV 30h,A)
Endereçamento Indireto:
a instrução especifica um registrador que contém o endereço do
operando. RAM externa e RAM interna podem ser indiretamente endereçáveis.
Se o endereço for de 8 bits, seu valor é armazenado em R0 ou R1;
Se o endereço for de 16 bits, seu valor é armazenado no registrador DPTR;
(Exs: MOVX A,@DPTR e MOV @R0,A)
Endereçamento por Registrador:
Instruções que acessam registradores de R0 a R7 do banco de
registradores ou algumas instruções específicas a certos registradores.
Tais instruções são eficientes por eliminarem um byte de endereço. O próprio OPCODE já
indica qual a tarefa a ser realizada. (Ex: MOV R0,A)
Endereçamento Imediato:
quando uma constante é apresentada na instrução após o símbolo #;
(Ex : ADD R0,#30h)
Endereçamento Indexado:
Sómente a memória de Programas, cuja única operação é leitura,
pode ser acessada por esse modo. É usado para fazer leituras em tabelas na Memória de
Programa. Um registrador de 16 bits(DPTR) aponta para o início da tabela enquanto o
Acumulador é ajustado para a e-nesima posição da mesma. O endereço de um valor da tabela é
formado pelo soma do valor do acumulador com o valor do DPTR. (Ex: MOVC A,@A+DPTR)
Lista nº 11
25
15. Dado o segmento de programa da Figura 1 escrito em assembly para o microcontrolador Intel
8051. Responda:
15.1 Determine os valores de End1, End2,End3 e dado1 para que: o endereço da instrução MOV A,
#dado1 seja
100CH
,
que o endereço acessado na memória RAM seja 2009H, que o endereço acessado
na memória EPROM seja 2010H e que a rotina chamada inicie no endereço 1100H.
End da EEPROM Conteúdo da EEPROM significado Número de bytes
End1 75H Opcode de MOV DPTR, #End2 3
100Ch 74H Opcode de MOV A,#dado1 2
dado1 de 8 bits
93H Opcode MOVC A,@A+DPTR 1
F8H Opcode de MOV R0,A 1
F0H MOVX A,@DPTR 1
12H Opcode LCALL ROT 3
80H Opcode da SJMP $ 2
26 End da EEPROM Conteúdo da EEPROM significado Número de bytes
End1 75H Opcode de MOV DPTR, #End2 3 MSB End2
LSB End2
100CH 74H Opcode de MOV A,#dado1 2
Dado1 dado1 de 8 bits
93H Opcode MOVC A,@A+DPTR 1
F8H Opcode de MOV R0,A 1
F0H MOVX A,@DPTR 1
12H Opcode LCALL ROT 3
MSB ROT LSB ROT
80H Opcode da SJMP $ 2
Figura 1
Lista nº 11
Resolução: Alocando o conteúdo da EEPROM: o endereço da instrução MOV A,
#dado1 é 100CH, o endereço acessado na memória RAM é 2009H, o
endereço acessado na memória EPROM é 2010H e a rotina chamada inicia no
endereço 1100H então ROT = 1000H
Lista nº 11
27
15.1 MOV A, #dado1 esta no 100CH, endereço acessado na memória RAM = 2009H;
o endereço acessado na memória EPROM =2010H e ROT=1100H
Resposta: End3 = ROT = 1100H
End da EEPROM Conteúdo da EEPROM significado Numero De Bytes
ROT= 1100H 98H Opcode de SUBB A,R0 1
1101H E5H Opcode de MOV 20H,A 2
1202H 20H 20H= endereço acessado
da RAM interna cujo conteúdo é copiada em A
1103H 22H Opcode de RET 1
28
Lista11
.
15.1 Resposta: MOV A, #dado1 esta no 100CH,colocando os endereços
anteriores a 100CH verifica-se que End1 é 1009H. End2 é o valor armazenado
em DPTR e como o enunciado diz que o endereço acessado na memória RAM =
2009H, a instrução que acessa é MOVX A, DPTR, portanto DPTR=End2 =2009H
End da EEPROM Conteúdo da EEPROM significado Número de bytes
End1 =1009H 75H Opcode de MOV DPTR, #End2 3
100AH MSB End2
100BH LSB End2
100CH 74H Opcode de MOV A,#dado1 3
100DH dado1 dado1 de 8 bits que é movido para o Ac.
100EH 93H Opcode MOVC A,@A+DPTR 1
100FH F8H Opcode de MOV R0,A 1
1010H F0H Opcode de MOVX A,@DPTR 1
1011H 12H Opcode de LCALL ROT 3
1012H MSB ROT MSB do Endereço da
subrotina
1013H LSB ROT LSB do Endereço da subrotina
1014H 80H Opcode da SJMP $ 2
29
Lista11
.
15.1 Resposta: O enunciado diz que o endereço acessado na memória
EPROM seja 2010H, e a EEPROM é acessada pela instrução MOVC A,@A+DPTR,
então A+DPTR = 2010H, e o valor de A é = dado1. Como já se sabe que DPTR =
2009H, ou seja, dado1+ DPTR= 2010H, então dado1 = 2010H – 2009H = 07H
End da EEPROM
Conteúdo da EEPROM
significado Número de bytes
1009H 75H Opcode de MOV DPTR, #End2 3
100AH MSB End2
100BH LSB End2
100CH 74H Opcode de MOV A,#dado1 3
100DH dado1 dado1 de 8 bits que é movido para o Ac.
100EH 93H Opcode MOVC A,@A+DPTR 1
100FH F8H Opcode de MOV R0,A 1
1010H F0H Opcode de MOVX A,@DPTR 1
1011H 12H Opcode de LCALL ROT 3
1012H MSB ROT MSB do Endereço da
subrotina ( endereço 1100H) 1013H LSB ROT LSB do Endereço da subrotina
( endereço 1100H)
1014H 80H Opcode da SJMP $ 2
1015H FEH Endereço relativo do opcode
SJMP
30
Lista11
.
15.1 Resposta: Colocando os valores obtidos no programa em assembly
e completando o conteúdo da memória de programa fica:
End da
EEPROM
Conteúdo
da EEPROM
1009H
75H
100AH
20H
100BH
09H
100CH
74H
100DH
07H
100EH
93H
100FH
F8H
1010H
F0H
1011H
12H
1012H
11H
1013H
00H
1014H
80H
1015H
FEH
ORG 1009H
MOV DPTR, #2009H
MOV A,# 07H
MOVC A, @A+DPTR
MOV R0,A
MOVX A,@DPTR
LCALL ROT; o endereço ROT = 1100H
SJMP $
ORG 1100H
ROT: SUBB A,R0
MOV 20H,A
RET
END
Figura 1
31
15.2 Dado um “reset” no microcontrolador 80C51, em função das características
do registrador SP (stack pointer ou ponteiro de pilha) responda qual o valor do
SP, da pilha e do PC (Program Counter), após a instrução (LCALL) de chamada de
subrotina ter sido executada, e quais esses valores após a instrução RET da
subrotina ter sido executada?
End da
EEPROM
Conteúdo
da EEPROM
1009H
75H
100AH
20H
100BH
09H
100CH
74H
100DH
07H
100EH
93H
100FH
F8H
1010H
F0H
1011H
12H
1012H
11H
1013H
00H
1014H
80H
1015H
FEH
ORG 1009H
MOV DPTR, #2009H
MOV A,# 07H
MOVC A, @A+DPTR
MOV R0,A
MOVX A,@DPTR
LCALL ROT;
o endereço ROT = 1100H
SJMP $
ORG 1100H
ROT: SUBB A,R0
MOV 20H,A
RET
END
Figura 1
Opcode LCALL
Endereço
da subrotina
1100H
Lista nº 11
32
15.2 Resposta: Dado um “reset” no microcontrolador 80C51, o registrador SP é inicializado com o valor 07H.
Enquanto a instrução LCALL ROT é executada o PC contém o endereço da instrução seguinte à ela, que neste caso do programa é a instrução SJMP $ que está na posição 1014H por que a instrução LCALL ocupa 3 bytes ( os endereços 1011H, 1012H e 1013H). Porém, ao finalizar a execução da instrução LCALL o microcontrolador irá executar a subrotina que inicia na posição 1100H, portanto, após a execução da instrução LCALL o PC terá o endereço da subrotina.. Após execução da instrução LCALL ROT Após execução da instrução RET Valor de SP Valor da Pilha (conteúdo de SP) Valor do PC
(Endereço da próxima instrução a ser executada) 1100|H
End da
EEPROM
Conteúdo
da EEPROM
1009H
75H
100AH
20H
100BH
09H
100CH
74H
100DH
07H
100EH
93H
100FH
F8H
1010H
F0H
1011H
12H
1012H
11H
1013H
00H
1014H
80H
Opcode LCALL
Endereço
da subrotina
1100H
Lista nº 11
33
15.2 Resposta ( continuação): Porém, como o PC passará a ter o endereço da subrotina, o endereço da próxima
instrução a LCALL, que é no caso a SJMP< seria perdido. Portanto, quando a instrução LCALL é executada, o
microcontrolador salva o endereço da próxima instrução(SJMP) na pilha. O SP do 8051 é incrementável, a instrução LCALL ROT O microcontrolador incrementa o SP (SP <- SP + 1 = 07 +1) que passa a ter o valor 08H e salva nessa posição da RAM interna os bytes MENOS significativos do endereço da próxima instrução a LCALL que é a instrução SJUMP que está no endereço 1014He cujos bytes menos significativos são 14H. O SP é mais uma vez incrementado
e passa a apontar para a posição 08H da RAM interna e nessa posição o
microcontrolador armazena o 8 bytes MAIS significativos do endereço de SJMP que é 10H. Portanto ,o valor da Pilha após a execução da instrução LCALL é 10H
End da
EEPROM
Conteúdo
da EEPROM
1009H
75H
100AH
20H
100BH
09H
100CH
74H
100DH
07H
100EH
93H
100FH
F8H
1010H
F0H
1011H
12H
1012H
11H
1013H
00H
1014H
80H
1015H
FEH
Opcode LCALL Endereço da subrotina 1100H7FH
07H
08H
00H
09H
10H
14H
Valor desconhecido
Endereço
ram interna 128 bytes inferiores
SP
Valor Antes da
execução de
LCALL
SP
Valor após
a execução
de LCALL
34 Após execução da instrução LCALL ROT Após execução da instrução RET Valor de SP 09H Valor da Pilha (conteúdo de SP) 10H Valor do PC (Endereço da próxima instrução a ser executada) 1100H
End da
EEPROM
Conteúdo
da EEPROM
1009H
75H
100AH
20H
100BH
09H
100CH
74H
100DH
07H
100EH
93H
100FH
F8H
1010H
F0H
1011H
12H
1012H
11H
1013H
00H
1014H
80H
1015H
FEH
Opcode LCALL
Endereço
da subrotina
1100H
35
15.2 Resposta ( continuação): Quando o microcontrolador finaliza a execução da subrotina encontra a instrução RET.
Essa instrução faz com que o conteúdo da pilha = 10H (que é o conteúdo da posição 09H apontada por SP) seja armazenada em PCH ( que é o registrador que guarda os bytes mais significativos do PC). Então o ponteiro SP é decrementado (SP<-SP-1 =08H) e o conteúdo dessa posição ( 14H) é armazenado em PCL (que é o registrador que guarda os bytes menos significativos do PC). O PC passa então a ter o endereço 1014H que é o endereço da instrução SJMP $, que é a instrução seguinte à instrução LCALL ROT no programa principal, recuperando assim o endereço., passando a executar o programa a partir dessa posição. O ponteiro SP é decrementado mais uma vez
(SP<-SP-2 =07H), voltando a apontar para a posição inicial, posição 07H da RAM interna cujo conteúdo não foi modificado nesse programa.
End da
EEPROM
Conteúdo
da EEPROM
1009H
75H
100AH
20H
100BH
09H
100CH
74H
100DH
07H
100EH
93H
100FH
F8H
1010H
F0H
1011H
12H
1012H
11H
1013H
00H
1014H
80H
1015H
FEH
Opcode LCALL Endereço da subrotina 1100H7FH
07H
08H
00H
09H
10H
14H
Valor desconhecido
Endereço
ram interna 128 bytes inferiores
SP
Valor Após a
execução da
instrução RET
SP
Valor após
a execução
de LCALL
36 Após execução da instrução LCALL ROT Após execução da instrução RET Valor de SP 09H 07H Valor da Pilha (conteúdo de SP) 10H Desconhecido pois não foi usado nesse
programa Valor do PC (Endereço da próxima instrução a ser executada) 1100H 1014H
15.2 Resposta
Exemplo de exercício sobre Pilha:
37
Supondo que um microcontrolador estava executando um programa onde o banco 1 de
registradores tenha sido ativado e o ponteiro SP tenha sido carregado com o valor 0FH. Em
uma linha do programa, no endereço 0104H tinha uma instrução de chamada de subrotina
LCALL 2010H., responda:
a) Qual o valor do SP, valor da Pilha e valor do PC após a instrução LCALL ser executada
b) Qual o valor do SP, valor da Pilha e valor do PC após a instrução RET ser executada
Após execução da instrução LCALL
Após execução da instrução RET
Valor de SP 11H
SP <- SP+2 o ponteiro SP é incrementado duas vezes da posição inicial(0Fh):
Em (SP+1) é armazenado o LSB do endereço de retorno ao programa principal
Em (SP+2) é armazenado o MSB do endereço de retorno ao programa principal)
0FH (recuperado endereço inicial de SP) Valor da Pilha (conteúdo de SP) 01H
( MSB do endereço de retorno ao programa principal (Instrução SJMP $ endereço 1014Hl)
Valor da posição 0FH (não conhecido neste exercicio) Valor do PC (Endereço da próxima instrução a ser executada) 2010H (endereço da subrotina) 0107H (endereço da instrução seguinte a instrução LCALL que ocupa3 bytes (0104H, 0105H 0106H
Lista nº 11
38
15.3 Considerando o valor do ponteiro de pilha do ítem 15.2, quais os bancos
de registradores que estão liberados?
Resposta: Se SP = 07H, então o banco 0 é que está liberado para utilização do
programador, pois o banco 0 tem endereço de R0 a R7 de 00H a 07H,
respecticamente
39
15.4 Qual (ou quais) instrução(s) da Figura 1 apresenta(m)
modo de endereçamento imediato. Explique porque?
Resposta:
40
16. Baseado na estrutura do processador 8051, onde o fluxograma e o assembly do programa
que será executado, é mostrado na Figura 2, o qual executa a soma do valor 1Ah com o valor 5Ah
e o resultado é armazenado na RAM externa. Responda as questões abaixo, lembrando que:
• AC: acumulador de 8 bits;
• DPTR de 16 bits;
• Ocorre um reset na CPU após a energização do microcontrolador;
16.1 Mostre quais os passos necessários para executar uma instrução localizada no endereço
0105h.
Lista nº 11
41
Lista 11.
16.1 Mostre quais os passos necessários para executar uma instrução
localizada no endereço 0105h.
End da EEPROM Conteúdo da EEPROM significado Nº bytes 0000H Opcode AJMP Salta para outro endereço numafaixa de 2Kbytes referentes à atual posição da memória de programa.( salta p endereço INICIO)
2
2ª byte AJMP Define o endereço de salto 0100H
0100H Opcode de
MOV A, 45H
Copia o conteúdo da posição 45H da RAM interna no acumulador
2
0101H 45H
0102H Opcode de MOV R0, #5AH
Copia o valor do 2º byte da instrução(5AH) em R0
2
0103H 5AH Valor
0104H Opcode de ADD A,RO Soma o conteúdo de R0 ao conteúdo do acumulador e salva resultado no acumulador
1
0105H Opcode do MOV DPTR, #1000H Opcode LCALL ROT 3
0106H 10H MSB do valor da instrução
0107H 00H LSB do valor da instrução
Opcode de MOVX @DPTR,A Copia no endereço da RAM externa contido em DPTR o valor do
acumulador(soma de r0 com A)
1
Opcode do SJMP $ Salta p o endereço relativo ao endereço da instrução -128 a 128
2 Endereço relativo do opcode de
SJUMP a esta posição
Figura 2
42 Lista 11. 16.1 Mostre quais os passos necessários para executar uma instrução localizada no endereço 0105h. Resp:
O PC é carregado com endereço da instrução que será executada (0105H).
No chip do microprocessador o pino /PSEN é colocado em nível baixo, sinalizando que será acessada memória de Programa(EEPROM), e o pino ALE é colocado em nível alto, indicando a presença de endereço no duto multiplexado (P0) . O microprocessador coloca então os valores do 8 bits LSB (05H) do endereço na porta paralela P0 e dos MSBs na porta paralela P2.
Os 8 bits menos significativos do endereço são armazenado em um latch, para que esse endereço esteja presente na entrada de endereços da memória de programa (EEPROM) durante todo o tempo de acesso à memória e possibilite seu conteúdo ser acessado.
Então, o microprocessador coloca o pino ALE em nível baixo indicando que a porta multiplexada P0 foi transformada em duto de dados e está apta a receber os dados da memória.
O conteúdo da posição cujo endereço está presente nas entradas de endereço da memória é acessado e
apresentada nas saídas de dados da memória. O conteúdo dessa posição que corresponde ao OPCODE da instrução MOV DPTR,#1000H ( cujo valor é 90H), transita agora pelo duto multiplexado da porta P0, sendo esse valor
carregado no registrador de instrução(RI) na CPU. O valor desse OPCODE é armazenado no registrador RI e então é decodificado pelo processador e este processo define se a instrução tem apenas 1 ou mais bytes. No caso desta instrução, são 3 bytes, então o PC é incrementado de uma vez, a porta P0 passa a conter esse valor que é o
endereço do próximo byte onde está o valor 10H que será armazenado em DPH. O PC é novamente incrementado e para acessar o próximo byte que contém o valor 00H que será armazenado em DPL
Após finalizada a busca dos dois próximos bytes, a execução da instrução é finalizada armazenando o valor desses dois bytes em DPL e DPH, e portanto DPTR = 1000H
0105H 90H Opcode MOV DPTR, #1000H 3 bytes
0106H 00H LSB do valor da instrução
43
Para entender melhor os passos listador no slide 37
44
45 End da EEPROM Conteúdo da EEPROM significado Nº bytes
0000H 21H Pula para a posição INICIO e o opcode depende do tamanho do saltoAJMP ( 01H, 21H, 41H, 61H, 81H, A1H, C1H ou E1H)
2
0001H 00H O valor depende do endereço INICIO em relação à instrução
0100H E5H Opcode de MOV A, 45H 2 0101H 45H 45H 0102H 78H Opcode de MOV R0, #5AH 2
0103H 5AH Valor do 2º byte da instruçao
0104H 28H Opcode de ADD A,RO 1
0105H 90H Opcode do MOV DPTR, #1000H 3
0106H 00H 00H
0107H 10H 10H
0108H F0H Opcode de MOVX @DPTR,A 1
0109H 80H Opcode do SJMP $ 2
010AH FEH Endereço relativo desta posição até opcode SJUMP
Lista 11.
16.2 Qual o conteúdo da memória principal após a execução programa (memória de
programa )?
46
Lista 11.
16.3 Qual o conteúdo da RAM interna
após execução
deste programa ?
16.4 Ao final da execução do programa qual o valor da posição 1000H da
RAM
externa?
16.3 Resp: A = 74H, DPL = 00H, DPH= 10H, R0 = 5AH
conteúdo da posição 45H = 1AH e SP= 07H
16.4 Resp: o conteúdo da posição 1000H da RAM externa é
74H
47
Como funciona a instrução SJUMP $ ou SJUMP end rel 8?
aqui: Sjump aqui = sjump $; salta para o endereço onde
; está o OPCODE da SJUMP
Como fica na memória de programa?
Endereço
Conteúdo
Significado (comentários)
0105H
90H
Opcode do MOV DPTR, #1000H
0106H10H
MSB do endereço 1000H
0107H00H
LSB do endereço 1000H
0108HF0H
Opcode de MOVX @DPTR,A
0109H80H
Opcode do SJMP $
010AH
FEH
Endereço relativo desta posição até opcode SJUMPAnalisando parte
do programa anterior:
.
.
.
MOV DPTR, #1000H
MOVX @DPTR,A
SJUMP $
END
48
Como funciona a instrução SJUMP end rel 8 ?
Como é calculado o valor FEH que fica na memória de programa?
Ender
eço
Conteú
do
Posição relativa ao
endereço 010AH
0105H90H
FAH
0106H10H
FBH
0107H00H
FCH
0108HF0H
FDH
0109H80H
FEH
010AH
FEH
Posição considerada FFH
Analisando parte
do programa
anterior:
.
.
.
MOV DPTR, #1000H
MOVX @DPTR,A
SJUMP $
END
O valor FEH é o endereço para o qual o PC vai saltar, que é calculado pelo compilador.
Neste caso é o endereço do OPCODE da instrução SJUMP. O compilador considera que
essa posição onde está FEH é a posição referência na qual o salto será
calculado´.Portanto, esta posição é considerada posição FFH, como irá saltar para uma
anterior onde está o opcode do SJUMP o valor do endereço relativo seria FEH e se fosse
saltar para a instrução MOVX @DPTR,A, então seria FDH
Analisando parte
do programa anterior:
.
.
.
MOV DPTR, #1000H
MOVX @DPTR,A
aqui: SJUMP aqui
Saltos incondicionais do 8051
49
Existem quatro tipos no 8051:
• SJUMP rótulo : Desvio curto relativo. Usa um offset de oito bits, podendo ser
negativo ou positivo, ou seja o endereço de desvio pode ser de até 128 bytes a
menos ou 127 bytes a mais, respectivamente, em relação à posição atual da
memória.
• O formato da instrução é: opcode Offset relativo Exemplo: SJMP 00h; ;desvia
para a próxima instrução (offset = 0) NEXT: SJMP 0FEH; ;retorna para a instrução
anterior (offset = -1)
•
SJUMP
•
AJUMP
•
LJUMP
Saltos incondicionais do 8051
50
• SJUMP end rel:
Desvio curto relativo. Usa um offset de oito bits, podendo ser
negativo ou positivo, ou seja o endereço de desvio pode ser de até 128 bytes a
menos ou 127 bytes a mais, respectivamente, em relação à posição atual da
memória;
É uma instrução de 2 bytes, o primeiro byte é o OPCODE e o segundo byte é o
endereço da localidade de memória (00H a FFH). ;
Exemplos:
SJMP 00h ;desvia para a próxima instrução (offset = 0)
aqui:
SJMP FEH ;retorna para a instrução anterior (offset = -1)
Ou
Saltos incondicionais do 8051
51
• AJUMP end rel:
Desvio Absoluto
.Esta instrução desvia o fluxo do programa para
outro endereço numa faixa de 2Kbytes referentes à atual posição da memória
de programa. Dependendo do salto que será dado o valor do OPCODE muda:
OPCODE Instrução
01H AJUMP Pagina +00XX Salto até 255 posições 21H AJUMP Pagina +01XX Salta de 256 a 511 posições 41H AJUMP Pagina +02XX Salta de 511 a 766 posições 61H AJUMP Pagina +03XX Salta de 767 a 1023 posições 81H AJUMP Pagina +04XX Salta de 1024 a 1278 posições A1H AJUMP Pagina +05XX Salta de 1279 a 1534 posições C1H AJUMP Pagina +06XX Salta de 1525 a 1790 posições E1H AJUMP Pagina +07XX Salta de 1791 até 2k posições
Exemplo:
AJMP pula ;desvia para a instrução que tem o rótulo pula MOV A, #01H;
Saltos incondicionais do 8051
52
• LJUMP end 16bits:
Esta é a instrução de desvio longo que usa endereços de 16 bits
como parte da instrução. Possibilita acessar qualquer localização no espaço de 64Kb de
memória de programa.
é uma instrução de 3 bytes, o primeiro é o OPCODE o segundo é o 8 bits mais
significativos do endereço de salto e o 3º byte contém os 8 bits menos significativos do
endereço de salto
Exemplo:
ORG 1000H
temp: LJMP rotulo
CLR A;
Rotulo: LJMP temp
Endereço EEPROM conteúdo comentários1000H 02H Salta para o endereço que estão nos 2 bytes seguintes a esta instrução (rotulo)
1001H 04H Byte mais significativo do endereço do salto 1004H 1002H 10H Byte menos significativo do endereço do salto 1004H 1003H E4H CLR A ( instrução de 1 byte)
1004H 02H Salta para o endereço que estão nos 2 bytes seguintes a esta instrução (temp)
1005H 10H Byte mais significativo do endereço do salto 1000H 1006H 00H Byte menos significativo do endereço do salto 1000H
Saltos incondicionais do 8051
53
• JMP @A+DPTR
:
O conteúdo do PC é armazenado com o valor
da soma dos conteúdos dos registradores DPTR e
acumulador, prosseguindo portanto a execução do
programa a partir deste ponto
Saltos condicionais do 8051
Instruções
Ação
Nº de
bytes
JZ
Salta se A = 0
2
JNZ
Salta se A ≠0
2
DJNZ
Decrementa e Salta se A ≠0
3
CJNE A,byte
Salta se A ≠ byte
3
CJNE reg,#dado
Salta se byte ≠ #dado
3
JC
Salta se CY = 1
2
JNC
Salta se CY = 0
2
JB
Salta se bit = 1
3
JNB
Salta se bit = 0
3
JBC
Salta se bit = 1 e reseta o bit (clear bit)
3
Saltos condicionais do 8051
55
• Exemplo: Escrever um programa para determinar se R5 contém o valor 0. Se
for verdadeiro, armazene 55H, se for falso finalize o programa.
ORG 0000H
MOV A, R5 ; copia R5 para A
JNZ SALTO ; salta se A não é zero (A ≠0)
MOV R5, #55H
SALTO: SJMP SALTO
END
Endereço da EEPROM Conteúdo significado0000H EDH Opcode de MOV A,R5 (1 byte) copia o valor de R5 para A
0001H 70H Opcode de JNZ salto (2 Bytes) 0002H
0003H 7DH Opcode de MOV R5, #55H (2 bytes)
0004H 55H Valor do segundo byte da instrução MOV R5, #55H 0005H 80H Opcode do SJMP salto (2 bytes)
Exercício Resolvido Aplicações de microcontroladores:
Prentice Hall Microcontroladores 8051 56
57
58
59
17. Baseado na estrutura do processador 8051, onde o fluxograma e o assembly do
programa que será executado, é mostrado na Figura 3, o qual executa a soma do valor
1Ah com o valor 7Fh e o resultado é armazenado na posição 6Dh da RAM interna.
Responda as questões abaixo, lembrando que:
• AC: acumulador de 8 bits;
• DPTR de 16 bits;
• Ocorre um reset na CPU após a energização do microcontrolador;
17.1 Qual o conteúdo da memória principal para esse programa (memória de
programa)?
17.2 Qual o conteúdo da RAM interna para esse programa ?
17.3 Qual o valor do PC (Counter Program) quando a instrução ADD A,@R0 está
sendo executada?
60