;*************************************************************************************************** ; ; CALIBRANDO_OSCALL_RS232.ASM ; ; PROJETO : CALIBRADOR DE FREQUÊNCIA DO OSCILADOR INTERNO ; ; OBJETIVO: OBTER O MELHOR VALOR PARA O BYTE DE CALIBRAÇÃO DO OSCILADOR INTERNO ; PARA PIC 12F629,675. ; A VISUALIZAÇÃO DO VALOR SERÁ PELA LEITURA DE EEPROM APÓS A CALIBRAÇÃO , SENDO ; QUE NO ENDEREÇO '0' FICARÁ A CALIBRAÇÃO ORIGINAL E EM '1' A CALIBRAÇÃO NOVA. ; TAMBÉM PODERÁ SER USADO UMA LIGAÇÃO A UM PC VIA SERIAL (CABO NA DB9) E USANDO ; UM TERMINAL, PARA VISUALIZAR A CALIBRAÇÃO (POR SE APERTAR O BOTÃO 'VER'). ; CASO USE UM TERMINAL DE RS232 (HYPERTERMINAL POR EX.): ; AJUSTAR HYPERTERMINAL PARA 38400 BAUDS, 8 BITS, SEM PARIDADE, 1 STOP BIT, NO HANDSHAKE ; ; INICIO : 21/03/13 TERM.:22/03/13 ; AUTOR: CLÁUDIO LÁRIOS ; PROCESSADOR: PIC 12F675/629 ; PROJETO DIDÁTICO APENAS. ; PINAGEM: ; PINO 1 = VCC (+5VOLTS) ; PINO 2 = BOTÃO 'UP' (AUMENTA A FREQUÊNCIA DO OSCILADOR INTERNO) AO GND ; PINO 3 = SAIDA DE FREQUÊNCIA (LIGAR A UM FREQUÊNCIMETRO) ; PINO 4 = RESET (RESISTOR DE 10K AO VCC) ; PINO 5 = RS232 (ENVIA) P/ PINO 2 DA DB9 ; PINO 6 = BOTÃO 'VER' (APERTE PARA ENVIAR PARA SERIAL O RESULTADO DA CALIBRAÇÃO) AO GND ; PINO 7 = BOTÃO 'DOWN' (REDUZIR A FREQUÊNCIA DO OSCILADOR INTERNO) AO GND ; PINO 8 = GND ; COMO USAR: ; CARREGUE ESTE PROGRAMA (HEX) NO PIC A CALIBRAR. ; LIGUE UM FREQUÊNCIMETRO NO PINO 3 (PIC12F629/675) PARA CONTROLAR A FREQUÊNCIA DO OSCILADOR ; INTERNO DIVIDIDO POR 4 (1MHZ). ; COM AJUDA DOS BOTÕES 'UP' E 'DOWN', AJUSTE PARA LER O VALOR MAIS PRÓXIMO POSSÍVEL DE 1MHZ. ; QUANDO ACONTECER ISTO, APERTE BOTÃO 'VER' PARA LER O BYTE DE CALIBRAÇÃO NO PC, VIA SERIAL, RODANDO O ; HYPERTERMINAL, A 38400 BAUDS, 8 BITS, SEM PARIDADE, NO HANDSHAKE (NONE). ; COMO OPÇÃO, PODERÁ LER A EEPROM COM O PROGRAMADOR E NO ENDEREÇO '1' ESTÁRA O VALOR OBTIDO NA CALIBRAÇÃO, ; SENDO QUE, NO ENDEREÇO '0' ESTARÁ O VALOR ATUAL (PARA FINS DE COMPARAÇÃO APENAS). ; SE OS VALORES FOREM IGUAIS, NÃO HÁ NECESSIDADE DE MUDAR O BYTE DE CALIBRAÇÃO. ; ; O QUE FAZER COM ESTE VALOR? ; ANOTE ESTE VALOR EMBAIXO DO CHIP COM CANETA PARA CD. ; NO FINAL DO SEU PRÓXIMO PROGRAMA EM QUE VOCE FOR USAR ESTE CHIP, ESCREVA O SEGUINTE NO FINAL DO ; PROGRAMA: ; ; ORG 0X03FF ; RETLW 0X4C ;( SENDO 0X4C, A TÍTULO DE EXEMPLO, O VALOR OBTIDO NA CALIBRAÇÃO, QUE VOCÊ ANOTOU EMBAIXO ; DO CHIP). ; ; PRONTO: AO CARREGAR SEU PROGRAMA, IRÁ TAMBÉM CARREGAR O VALOR CORRETO DA CALIBRAÇÃO DO OSCILADOR ; INTERNO. ; OBS. AO USAR O HYPERTERMINAL, APENAS APERTO O BOTÃO 'VER' QUANDO ESTIVER NA FREQUÊNCIA PRÓXIMA ; DE 1MHZ, POIS DO CONTRÁRIO, IRÁ APARECER CARACTERES 'ESTRANHOS' NA TELA DO PC, POR DESSINCRONIZAÇÃO ; DA FREQUÊNCIA DA SERIAL (MUDANÇA DE BAUD RATE). ;===================================================================================================== ;===================================================================================================== ;ESCOLHA DO USUÁRIO: ; ESCOLHA O MICROCONTROLADOR QUE DESEJA VERIFICAR A CALIBRAÇÃO: ;(DESCOMENTE A OPÇÃO DESEJADA E COMENTE A OUTRA) #DEFINE F675 ;PARA PIC 12F675 ;#DEFINE F629 ;PARA PIC 12F629 ;===================================================================================================== ; IFDEF F675 LIST P=12f675 , R=DEC INCLUDE "P12F675.INC" ;ARQUIVO PADRAO ENDIF IFDEF F629 LIST P=12f629 , R=DEC INCLUDE "P12F629.INC" ;ARQUIVO PADRAO ENDIF ERRORLEVEL -302 ;ELIMINA MENSAGEM DE ERRO ;PALAVRA DE CONFIGURAÇÃO: __CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_CLKOUT & _BODEN_ON & _MCLRE_ON ;OBS: TEM QUE CONFIGURAR PARA TER SAIDA DO OSCILADOR INTERNO NO PINO 3 ; ;PAGINACAO DE MEMORIA; #DEFINE BANK0 BCF STATUS,RP0 ;SETA BANK0 DE MEMORIA #DEFINE BANK1 BSF STATUS,RP0 ;SETA BANK1 ; VARIAVEIS DA RAM CBLOCK 0X20 ;ENDERECO INICIAL DE MEMORIA AUX ;IDEM AUX1 ;IDEM LC ;DELAY LC1 ;IDEM TR ;BUFFER PARA ENVIO DO LCD BR0 ;RESULTADO DE CONVERSÃO BR1 ;IDEM BR2 ;IDEM R0 ;AUXILIAR USADO NA CONVERSÃO HEXA PARA ASCII R1 ;IDEM PAG ;AUX DE SALTO GOTO FLAGS ;FLAGS BUFFER ;REGISTRADOR PARA A SERIAL CNT CNT1 CNT3 TEMP VALOR_CAL TMP ENDC ;*********************************************************************************************** ; CONSTANTES #DEFINE _C STATUS,C ; RENOMEIA PARA FACILITAR ESCRITA #DEFINE _Z STATUS,Z ; RENOMEIA PARA FACILITAR ESCRITA #DEFINE T_232 GPIO,2 ;PINO 5 TRANSMITE P/ RS232 (2 DA DB9) #DEFINE UP GPIO,5 ;PINO 2 ENTRADA UP #DEFINE DOWN GPIO,0 ;PINO 7 ENTRADA DOWN #DEFINE VER GPIO,1 ;PINO 6 ENTRADA VER #DEFINE FLAG1 FLAGS,0 #DEFINE FLAG_T FLAGS,1 ;========================================================================================= ;EQUATES ;========================================================================================= ; VETOR DE RESET ORG 0X00 GOTO INICIO ;========================================================================================= ; VETOR DE INTERRUPCAO ORG 0X04 RETFIE ;========================================================================================= ;PAGINA ZERO ;ROTINA PARA ENVIO DE FRASES PARA A SERIAL ENV_SERIAL MOVWF AUX MOVFW PAG MOVWF PCLATH MOVFW AUX RT1 CALL PEGA_M ADDLW .0 BTFSC STATUS,Z RETURN CALL SEND INCF AUX,F MOVFW AUX GOTO RT1 PEGA_M MOVWF PCL FRASE1: dt 0x0a,0x0d,0x0a,0x0d, " ***********CALIBRANDO_OSCALL_RS232***********",0x0a,0x0d,0x0a,0x0d, " BLOG: 'LARIOS.TECNOLOGIA.WS'", 0x0a,0x0d,0x0a,0x0d,0 FRASE2: dt " VALOR OBTIDO NA CALIBRACAO -> 0X",0 FRASE3: dt " ATUAL -> 0X",0 ;================================================================================== ; INICIO DO PROGRAMA ;================================================================================== ;CONFIGURAÇÕES INICIAIS DOS REGISTRADORES E PORTAS INICIO RESET BANK1 CALL 0X03FF ;BUSCA CALIBRAÇÃO ATUAL DO OSCILADOR MOVWF OSCCAL ;TRANSFERE PARA O REG.OSCILADOR BANK0 MOVLW .50 ;ESTABILIZA OSCILADOR CALL DELAY CALL 0X3FF ;BUSCA CALIBRAÇÃO ORIGINAL MOVWF TMP MOVLW .0 CALL EEWRITE ;SALVA VALOR DO OSCCAL ORIGINAL BSF FLAG_T MOVLW .0 MOVWF INTCON ;DESLIGA TODAS INTERRUPCOES BANK1 MOVLW b'11101011' ;DEFINE ENTRADAS (1) E SAIDAS (0) NA PIO MOVWF TRISIO ; MOVLW B'00001000' ;HABILITA PULL-UP DA PIO MOVWF OPTION_REG ;IDEM IFDEF F675 CLRF ANSEL ENDIF CLRF VRCON ;DESLIGA TENSÃO DE REFERENCIA MOVLW 0XFF MOVWF WPU ;LIGA PULL UP INDIVIDUAL BANK0 MOVLW .7 ;DESLIGA COMPARADORES ANALÓGICOS MOVWF CMCON CLRF GPIO ;LIMPA PORTA E C BSF T_232 ;TX SERIAL NIVEL ALTO ;======================================================= ; LOOP PRINCIPAL ;============================================================================================ MAIN BTFSS UP ;IDEM GOTO AUMENTA BTFSS DOWN GOTO REDUZ BTFSS VER CALL MOSTRA_BYTE_CAL GOTO MAIN ;=========================================================================================== ; SUB-ROTINAS ;=========================================================================================== ;ROTINA PARA AUMENTAR A FREQUÊNCIA DO OSCILADOR INTERNO AUMENTA MOVLW .2 CALL DELAYW MOVLW .1 CALL EEREAD ADDLW .4 MOVWF VALOR_CAL MOVWF TMP MOVLW .1 CALL EEWRITE MOVLW .50 CALL DELAY MOVFW VALOR_CAL BANK1 MOVWF OSCCAL BANK0 MOVLW .50 ;ESTABILIZAÇÃO DO OSCILADOR CALL DELAY MOVLW .1 CALL EEWRITE MOVLW .50 ;ESPERA FIM DA ESCRITA CALL DELAY GOTO MAIN ;========================================================================================== ;ROTINA DE REDUÇÃO DA FREQUÊNCIA DO OSCILADOR INTERNO REDUZ MOVLW .2 CALL DELAYW MOVLW .1 CALL EEREAD ADDLW 0XFC ;SUBTRAI '4' MOVWF VALOR_CAL MOVWF TMP MOVLW .1 CALL EEWRITE MOVLW .50 CALL DELAY MOVFW VALOR_CAL BANK1 MOVWF OSCCAL BANK0 MOVLW .50 ;ESTABILIZAÇÃO DO OSCILADOR CALL DELAY MOVLW .1 CALL EEWRITE MOVLW .50 ;ESPERA FIM DA ESCRITA CALL DELAY GOTO MAIN ;====================================================================================================== ; SUB-ROTINAS ;====================================================================================================== ; ROTINA PARA MOSTRAR PELA SERIAL NO PC, O VALOR DO BYTE DE CALIBRAÇÃO MOSTRA_BYTE_CAL BTFSS FLAG1 GOTO JUMP1 CLRF PAG MOVLW FRASE1 ;ENVIA MENSAGEM INICIAL CALL ENV_SERIAL BSF FLAG1 JUMP1 CLRF PAG ;ENVIA MENSAGEM 'NOVO BYTE DE CALIBRAÇÃO 0X--' MOVLW FRASE2 CALL ENV_SERIAL MOVLW .1 ;LOCAL DO BYTE NOVO CALL EEREAD CALL conv_asc2 ;CONVERTE PARA ASCII CALL SEND ;ENVIA 1ºNIBLE MOVFW R1 CALL SEND ;ENVIA 2ºNIBLE CLRF PAG ;ENVIA MENSAGEM 'NOVO BYTE DE CALIBRAÇÃO 0X--' MOVLW FRASE3 CALL ENV_SERIAL MOVLW .0 ;LOCAL DO BYTE NOVO CALL EEREAD CALL conv_asc2 ;CONVERTE PARA ASCII CALL SEND ;ENVIA 1ºNIBLE MOVFW R1 CALL SEND ;ENVIA 2ºNIBLE MOVLW 0X0D ;RETORNO AO COMEÇO DA LINHA CALL SEND BTFSS VER ;TESTA BOTÃO GOTO $-1 MOVLW .150 ;DEBOUNCE CALL DELAY RETURN ;================================================================================ ;ROTINA DE CONVERSÃO DE HEXA PARA ASCII CONV_ASC2: conv_asc2: ; converte 2 nibles hex em 2 nibles asc2 lsb=r1 msb=W 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 ;================================================================================ ;ROTINAS DE DELAY DELAY2 MOVLW .20 DELAYW DELAYM MOVWF TEMP VJ1 call LcdDelay1 DECFSZ TEMP,F GOTO VJ1 DELAY1 LcdDelay1 MOVLW .255 ;DELAY PARA VISUALIZAÇAO DELAY LcdDelay goto $+1 movwf LC1 ;duas variáveis em uma LcdDelayLoop decfsz LC,F ;dec. o prim. cont. goto LcdDelayLoop decfsz LC1,F ;dec. o seg. cont. goto LcdDelayLoop return ;======================================================================== ;ROTINA DE ENVIO DA SERIAL (38400 BAUDS) ,SENDO QUE '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 CALL T_BAUD RETURN ;TEMPO DE 26 uSEG (INCLUINDO RETORNO) T_BAUD MOVWF CNT1 DECFSZ CNT1,F GOTO $-1 RETURN ;====================================================== EEWRITE ; ******* EEPROM WRITE ENABLE ****************** ;COLOQUE ENDEREÇO EM 'W' ;COLOQUE DADOS A ESCREVER EM 'TMP' BANK1 movwf EEADR BANK0 MOVFW TMP ;PEGA PRIMEIRO DADO BANK1 movwf EEDATA bcf EECON1, EEIF bsf EECON1, WREN ; enable Write\par movlw 0x55 movwf EECON2 movlw 0xAA movwf EECON2 bsf EECON1, WR WRITE_SN_A clrwdt btfsc EECON1, WR ; Write complete ?\par goto WRITE_SN_A bcf EECON1, WREN ; disable Write\par BANK0 RETURN EEREAD ;COLOQUE EM 'W' O ENDEREÇO E RECEBA EM 'W' O DADO. BANK1 movwf EEADR bsf EECON1, RD ; do a read\par btfsc EECON1, RD ; Read done ?\par goto $-1 movf EEDATA,W BANK0 RETURN ORG 0X2100 + 1 DE 0X3C ;VALOR INICIAL MÉDIO PARA OSCCAL END