Buscar

MicroProc e MicroContr_03

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

Continue navegando