Buscar

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 8 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 8 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Continue navegando


Prévia do material em texto

Universidade Federal de Mato Grosso 
Faculdade de Arquitetura, Engenharia e Tecnologia 
Departamento de Engenharia Elétrica 
Laboratório de Microprocessadores 
 
 
 
 
 
 
 
 
Laboratório 8 
Bibliotecas de Operações Aritméticas 
 
 
 
Engenharia Elétrica 
 
Docente: Prof. Nicolás Eusebio Cortez Ledesma 
 
Discentes: 
Bárbara Morais Gianesini 
Kaio Vinícius Vilerá 
 
Turma: N1 
Data da realização do laboratório: 
 18 de Março de 2016 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1. Objetivos 
 
 Estudo, desenvolvimento e utilização de bibliotecas de sub-rotinas matemáticas e 
controle do LCD para processamento de dados e apresentação de resultados. 
 
2. Atividades 
 
Realize as mudanças ou inclua as instruções necessárias, para o programa realizar operações 
de precisão dupla, ou seja, com operandos de 16 bits. Ensamblar, simular e gravar no PIC o 
conteúdo ‘.HEX’, e testar na placa física de desenvolvimento ou na protoboard. 
 
 
 
Os códigos em Assembly para implementação das operações matemáticas foram 
incluídos na próxima página. A partir do código entregue pelo professor, cada membro do grupo 
realizou as modificações necessárias para implementação das operações de soma, subtração, 
divisão e multiplicação utilizando operandos de 16 bits. 
Os operandos são definidos pelo programador no início do código, mas o usuário tem a 
liberdade de escolher a operação matemática que deseja realizar. 
Foram utilizados 4 botões, o primeiro (conectado ao pino 4 da porta B) para escolher a 
operação de soma, o segundo (conectado ao pino 5 da porta B) para escolher a operação de 
subtração, o terceiro (conectado ao pino 6 da porta B) para multiplicação e o quarto (conectado 
ao pino 7 da porta B) para a divisão. 
A cada vez que um desses botões é pressionado, o resultado da respectiva operação é 
enviado para o display LCD. 
Foi necessário “conectar” os códigos das bibliotecas disponibilizadas com o código 
principal, por isso foi importante entender como funcionavam as sub-rotinas dessas bibliotecas, 
de forma a recuperar os resultados de maneira correta. 
 Uma observação importante sobre a operação de subtração, é que pode-se considerar 
resultados negativos, e quando isso ocorre, um sinal negativo aparece em frente ao resultado. 
 As partes do código modificadas pelos participantes foram destacadas em negrito. 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Código Barbara: 
 
list p =16f877a 
#include <p16f877a.inc> 
__CONFIG H'3F32' 
 
ERRORLEVEL -305 
ERRORLEVEL -302 
 
cblock 0x20 
 conta 
 Loper 
 binario_L 
 binario_H 
endc 
 
org 0x00 
goto inicio 
seq_1 addwf PCL,F 
 dt "OPERACAO: " 
seq_2 addwf PCL,F 
 dt "RES.:" ; 
 
sinalnegativo macro 
 movlw '-' 
 call EnviaCarLCD 
 endm 
 
;programa principal 
inicio: 
 movlw 0xF0 
 movwf PORTB 
 clrf PORTE 
 bsf STATUS, RP0 
 bcf OPTION_REG, 7 
 bsf TRISA, 0 
 movlw B'11110000' 
 movwf TRISB 
 movlw 0x0E 
 movwf ADCON1 
 bcf STATUS, RP0 
 bsf INTCON, PEIE 
 bsf INTCON, GIE 
 call inicio_LCD 
menu 
 clrf negativo 
 movlw 0xFF 
 movwf Op1_L 
 movlw 0xFF 
 movwf Op2_L 
 movlw 0x00 
 movwf Op1_H 
 movlw 0x00 
 movwf Op2_H 
 call LCD_limpar 
 call prt1 
 clrf binario_H 
 clrf binario_L 
 clrf Binario3 
 clrf Binario4 
 clrf Binario5 
 btfss PORTB, 4 
 goto soma 
 btfss PORTB, 5 
 goto subtrai 
 btfss PORTB, 6 
 goto multiplica 
 btfss PORTB, 7 
 goto divide 
 goto $-8 
soma 
 movlw '+' 
 call EnviaCarLCD 
 call soma16 
 btfsc STATUS,C 
 incf Binario3 
 movfw Op2_L 
 movwf binario_L 
 movfw Op2_H 
 movwf binario_H 
 goto prt_rpta 
subtrai 
 movlw '-' 
 call EnviaCarLCD 
 call subtracao16 
 movfw Op2_L 
 movwf binario_L 
 movfw Op2_H 
 movwf binario_H 
 goto prt_rpta 
multiplica 
 movlw '*' 
 call EnviaCarLCD 
 call multi16 
 movfw Rpta1 
 movwf binario_L 
 movfw Rpta2 
 movwf binario_H 
 movfw Rpta3 
 movwf Binario3 
 movfw Rpta4 
 movwf Binario4 
 goto prt_rpta 
divide 
 movlw '/' 
 call EnviaCarLCD 
 call divide16 
 movfw Quociente_L 
 movwf binario_L 
 movfw Quociente_H 
 movwf binario_H 
 goto prt_rpta 
prt_rpta 
 call LCD_cursor_linha_2 
 call prt2 
 call bin40_bcd 
 movlw .1 
 xorwf negativo, W 
 btfsc STATUS, Z 
 sinalnegativo 
 swapf BCD5, W 
 andlw 0x0F 
 addlw 0x30 
 call EnviaCarLCD 
 movfw BCD5 
 andlw 0x0F 
 addlw 0x30 
 call EnviaCarLCD 
 swapf BCD4, W 
 andlw 0x0F 
 addlw 0x30 
 call EnviaCarLCD 
 movfw BCD4 
 andlw 0x0F 
 addlw 0x30 
 call EnviaCarLCD 
 swapf BCD3, W 
 andlw 0x0F 
 addlw 0x30 
 call EnviaCarLCD 
 movfw BCD3 
 andlw 0x0F 
 addlw 0x30 
 call EnviaCarLCD 
 swapf BCD2, W 
 andlw 0x0F 
 addlw 0x30 
 call EnviaCarLCD 
 movfw BCD2 
 andlw 0x0F 
 addlw 0x30 
 call EnviaCarLCD 
 swapf BCD1, W 
 andlw 0x0F 
 addlw 0x30 
 call EnviaCarLCD 
 movfw BCD1 
 andlw 0x0F 
 addlw 0x30 
 call EnviaCarLCD 
 call ret1s 
 call ret1s 
 btfss PORTB, 4 
 goto $-1 
 btfss PORTB, 5 
 goto $-1 
 btfss PORTB, 6 
 goto $-1 
 btfss PORTB, 7 
 goto $-1 
 call ret1s 
 call ret1s 
 goto menu 
prt1 
 clrf conta 
 movfw conta 
 call seq_1 
 call EnviaCarLCD 
 incf conta,F 
 movf conta, W 
 xorlw .10 
 btfss STATUS, Z 
 goto $-7 
 return 
prt2 
 clrf conta 
 movfw conta 
 call seq_2 
 call EnviaCarLCD 
 incf conta,F 
 movf conta, W 
 xorlw .5 
 btfss STATUS, Z 
 goto $-7 
 return 
 
#include "up_atrasos.asm" 
#include "up_bin40-bcd.asm" 
#include "up_driver_lcd.asm" 
#include "up_matemat.asm" 
 
 end 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Modificações na biblioteca 
“matemat”: 
 
cblock 
auxiliar 
carr 
negativo 
endc 
 
;MACROS 
 
addwfca macro reg1 
; salva no Wreg 
clrf carr 
btfsc STATUS, C 
addlw .1 
btfsc STATUS, C 
incf carr, F 
addwf reg1, W 
btfsc STATUS, C 
incf carr, F 
movwf auxiliar 
bcf STATUS, C 
movlw .1 
xorwf carr, W 
btfsc STATUS, Z 
bsf STATUS, C 
movf auxiliar, W 
endm 
 
comp16 macro ope2_H, ope2_L 
 
comf ope2_H, F 
comf ope2_L, F 
 movlw .1 
 addwf ope2_L, F 
 movlw 0x00 
addwfca ope2_H 
 movwf ope2_H 
 endm 
 
jae macro op1, op2, address 
;pula se op1>=op2 
 movfw op2 
 subwf op1, w 
; w = op1-op2 
btfsc STATUS, C 
 goto address 
 endm 
 
;////////////////////////////////////////////////// 
 
 
 
 
;***************************** 
; SUBTRACAO DE PRECISÃO DUPLA 
;***************************** 
; Op1_H:Op1_L - Op2_H:Op2_L -> 
Op2_H:Op2_L 
;***************************** 
 
subtracao16: 
 
 clrf negativo 
jae Op1_H, Op2_H, testa_l 
 incf negativo, F 
 goto final 
testa_l 
jae Op1_L, Op2_L, final 
 incf negativo, F 
final 
comp16 Op2_H, Op2_L 
 call soma16 
 
 movfw negativo 
 xorlw .1 
 btfsc STATUS, Z 
 goto negacao 
 goto afirmacao 
negacao 
comp16 Op2_H, Op2_L 
afirmacao 
 
 return 
;***************************** 
; SOMA DE PRECISÃO DUPLA 
;***************************** 
; Op1_H:Op1_L + Op2_H:Op2_L -> 
C:Op2_H:Op2_L 
;***************************** 
 
soma16: 
 movfw Op1_L 
 bcf STATUS, C 
addwfca Op2_L 
 movwf Op2_L 
 movfw Op1_H 
addwfca Op2_H 
 movwf Op2_H 
 
return 
 
 
 
 
 
 
 
 
 
 
 
Código Kaio: 
list p =16f877a 
#include <p16f877a.inc> 
__CONFIG H'3F32' 
ERRORLEVEL -305 
ERRORLEVEL -302 
 cblock 0x20 
 conta,Loper 
 endc 
 org 0x00 
 goto inicio 
seq1 addwf PCL,F 
 dt "OPERACAO: " ;10c 
 
inicio: 
 movlw 0xF0 
 movwf PORTB 
 clrf PORTE 
 clrf INTCON 
 bsf STATUS,RP0 
 bcf OPTION_REG,7 
 movlw B'11110000' 
 movwf TRISB 
 bsf TRISA,0 
 movlw 0x0E 
 movwf ADCON1 
 bcf STATUS,RP0 
 bsf INTCON,RBIE 
 bsf INTCON,GIE 
 call inicio_LCD 
 
menu 
 movlw .25 
 movwf Op1_L 
 movlw .0 
 movwf Op1_H 
 movlw .65 
 movwf Op2_L 
 movlw .0 
 movwf Op2_H 
 call LCD_limpar 
 call prt1 
 clrf binario_H 
 clrf binario_L 
 clrf Binario3 
 clrf Binario4 
 clrf Binario5 
 clrf operacao 
 clrf seNeg 
 btfss PORTB,4 
 goto Soma 
 btfss PORTB,5 
 goto Subtrai 
 btfss PORTB,6 
 goto Multiplica 
 btfss PORTB,7 
 goto Divide 
 goto $-8 
Soma 
 movlw '+' 
 movwf operacao 
 call ptrResultadoLinha1 
 call Soma16 
 movfw Op1_L 
 movwf binario_L 
 movfw Op1_H 
 movwf binario_H 
 btfsc Carry,1 
 incf Binario3,F 
 goto prt_rpta 
 
Subtrai 
 movlw '-'movwf operacao 
 call ptrResultadoLinha1 
 clrf seNeg 
 call Subtrai16 
 movfw Op1_L 
 movwf binario_L 
 movfw Op1_H 
 movwf binario_H 
 goto prt_rpta 
 
Multiplica 
 movlw '*' 
 movwf operacao 
 call ptrResultadoLinha1 
 call multi16 
 movfw Rpta1 
 movwf binario_L 
 movfw Rpta2 
 movwf binario_H 
 movfw Rpta3 
 movwf Binario3 
 movfw Rpta4 
 movwf Binario4 
 goto prt_rpta 
 
Divide 
 movlw '/' 
 movwf operacao 
 call ptrResultadoLinha1 
 call divide16 
 goto prt_rptaDivide 
 
prt_rptaDivide 
 call LCD_cursor_linha_2 
 movlw 'Q' 
 call EnviaCarLCD 
 movlw ':' 
 call EnviaCarLCD 
 movfw Quociente_L 
 movwf binario_L 
 movfw Quociente_H 
 movwf binario_H 
 call bin_bcd 
 movfw dmil 
 addlw 0x30 
 call EnviaCarLCD 
 movfw umil 
 addlw 0x30 
 call EnviaCarLCD 
 movfw cent 
 addlw 0x30 
 call EnviaCarLCD 
 movfw deze 
 addlw 0x30 
 call EnviaCarLCD 
 movfw unit 
 addlw 0x30 
 call EnviaCarLCD 
 movlw ' ' 
 call EnviaCarLCD 
 movlw 'R' 
 call EnviaCarLCD 
 movlw ':' 
 call EnviaCarLCD 
 movfw Resto_L 
 movwf binario_L 
 movfw Resto_H 
 movwf binario_H 
 call bin_bcd 
 movfw dmil 
 addlw 0x30 
 call EnviaCarLCD 
 movfw umil 
 addlw 0x30 
 call EnviaCarLCD 
 movfw cent 
 addlw 0x30 
 call EnviaCarLCD 
 movfw deze 
 addlw 0x30 
 call EnviaCarLCD 
 movfw unit 
 addlw 0x30 
 call EnviaCarLCD 
 call ret1s 
 call ret1s 
 btfss PORTB,4 
 goto $-1 
 btfss PORTB,5 
 goto $-1 
 btfss PORTB,6 
 goto $-1 
 btfss PORTB,7 
 goto $-1 
 call ret1s 
 call ret1s 
 goto menu 
 
 
prt_rpta 
 call LCD_cursor_linha_2 
 btfsc seNeg,0 
 movlw '-' 
 btfsc seNeg,0 
 call EnviaCarLCD 
 call bin40_bcd 
 swapf BCD5,W 
 andlw 0X0F 
 addlw 0x30 
 call EnviaCarLCD 
 movfw BCD5 
 andlw 0X0F 
 addlw 0x30 
 call EnviaCarLCD 
 swapf BCD4,W 
 andlw 0X0F 
 addlw 0x30 
 call EnviaCarLCD 
 movfw BCD4 
 andlw 0X0F 
 addlw 0x30 
 call EnviaCarLCD 
 swapf BCD3,W 
 andlw 0X0F 
 addlw 0x30 
 call EnviaCarLCD 
 movfw BCD3 
 andlw 0X0F 
 addlw 0x30 
 call EnviaCarLCD 
 swapf BCD2,W 
 andlw 0X0F 
 addlw 0x30 
 call EnviaCarLCD 
 movfw BCD2 
 andlw 0X0F 
 addlw 0x30 
 call EnviaCarLCD 
 swapf BCD1,W 
 andlw 0X0F 
 addlw 0x30 
 call EnviaCarLCD 
 movfw BCD1 
 andlw 0X0F 
 addlw 0x30 
 call EnviaCarLCD 
 call ret1s 
 call ret1s 
 btfss PORTB,4 
 goto $-1 
 btfss PORTB,5 
 goto $-1 
 btfss PORTB,6 
 goto $-1 
 btfss PORTB,7 
 goto $-1 
 call ret1s 
 call ret1s 
 goto menu 
prt1: 
 clrf conta 
 movfw conta 
 call seq1 
 call EnviaCarLCD 
 incf conta,F 
 movf conta,W 
 xorlw .10 
 btfss STATUS,Z 
 goto $-7 
 return 
 
 cblock 
 Op1_H, Op1_L 
 Op2_H, Op2_L, Carry 
 endc 
prtop1: 
 movfw Op1_L 
 movwf binario_L 
 movfw Op1_H 
 movwf binario_H 
 call bin_bcd 
 movfw dmil 
 addlw 0x30 
 call EnviaCarLCD 
 movfw umil 
 addlw 0x30 
 call EnviaCarLCD 
 movfw cent 
 addlw 0x30 
 call EnviaCarLCD 
 movfw deze 
 addlw 0x30 
 call EnviaCarLCD 
 movfw unit 
 addlw 0x30 
 call EnviaCarLCD 
 return 
 
ptrResultadoLinha1: 
 call LCD_cursor_linha_1 
 call prtop1 
 movlw ' ' 
 call EnviaCarLCD 
 movfw operacao 
 call EnviaCarLCD 
 movlw ' ' 
 call EnviaCarLCD 
 call prtop2 
 movlw ' ' 
 call EnviaCarLCD 
 movlw '=' 
 call EnviaCarLCD 
 return 
 
 
prtop2: 
 movfw Op2_L 
 movwf binario_L 
 movfw Op2_H 
 movwf binario_H 
 call bin_bcd 
 movfw dmil 
 addlw 0x30 
 call EnviaCarLCD 
 movfw umil 
 addlw 0x30 
 call EnviaCarLCD 
 movfw cent 
 addlw 0x30 
 call EnviaCarLCD 
 movfw deze 
 addlw 0x30 
 call EnviaCarLCD 
 movfw unit 
 addlw 0x30 
 call EnviaCarLCD 
 return 
 
Subtrai16: 
 call neg_Oper2 
 call Soma16 
 btfsc Carry,1 
 return 
 bsf seNeg,0 ;Mostra que o 
numero e negativo 
 call neg_Oper1 
 return 
 
Soma16: 
 clrf Carry 
 movfw Op2_L 
 addwf Op1_L, F 
 btfsc STATUS, C 
 bsf Carry,0 
 movfw Op2_H 
 addwf Op1_H,F 
 btfsc STATUS,C 
 bsf Carry,1 
 btfss Carry,0 
 return 
 incf Op1_H,F 
 btfsc STATUS,Z 
 bsf Carry,1 
 return 
 
neg_Oper2: 
 comf Op2_L,F 
 incf Op2_L,F 
 btfsc STATUS,Z 
 decf Op2_H,F 
 comf Op2_H,F 
 return 
 
neg_Oper1: 
 comf Op1_L,F 
 incf Op1_L,F 
 btfsc STATUS,Z 
 decf Op1_H,F 
 comf Op1_H,F 
 return 
 
 cblock 
 Mulcnd, Mulpdr, 
conta8 
 Rpta2, Rpta1, 
operacao 
 seNeg 
 endc 
 
Multi8: 
 clrf Rpta1 
 clrf Rpta2 
 movlw .8 
 movwf conta8 
 movfw Mulcnd 
 bcf STATUS,C 
 
lazo_m8: 
 rrf Mulpdr,F 
 btfsc STATUS,C 
 addwf Rpta2,F 
 rrf Rpta2,F 
 rrf Rpta1,F 
 decfsz conta8,F 
 goto lazo_m8 
 return 
 
 cblock 
 Divdnd, Divisor 
 endc 
 Quociente equ Divisor 
 Resto equ Divdnd 
 
Divide8: 
 movfw Divisor 
 clrf Quociente 
 
loopd subwf Resto,F 
 btfss STATUS,C 
 goto fimd 
 incf Quociente,F 
 goto loopd 
fimd addwf Resto,F 
 return 
 
 #include "up_atrasos.asm" 
 #include "up_bin16-bcd.asm" 
 #include "up_driver_lcd.asm" 
 #include "up_matemat.asm" 
 #include "up_bin40-bcd.asm" 
 End