;***************************************************************************************************** ; ; FEEL32KHZ.ASM ; ; DETECTA FREQUENCIADE 32KHZ E ACIONA UMA SAIDA PARA INDICAR ISTO. ; MICROCONTROLADOR USADO: PIC 12F675 DE APENAS 8 PINOS ; ; ; INICIO DO PROJETO: 06/05/2013 TERMINO:06/05/2013 ; ; SITE : LARIOS.TECNOLOGIA.WS ; BY CLÁUDIO LÁRIOS ; #DEFINE TESTE ;SOMENTE EM DESENVOLVIMENTO (SERIAL) ;***************************************************************************************************** ;ESCOLHA DO MICROCONTROLADOR #DEFINE F675 ;#DEFINE F629 ;===================================================================================================== IFDEF F675 #INCLUDE ; ARQUIVO PADRAO ENDIF IFDEF F629 #INCLUDE ; ARQUIVO PADRAO ENDIF __CONFIG _BODEN_ON & _CP_OFF & _PWRTE_ON & _WDT_OFF & _MCLRE_ON & _INTRC_OSC_NOCLKOUT ERRORLEVEL -302 ;SUPRIME A MENSAGEM DE ERRO DO BANCO 0 ;PAGINACAO DE MEMORIA; #DEFINE BANK0 BCF STATUS,RP0 ;SETA BANK0 DE MEMORIA #DEFINE BANK1 BSF STATUS,RP0 ;SETA BANK1 #DEFINE IN_TMR0 GPIO,2 ;ENTRADA PARA CONTAGEM DO TMR0 #DEFINE SAIDA GPIO,5 ;SAIDA DE ACIONAMENTO ;VARIAVEIS NA RAM CBLOCK 0X20 ;ENDERECO INICIAL DE MEMORIA TEMP,TEMP1,CONT,CONT1,TMR_H ENDC IFDEF TESTE CBLOCK 0X28 LC,BR0,BR1,BR2,BR3,R1,R0,CX,C1,C0,BUFFER,CNT,CNT1 ENDC ENDIF IFDEF TESTE #DEFINE T_232 GPIO,4 ;PINO 3 TRANSMITE P/ RS232 (2 DA DB9) ENDIF ORG 0X00 GOTO INICIO ;................................................................................................ ; ORG 0X04 RETFIE ; INICIO DO PROGRAMA INICIO BANK1 ;BANCO 1 CALL 0X03FF ;BUSCA CALIBRAÇÃO DO OSCILADOR MOVWF OSCCAL ;TRANSFERE PARA O REG.OSCILADOR MOVLW B'001111' ;ACERTA ENTRADA/SAIDAS MOVWF TRISIO MOVLW B'10101000' ;TIMER 0 SEM PRESCALLER MOVWF OPTION_REG IFDEF F675 CLRF ANSEL ENDIF BANK0 CLRF GPIO MOVLW .7 MOVWF CMCON ;DESLIGA COMPARADORES LIBERANDO AS IO'S MAIN ;INICIA A MEDIÇÃO USANDO O TEMPO DE 1 SEGUNDO PARA A CONTAGEM MED_FREQ CLRF TMR0 ;PREVINE MUDANÇA DO FLAG COINCIDENTE AS PRÓXIMAS INSTRUÇÕES BCF INTCON,2 ;APAGA FLAG OV TIMER0 CLRF TMR0 ;INICIA A MEDIÇÃO CALL T3906US ;tempo de leitura da frequencia DE 3,9MS MOVFW TMR0 ;SALVA CONTAGEM DO TIMER 0 MOVWF TMR_H ;NO CONTADOR TMR_H BTFSS INTCON,2 GOTO SEGUE GOTO FORA_FAIXA ;===================================================== SEGUE IFDEF TESTE MOVFW TMR_H MOVWF C0 CLRF CX CLRF C1 CALL CONV_DEC MOVFW BR1 CALL conv_asc2 ;CONVERTE PARA ASCII MOVLW 'T' CALL SEND MOVLW 'M' CALL SEND MOVLW 'R' CALL SEND MOVLW '=' CALL SEND MOVLW ' ' CALL SEND MOVFW R1 CALL SEND ;ENVIA CENTENA MOVFW BR0 CALL conv_asc2 ;ENVIA DEZENA CALL SEND MOVFW R1 ;ENVIA UNIDADE CALL SEND MOVLW ' ' CALL SEND MOVLW ' ' CALL SEND MOVLW ' ' CALL SEND ENDIF ;=============================================================== ;FAIXA DE OPERAÇÃO QUE LIGA A SAIDA = LIMITE SUP - LIMITE INF ;NO EX: = (1325 X 256) - (125 X 256) = 1792H ; ACIONANDO A PARTIR DOS 32001 A 33791 HZ. MOVFW TMR_H SUBLW .125 ;LIMITE INFERIOR .125 X 256 = 32.000HZ BTFSC STATUS,C GOTO FORA_FAIXA MOVFW TMR_H SUBLW .132 ;LIMITE SUPERIOR .132 X 256 = 33.792HZ BTFSS STATUS,C GOTO FORA_FAIXA BSF SAIDA CALL D250US GOTO SAI FORA_FAIXA BCF SAIDA CALL D250US SAI GOTO MAIN ;DELAY DE 3906 MICROSEGUNDOS T3906US MOVLW .5 MOVWF CONT L1 MOVLW .194 MOVWF CONT1 L2 NOP DECFSZ CONT1, 1 GOTO L2 DECFSZ CONT, 1 GOTO L1 NOP RETURN ;DELAY DE 250 US D250US MOVLW .197 MOVWF CONT PL1 MOVLW .253 MOVWF CONT1 PL2 NOP NOP DECFSZ CONT1, 1 GOTO PL2 DECFSZ CONT, 1 GOTO PL1 GOTO $+1 RETURN IFDEF TESTE CONV_DEC ;************************************************************************** ; ROTINA PARA CONVERSÃO DE 24 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 ; CX DATA 24H ;UPPER ; C1 data 25H ;VALOR DE ENTRADA ALTO ; C0 data 26H ;BAIXO HEX_DEC: MOVLW .24 MOVWF LC ;CARREGA 16 CLRF BR0 ;ZERA RESULTADOS CLRF BR1 CLRF BR2 CLRF BR3 VOLTA: BCF STATUS,C RLF C0,F ;DESLOCA PARA ESQUERDA C0,C1,BR0,1,2 RLF C1,F RLF CX,F RLF BR0,F RLF BR1,F RLF BR2,F RLF BR3,F DECFSZ LC,F ;VERIFICA SE CHEGOU AO FIM DA CONVERSÃO GOTO SEG9X RETURN ;FI DA CONVERSÃO SEG9X: MOVLW .3 ADDWF BR3,W ;SOMA 3 EM RES2 ANDLW .8 ; 2ELEV 3=8 XORLW .8 BTFSS STATUS,Z GOTO NSOMA3X ;É=0 ,ENTÃO NÃO SOMA 3 (SE ZERO RETORNA VALOR ORIGINAL) MOVLW .3 ADDWF BR3,F ; É=1 ENTAO SOMA 3 NSOMA3X: MOVLW 0X30 ADDWF BR3,W ANDLW 0X80 XORLW 0X80 BTFSS STATUS,Z GOTO NSOMA3AX ;É=0 ,ENTÃO NÃO SOMA 30h MOVLW 0X30 ; É=1 ENTAO SOMA 30h ADDWF BR3,F NSOMA3AX 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 ;================================================================================ CONV_ASC2: conv_asc2: ; converte 2 nibles hex em 2 nibles asc2 lsb=r1 msb=a MOVWF R0 ANDLW 0X0F ADDLW 0XF6 BTFSC STATUS,C GOTO LETRAS ADDLW 0X3A GOTO SAIQ LETRAS: ADDLW 0X41 SAIQ: MOVWF R1 SWAPF R0,F MOVFW R0 ANDLW 0X0F ADDLW 0XF6 BTFSC STATUS,C GOTO LETRAS1 ADDLW 0X3A GOTO SAIQ1 LETRAS1: ADDLW 0X41 SAIQ1: RETURN ;======================================================================== ;ROTINA DE ENVIO DA SERIAL (38400 BAUDS) 'W' ESTÁ COM O BIT A TRANSMITIR SEND MOVWF BUFFER MOVLW .8 MOVWF CNT BCF T_232 ;ENVIA START BIT MOVLW .7 CALL T_BAUD VTP1 RRF BUFFER,F BTFSS STATUS,C BCF T_232 BTFSC STATUS,C BSF T_232 NOP MOVLW .4 CALL T_BAUD DECFSZ CNT,F GOTO VTP1 BSF T_232 ;STOP BIT MOVLW .7 GOTO T_BAUD ;RETURN NA ROTINA (ECONOMIA) ;TEMPO DE 26 uSEG (INCLUINDO RETORNO) T_BAUD MOVWF CNT1 DECFSZ CNT1,F GOTO $-1 RETURN ENDIF END