Baixe o app para aproveitar ainda mais
Prévia do material em texto
1 1º semestre 2018 – pg. 1 Universidade Paulista – UNIP Engenharia Elétrica 03 – Assembly 8051 Microprocessadores e Microcontroladores Prof. Me. José Ricardo G. Pinheiro jrgpinheiro@feb.unesp.br Microprocessadores e Microcontroladores pg. 2 Tópicos • Registros do 8051 • Os Bancos de Registros • Espaço de Memória RAM • Mapa de Memória de Programa • Tipos de dados • A instrução MOV e o movimento de dados utilizando os registros • Um simples exemplo de código em linguagem assembly • Compilando e Executando o programa • Seqüencia de eventos a partir do power-up • Exame do programa em código binário • Execução das instruções • Registrador PSW (Program Status Word) • O Stack UNIP – Universidade Paulista – Engenharia Elétrica – Campus Bauru 2 Microprocessadores e Microcontroladores pg. 3 Organização da RAM no 8051 RAM de uso geral Bits Endereçáveis BANK 3 BANK 2 BANK 1 BANK 0 default 00H 07H 08H 0FH 10H 17H 18H 1FH 20H 2FH 30H 7FH 80H FFH S P E C IA L F U N C T IO N R E G IS T E R S 80H P0 90H P1 81H SP 98H SCON 82H DPL 99H SBUF 83H DPH A0H P2 87H PCON A8H IE 88H TCON B0H P3 89H TMOD B8H IP 8AH TL0 D0H PSW 8BH TL1 E0H ACC 8CH TH0 F0H B 8DH TH1 UNIP – Universidade Paulista – Engenharia Elétrica – Campus Bauru Microprocessadores e Microcontroladores pg. 4 Organização da memória 8051 D7 D6 D5 D4 D3 D2 D1 D0 DPTR PC PC (Ponteiro de Programa) DPH DPL Registros 8-bits Registros 16-bits Posição: 8-bits R6 R5 R4 R3 R2 R1 R0 B ACC R7 SP PSW 8-bits (ram interna) (↑) CY AC F0 RS1 RS2 OV - P Registros 8-bits 4 B A N C O S 07H default UNIP – Universidade Paulista – Engenharia Elétrica – Campus Bauru 3 Microprocessadores e Microcontroladores pg. 5 Memória de Programa Interna do 8051 8752 AT89C52 DS5000-32 FFFF 00000000 1FFF 8751 AT89C51 0FFF 0000 byte byte byte Espaço de Endereçamento da Memória de Programa do 8051 8031 (externa) UNIP – Universidade Paulista – Engenharia Elétrica – Campus Bauru Microprocessadores e Microcontroladores pg. 6 Notas de Programação • Um valor precedido de # pode ser carregado diretamente nos registros ACC, B, ou R0-R7 • MOV R5, #0F9H • Se valor compreendidos entre 00H e 0FH são movidos para um registro 8-bits os demais bits serão assumidos como zeros • MOV A, #5 • Um valor maior que a capacidade do registro gera um erro • MOV A, #7F2H UNIP – Universidade Paulista – Engenharia Elétrica – Campus Bauru 4 Microprocessadores e Microcontroladores pg. 7 Diretivas & Tipos de Dados ORG 500H DATA1: DB 28 ;DECIMAL (1C em Hex) DATA2: DB 00110101B ;BINARIO (35 em Hex) DATA3: DB 39H ;HEXADECIMAL ORG 510H DATA4: DB “2591” ; NUMEROS ASCII ORG 518H DATA6: DB “My name is 8051$” ;CARACTERES ASCII UNIP – Universidade Paulista – Engenharia Elétrica – Campus Bauru Microprocessadores e Microcontroladores pg. 8 A instrução MOV • MOV destino,origem ; copia origem para destino • MOV A,#55H ; carrega o valor 55H no ACC MOV R0,A ; copia o valor de ACC em R0 ; (agora ACC=R0=55H) MOV R1,A ; copia o valor de ACC em R1 ; (agora ACC=R0=R1=55H) MOV R2,A ; copia o valor de ACC em R2 ; (agora ACC=R0=R1=R2=55H) MOV R3,#95H ; carrega o valor 95H em R3 ; (agora R3=95H) MOV A,R3 ; copia o valor de R3 em ACC ; agora ACC=R3=95H UNIP – Universidade Paulista – Engenharia Elétrica – Campus Bauru 5 Microprocessadores e Microcontroladores pg. 9 A instrução ADD • ADD A, origem ; adiciona o valor do operando fonte ; com o valor do ACC ; e coloca o resultado no ACC • MOV A, #25H ; carrega 25H no ACC MOV R2,#34H ; carrega 34H em R2 ADD A,R2 ; adiciona R2 com o acumulador ; (A = A + R2 → A=59H) UNIP – Universidade Paulista – Engenharia Elétrica – Campus Bauru Microprocessadores e Microcontroladores pg. 10 Passos para criar um código executável (programa) myfile.abs myfile.obj EDITOR ASCII myfile.asm myfile.hex outros arquivos .obj Passos para criar um Programa Executável COMPILADOR ASSEMBLY LINKEDITOR CONVERSOR OH myfile.lst UNIP – Universidade Paulista – Engenharia Elétrica – Campus Bauru 6 Microprocessadores e Microcontroladores pg. 11 PSW Register CY AC F0 RS1 RS0 0V - P CY AC F0 RS1 RS0 OV - P PSW.7 PSW.6 PSW.5 PSW.4 PSW.3 PSW.2 PSW.1 PSW.0 Carry Flag Auxiliary Carry Flag Available to the user for GP Register Bank selector bit 1 Register Bank selector bit 0 Overflow Flag User definable bit Parity Flag – Set/Erased by HD RS1 RS0 Register Bank Address 0 0 0 00H-07H 0 1 1 08H-0FH 1 0 2 10H-17H 1 1 3 18H-1FH UNIP – Universidade Paulista – Engenharia Elétrica – Campus Bauru Microprocessadores e Microcontroladores pg. 12 Instrução ADD & PSW EXEMPLO 3.1 Mostra o status das flags CY, AC e P após a adição de 38 H e 2FH nas seguintes instruções: Prog-Seg: MOV A,#38H ADD A,#2FH ; após a adição temos: A=67H e CY=0 OPERAÇÃO: 38H 00111000 +2FH 00101111 67H 01100111 CY = 0 visto que NÃO HÁ carry além do bit D7 AC = 1 visto que HÁ carry do bit D3 para o bit D4 P = 1 visto que o acumulador contém um número IMPAR de 1s. UNIP – Universidade Paulista – Engenharia Elétrica – Campus Bauru 7 Microprocessadores e Microcontroladores pg. 13 Instrução ADD & PSW EXEMPLO 3.2 Mostra o status das flags CY, AC e P após a adição de 9CH e 64H nas seguintes instruções: Prog-Seg: MOV A,#9CH ADD A,#64H ; após a adição temos: A=00H e CY=1 OPERAÇÃO: 9CH 10011100 +64H 01100100 100H 100000000 CY = 1 visto que HÁ carry além do bit D7 AC = 1 visto que HÁ carry do bit D3 para o bit D4 P = 0 visto que o acumulador contém um número PAR de 1s. UNIP – Universidade Paulista – Engenharia Elétrica – Campus Bauru Microprocessadores e Microcontroladores pg. 14 Instrução ADD & PSW EXEMPLO 3.3 Mostra o status das flags CY, AC e P após a adição de 88H e 93H nas seguintes instruções: Prog-Seg: MOV A,#88H ADD A,#93H ; após a adição temos: A=1BH e CY=1 OPERAÇÃO: 88H 10001000 +93H 10010011 11BH 100011011 CY = 1 visto que HÁ carry além do bit D7 AC = 0 visto que NÃO HÁ carry do bit D3 para o bit D4 P = 0 visto que o acumulador contém um número PAR de 1s. UNIP – Universidade Paulista – Engenharia Elétrica – Campus Bauru 8 Microprocessadores e Microcontroladores pg. 15 Acesso à RAM usando Nomes de Registros EXEMPLO 3.4 Conteúdo dos registros após a execução das seguintes instruções: Prog-Seg: MOV R0,#99H ; carrega o valor 99H em R0 MOV R1,#89H ; carrega o valor 89H em R1 MOV R2,#3FH ; carrega o valor 3FH em R2 MOV R7,#63H ; carrega o valor 63H em R7 MOV R5,#12H ; carrega o valor 12H em R5 OPERAÇÃO: Após a execução do segmento de programa acima teremos: Posição 00H da RAM contém o valor 99H Posição 01H da RAM contém o valor 89H Posição 02H da RAM contém o valor 3FH Posição 07H da RAM contém o valor 63H Posição 05H da RAM contém o valor 12H UNIP – Universidade Paulista – Engenharia Elétrica – Campus Bauru Microprocessadores e Microcontroladores pg. 16 Acesso à RAM usando Endereço de Registros EXEMPLO 3.5 Este modo é denominado Endereçamento Direto, onde a posição de memória RAM é o primeiro parâmetro da instrução: Prog-Seg: MOV 00,#99H ; carrega o valor 99H em R0 MOV 01,#89H ; carrega o valor 89H em R1 MOV 02,#3FH ; carrega o valor 3FH em R2 MOV 07,#63H ; carrega o valor 63H em R7 MOV 05,#12H ; carrega o valor 12H em R5 OPERAÇÃO: Após a execução do segmento de programa acima teremos: Posição 00H da RAM contém o valor 99H Posição 01H da RAM contém o valor 89H Posição 02H da RAM contém o valor 3FH Posição 07H da RAM contém o valor 63H Posição 05H da RAM contém o valor 12H UNIP – Universidade Paulista – Engenharia Elétrica – Campus Bauru 9 Microprocessadores e Microcontroladores pg. 17 EXEMPLO 3.6 Acesso ao banco de registros 2 utilizando o bits PSW.RS1 e PSW.RS0: Prog-Seg: SETB PSW.4 ; seleciona BANK2 MOV R0,#99H ; carrega o valor 99H em R0 MOV R1,#89H ; carrega o valor 89H em R1 MOV R2,#3FH ; carrega o valor 3FH em R2 MOV R7,#63H ; carrega o valor 63H em R7 MOV R5,#12H ; carrega o valor 12H em R5 OPERAÇÃO: Posição 10H da RAM contém o valor 99H Posição 11H da RAM contém o valor 89H Posição 12H da RAM contém o valor 3FH Posição 17H da RAM contém o valor 63H Posição 15H da RAM contém o valor 12H Chaveamento de Bancos de Registros UNIP – Universidade Paulista – Engenharia Elétrica – Campus Bauru Microprocessadores e Microcontroladores pg. 18 EXEMPLO 3.7 Este exemplo mostra o conteúdo da pilha (Stack) e o valor do SP (Stack Pointer) quando se utiliza a instrução PUSH (POP): Prog-Seg: MOV R6,#99H ; carrega o valor 99H em R6 = 06H da RAM MOV R1,#89H ; carrega o valor 89H em R1 = 01H da RAM MOV R2,#3FH ; carrega o valor 3FH em R2 = 02H da RAM PUSH 6 ; 1a operação no Stack PUSH 1 ; 2a operação no Stack PUSH 2 ; 3a operação no Stack OPERAÇÃO: ;1a operação no Stack → Posição 08H da RAM = 99H e SP=08H ;2a operação no Stack → Posição 09H da RAM = 89H e SP=09H ;3a operação no Stack → Posição 0AH da RAM = 3FH e SP=0AH Movendo dado para o Stack UNIP – Universidade Paulista – Engenharia Elétrica – Campus Bauru 10 Microprocessadores e Microcontroladores pg. 19 EXEMPLO 3.8 Este exemplo mostra o conteúdo da pilha (Stack) e o valor do SP (Stack Pointer) quando se utiliza a instrução POP (PUSH): Prog-Seg: SETB PSW.4 ; RS0 = 1 → seleciona BANK2 POP 0 ; 1a operação no Stack POP 1 ; 2a operação no Stack POP 2 ; 3a operação no Stack OPERAÇÃO: Observe que o STACK = registro do tipo LIFO ;1a operação no Stack → Posição 00H da RAM = 3FH e SP=09H ;2a operação no Stack → Posição 01H da RAM = 89H e SP=08H ;3a operação no Stack → Posição 02H da RAM = 99H e SP=07H 0BS: Embora BANK2 foi selecionado, a instrução POP utiliza o endereçamento direto para a RAM Movendo dado do Stack UNIP – Universidade Paulista – Engenharia Elétrica – Campus Bauru Microprocessadores e Microcontroladores pg. 20 EXEMPLO 3.9 Este exemplo mostra como evitar conflito com o STACK e os bancos de registros Prog-Seg: MOV SP,#2FH ; inicializa começo da pilha em 30H PUSH 0 ; 1a operação no Stack PUSH 1 ; 2a operação no Stack PUSH 2 ; 3a operação no Stack OPERAÇÃO: Observe que o STACK = registro do tipo LIFO ;1a operação no Stack → Posição 30H da RAM = 99H e SP=30H ;2a operação no Stack → Posição 31H da RAM = 89H e SP=31H ;3a operação no Stack → Posição 32H da RAM = 3FH e SP=32H Evitando conflito com Stack & Bancos de Registro UNIP – Universidade Paulista – Engenharia Elétrica – Campus Bauru 11 Microprocessadores e Microcontroladores pg. 21 Um exemplo de operação com portas EXEMPLO 3.10 Escrever um programa que faça o seguinte: a) Fica monitorando o estado do pino P1.2 b) Quando vai para nível alto, escreve 45H na P0 c) Envia uma transição de alto-para-baixo em P2.3 SOLUÇÃO: SETB P1.2 ; faz P1.2 operar como entrada MOV A,#45H ; A=45H AGAIN: JNB P1.2,AGAIN ; verifica estado de P1.2 MOV P0,A ; escreve A em P0 SETB P2.3 ; P2.3=HIGH CLR P2.3 ; P2.3=LOW JMP $ ; fica em loop UNIP – Universidade Paulista – Engenharia Elétrica – Campus Bauru Microprocessadores e Microcontroladores pg. 22 Exemplo de Programação com Portas EXEMPLO 3.11 Considerando o hardware abaixo, escrever (compilar e linkeditar) um programa que faça o seguinte: Usando os LEDs como contador binário de 3 bits, mostrar o número de vezes que a chave SW2 é acionada. UNIP – Universidade Paulista – Engenharia Elétrica – Campus Bauru 12 Microprocessadores e Microcontroladores pg. 23 1a Solução Inicialmente apresenta-se uma solução simples, que não leva em consideração o “bouncing” que possa ocorrer ao se pressionar/soltar a chave. ;CHAVE1.ASM ; SW2 EQU P1.3 ; ORG RESET INIC CLR A ; zerar contador MOV P1,A ; apagar LEDs SETB SW2 ; programar P1.3 como em entrada AQUI1 JB SW2,AQUI1 ; aguardar acionamento INC A MOV P1,A ; dar saída ao contador SETB SW2 ; garantir P1.3 como entrada AQUI2 JNB SW2,AQUI2 ; aguardar liberar chave SJMP AQUI1 END Exemplo de Programação com Portas UNIP – Universidade Paulista – Engenharia Elétrica – Campus Bauru Microprocessadores e Microcontroladores pg. 24 2a Solução Esta solução, um pouco mais evoluída, considera o “bouncing” que possa ocorrer ao se pressionar/soltar a chave, empregando uma rotina de retardo. ; CHAVE2.ASM ; ; NESTE PROGRAMA SE PRETENDE ELIMINAR O BOUCING COM RETARDOS ; O VALOR DO RETARDO É PARTICULAR PARA CADA CIRCUITO (DEPENDE ; DO TAMANHO DOS CABOS, QUALIDADE DA CHAVE, ETC. RECOMENDA-SE: ; DETERMINAR EMPIRICAMENTE O MELHOR RETARDO PARA CADA CIRCUITO. ; RTD EQU 500 ; RTD >256 SW2 EQU P1.3 ; ORG RESET INIC CLR A ; zerar contador MOV P1,A ; apagar LEDS Exemplo de Programação com Portas UNIP – Universidade Paulista – Engenharia Elétrica – Campus Bauru 13 Microprocessadores e Microcontroladores pg. 25 2a Solução – CONT. SETB SW2 ; programar P1.3 como entrada AQUI1 JB SW2,AQUI1 ; aguardar acionamento INC A MOV P1,A ; dar saída ao contador SETB SW2 ; garantir P1.3 como entrada ACALL RTD ; eliminar bouncing AQUI2 JNB SW2,AQUI2 ; aguardar liberar chave ACALL RTD ; eliminar bouncing SJMP AQUI1 ; ; ROTINA PARA GERAR UM RETARDO RTD MOV R7,# HIGH RTD L1 MOV R6,# LOW RTD L2 DJNZ R6,L2 DJNZ R7,L1 RET END Exemplo de Programação com Portas UNIP – Universidade Paulista – Engenharia Elétrica – Campus Bauru Microprocessadores e Microcontroladores pg. 26 3a Solução Esta solução, mais eficiente, considera o “bouncing” que possa ocorrer ao se pressionar/soltar a chave, empregando subrotina para as duas transições da chave ↓ e ↑. ; CHAVE3.ASM ; ; SOLUCAO MAIS EFICIENTE PARA ELIMINAR O BOUNCING COM RETARDOS ; USAM-SE ROTINAS QUE AGUARDAM A ESTABILIZACAO DA CHAVE ; HA UMA PARA AS TRANSIÇÕES DE 0 PARA 1 E OUTRA DE 1 PARA 0 ; ESTA TECNICA SE ADAPTA MELHOR AS VARIACOES ENTRE OS CIRCUITOS ; RTD EQU 100 SW2 EQU P1.3 ; ORG RESET INIC CLR A ;ZERAR CONTADOR MOV P1,A ;APAGAR LEDS Exemplo de Programação com Portas UNIP – Universidade Paulista – Engenharia Elétrica – Campus Bauru 14 Microprocessadores e Microcontroladores pg. 27 3a Solução – CONT. AQUI SETB SW2 ; programa P1.3 como entrada ACALL RBT_1_0 ; transição limpa de 1 para 0 INC A MOV P1,A ; dar saída ao contador SETB SW2 ; programa P1.3 como entrada ACALL RBT_0_1 ; transição limpa de o para 1 SJMP AQUI ; ; ELIMINAR BOUNCING NAS TRANSIÇÕES DE 0 PARA 1 RBT_0_1 MOV R7,#RTD LB1 JNB SW2,RBT_0_1 DJNZ R7,LB1 RET ; ; ELIMINAR BOUNCING NAS TRANSIÇÕES DE 1 PARA 0 RBT_1_0 MOV R7,#RTD LB2 JB SW2,RBT_1_0 DJNZ R7,LB2 RET END Exemplo de Programação com Portas UNIP – Universidade Paulista – Engenharia Elétrica – Campus Bauru
Compartilhar