Upload
stanley-florencio
View
160
Download
1
Embed Size (px)
Citation preview
AAAASELSEL––06290629
Aplicação deAplicação deAplicação de Aplicação de Microprocessadores IMicroprocessadores I
Aula 4Aula 4Operações Lógicas e Operações Lógicas e
A it étiA it étiAritméticasAritméticas
Marcelo Andrade da Costa Vieira
AAAA
Operações LógicasOperações Lógicas
Existem 5 tipos de operações lógicas nosmicrocontroladores PIC:microcontroladores PIC:
AND : “E” Lógico;OR : “OU” Lógico;OR : OU Lógico;XOR : “OU” Exclusivo;COMP : Complemento;SWAP : Inversão.SWAP : Inversão.
AA
ANDAND
Byte1 1 0 1 0 0 0 1 0Byte2 1 1 0 0 1 0 1 0AND 1 0 0 0 0 0 1 0
“E” Lógico entre todos os bits do registrador bit a bitE Lógico entre todos os bits do registrador, bit a bit.
AA
ANDAND
A B AND0 0 0 Criar uma “máscara”:0 0 0
0 1 0
Criar uma máscara :
1: “Copia” o valor do bit1 0 0
1: Copia o valor do bit
0: “Reseta” o valor do bit1 1 1
0: Reseta o valor do bit
AA
ANDAND
1 ANDLW k “E” ló i l li l k l1. ANDLW k : “E” lógico entre o valor literal k e o valorcontido 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 oregistrador f guardando o resultado no destino (w ouregistrador f, guardando o resultado no destino (w ouf) (d ← f AND w);
AA
ANDWF e ANDLWANDWF e ANDLW
Garantir que um número seja menor que 15
MOVLW B ‘00001111’ANDWF NUM_1,F
Ou
MOVF NUM_1,WANDLW B ‘00001111’MOVWF NUM_1
AA
OROR
Byte1 1 0 1 0 0 0 1 0Byte2 1 1 0 0 1 0 1 0OR 1 1 1 0 1 0 1 0
“OU” Lógico entre todos os bits do registrador bit a bitOU Lógico entre todos os bits do registrador, bit a bit.
AA
OROR
A B OR0 0 0 Criar uma “máscara”:0 0 0
0 1 1
Criar uma máscara :
0: “Copia” o valor do bit1 0 1
0: Copia o valor do bit
1: “Seta” o valor do bit1 1 1
1: Seta o valor do bit
AA
OROR
1 IORLW k “OU” ló i l li l k l1. IORLW k : “OU” lógico entre o valor literal k e o valorcontido 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 oregistrador f guardando o resultado no destino (w ouregistrador f, guardando o resultado no destino (w ouf) (d ← f OR w);
AA
IORWF e IORLWIORWF e IORLW
Garantir que um número seja maior que 15
MOVLW B ‘00010000’IORWF NUM_1,F
Ou
MOVF NUM_1,WIORLW B ‘00010000’MOVWF NUM_1
AA
XORXOR
Byte1 1 0 1 0 0 0 1 1Byte2 1 1 0 0 1 0 1 0XOR 0 1 1 0 1 0 0 1
“OU” Exclusivo entre todos os bits do registrador bit a bitOU Exclusivo entre todos os bits do registrador, bit a bit.
Bits Iguais 0Bits Iguais – 0Bits Diferentes - 1
AA
XORXOR
Criar uma “máscara” do A B XOR0 0 0
Criar uma máscara do tipo “inversor controlado”:
0 0 0
0 1 10: “Copia” o valor do bit1: “Inverte” o valor do bit
1 0 1“Comparação” bit a bit
1 1 0Comparação bit a bit
0: Bits iguaisg1: Bits diferentes
AA
XORXOR
1 XORLW k “OU” E l i l li l k1. XORLW k : “OU” Exclusivo entre o valor literal k e ovalor contido no registrador w, guardando o resultadoem w (w ← k XOR w);
2. XORWF f,d : “OU” Exclusivo entre o valor de w e oregistrador f guardando o resultado no destino (w ouregistrador f, guardando o resultado no destino (w ouf) (d ← f XOR w);
AA
XORWFXORWFChamar uma rotina 10 vezes – Contador
Se a operação “OU” Exclusivo resultar em Zero, é porque os valores são iguais.
CLRF CONTADORLOOPCALL ROTINAINCF CONTADOR FINCF CONTADOR,FMOVLW .10XORWF CONTADOR WXORWF CONTADOR,WBTFSS STATUS,ZGOTO LOOPGOTO LOOPFIM
AA
COMFCOMF
Byte 0 0 0 1 0 0 1 0 18COMF 1 1 1 0 1 1 0 1
18
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
COMFCOMF
COMF f,d : Complemento do valor do registrador f,guardando o resultado no destino (w ou f) (d ← COMP f );guardando o resultado no destino (w ou f) (d ← COMP f );
AA
SWAPSWAP
Byte 0 1 1 0 1 1 0 0SWAP 1 1 0 0 0 1 1 0
Inverte os 4 bits (nibble) mais significativos com os 4 bits menos significativos
AA
SWAPSWAP
SWAPF f,d : Inversão dos 4 bits do valor do registrador f,guardando o resultado no destino (w ou f) (d ← COMP f );guardando o resultado no destino (w ou f) (d ← COMP f );
AA
ADIÇÃOADIÇÃO• Existem 4 comandos para adição no PIC:
1.INCF f,d : Incrementa uma unidade o registrador f, guardandoo resultado no destino (w ou f) (d ← f + 1);
2.INCFSZ f,d : Incrementa uma unidade o registrador f, e pulauma linha se o resultado for zero (d ← f + 1);uma linha se o resultado for zero (d ← f + 1);
3 ADDWF f d : Soma o valor de W com o registrador f3.ADDWF f,d : Soma o valor de W com o registrador f,guardando o resultado no destino (w ou f) (d ← f + w);
4.ADDLW k: Soma o valor literal k ao W, guardando o resultadoem w (w ← k + w);
AA
INCFINCF
Chamar uma rotina 4 vezes
CLRF CONTADORLOOPCALL ROTINACALL ROTINAINCF CONTADOR,FBTFSS CONTADOR,2GOTO LOOPFIM
AA
INCFSZINCFSZ
Chamar uma rotina 4 vezes
MOVLW D‘252’MOVLW D 252MOVWF CONTADORCALL ROTINAINCFSZ CONTADOR FINCFSZ CONTADOR,FGOTO $-2FIM
AA
INCFSZINCFSZ
Essa instrução afeta o registrador STATUS
Carry – STATUS, 0 ou STATUS, Cy , ,- Vai para “1” se o registrador “estourar”
Zero – STATUS, 2 ou STATUS, ZZero STATUS, 2 ou STATUS, Z- Vai para “1” se o registrador “zerar”
AA
ADDWF e ADDLWADDWF e ADDLWSomar dois números
MOVLW .10MOVWF NUM 1_MOVLW .20MOVWF NUM_2CLRF RESULTMOVF NUM_1,W ; W ← 10ADDWF NUM2,W ;W ← 10 + 20ADDLW .5 ;W ← 30 + 5MOVWF RESULT RESULT 35MOVWF RESULT ; RESULT ← 35FIM
AA
E se a soma for maior que 255?E se a soma for maior que 255?
NUM1 100 1 1 0 0 1 0 0 0Carry
NUM1 100 1 1 0 0 1 0 0 0NUM2 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 = 510 (9 bits no máximo)255 + 255 + 255 = 765 (10 bits no máximo)
Utiliza 2 bytes para guardar o resultadoA cada número somado incrementa o carry uma vez!
AAA cada número somado, incrementa o carry uma vez!
E se a soma for maior que 255?E se a soma for maior que 255?Utilizar o Carry!
MOVLW .100MOVWF NUM_1MOVLW 200MOVLW .200MOVWF NUM_2CLRF RESULT_LSBCLRF RESULT MSBCLRF RESULT_MSBMOVF NUM_1,W ; W ← 100ADDWF NUM2,W ;W ← 100 + 200, ;BTFSC STATUS,C ; testa o carryINCF RESULT_MSB,FMOVWF RESULT LSBMOVWF RESULT_LSBFIM
AA
SUBTRAÇÃOSUBTRAÇÃ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 pulauma linha se o resultado for zero (d ← f 1);uma linha se o resultado for zero (d ← f - 1);
3 SUBWF f d : Subtrai o valor de W do registrador f guardando3.SUBWF f,d : Subtrai o valor de W do registrador f, guardandoo resultado no destino (w ou f) (d ← f - w);
4.SUBLW k: Subtrai o valor de W do literal k, guardando oresultado em w (w ← k - w);
AA
DECFSZDECFSZ
Chamar uma rotina 10 vezes
MOVLW .10MOVWF CONTADORLOOPLOOPCALL ROTINADECFSZ CONTADOR,FGOTO LOOPFIM
AA
SUBWF e SUBLWSUBWF e SUBLWSubtrair dois números quaisquer
MOVLW 12MOVLW .12MOVWF NUM1MOVLW 20MOVLW .20MOVWF NUM2CLRF RESULTCLRF RESULTMOVF NUM1,W ; W ← 12SUBWF NUM2 W ;W ← 20 12 = 8 (NUM2 W)SUBWF NUM2,W ;W ← 20 – 12 = 8 (NUM2 – W)SUBLW .10 ; W ← 10 – 8 (k – W)MOVWF RESULT; RESULT ← 2MOVWF RESULT; RESULT ← 2FIM
AA
DECFSZDECFSZA subtração afeta o carry (STATUS) de modo inverso à
operação de adição!operação de adição!
ÃADIÇÃO: n° positivo: C = 0zero: C = 1 e Z = 1 (“estouro”)zero: C 1 e Z 1 ( estouro )
ÃSUBTRAÇÃO: n° positivo: C = 1zero: C = 1 e Z = 1zero: C 1 e Z 1
n° negativo: C = 0 (“estouro”)
AA
E se o resultado for negativo?E se o resultado for negativo?
NUM1 160 1 0 1 0 0 0 0 0Carry
NUM1 160 1 0 1 0 0 0 0 0NUM2 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 2256 - 216 = 40 (complemento para 256) = Complemento de 2
Utiliza 1 bit (flag) para guardar o sinalUtiliza 1 bit (flag) para guardar o sinal
AA
SUBWF e SUBLWSUBWF e SUBLWSubtrair dois números quaisquer
CLRF RESULTCLRF RESULTMOVF NUM_1,W ;W ← NUM_1SUBWF NUM2 W ;W ← NUM 2 – NUM 1SUBWF NUM2,W ;W ← NUM_2 NUM_1BTFSS STATUS,C ;TESTA O CARRY (NÚMERO NEGATIVO → C = 0)GOTO NEGATIVOMOVWF RESULT ; SALVA O RESULTADO POSITIVOBCF NEG ; LIMPA O FLAG DE SINAL NEGATIVOGOTO FIMGOTO FIMNEGATIVOSUBLW 0 ; W ←256 – WSUBLW .0 ; W ←256 WMOVWF RESULT ; SALVA O RESULTADO NEGATIVOBSF NEG ; SETA O FLAG DE SINAL NEGATIVO
AAFIM
Rotacionando o ByteRotacionando o Byte
• RLF f,d – rotacionar o byte à esquerda
• RRF f,d – rotacionar o byte à direita
Cuidado com o CARRY!!
AA
MULTIPLICAR e DIVIDIRMULTIPLICAR e DIVIDIR
• Só é válido para potências de 2 (2-4-8-16-32):
– RLF f,d : Rotaciona o bit à esquerda (left) – multiplica por , q ( ) p p2 cada vez que o bit é rotacionado;
– RRF f,d : Rotaciona o bit à direita (right) – divide por 2 cada vez que o bit é rotacionado;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 ByteRotacionando 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 4MOVLW 200MOVLW .200MOVWF NUM_1CLRF RESULT LSBCLRF RESULT_LSBCLRF RESULT_MSBBCF STATUS, C ; LIMPA O CARRYRLF 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)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, WMOVWF RESULT_LSBFIM
AA
Tabela de ConversãoTabela de ConversãoRotina de conversão: (NUM ← NUM * 3 + 2)
CONVERSAOMOVF NUM,WADDWF PCL FADDWF PCL,FRETLW .2 ; NUM = 0 → Retorna 2RETLW .5 ; NUM = 1 → Retorna 5RETLW 8 ; NUM 2 R t 8RETLW .8 ; NUM = 2 → Retorna 8RETLW .11 ; NUM = 3 → Retorna 11
AA
EndereçamentoEndereçamento
- Endereçamento Direto: o endereço do dado está naprópria instrução.p p ç
- Endereçamento Indireto: o endereço do dado está emum registrador de uso específico (Ponteiro).
AA
Acesso Indireto à MemóriaAcesso Indireto à Memória
Endereçamento Indireto: o endereço do dado está em umregistrador de uso específico (SFR).g p ( )
FSR Contém o endereço que o ponteiro deverá apontar- FSR – Contém o endereço que o ponteiro deverá apontar.Equivalente ao DPTR do 8051
- INDF – Ponteiro (não é fisicamente um registrador!)
AA
Acesso Indireto à MemóriaAcesso Indireto à MemóriaRotina para limpar um bloco de endereços da memória RAM de 0x20 a 0x2F
LIMPAMOVLW 0x20MOVWF FSR ; Inicia o ponteiro com o endereço 0x20hLOOPLOOPCLRF INDF; na verdade está “limpando” o endereço dado que está no
endereço indicado no ponteiro FSRendereço indicado no ponteiro FSRMOVLW 0X2FXORWF FSR,WBTFSC STATUS,ZRETURNINCF FSR,FGOTO LOOP
AAFIM