Sei sulla pagina 1di 51

AAAA SEL–

SEL–0629

Aplicação de
Microprocessadores I

Aula 4
Operações Lógicas e
A it éti
Aritméticas

Marcelo Andrade da Costa Vieira

AAAA
Operações Lógicas

AA
Operações Lógicas
Existem 5 tipos de operações lógicas nos
microcontroladores PIC:

AND : “E” Lógico;


OR : “OU”
OU Lógico;
XOR : “OU” Exclusivo;
COMP : Complemento;
SWAP : Inversão.

AA
AND

Byte1 1 0 1 0 0 0 1 0
Byte2 1 1 0 0 1 0 1 0
AND 1 0 0 0 0 0 1 0

“E”
E Lógico entre todos os bits do registrador,
registrador bit a bit
bit.

AA
AND

A B AND
0 0 0 Criar uma “máscara”:
máscara :
0 1 0
1: “Copia”
Copia o valor do bit
1 0 0
0: “Reseta”
Reseta o valor do bit
1 1 1

AA
AND

Byte1 1 0 1 1 0 0 1 0
Byte2 1 1 1 1 0 0 0 0
AND 1 0 1 1 0 0 0 0

“Máscara”
Máscara

AA
AND

1 ANDLW k : “E” lógico


1. ló i entre o valor
l literal
li l k e o valor
l
contido no registrador w, guardando o resultado em w
(w ← k AND w);

2. ANDWF f,d : “E” lógico entre o valor de w e o


registrador f,f guardando o resultado no destino (w ou
f) (d ← f AND w);

AA
ANDWF e ANDLW
Garantir que um número seja menor que 15

MOVLW B ‘00001111’
ANDWF NUM_1,F

Ou

MOVF NUM_1,W
ANDLW B ‘00001111’
MOVWF NUM_1

AA
OR

Byte1 1 0 1 0 0 0 1 0
Byte2 1 1 0 0 1 0 1 0
OR 1 1 1 0 1 0 1 0

“OU”
OU Lógico entre todos os bits do registrador,
registrador bit a bit
bit.

AA
OR

A B OR
0 0 0 Criar uma “máscara”:
máscara :
0 1 1
0: “Copia”
Copia o valor do bit
1 0 1
1: “Seta”
Seta o valor do bit
1 1 1

AA
OR

Byte1 1 0 1 0 0 0 1 0
Byte2 0 0 0 0 1 1 1 1
AND 1 0 1 0 1 1 1 1

“Máscara”
Máscara

AA
OR

1 IORLW k : “OU” lógico


1. ló i entre o valor
l literal
li l k e o valor
l
contido no registrador w, guardando o resultado em w
(w ← k OR w);

2. IORWF f,d : “OU” lógico entre o valor de w e o


registrador f,f guardando o resultado no destino (w ou
f) (d ← f OR w);

AA
IORWF e IORLW
Garantir que um número seja maior que 15

MOVLW B ‘00010000’
IORWF NUM_1,F

Ou

MOVF NUM_1,W
IORLW B ‘00010000’
MOVWF NUM_1

AA
XOR

Byte1 1 0 1 0 0 0 1 1
Byte2 1 1 0 0 1 0 1 0
XOR 0 1 1 0 1 0 0 1

“OU”
OU Exclusivo entre todos os bits do registrador
registrador, bit a bit
bit.

Bits Iguais – 0
Bits Diferentes - 1

AA
XOR

Criar uma “máscara”


máscara do
A B XOR
tipo “inversor controlado”:
0 0 0
0: “Copia” o valor do bit
0 1 1 1: “Inverte” o valor do bit
1 0 1
“Comparação”
Comparação bit a bit
1 1 0
0: Bits iguais
g
1: Bits diferentes

AA
XOR

Byte1 1 0 1 1 0 0 1 0
Byte2 1 1 1 1 0 0 0 0
XOR 0 1 0 0 0 0 1 0

“Máscara”
Máscara

AA
XOR

Byte1 1 0 1 1 0 0 1 0
Byte2 1 1 1 1 0 0 0 0
XOR 0 1 0 0 0 0 1 0

“Comparação”
Comparação

AA
XOR

1 XORLW k : “OU” Exclusivo


1. E l i entre o valor l literal
li l k e o
valor contido no registrador w, guardando o resultado
em w (w ← k XOR w);

2. XORWF f,d : “OU” Exclusivo entre o valor de w e o


registrador f,f guardando o resultado no destino (w ou
f) (d ← f XOR w);

AA
XORWF
Chamar uma rotina 10 vezes – Contador
Se a operação “OU” Exclusivo resultar em Zero, é porque os valores são iguais.

CLRF CONTADOR
LOOP
CALL ROTINA
INCF CONTADOR,F
CONTADOR F
MOVLW .10
XORWF CONTADOR,W
CONTADOR W
BTFSS STATUS,Z
GOTO LOOP
FIM

AA
COMF

Byte 0 0 0 1 0 0 1 0 18
COMF 1 1 1 0 1 1 0 1 237

Inverte o valor de todos os bits do registrador, bit a bit;

Cálculo do complemento do byte: (COMF = 255 – Byte)

Cálculo do complemento de 2 do byte: (ADDLW .1)

AA
COMF

COMF f,d : Complemento do valor do registrador f,


guardando o resultado no destino (w ou f) (d ← COMP f );

AA
SWAP

Byte 0 1 1 0 1 1 0 0
SWAP 1 1 0 0 0 1 1 0

Inverte os 4 bits (nibble) mais significativos com os 4 bits


menos significativos

AA
SWAP

SWAPF f,d : Inversão dos 4 bits do valor do registrador f,


guardando o resultado no destino (w ou f) (d ← COMP f );

AA
Operações Aritméticas

AA
ADIÇÃO
• Existem 4 comandos para adição no PIC:

1. INCF f,d : Incrementa uma unidade o registrador f, guardando


o resultado no destino (w ou f) (d ← f + 1);

2. INCFSZ f,d : Incrementa uma unidade o registrador f, e pula


uma linha se o resultado for zero (d ← f + 1);

3 ADDWF f,d
3. f d : Soma o valor de W com o registrador f,f
guardando o resultado no destino (w ou f) (d ← f + w);

4. ADDLW k: Soma o valor literal k ao W, guardando o resultado


em w (w ← k + w);

AA
INCF
Chamar uma rotina 4 vezes

CLRF CONTADOR
LOOP
CALL ROTINA
INCF CONTADOR,F
BTFSS CONTADOR,2
GOTO LOOP
FIM

AA
INCFSZ

Chamar uma rotina 4 vezes

MOVLW D‘252’
D 252
MOVWF CONTADOR
CALL ROTINA
INCFSZ CONTADOR,F
CONTADOR F
GOTO $-2
FIM

AA
INCFSZ

Essa instrução afeta o registrador STATUS

Carryy – STATUS,, 0 ou STATUS,, C


- Vai para “1” se o registrador “estourar”

Zero – STATUS, 2 ou STATUS, Z


- Vai para “1” se o registrador “zerar”

AA
AA
ADDWF e ADDLW
Somar dois números

MOVLW .10
MOVWF NUM_1
MOVLW .20
MOVWF NUM_2
CLRF RESULT
MOVF NUM_1,W ; W ← 10
ADDWF NUM2,W ;W ← 10 + 20
ADDLW .5 ;W ← 30 + 5
MOVWF RESULT ; RESULT ← 35
FIM

AA
E se a soma for maior que 255?
Carry
NUM1 100 1 1 0 0 1 0 0 0
NUM2 200 0 1 1 0 0 1 0 0
RESULT 300 1 0 0 1 0 1 1 0 0 44

255 + 255 = 510 (9 bits no máximo)


255 + 255 + 255 = 765 (10 bits no máximo)

Utiliza 2 bytes para guardar o resultado


A cada número somado,
somado incrementa o carry uma vez!
AA
E se a soma for maior que 255?
Utilizar o Carry!

MOVLW .100
MOVWF NUM_1
MOVLW .200
200
MOVWF NUM_2
CLRF RESULT_LSB
CLRF RESULT
RESULT_MSB
MSB
MOVF NUM_1,W ; W ← 100
ADDWF NUM2,W
, ;W ← 100 + 200
BTFSC STATUS,C ; testa o carry
INCF RESULT_MSB,F
MOVWF RESULT_LSB
RESULT LSB
FIM

AA
SUBTRAÇÃO
• Existem 4 comandos para subtração no PIC:

1. DECF f,d : Decrementa uma unidade o registrador f,


guardando o resultado no destino (w ou f) (d ← f - 1);

2. DECFSZ f,d : Decrementa uma unidade o registrador f, e pula


uma linha se o resultado for zero (d ← f - 1);

3 SUBWF f,d
3. f d : Subtrai o valor de W do registrador f,f guardando
o resultado no destino (w ou f) (d ← f - w);

4. SUBLW k : Subtrai o valor de W do literal k, guardando o


resultado em w (w ← k - w);

AA
DECFSZ
Chamar uma rotina 10 vezes

MOVLW .10
MOVWF CONTADOR
LOOP
CALL ROTINA
DECFSZ CONTADOR,F
GOTO LOOP
FIM

AA
SUBWF e SUBLW
Subtrair dois números quaisquer
MOVLW .12
12
MOVWF NUM1
MOVLW .20
20
MOVWF NUM2
CLRF RESULT
MOVF NUM1,W ; W ← 12
SUBWF NUM2
NUM2,W W ;W ← 20 – 12 = 8 (NUM2 – W)
SUBLW .10 ; W ← 10 – 8 (k – W)
MOVWF RESULT; RESULT ← 2
FIM

AA
DECFSZ
A subtração afeta o carry (STATUS) de modo inverso à
operação de adição!

ADIÇÃO:
à n° positivo: C = 0
zero: C = 1 e Z = 1 (“estouro”)
( estouro )

SUBTRAÇÃO:
à n° positivo: C = 1
zero: C = 1 e Z = 1
n° negativo: C = 0 (“estouro”)

AA
E se o resultado for negativo?
Carry
NUM1 160 1 0 1 0 0 0 0 0
NUM2 200 1 1 0 0 1 0 0 0
RESULT -40 0 1 1 0 1 1 0 0 0 216

256 - 216 = 40 (complemento para 256) = Complemento de 2

Utiliza 1 bit (flag) para guardar o sinal

AA
SUBWF e SUBLW
Subtrair dois números quaisquer
CLRF RESULT
MOVF NUM_1,W ;W ← NUM_1
SUBWF NUM2,W
NUM2 W ;W ← NUM_2
NUM 2 – NUM_1
NUM 1
BTFSS STATUS,C ;TESTA O CARRY (NÚMERO NEGATIVO → C = 0)
GOTO NEGATIVO
MOVWF RESULT ; SALVA O RESULTADO POSITIVO
BCF NEG ; LIMPA O FLAG DE SINAL NEGATIVO
GOTO FIM
NEGATIVO
SUBLW .00 ; W ←256 – W
MOVWF RESULT ; SALVA O RESULTADO NEGATIVO
BSF NEG ; SETA O FLAG DE SINAL NEGATIVO

AA
FIM
Rotacionando o Byte

• RLF f,d – rotacionar o byte à esquerda

• RRF f,d – rotacionar o byte à direita

Cuidado com o CARRY!!

AA
MULTIPLICAR e DIVIDIR
• Só é válido para potências de 2 (2-4-8-16-32):

– RLF f,d
, : Rotaciona o bit à esquerda
q ((left)) – multiplica
p ppor
2 cada vez que o bit é rotacionado;

– RRF f,d : Rotaciona o bit à direita (right) – divide por 2


cada vez que o bit é rotacionado;

Deve-se garantir que o o bit que entra na posição menos


significativa seja zero!

AA
Rotacionando o Byte

• O PIC rotaciona um número de 9 bits!

– 8 bits do registrador F + Bit Carry (STATUS,C)

AA
Multiplicar um número por 4
MOVLW .200
200
MOVWF NUM_1
CLRF RESULT
RESULT_LSB
LSB
CLRF RESULT_MSB
BCF STATUS, C ; LIMPA O CARRY
RLF NUM_1,F ; MULTIPLICA POR 2 (400 = 200 (11001000) X 2)
RLF RESULT_MSB,F ;ROTACIONA O BYTE MAIS SIGNIFICATIVO PARA “PEGAR”
O BIT DO CARRY (400 = 110010000)
RLF NUM_1,F ; MULTIPLICA POR 2 NOVAMENTE (800 = 200 X 4)
RLF RESULT_MSB,F
, ; “PEGA” O CARRY ((800 = 1100100000))
MOVF NUM_1, W
MOVWF RESULT_LSB
FIM

AA
RETLW

AA
Tabela de Conversão
Rotina de conversão: (NUM ← NUM * 3 + 2)

CONVERSAO
MOVF NUM,W
ADDWF PCL,F
PCL F
RETLW .2 ; NUM = 0 → Retorna 2
RETLW .5 ; NUM = 1 → Retorna 5
RETLW .88 ; NUM = 2 → Retorna
R t 8
RETLW .11 ; NUM = 3 → Retorna 11
AA
Endereçamento Indireto

AA
Endereçamento

- Endereçamento Direto: o endereço do dado está na


pprópria
p instrução.
ç

- Endereçamento Indireto: o endereço do dado está em


um registrador de uso específico (Ponteiro).

AA
AA
Acesso Indireto à Memória

Endereçamento Indireto: o endereço do dado está em um


registrador
g de uso específico
p ((SFR).
)

- FSR – Contém o endereço que o ponteiro deverá apontar.


apontar
Equivalente ao DPTR do 8051

- INDF – Ponteiro (não é fisicamente um registrador!)

AA
AA
Acesso Indireto à Memória
Rotina para limpar um bloco de endereços da memória RAM de 0x20 a 0x2F
LIMPA
MOVLW 0x20
MOVWF FSR ; Inicia o ponteiro com o endereço 0x20h
LOOP
CLRF INDF; na verdade está “limpando” o endereço dado que está no
endereço indicado no ponteiro FSR
MOVLW 0X2F
XORWF FSR,W
BTFSC STATUS,Z
RETURN
INCF FSR,F
GOTO LOOP
FIM
AA
FIM

AA

Potrebbero piacerti anche