;===================================================================================================== ; PROJETO CONTADOR DIGITAL DE VOLTAS ; INICIO : 24/03/13 TERM.:24/03/13 ; AUTOR: CLÁUDIO LÁRIOS ; PROCESSADOR: VERSÃO COM PIC 16F628A DE 18 PINOS ; OBJETIVO: MOSTRAR VALOR DE NÚMERO DE VOLTAS AO ENROLAR BOBINAS E TRANSFORMADORES. ; USE UM REED SWITCH COMO SENSOR E UM IMÃ JUNTO A MANIVELA. ;___________________________________________________________________________________________________ ; LIST P=16f628a , R=DEC INCLUDE "P16F628a.INC" ; ARQUIVO PADRAO ERRORLEVEL -302 __CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _BODEN_ON & _MCLRE_ON & _LVP_OFF ; PAGINACAO DE MEMORIA; #DEFINE BANK0 BCF STATUS,RP0 ;SETA BANK0 DE MEMORIA #DEFINE BANK1 BSF STATUS,RP0 ;SETA BANK1 ; VARIAVEIS CBLOCK 0X20 ;ENDERECO INICIAL DE MEMORIA DIG0 ;ACUMULADOR DOS DIGITOS DO DISPLAY ZERO (0) DIG1 ;ACUMULADOR DOS DIGITOS DO DISPLAY UM(1) DIG2 ;ACUMULADOR DOS DIGITOS DO DISPLAY DOIS (2) DIG3 ;ACUMULADOR DOS DIGITOS DO DISPLAY TREIS (3) CENV ;CONTADOR DE ENVIO PARA MOSTRADOR EXTERNO DEL0 ;DELAY DEL1 ;IDEM FLAGS ;IDEM CONT0 ;CONTADOR AUXILIAR PARA RESULTADO PARTE BAIXA DA CONVERSÃO CONT1 ;CONTADOR AUXILIAR PARA RESULTADO PARTE ALTA DA CONVERSÃO CDELAP ;DELAY PARA REDUZIR CONVERSÕES E OPERAR MULTIPLEXAÇÃO PONTK ;PONTEIRO PARA KATODOS DOS SEGUIMENTOS WAUX ;W AUXILIAR PT_MSG ;PONTEIRO PARA MENSAGEM AUX AUX1 WTEMP STATUSTEMP LC C1 C0 BR0 BR1 BR2 BR3 ENDC CBLOCK 0X3F PILHA ENDC ;======================DEFINICAO DE BITS E FLAGS============================================== #DEFINE REED PORTA,0 #DEFINE FLAG_ZERO FLAGS,0 ;*********************************************************************************************** ; CONSTANTES VDEL0 EQU .250; 250 VALOR INICIAIS PARA DELAY VDEL10MS EQU .13; PARA 10 MILISEGUNDOS VDEL1MS EQU .1 ;************************************************************************************************* ; VETOR E2PROM ; ORG H'2100' ;................................................................................................. ; VETOR DE RESET ORG 0X00 GOTO INICIO ;=================================================================================================== ; VETOR DE INTERRUPCAO ORG 0X04 MOVWF WTEMP ;SALVA 'W' SWAPF STATUS,W ;SALVA 'STATUS' MOVWF STATUSTEMP BCF INTCON,T0IF ;APAGA FLAG INTERRUPÇÃO TMR0 BANK0 MOVFW PONTK ANDLW B'00000011' ADDWF PCL,F GOTO M0 GOTO M1 GOTO M2 GOTO M3 M0 MOVFW DIG0 MOVWF WAUX ;CARREGA CONTADOR AUXILIAR CALL COPYD BSF PORTB,2 ;SETA RC2 K0 INCF PONTK,F GOTO SAI_INT M1 MOVFW DIG1 MOVWF WAUX CALL COPYD BSF PORTB,3 ;SETA RC3 K1 INCF PONTK,F GOTO SAI_INT M2 MOVFW DIG2 MOVWF WAUX CALL COPYD BSF PORTB,4 ;SETA RC3 K1 INCF PONTK,F GOTO SAI_INT M3 MOVFW DIG3 MOVWF WAUX CALL COPYD INCF PONTK,F SAI_INT SWAPF STATUSTEMP,W ;RECUPERA 'STATUS' MOVWF STATUS MOVFW WTEMP ;RECUPERA 'W' RETFIE ;................................................................................................ ; ; INICIO BANK1 ;BANCO 1 MOVLW B'10100000' ;LIGA INTERRUPÇÃO GERAL E DO TIMER 0 MOVWF INTCON ;DESLIGA TODAS INTERRUPCOES MOVLW b'11000001' ;DEFINE ENTRADAS (1) E SAIDAS (0) NA PIO MOVWF TRISA ; MOVLW b'11000000' MOVWF TRISB MOVLW B'10000011' ;DESAHABILITA PULL-UP DA PIO MOVWF OPTION_REG ;IDEM BANK0 MOVLW .7 MOVWF CMCON CLRF PORTA ;LIMPA PORTA CLRF PORTB ;LIMPA PORTB CLRF CONT0 CLRF CONT1 CLRF DEL1 CLRF PONTK MOVLW 0XFC MOVWF DIG0 COMF DIG0,F CLRF DIG1 COMF DIG1,F CLRF DIG2 COMF DIG2,F CLRF DIG3 COMF DIG3,F CLRF FLAGS MAIN BTFSC REED ;TESTA REED GOTO MAIN MOVLW .5 CALL DELAY ;4 MS BTFSC REED GOTO MAIN INCFSZ CONT0,F GOTO V_CONV INCF CONT1,F V_CONV MOVFW CONT0 MOVWF C0 MOVFW CONT1 MOVWF C1 CALL CONV_DEC ;CONVERTE PARA DECIMAL OS RESULTADOS H E L CALL CD7S ;CONVERTE EM 7 SEGUIMENTOS BTFSS REED GOTO $-1 GOTO MAIN ;=============================================================================================== ; SUB ROTINAS ;=============================================================================================== ;CONVERTE PARA 7 SEGUIMENTOS CD7S SWAPF BR1,W ;CONVERTE QUARTO DIGITO PARA 7 SEGUIMENTOS ANDLW 0X0F ADDLW .0 BTFSS STATUS,Z GOTO PR1 BSF FLAG_ZERO CLRF DIG3 COMF DIG3,F GOTO V_DIG2 PR1 BCF FLAG_ZERO CALL SEG7 MOVWF DIG3 COMF DIG3,F V_DIG2 MOVFW BR1 ;CONVERTE TERCEIRO DIGITO PARA 7 SEGMENTOS ANDLW 0X0F ADDLW .0 BTFSS STATUS,Z GOTO XPR2 BTFSS FLAG_ZERO GOTO XPR2 BSF FLAG_ZERO CLRF DIG2 COMF DIG2,F GOTO V_DIG1 XPR2 BCF FLAG_ZERO CALL SEG7 MOVWF DIG2 COMF DIG2,F V_DIG1 SWAPF BR0,W ;CONVERTE SEGUNDO DIGITO PARA 7 SEGUIMENTOS ANDLW 0X0F ADDLW .0 BTFSS STATUS,Z GOTO PR3 BTFSS FLAG_ZERO GOTO PR3 BSF FLAG_ZERO CLRF DIG1 COMF DIG1,F GOTO V_DIG0 PR3 BSF FLAG_ZERO CALL SEG7 MOVWF DIG1 COMF DIG1,F V_DIG0 MOVFW BR0 ;CONVERTE PRIMEIRO DIGITO PARA 7 SEGMENTOS ANDLW 0X0F CALL SEG7 MOVWF DIG0 COMF DIG0,F RETURN ;__________________________________________________________________________________ SEG7 ADDWF PCL,F ;TABELA DE CONVERSÃO "CALCULO GOTO" RETORNA 7 SEGUIMENTOS RETLW B'11111100' ;RETORNA NUMERO 0 (ABCDEFGP) F C RETLW B'01100000' ;RETORNA 1 60 RETLW B'11011010' ;RETORNA 2 DA RETLW B'11110010' ;RETORNA 3 F2 RETLW B'01100110' ;RETORNA 4 66 RETLW B'10110110' ;RETORNA 5 B6 RETLW B'10111110' ;RETORNA 6 BE RETLW B'11100000' ;RETORNA 7 E0 RETLW B'11111110' ;RETORNA 8 RETLW B'11110110' ;RETORNA 9 ;------------------------------------------------------------------------------------ ;------------------------------------------------------------------------- COPYD CLRF PORTA CLRF PORTB BTFSC WAUX,1 BSF PORTA,2 ;SETA RA2 G BTFSC WAUX,2 BSF PORTA,1 ;SETA RA1 F BTFSC WAUX,3 BSF PORTB,5 ;SETA RC5 E BTFSC WAUX,4 BSF PORTA,4 ;SETA RA4 D BTFSC WAUX,5 BSF PORTA,3 ;SETA RA3 C BTFSC WAUX,6 BSF PORTB,1 ;SETA RC1 B BTFSC WAUX,7 BSF PORTB,0 ;SETA RC0 A RETURN ;-------------------------------------------------------------------------- DELAY MOVWF DEL1 CLRF DEL0 DECFSZ DEL0,F GOTO $-1 DECFSZ DEL1,F GOTO $-3 RETURN CONV_DEC ;************************************************************************** ; ROTINA PARA CONVERSÃO DE 16 BITS PARA 5 BCD (3BYTES) ; ; ; EX: C0=FF ; C1=FF ; SERÁ APÓS CONVERSÃO : ; BR2=06 , BR1=55 ,BR0=35 (OBS. VALOR MÁXIMO 65535) ;*************************************************************************** ; RESERVAR ESTES REGISTRADORES NA MEMÓRIA ( SRAM) ; LC data 20H ;LOOPCOUNTER ; BR0 data 21H ;RESULTADOS DA CONVERSÃO ; BR1 data 22H ; BR2 data 23H ; C1 data 24H ;VALOR DE ENTRADA ALTO ; C0 data 25H ;BAIXO HEX_DEC: MOVLW .16 MOVWF LC ;CARREGA 16 CLRF BR0 ;ZERA RESULTADOS CLRF BR1 CLRF BR2 VOLTA: BCF STATUS,C RLF C0,F ;DESLOCA PARA ESQUERDA C0,C1,BR0,1,2 RLF C1,F RLF BR0,F RLF BR1,F RLF BR2,F DECFSZ LC,F ;VERIFICA SE CHEGOU AO FIM DA CONVERSÃO GOTO SEG9 RETURN ;FI DA CONVERSÃO SEG9: MOVLW .3 ADDWF BR2,W ;SOMA 3 EM RES2 ANDLW .8 ; 2ELEV 3=8 XORLW .8 BTFSS STATUS,Z GOTO NSOMA3 ;É=0 ,ENTÃO NÃO SOMA 3 (SE ZERO RETORNA VALOR ORIGINAL) MOVLW .3 ADDWF BR2,F ; É=1 ENTAO SOMA 3 NSOMA3: MOVLW 0X30 ADDWF BR2,W ANDLW 0X80 XORLW 0X80 BTFSS STATUS,Z GOTO NSOMA3A ;É=0 ,ENTÃO NÃO SOMA 30h MOVLW 0X30 ; É=1 ENTAO SOMA 30h ADDWF BR2,F NSOMA3A: MOVLW .3 ADDWF BR1,W ;SOMA 3 EM RES2 ANDLW .8 ; 2ELEV 3=8 XORLW .8 BTFSS STATUS,Z GOTO NSOMA3B ;É=0 ,ENTÃO NÃO SOMA 3 (SE ZERO RETORNA VALOR ORIGINAL) MOVLW .3 ADDWF BR1,F ; É=1 ENTAO SOMA 3 NSOMA3B: MOVLW 0X30 ADDWF BR1,W ANDLW 0X80 XORLW 0X80 BTFSS STATUS,Z GOTO NSOMA3C ;É=0 ,ENTÃO NÃO SOMA 30h MOVLW 0X30 ; É=1 ENTAO SOMA 30h ADDWF BR1,F NSOMA3C: MOVLW .3 ADDWF BR0,W ;SOMA 3 EM RES2 ANDLW .8 ; 2ELEV 3=8 XORLW .8 BTFSS STATUS,Z GOTO NSOMA3D ;É=0 ,ENTÃO NÃO SOMA 3 (SE ZERO RETORNA VALOR ORIGINAL) MOVLW .3 ADDWF BR0,F ; É=1 ENTAO SOMA 3 NSOMA3D: MOVLW 0X30 ADDWF BR0,W ANDLW 0X80 XORLW 0X80 BTFSS STATUS,Z GOTO NSOMA3E ;É=0 ,ENTÃO NÃO SOMA 30h MOVLW 0X30 ; É=1 ENTAO SOMA 30h ADDWF BR0,F NSOMA3E: GOTO VOLTA ;================================================================================ END