Prévia do material em texto
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 2 Microcontrolador 8051 descrição dos pinos 3 Fonte: file:///C:/Users/CASA/Downloads/gk_mc1_a2_sw8051%20(2).pdf Microcontrolador 8051 descrição dos pinos 4 Fonte: file:///C:/Users/CASA/Downloads/gk_mc1_a2_sw8051%20(2).pdf Microcontrolador 8051 Função especial da porta P3 5Fonte: file:///C:/Users/CASA/Downloads/gk_mc1_a2_sw8051%20(2).pdf 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) 8 RAM Interna RAM interna 8052RAM interna 8051 Fonte: file:///C:/Users/CASA/Downloads/gk_mc1_a2_sw8051%20(2).pdf Banco 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 9 Microcontrolador 8051: RAM interna 10 Endereço do Banco de Registradores Fonte: file:///C:/Users/CASA/Downloads/gk_mc1_a2_sw8051%20(2).pdf Organização das memórias do Microcontrolador 8051 11 Organização das memórias do Microcontrolador 8051 12 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. Fonte: Microcontolador 8051- Prentice Hall 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) FIM Programa 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 Fonte: Microcontolador 8051- Prentice Hall 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 0008h FEh Endereço salto 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 Controle do loop Fonte: Microcontolador 8051- Prentice Hall 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 Fonte: Microcontolador 8051- Prentice Hall • 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 • Se R1 ≠ 0, busca-se outro número Programa que calcula a quantidade de números menores que 38h de um buffer de memória. 18 Fonte: Microcontolador 8051- Prentice Hall 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ção END ; Fim físico do programa Programa que calcula a quantidade de números menores que 38h de um buffer de memória. Fonte: Microcontolador 8051- Prentice Hall 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. Fonte: Microcontolador 8051- Prentice Hall 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 ; é armazenado 60h na RAM interna posição 01h (pois o ;bloco 0 de registradores está que está ativo) MOV R1,#1Bh ; é armazenado 1Bh na RAM interna posição 01h (pois o ;bloco 0 de registradores está que está ativo) MOV 7Bh,#00 ; na posição 7Bh da RAM interna é armazenado 00h ; que é a quantidade de dados menores 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 para 61h) para apontar para o ; próximo dado DJNZ R1,ADR2; decrementa o valor de R1(que inicialmente é 1Bh passando para1Ah ;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: os itens de 15.1 a 15.4 Figura 1 ORG 0000h LJMP end1 ORG end1 MOV DPTR, #end2 MOV A,#dado1 MOVC A,@A+DPTR MOV R0,A MOVX @DPTR,A LCALL rot SJMP $ ORG end3 Rot: SUBB A,R0 MOV 20h,A RET ORG 2010h dados: DB 25h END Como ao ser energizado o Microcontrolador 8051 carrega o registrador PC com o valor 0000h. Portanto, a 1ª instrução a ser executada deve estar armazenada nessa posição. O programador deve então incluir nesse endreço uma instrução de salto (LJMP ou SJMP) para o endereço em que o programa inicia ( no caso desse exemplo, endereço end1 Lista nº 11 26 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 ( então rot = 1100h). End da EEPROM (hexadecimal) Conteúdo da EEPROM (hexadecimal) significado Número de bytes end1 75 Opcode de MOV DPTR, #end2 3 ? ? 100C 74 Opcode de MOV A,#dado1 2 ? dado1 de 8 bits 93 Opcode MOVC A,@A+DPTR 1 F8 Opcode de MOV R0,A 1 F0 MOVX @DPTR,A 1 12 Opcode LCALL rot 3 11 00 80 Opcode da SJMP $ 2 Figura 1 ORG 0000h LJMP end1 ORG end1 MOV DPTR, #end2 MOV A,#dado1 MOVC A,@A+DPTR MOV R0,A MOVX @DPTR,A LCALL rot SJMP $ ORG end3 rot: SUBB A,R0 MOV 20h,A RET ORG 2010h dados: DB 25h END Lista nº 11 27 15.1 MOV A, #dado1 está no endereço 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 Hexadecimal Conteúdo da EEPROM (hexadecimal) significado Numero De Bytes rot= 1100 98 Opcode de SUBB A,R0 1 1101 E5 Opcode de MOV 20h,A 2 1202 20 20h= endereço acessado da RAM interna cujo conteúdo é copiada em A 1103 22 Opcode de RET 1 Figura 1 ORG 0000h LJMP end1 ORG end1 MOV DPTR, #end2 MOV A,#dado1 MOVC A,@A+DPTR MOV R0,A MOVX @DPTR,A LCALL rot SJMP $ ORG end3 rot: SUBB A,R0 MOV 20h,A RET ORG 2010h dados: DB 25h END Tabela referente à subrotina rot 28 Lista 11. 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 (hexadecimal) Conteúdo da EEPROM significado Número de bytes End1 =1009 75h Opcode de MOV DPTR, #End2 3 100A MSB End2 100B LSB End2 100C 74h Opcode de MOV A,#dado1 3 100D dado1 dado1 de 8 bits que é movido para o Ac. 100E 93h Opcode MOVC A,@A+DPTR 1 100F F8h Opcode de MOV R0,A 1 1010 F0h Opcode de MOVX A,@DPTR 1 1011 12h Opcode de LCALL rot 3 1012 MSB rot MSB do Endereço da subrotina 1013 LSB rot LSB do Endereço da subrotina 1014 80h Opcode da SJMP $ 2 Figura 1 ORG end1 MOV DPTR, #end2 MOV A,#dado1 MOVC A,@A+DPTR MOV R0,A MOVX @DPTR,A LCALL rot SJMP $ ORG end3 rot: SUBB A,R0 MOV 20h,A RET ORG 2010h dados: DB 25h END 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 Figura 1 ORG end1 MOV DPTR, #end2 MOV A,#dado1 MOVC A,@A+DPTR MOV R0,A MOVX @DPTR,A LCALL rot SJMP $ ORG end3 rot: SUBB A,R0 MOV 20h,A RET ORG 2010h dados: DB 25h END 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 EEPROM 0000h 02h 0001h 10h 0002h 09h : : : : 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 0000h LJMP 1009h ORG 1009h MOV DPTR, #2009h MOV A,# 07H MOVC A, @A+DPTR; posição 2010h (A) = 25h MOV R0,A MOVX @DPTR, A LCALL rot; o endereço rot = 1100h SJMP $ ORG 1100h rot: SUBB A,R0 MOV 20h,ARET ORG 2010h Dado: DB 25h END Figura 1 Obs: na RAM externa na posição 2009h será armazenado o valor de A = 22h 31 Lista11. 15.1 Resposta: continuação do preenchimento do conteúdo da memória End da EEPROM Conteúdo EEPROM : : : : 1100h 98h 1101h F5h 1102h 22h : : : : : : : : : : : : 2010h 25h ORG 0000h LJMP 1009h ORG 1009h MOV DPTR, #2009h MOV A,# 07H MOVC A, @A+DPTR; posição 2010h (A) = 25h MOV R0,A MOVX @DPTR, A LCALL rot; o endereço rot = 1100h SJMP $ ORG 1100h rot: SUBB A,R0 MOV 20h,A RET ORG 2010h Dado: DB 25h END Figura 1 Obs: na RAM externa na posição 2009h será armazenado o valor de A = 25h A diretiva DB reserva bytes com os valores indicados no programa, no exemplo = 25h 32 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 0000h LJMP 1009h ORG 1009H MOV DPTR, #2009H MOV A,# 07H MOVC A, @A+DPTR MOV R0,A MOVX A,@DPTR LCALL ROTINA; o endereço ROTINA = 1100H SJMP $ ORG 1100H ROTINA: SUBB A,R0 MOV 20H,A RET ORG 2010h Dado: DB 25h END Figura 1 Opcode LCALL Endereço da subrotina 1100H Lista nº 11 33 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) 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 Lista nº 11 34 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 1014H e 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 1100H 7FH 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 35 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 36 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 1100H 7FH 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 37 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: 38 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 39 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 Banco 0 40 15.4 Qual (ou quais) instrução(s) da Figura 1 apresenta(m) modo de endereçamento imediato. Explique porque? Resposta: Lista nº 11 41 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çãolocalizada no endereço 0105h. Lista nº 11 Figura 2 42 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 numa faixa 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 43 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 0107H 10H MSB do valor da instrução 44 Para entender melhor os passos listador no slide 37 observar o diagrama de tempo de acesso às memórias 45 diagrama de tempo de acesso às memórias 46 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 )? Figura 2 47 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 RAM interna SFRs 48 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 0106H 10H MSB do endereço 1000H 0107H 00H LSB do endereço 1000H 0108H F0H Opcode de MOVX @DPTR,A 0109H 80H Opcode do SJMP $ 010AH FEH Endereço relativo desta posição até opcode SJUMP Analisando parte do programa anterior: . . . MOV DPTR, #1000H MOVX @DPTR,A SJUMP $ END 49 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 0105H 90H FAH 0106H 10H FBH 0107H 00H FCH 0108H F0H FDH 0109H 80H 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 END Saltos incondicionais do 8051 50 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 • JUMP @A+DPTR Saltos incondicionais do 8051 51 • 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 aqui: SJMP aqui ;retorna para a instrução anterior (offset = -1) Saltos incondicionais do 8051 52 • 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; pula: MOV A, #020H; Saltos incondicionais do 8051 53 • 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ários 1000H 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 54 • 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 55 Saltos condicionais do 8051 56 • 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 significado 0000H 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) 0006H FEH Endereço relativo do salto Exercício Resolvido Aplicações de microcontroladores: Prentice Hall Microcontroladores 8051 57 Programa Fonte: 58 Exercício Resolvido Aplicações de microcontroladores: 59 Exercício Resolvido Aplicações de microcontroladores: 60 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? Lista 11. 61 FIM