LEGENDAS A (ou Acc) → Acumulador C → Carry bit ( também

Propaganda
LEGENDAS
A (ou Acc) → Acumulador
C → Carry bit ( também chamado CY)
Rn → R0, R1, R2, … R7
@Ri → @R0, @R1
#d8 → Constante de 8 bits
#d16 → Constante de 16 bits
e8 → Endereço de 8 bits
e11 → Endereço de 11 bits
e16 → Endereço de 16 bits
rel → Endereço 8 bits ROM (PC±rel)
not(x) → O complemento (negação ou inversão) do valor x.
(x) → O conteúdo da posição de memória dada por x.
bit → Endereço (0..255) da posição do bit na RAM interna.
As operações em destaque afetam as flags Z, C, OV ou P
CICLOS DE MÁQUINA
Número de pulsos de clock necessários para encerrar uma tarefa.
Família 8051 → 12 pulsos.
Família MSC12XX → 4 pulsos (Texas Instruments)
Família LPC76X → 6 pulsos e Família LPC 91X → 2 pulsos (NXP)
Família ADuC84X → 1 pulso (Analog Devices)
MODOS DE ENDEREÇAMENTO
Direto
Operando é um endereço de 8 bits
Indireto
Utiliza os ponteiros @DPTR, @R0 ou @R1
Imediato
Constante de 8 ou 16 bits. Inicia com ‘#’
Registrado
Endereço composto fornecido por R0, R1, R2, ...R7
STACK POINTER
A pilha fica na RAM interna. No reset o SP aponta para o endereço
07H. A pilha armazena sempre múltiplos de 8 bits. Os dados a serem
armazenados são os endereços de retorno (CALL – RET ou INTRETI) ou os valores dos registradores (PUSH-POP).
SP ← SP+1
PUSH registrador
(SP) ← (registrador)
SP ← SP-1
POP registrador
(registrador) ← (SP)
Ciclos de máquina por instrução (no MSC1211)
Tamanho da Instrução (em bytes, no MSC1211)
INSTRUÇÕES DE CARGA
A ← Rn
MOV A,Rn
A ← (e8)
MOV A,e8
A ← ((Ri))
MOV A,@Ri
A ← d8
MOV A,#d8
Rn ← A
MOV Rn,A
Rn ← (e8)
MOV Rn,e8
Rn ← d8
MOV Rn,#d8
(e8) ← A
MOV e8,A
(e8) ← Rn
MOV e8,Rn
(e8) ← d8
MOV e8,#d8
(e8) ← (e8_b)
MOV e8,e8_b
(e8) ← ((Ri))
MOV e8,@Ri
((Ri)) ← A
MOV @Ri,A
((Ri)) ← (e8)
MOV @Ri,e8
((Ri)) ← d8
MOV @Ri,#d8
DPTR ← d16
MOV DPTR,#d16
[1] [1]
[2] [2]
[1] [1]
[2] [2]
[1] [1]
[2] [2]
[2] [2]
[2] [2]
[2] [2]
[3] [3]
[3] [3]
[2] [2]
[1] [1]
[2] [2]
[2] [2]
[3] [3]
PUSH
POP
XCH
XCH
XCH
XCHD
e8
e8
A,Rn
A,e8
A,@Ri
A,@Ri
(SP) ← (e8)
(e8) ← (SP)
A ↔ Rn
A ↔ (e8)
A ↔ ((Ri))
Alow ↔ ((Ri))low
[2] [2]
[2] [2]
[1] [1]
[2] [2]
[1] [1]
[1] [1]
INSTRUÇÕES ARITMÉTICAS
A ← A+Rn
ADD
A,Rn
A ← A+(e8)
ADD
A,e8
A ← A+((Ri))
ADD
A,@Ri
A ← A+d8
ADD
A,#d8
A ← A+Rn+C
ADDC A,Rn
A ← A+(e8)+C
ADDC A,e8
A ← A+((Ri))+C
ADDC A,@Ri
A ← A+d8+C
ADDC A,#d8
A ← A-Rn-C
SUBB A,Rn
A ← A-(e8)-C
SUBB A,e8
A ← A-((Ri))-C
SUBB A,@Ri
A ← A-d8-C
SUBB A,#d8
A ← A+1
INC
A
Rn ← Rn+1
INC
Rn
(e8) ← (e8)+1
INC
e8
((Ri)) ← ((Ri))+1
INC
@Ri
A ← A-1
DEC
A
Rn ← Rn-1
DEC
Rn
(e8) ← (e8)-1
DEC
e8
((Ri)) ← ((Ri))-1
DEC
@Ri
DPTR ← DPTR-1
INC
DPTR
B:A ← AxB
(C=0, OV)
MUL
AB
A ← Inteiro(A/B)
DIV
AB
B ← Resto(A/B) (C=0, OV)
DA
A
Converte A em BCD
(C)
INSTRUÇÕES LÓGICAS
ANL
A,Rn
ANL
A,e8
ANL
A,@Ri
ANL
A,#d8
ANL
e8,A
ANL
e8,#d8
ORL
A,Rn
ORL
A,e8
ORL
A,@Ri
ORL
A,#d8
ORL
e8,A
ORL
e8,#d8
XRL
A,Rn
XRL
A,e8
XRL
A,@Ri
XRL
A,#d8
XRL
e8,A
A ← A and Rn
A ← A and (e8)
A ← A and ((Ri))
A ← A and d8
(e8) ← (e8) and A
(e8) ← (e8) and d8
A ← A or Rn
A ← A or (e8)
A ← A or ((Ri))
A ← A or d8
(e8) ← (e8) or A
(e8) ← (e8) or d8
A ← A xor Rn
A ← A xor e8
A ← A xor ((Ri))
A ← A xor d8
(e8) ← (e8) xor A
(Z,P)
(Z,P)
(Z,P)
(Z,P)
(Z,P)
(Z,P)
(Z,P)
(Z,P)
(Z,P)
(Z,P)
(Z,P)
(Z,P)
[1] [1]
[2] [2]
[1] [1]
[2] [2]
[1] [1]
[2] [2]
[1] [1]
[2] [2]
[1] [1]
[2] [2]
[1] [1]
[2] [2]
[1] [1]
[1] [1]
[2] [2]
[1] [1]
[1] [1]
[1] [1]
[2] [2]
[1] [1]
[1] [3]
[1] [5]
[1] [5]
[1] [1]
[1] [1]
[2] [2]
[1] [1]
[2] [2]
[2] [2]
[3] [3]
[1] [1]
[2] [2]
[1] [1]
[2] [2]
[2] [2]
[3] [3]
[1] [1]
[2] [2]
[1] [1]
[2] [2]
[2] [2]
XRL
CLR
CPL
RL
RLC
RR
RRC
SWAP
e8,#d8
A
A
A
A
A
A
A
(e8) ← (e8) xor d8
A←0
(Z,P=0)
A ← not(A)
(Z,P)
Rot esq A (8bits)
Rot esq A com C (9bits) (C)
Rot dir A (8bits)
Rot dir A com C (9bits) (C)
Ahigh ↔ Alow
[3] [3]
[1] [1]
[1] [1]
[1] [1]
[1] [1]
[1] [1]
[1] [1]
[1] [1]
Estas instruções geram o sinal PSEN
INSTRUÇÕES COM A MEMÓRIA ROM EXTERNA
A ← (A+DPTR)ROM
MOVC A,@A+DPTR
A ← (A+PC)ROM
MOVC A,@A+PC
[1] [3]
[1] [3]
Estas instruções geram os sinais RD ou WR
Utilizando o ponteiro @Ri, então P2 → A8..A15, Ri → A0..A7
INSTRUÇÕES COM A MEMÓRIA RAM EXTERNA
A ← (DPTR)RAM (gera RD)
MOVX A,@DPTR
A ← (P2+Ri)RAM (gera RD)
MOVX A,@Ri
(DPTR)RAM ← A (gera WR)
MOVX @DPTR,A
(P2+Ri)RAM ← A (gera WR)
MOVX @Ri,A
[1] [2]
[1] [2]
[1] [2]
[1] [2]
Nestas operações, Carry funciona como um acumulador de 1 bit
INSTRUÇÕES BOOLEANAS (OU MANIPULAÇÃO DE BIT)
C←0
(C=0) [1] [1]
CLR
C
(bit) ← 0
CLR
bit
[2] [2]
C←1
(C=1) [1] [1]
SETB C
(bit) ← 1
SETB bit
[2] [2]
C ← not(C)
(C) [1] [1]
CPL
C
(bit) ← not((bit))
CPL
bit
[2] [2]
C ← C and (bit)
(C) [2] [2]
ANL
C,bit
C ← C and not((bit))
(C) [2] [2]
ANL
C,/bit
C ← C or (bit)
(C) [2] [2]
ORL
C,bit
C ← C or not((bit))
(C) [2] [2]
ORL
C,/bit
C ← (bit)
(C) [2] [2]
MOV C,bit
(bit) ← C
MOV bit,C
[2] [2]
As instruções onde PC ← PC±rel, desviam no máximo ±128 bytes!!!
INSTRUÇÕES DE DESVIO INCONDICIONAL
SP ← SP+1
ACALL e11
[2] [3]
(SP) ← PC+2LO
SP ← SP+1
(SP) ← PC+2HI
PC ← PC±e11 (desvio de ± 2K)
SP ← SP+1
LCALL e16
[3] [4]
(SP) ← PC+2LO
SP ← SP+1
(SP) ← PC+2HI
PC e16
(desvio de 64K)
SP ← SP-1
RET
[1] [4]
PCHI ← (SP)
SP ← SP-1
PCLO ← (SP)
RETI
AJMP
LJMP
SJMP
JMP
e11
e16
rel
@A+DPTR
Retorno de Interrupção
PC ← PC±e11 (desvio de ± 2K)
PC ← e16
(desvio de 64K)
PC ← PC±rel
PC ← (A+DPTR)ROM
INSTRUÇÕES DE DESVIO CONDICIONAL
Se bit = 1 então PC ← PC±rel
JB
bit,rel
Se bit = 0 então PC ← PC±rel
JNB
bit,rel
JBC
bit,rel
Se bit = 1, então
PC ← PC±rel e bit ← 0
Se Z=1 então PC ← PC±rel
JZ
rel
Se Z=0 então PC ← PC±rel
JNZ
rel
Se C=1 então PC ← PC±rel
JC
rel
Se C=0 então PC ← PC±rel
JNC
rel
Se A≠(e8) : PC ← PC±rel
(C)
CJNE
a,e8,rel
Se A≠d8 : PC ← PC±rel
(C)
CJNE
a,#d8,rel
Se Rn≠d8 : PC ← PC±rel
(C)
CJNE
Rn,#d8,rel
Se ((Ri))≠d8 : PC ← PC+rel (C)
CJNE
@Ri,#d8,rel
Rn ← Rn-1
DJNZ
Rn,rel
Se Rn≠0 então PC ← PC±rel (Z)
(e8) ← (e8)-1
DJNZ
e8,rel
Se (e8)≠0 então PC ← PC±rel (Z)
NOP
Não faz nada
[1] [4]
[2] [3]
[3] [4]
[2] [3]
[1] [3]
[3] [4]
[3] [4]
[3] [4]
[2] [3]
[2] [3]
[2] [3]
[2] [3]
[3] [4]
[3] [4]
[3] [4]
[3] [4]
[2] [3]
[3] [4]
[1] [1]
AC → Auxiliar Carry (transporte do bit 3 para o bit 4)
RS1/RS0 → Controla o banco de registradores (R0..R7)
OV → Overflow (para números sinalizados de -128...+127)
P → Bit de paridade par (para que o total de “1s” seja par)
Utiliza os registradores IE, IP e TCON.3 ... TCON.0
INTERRUPÇÕES
Endereço
0000H
Interrupção
Prioridade
Reset
++
Nenhum
INT0
+
EA, EX0, IT0, IE0,
PX0
000BH
TIMER0
EA, ET0, TF0, PT0
INT1
EA, EX1, IT1, IE1,
PX1
TIMER1
EA, ET1, TF1, PT1
0013H
Modo operação (M1M0): 0, 1 ou 2
Modo0 → Prescaler (÷32) + Contador de 8 bits.
Modo1 → Contador de 16 bits.
Modo2 → Contador de 8 bits autocarregável.
PROGRAMA DE TESTE (ASSEMBLY) – MSC1211
led
EQU
93H
; endereço do bit P1.3
X
EQU
244
Y
EQU
255
ORG
0000H
LJMP
main
001BH
main:
0023H
-
EA, ES, RI, TI, OS
Se EA = 0 então todas as interrupções estão desativadas
INTx → Ativada por borda (ITx = 0) ou por nível (ITx = 1)
INTERRUPÇÕES
delay:
loop1:
loop2:
ORG
0100H
CPL
led
LCALL delay
LJMP
main
MOV
MOV
NOP
DJNZ
DJNZ
RET
R6,#X
R7,#Y
EX1
ET0
EX0
IP (Interrupt Priority)
-
PX1
PT0
PX0
OS
PT1
TMOD (Timer Mode)
GATE
C/T
M1
Timer 1
M0
GATE
C/T
M1
Timer 0
M0
TCON (Timer Control)
TF1
TR1
TF0
Timer1 & Timer0
TR0
IE1
IT1
IE0
INT1 & INT0
IT0
F=2MHz
; Alterna o valor do pino led
; delay 0.5s
; Supondo f = 2MHz → Tciclo = 2us
; Nciclos = 10+X(5+4Y)
; Nciclos = 250.000
R7,loop2
R6,loop1
PROGRAMA DE TESTE (C) – MSC1211
#include <MSC1211.h>
#include <stdio.h>
REGISTRADORES IMPORTANTES
IE (Interrupt Enable)
EA
ES
ET1
PSW (Processor Status Word)
CY
AC
RS1
RS0
OV
C (ou CY) → Carry bit (transporte do bit 7 para o bit 8)
Bits de Controle
0003H
Serial
Condição dos Registradores e/ou bits no reset do µC
CONDIÇÕES NO RESET
PC ← 0
IE ← 0xx0000
A←0
IP ← xxx00000
B←0
PSW ← 00x000x0
SP ← 07H
SCON ← 0, SBUF ← xxxxxxxx
DPTR ← 0
PCON ← 0xxxxxxx
P0..P3 ← FFH
TMOD ← 0
TCON ← 0
TH1, TL1, TH0, TL0 ← 0
TIMER0 e TIMER1
F=2MHz
sbit at 0x93 led;
// declaração do pino P1.3
void delay(unsigned int i);
void main(void)
{
While(1)
{
led = !(led);
delay(50000); // delay de aproximadamente 250.000 ciclos
}
}
void delay(unsigned int i)
{
while(i) i--;
}
P
Júlio César Marques de Lima – [email protected]
Download