;**************************************************************************************************** ; PROJETO PIC_METRONOMO ; ; METRONOMO DIDÁTICO PARA USO EM APRENDIZAGEM DE TEMPOS MÚSICAIS ; INICIO : 11/10/12 TERM.: 15/10/12 ; AUTOR: CLÁUDIO LÁRIOS ; PROCESSADOR: PIC 16F628A ; OBJETIVO: PRODUZIR SINAL SONORO (BATIDA) EM CADÊNCIA ,PROGRAMAVEL ENTRE 40 E 250 BPM. ; PODE SER AJUSTADO USANDO A CHAVE 'UP' OU 'DOWN'. ; QUALQUER UMA DAS CHAVES SE MANTIDA PRESSIONADA IRÁ PARA A FUNÇÃO 'RAPIDA' APÓS UM TEMPO DEFINIDO ; UTILIZA UM PEQUENO ALTOFALANTE PARA PRODUZIR OS SONS (TOC) ; APRESENTA INDICAÇÃO VISUAL POR MEIO DE 'FLASH' EM UM LED. ;___________________________________________________________________________________________________ ; #INCLUDE ; ARQUIVO PADRAO __CONFIG _BODEN_ON & _CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _MCLRE_ON & _INTRC_OSC_NOCLKOUT ERRORLEVEL -302 ;suppress bank selection messages ; PAGINACAO DE MEMORIA; #DEFINE BANK0 BCF STATUS,RP0 ;SETA BANK0 DE MEMORIA #DEFINE BANK1 BSF STATUS,RP0 ;SETA BANK1 ; RAM CBLOCK 0X20 ;ENDERECO INICIAL DE MEMORIA D10,D11,D12,D10X,D11X,D12X,BAT,SALVO_BAT,W_TEMP,VEL STATUS_TEMP,R3,R2,R1,AUX,AUX1,CONT1,CNT,FLAGS,DIV,TEMP ENDC ;======================DEFINICAO DE BITS E FLAGS============================================== #DEFINE UP PORTA,3 ; BOTÃO 'UP' PINO 2 #DEFINE DOWN PORTA,4 ; BOTÃO 'DOWN' PINO 3 #DEFINE SOM PORTA,7 ; SAIDA DE SOM PINO 16 #DEFINE K1 PORTA,0 ; KATODO 1 PINO 17 #DEFINE K2 PORTA,1 ; KATODO 2 PINO 18 #DEFINE K3 PORTA,2 ; KATODO 3 PINO 1 #DEFINE FLAG1MS FLAGS,0 ;FLAG SE 1 MS ; CONSTANTES L_TIMER1H EQU 0XFC ;CARGA DO TIMER1 HIGH L_TIMER1L EQU 0X29 ;CARGA DO TIMER1 LOW L_TIMER EQU .250 ;CARGA DO TIMER PARA O TEMPO MAXIMO DO SOM LIGADO ;*********************************************************************************************** ; VETOR DE RESET ORG 0X00 GOTO INICIO ;=================================================================================== ;ROTINA DE INTERRUPÇÃO ;OBJETIVO: ; 1) GERAR TEMPO PADRÃO DE 1 MILISEGUNDOS AO SETAR O FLAG 'FLAG1MS' ; 2) DESLIGAR A SAIDA DE SOM APÓS ACIONADA ; 3) REALIZAR A MULTIPLEXAÇÃO DOS 3 DISPLAYS DE 7 SEGUIMENTOS ORG 0X04 MOVWF W_TEMP ;SALVA VALOR DE 'W' SWAPF STATUS,W ;SALVA VALOR DE 'STATUS' MOVWF STATUS_TEMP BTFSS INTCON,T0IF ;APAGA FLAG DE INTERRUPÇÃO DO TMR0 GOTO MULTIPLEX1 ;SE NÃO FOI FLAG DO TMR0 VAI PARA MULTIPLEXAÇÃO BCF SOM ;DESLIGA SOM BCF INTCON,T0IF ;DESLIGA FLAG DO TIMER 0 BCF INTCON,T0IE ;DESLIGA INTERRUPÇÃO MULTIPLEX1 BTFSS PIR1,TMR1IF ;TESTA SE FOI INTERRUPÇÃO DO TIMER 1 GOTO SAI ;NÃO, SAI DA INTERRUPÇÃO BCF PIR1,TMR1IF ;APAGA FLAG TIMER1 DECFSZ DIV,F ;DECREMENTA REGISTRADOR GOTO SAIT ; NÃO CHEGOU A ZERO, ENTÃO SAI DA INTERRUPÇÃO MOVLW .5 ; CHEGOU A ZERO, RECARREGA REGISTRADOR MOVWF DIV MOVLW .3 ;BUSCA PELA PAGINA DA TABELA MOVWF PCLATH INCF CNT,F ;INCREMENTA CONTADOR DE QUAL DISPLAY IRÁ LIGAR MOVLW .3 ANDWF CNT,F ;LIMITA BTFSC STATUS,Z INCF CNT,F ;SE ZERO, INCREMENTA PARA '1' MOVFW CNT ;PREPARA PARA O SALTO 'GOTO' CLRF PCLATH ;FICA NESTA PAGINA ADDWF PCL,F ;SOMA 'W' COM 'PCL' NOP ;NUNCA GOTO DISP1 ;SE W = 1 GOTO DISP2 ;SE W = 2 MOVLW .3 ;SE W = 3 MOVWF PCLATH ;APONTA PARA A PAGINA DA TABELA MOVFW R2 ;PEGA REGISTRADOR COM RESULTADO DA CONVERÇÃO DO NÚMERO DE BATIDAS (CENTENA) ANDLW 0X0F ;APAGA MSB CALL TAB_NUM ;BUSCA NA TABELA O NÚMERO CONVERTIDO PARA 7 SEGUIMENTOS MOVWF PORTB ;COLOCA NA PORTB BCF K1 ;ACIONA O TRANSISTOR DRIVE PARA O KATODO DO DISPLAY CORRETO BCF K2 ; E APAGA OS OUTROS BSF K3 GOTO SAIT DISP2 MOVLW .3 MOVWF PCLATH SWAPF R1,W ;PEGA REGISTRADOR COM RESULTADO DA CONVERÇÃO DO NÚMERO DE BATIDAS (DEZENA) ANDLW 0X0F ;APAGA MSB CALL TAB_NUM MOVWF PORTB BCF K3 ;ACIONA O TRANSISTOR DRIVE PARA O KATODO DO DISPLAY CORRETO BCF K1 ;E APAGA OS OUTROS BSF K2 GOTO SAIT DISP1 MOVLW .3 MOVWF PCLATH MOVFW R1 ;PEGA REGISTRADOR COM RESULTADO DA CONVERÇÃO DO NÚMERO DE BATIDAS (UNIDADE) ANDLW 0X0F ;APAGA MSB CALL TAB_NUM MOVWF PORTB BCF K2 ;ACIONA O TRANSISTOR DRIVE PARA O KATODO DO DISPLAY CORRETO BCF K3 ;E APAGA OS OUTROS BSF K1 SAIT MOVLW L_TIMER1H ;RECARGA DO TEMPO NO TMR1H E L MOVWF TMR1H MOVLW L_TIMER1L MOVWF TMR1L BSF FLAG1MS ;ACIONA FLAG DE 1 MILISEGUNDOS SAI SWAPF STATUS_TEMP,W ;RECUPERA STATUS E 'W' MOVWF STATUS SWAPF W_TEMP,F SWAPF W_TEMP,W RETFIE ;SAI DA INTERRUPÇÃO ;===================================================================================================== ;TABELAS COM VALORES PARA DELAY CORRESPONDENTES DE 40 A 250 BATIDAS POR MINUTOS (PARTE ALTA) ORG 0XFF ;PCLATH =1 TAB_1 ADDWF PCL,F DT 0X05 , 0X05 , 0X05 , 0X05 , 0X05 , 0X05 , 0X05 , 0X04 , 0X04 , 0X04 ; 40 A 49 DT 0X04 , 0X04 , 0X04 , 0X04 , 0X04 , 0X04 , 0X04 , 0X04 , 0X04 , 0X03 ; 50 A 59 DT 0X03 , 0X03 , 0X03 , 0X03 , 0X03 , 0X03 , 0X03 , 0X03 , 0X03 , 0X03 ; 60 A 69 DT 0X03 , 0X03 , 0X03 , 0X03 , 0X03 , 0X03 , 0X03 , 0X03 , 0X02 , 0X02 ; 70 A 79 DT 0X02 , 0X02 , 0X02 , 0X02 , 0X02 , 0X02 , 0X02 , 0X02 , 0X02 , 0X02 ; 80 A 89 DT 0X02 , 0X02 , 0X02 , 0X02 , 0X02 , 0X02 , 0X02 , 0X02 , 0X02 , 0X02 ; 90 A 99 DT 0X02 , 0X02 , 0X02 , 0X02 , 0X02 , 0X02 , 0X02 , 0X02 , 0X02 , 0X02 ; 100 A 109 DT 0X02 , 0X02 , 0X02 , 0X02 , 0X02 , 0X02 , 0X02 , 0X01 , 0X01 , 0X01 ; 110 A 119 DT 0X01 , 0X01 , 0X01 , 0X01 , 0X01 , 0X01 , 0X01 , 0X01 , 0X01 , 0X01 ; 120 A 129 DT 0X01 , 0X01 , 0X01 , 0X01 , 0X01 , 0X01 , 0X01 , 0X01 , 0X01 , 0X01 ; 130 A 139 DT 0X01 , 0X01 , 0X01 , 0X01 , 0X01 , 0X01 , 0X01 , 0X01 , 0X01 , 0X01 ; 140 A 149 DT 0X01 , 0X01 , 0X01 , 0X01 , 0X01 , 0X01 , 0X01 , 0X01 , 0X01 , 0X01 ; 150 A 159 DT 0X01 , 0X01 , 0X01 , 0X01 , 0X01 , 0X01 , 0X01 , 0X01 , 0X01 , 0X01 ; 160 A 169 DT 0X01 , 0X01 , 0X01 , 0X01 , 0X01 , 0X01 , 0X01 , 0X01 , 0X01 , 0X01 ; 170 A 179 DT 0X01 , 0X01 , 0X01 , 0X01 , 0X01 , 0X01 , 0X01 , 0X01 , 0X01 , 0X01 ; 180 A 189 DT 0X01 , 0X01 , 0X01 , 0X01 , 0X01 , 0X01 , 0X01 , 0X01 , 0X01 , 0X01 ; 190 A 199 DT 0X01 , 0X01 , 0X01 , 0X01 , 0X01 , 0X01 , 0X01 , 0X01 , 0X01 , 0X01 ; 200 A 209 DT 0X01 , 0X01 , 0X01 , 0X01 , 0X01 , 0X01 , 0X01 , 0X01 , 0X01 , 0X01 ; 210 A 219 DT 0X01 , 0X01 , 0X01 , 0X01 , 0X01 , 0X01 , 0X01 , 0X01 , 0X01 , 0X01 ; 220 A 229 DT 0X00 , 0X00 , 0X00 , 0X00 , 0X00 , 0X00 , 0X00 , 0X00 , 0X00 , 0X00 ; 230 A 239 DT 0X00 , 0X00 , 0X00 , 0X00 , 0X00 , 0X00 , 0X00 , 0X00 , 0X00 , 0X00 ; 240 A 249 DT 0X00 ;===================================================================================================== ;TABELAS COM VALORES PARA DELAY CORRESPONDENTES DE 40 A 250 BATIDAS POR MINUTOS (PARTE BAIXA) ORG 0X1FF ;PCLATH =2 TAB_2 ADDWF PCL,F DT 0XD7 , 0XB2 , 0X8F , 0X6E , 0X4E , 0X30 , 0X13 , 0XF7 , 0XDD , 0XC3 ; 40 A 49 DT 0XAB , 0X93 , 0X7C , 0X67 , 0X52 , 0X3D , 0X2A , 0X17 , 0X05 , 0XF3 ; 50 A 59 DT 0XE3 , 0XD2 , 0XC2 , 0XB3 , 0XA4 , 0X96 , 0X88 , 0X7A , 0X6D , 0X60 ; 60 A 69 DT 0X54 , 0X48 , 0X3C , 0X30 , 0X25 , 0X1B , 0X10 , 0X06 , 0XFC , 0XF2 ; 70 A 79 DT 0XE9 , 0XDF , 0XD6 , 0XCD , 0XC5 , 0XBC , 0XB4 , 0XAC , 0XA4 , 0X9D ; 80 A 89 DT 0X95 , 0X8E , 0X87 , 0X80 , 0X79 , 0X72 , 0X6C , 0X65 , 0X5F , 0X59 ; 90 A 99 DT 0X53 , 0X4D , 0X47 , 0X41 , 0X3B , 0X36 , 0X31 , 0X2B , 0X26 , 0X21 ; 100 A 109 DT 0X1C , 0X17 , 0X12 , 0X0D , 0X09 , 0X04 , 0X00 , 0XFB , 0XF7 , 0XF3 ; 110 A 119 DT 0XEF , 0XEA , 0XE6 , 0XE2 , 0XDE , 0XDB , 0XD7 , 0XD3 , 0XCF , 0XCC ; 120 A 129 DT 0XC8 , 0XC5 , 0XC1 , 0XBE , 0XBA , 0XB7 , 0XB4 , 0XB0 , 0XAD , 0XAA ; 130 A 139 DT 0XA7 , 0XA4 , 0XA1 , 0X9E , 0X9B , 0X98 , 0X95 , 0X93 , 0X90 , 0X8D ; 140 A 149 DT 0X8B , 0X88 , 0X85 , 0X83 , 0X80 , 0X7E , 0X7B , 0X79 , 0X76 , 0X74 ; 150 A 159 DT 0X72 , 0X6F , 0X6D , 0X6B , 0X68 , 0X66 , 0X64 , 0X62 , 0X60 , 0X5E ; 160 A 169 DT 0X5B , 0X59 , 0X57 , 0X55 , 0X53 , 0X51 , 0X4F , 0X4D , 0X4C , 0X4A ; 170 A 179 DT 0X48 , 0X46 , 0X44 , 0X42 , 0X41 , 0X3F , 0X3D , 0X3B , 0X3A , 0X38 ; 180 A 189 DT 0X36 , 0X35 , 0X33 , 0X31 , 0X30 , 0X2E , 0X2D , 0X2B , 0X2A , 0X28 ; 190 A 199 DT 0X27 , 0X25 , 0X24 , 0X22 , 0X21 , 0X1F , 0X1E , 0X1C , 0X1B , 0X1A ; 200 A 209 DT 0X18 , 0X17 , 0X16 , 0X14 , 0X13 , 0X12 , 0X10 , 0X0F , 0X0E , 0X0C ; 210 A 219 DT 0X0B , 0X0A , 0X09 , 0X08 , 0X06 , 0X05 , 0X04 , 0X03 , 0X02 , 0X01 ; 220 A 229 DT 0XFF , 0XFE , 0XFD , 0XFC , 0XFB , 0XFA , 0XF9 , 0XF8 , 0XF7 , 0XF6 ; 230 A 239 DT 0XF5 , 0XF3 , 0XF2 , 0XF1 , 0XF0 , 0XEF , 0XEE , 0XED , 0XEC , 0XEB ; 240 A 249 DT 0XEB ; 250 ;================================================================================================== ;TABELA COM RETORNO DE DECIMAL PARA 7 SEGUIMENTOS ORG 0X2FF TAB_NUM ;PCLATH = 3 ADDWF PCL,F ; GFEDCBA DT B'00111111' ;0 DT B'00000110' ;1 DT B'01011011' ;2 DT B'01001111' ;3 DT B'01100110' ;4 DT B'01101101' ;5 DT B'01111101' ;6 DT B'00000111' ;7 DT B'01111111' ;8 DT B'01100111' ;9 ;=================================================================================================== INICIO MOVLW .7 MOVWF CMCON ;DESLIGA OS COMPARADORES BANK1 MOVLW .0 ;PB = TUDO SAIDAS MOVWF TRISB MOVLW B'01111000' ;ENTRADAS E SAIDAS PARA PORT A MOVWF TRISA MOVLW B'00000111' MOVWF OPTION_REG ;PULL UP'S ATIVO BSF PIE1,TMR1IE ;LIGA INTERRUPÇÃO DO TIMER1 BANK0 MOVLW L_TIMER1H ;CARGA INICIAL DO TIMER 1 MOVWF TMR1H MOVLW L_TIMER1L MOVWF TMR1L BSF INTCON,PEIE ;LIGA INTERRUPÇÃO DE PERIFÉRICOS BCF PIR1,TMR1IF ;APAGA FLAG TIMER1 BSF T1CON,TMR1ON ;LIGA TIMER 1 BSF INTCON,GIE ;LIGA INTERRUPÇÃO CLRF VEL ;LIMPA REGISTADOR MOVLW .5 ;CARGA INICIAL MOVWF DIV MOVLW .40 MOVWF BAT ;CARGA DE 'BATIDAS' INICIAL CALL CONV_HDEC ;CARREGA R2 E R1 VOLTA1 BTFSS UP ;TESTA SE BOTÃO 'UP' ESTÁ LIGADO CALL INCREMENTAR ;ESTÁ, ENTÃO VAI INCREMENTAR DISPLAY BTFSS DOWN ;TESTA SE BOTÃO 'DOWN' ESTÁ LIGADO CALL DECREMENTAR ; ESTÁ , ENTÃO VAI DECREMENTAR DISPLAY MOVLW .40 ; VALOR MINIMO DE BATIDAS POR MINUTO BCF STATUS,C SUBWF BAT,W ; SUBTRAI DO VALOR PARA ADQUIRIR 'PONTEIRO' DA TABELA CALL DELAY_BAT ;ROTINA DE TEMPO ENTRE BATIDAS BSF SOM ;ACIONA A SAIDA ('TOC' NO ALTOFALANTE) MOVLW L_TIMER ;CARREGA O VALOR DE DELAY PARA DESLIGAMENTO DA SAIDA DE SOM NA INTERRUPÇÃO MOVWF TMR0 BCF INTCON,T0IF ;APAGA FLAG BSF INTCON,T0IE ;LIGA INTERRUPÇÃO DO TIMER 0 GOTO VOLTA1 ;RETORNA AO LOOP FUNCIONAL ;============================================== ;PASSA EM 'W' O VALOR DA 'BATIDA' POR MINUTO ;GERA O ATRASO NECESSÁRIO PARA O NÚMERO DE BATIDAS PROGRAMADO DELAY_BAT MOVWF SALVO_BAT MOVLW .1 MOVWF PCLATH MOVFW SALVO_BAT CALL TAB_1 ;BUSCA O VALOR HIGH MOVWF D10 MOVLW .2 MOVWF PCLATH MOVFW SALVO_BAT CALL TAB_2 ;BUSCA O VALOR LOW MOVWF D11 MOVFW D10 ;CARGA DOS REGISTRADORES TEMPORARIOS MOVWF D10X INCF D10X ;PRÉ-INCREMENTA RTU1 MOVFW D11 ;CARGA DOS REGISTRADORES TEMPORARIOS MOVWF D11X INCF D11X ;PRÉ-INCREMENTA RTU2 BTFSS FLAG1MS ;AGUARDA FLAG DE 1 MS SETAR GOTO $-1 BCF FLAG1MS DECFSZ D11X,F ;DECREMENTA GOTO RTU2 DECFSZ D10X,F ;DECREMENTA GOTO RTU2 RETURN ;TEMPO FINAL ALCANÇADO, SAI DA ROTINA ;=============================================== INCREMENTAR INCF BAT,F MOVFW BAT ADDLW 0X05 ;.251 EM COMPLEMENTO DE 2 BTFSC STATUS,Z DECF BAT,F MOVFW BAT CALL CONV_HDEC ; EM R1,R2 ESTÃO OS RESULTADOS PARA APRESENTAÇÃO BTFSC UP GOTO SAIR5 INCF VEL,F MOVFW VEL ADDLW 0XF0 BTFSC STATUS,C GOTO RAPIDO1 MOVLW .250 CALL DELAYX BTFSC UP GOTO SAIR5 GOTO INCREMENTAR RAPIDO1 MOVLW .40 CALL DELAYX BTFSC UP GOTO SAIR5 GOTO INCREMENTAR SAIR5 CLRF VEL RETURN DECREMENTAR DECF BAT,F MOVFW BAT ADDLW 0XD9 ;.39 EM COMPLEMENTO DE 2 BTFSC STATUS,Z INCF BAT,F MOVFW BAT CALL CONV_HDEC ; EM R1,R2 ESTÃO OS RESULTADOS PARA APRESENTAÇÃO BTFSC DOWN GOTO SAIR5 INCF VEL,F MOVFW VEL ADDLW 0XF5 BTFSC STATUS,C GOTO RAPIDO2 MOVLW .250 CALL DELAYX BTFSC DOWN GOTO SAIR5 GOTO DECREMENTAR RAPIDO2 MOVLW .40 CALL DELAYX BTFSC DOWN GOTO SAIR5 GOTO DECREMENTAR ;==================================================== DELAYX MOVWF TEMP X70 BTFSS FLAG1MS GOTO $-1 BCF FLAG1MS DECFSZ TEMP,F GOTO X70 RETURN ;==================================================== ;CONVERTE HEX PARA BCD ; EM 'W' ENTRA O VALOR E R1(LSB) E R2(MSB) O RESULTADO BCD CONV_HDEC MOVWF AUX MOVLW .8 MOVWF CONT1 CLRF R2 CLRF R1 VT2 BCF STATUS,C RLF AUX,F RLF R1,F RLF R2,F DECFSZ CONT1,F GOTO SEG12 RETURN SEG12 MOVLW 0X03 ADDWF R2,W MOVWF AUX1 BTFSC AUX1,3 MOVWF R2 MOVLW 0X30 ADDWF R2,W MOVWF AUX1 BTFSC AUX1,7 MOVWF R2 MOVLW 0X03 ADDWF R1,W MOVWF AUX1 BTFSC AUX1,3 MOVWF R1 MOVLW 0X30 ADDWF R1,W MOVWF AUX1 BTFSC AUX1,7 MOVWF R1 GOTO VT2 ;======================================================= END