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