;************************************************************************* ; ; CONTROL_TESTER4_RS232_ASM ; ; LEITOR DE CODIGO TRANSMITIDO PARA HT6P20B E TAMBÉM PARA HCS 200 A 301 ; MICROCONTROLADOR : PIC12F675 OU PIC12F629 (ESCOLHER NAS DEFINIÇÕES DE ; USUÁRIO E COMPILAR). ; OBJETIVO: MOSTRAR TRANSMISSÃO DE CONTROLE COM VISUALISAÇÃO EM PC USANDO ; TERMINAL RS232 (HYPERTERMINAL). ; AJUSTAR HYPERTERMINAL PARA 38400 BAUDS, 8 BITS, SEM PARIDADE, 1 STOP BIT, ; NO HANDSHAKE. ; USO: TESTE DE CONTROLES REMOTOS COM CHIP HT6P20B E HCS 200...301 ; LIMITAÇÃO: RECEBE SINAL DE HCS PROGRAMADO COM BAUD RATE DE 400 MICROSEGUNDOS ; APENAS. NÃO FUNCIONA COM BIT BASE DE 200 MICROSEGUNDOS E 100 MICROSEGUNDOS. ; VEJA DATASHEET HCS200, PAGINA 7 DO MANUAL DS40138C, BAUD RATE. ; PROJETO DIDÁTICO APENAS. ; INICIO : 16/03/13 TERM.:16/03/13 ; AUTOR: CLÁUDIO CARMONA LÁRIOS ;************************************************************************* ;=============================================================================== ; DEFINIÇÕES DO USUÁRIO ;=============================================================================== ; ESCOLHA DO MODÊLO DO MICROCONTROLADOR ;(DESCOMENTE A OPÇÃO E COMENTE A OUTRA) ;#DEFINE F629 #DEFINE F675 ;=============================================================================== ;ESCOLHA OSCILADOR INTERNO OU COM CRISTAL EXTERNO DE 4MHZ ;(DESCOMENTE A OPÇÃO E COMENTE A OUTRA) ;#DEFINE OSC_EXTERNO ;USE XTAL DE 4MHZ EXTERNO #DEFINE OSC_INTERNO ;USA O OSCILADOR INTERNO COM CALIBRAÇÃO ORIGINAL (OSCALL) ;=============================================================================== IFDEF F629 LIST P=12f629 , R=DEC INCLUDE "P12F629.INC" ENDIF IFDEF F675 LIST P=12f675 , R=DEC INCLUDE "P12F675.INC" ENDIF ;-------------------------- ERRORLEVEL -302 IFDEF OSC_INTERNO __CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _BODEN_ON & _MCLRE_ON ENDIF IFDEF OSC_EXTERNO ;USE XTAL DE 4MHZ EXTERNO __CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC & _BODEN_ON & _MCLRE_ON ENDIF ;_INTRC_OSC_NOCLKOUT ;_XT_OSC ; USER DEFINED REGISTER ; ENDEREÇO 20H RESERVADO PARA MACROS PIC TEMP EQU 20H FLAGS EQU 21H ; USER FLAG REGISTER TMP EQU 22H R0 EQU 23H CNT0 EQU 24H ; LOOP COUNTERS CNT1 EQU 5CH LC EQU 25H CNT2 EQU 5DH HC EQU 26H RES3 EQU 50H RES2 EQU 51H RES1 EQU 52H RES0 EQU 53H C2 EQU 54H C1 EQU 55H C0 EQU 56H QB EQU 57H CSR4A EQU 58H CSR5A EQU 59H CSR6A EQU 5AH CSR7A EQU 5BH AUX EQU 5EH TR EQU 5FH ; CIRCULAR BUFFER REGISTER CSR0 EQU 29H ; 64 BIT RECEIVE SHIFT REGISTER CSR1 EQU 2AH CSR2 EQU 2BH CSR3 EQU 2CH CSR4 EQU 2DH CSR5 EQU 2EH CSR6 EQU 2FH CSR7 EQU 30H CSR0A EQU 31H ; 64 BIT RECEIVE SHIFT REGISTER CSR1A EQU 32H CSR2A EQU 33H CSR3A EQU 34H Z1 EQU 35H Z2 EQU 36H PAG EQU 37H BUFFER EQU 39H CNT EQU 3AH ;DEFINIÇÕES DA PORTAS E FLAGS ;=============================================================================== #DEFINE RFIN GPIO,0 ;PINO 7 ;PINO 17 IN RF #DEFINE T_232 GPIO,2 ;PINO 5 TRANSMITE P/ RS232 (2 DA DB9) ;BANCOS #DEFINE BANK0 BCF STATUS,RP0 ;SETA BANK0 DE MEMORIA #DEFINE BANK1 BSF STATUS,RP0 ;SETA BANK1 ;****** FLAGS DEFINITIONS ************** #DEFINE FLAGX FLAGS,6 ;RECEPÇÃO HT6P20B #DEFINE FLAGY FLAGS,5 ;RECEPÇÃO HCS200...301 #DEFINE FLAGH FLAGS,0 ;FLAG DE SITUAÇÃO #DEFINE FLAG1 FLAGS,1 ;FLAG DE NOVA LEITURA #DEFINE FLAG_HCS FLAGS,2 ;FLAG DE PREAMBULO DE HCS #DEFINE FLAGH1 FLAGS,3 ;FLAG DE HCS ACERTO VAL EQU 4H ; PERIODO DO TE CAPTADO TMAX EQU 50D ;50 TEMPO MAXIMO DO SINAL LOW VLINHA1 EQU 80H VLINHA2 EQU 0C0H C_Z1 EQU 0XFF C_Z2 EQU 0XAA ;------------------------------------------------------------------------------ ORG 00H AQ GOTO RESETA ;========================================================================================= ;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 MSG1: DT 0x0a,0x0d,0x0a,0x0d,"*******PIC_CONTROL_TESTER_4_RS232*******",0x0a,0x0d,0x0a,0x0d,0 MSG2: DT "*******BLOG: LARIOS.TECNOLOGIA.WS*******", 0x0a,0x0d,0x0a,0x0d,0 MSG3: DT "AGUARDANDO TX ... ",0x0d,0 MSG4: DT "CIRCUITO INTEGRADO -> HCS:",0x0a,0x0d,0 MSG5: DT "CIRCUITO INTEGRADO -> HTP:",0x0a,0x0d,0 RESETA: BANK1 CALL 0X03FF ;BUSCA CALIBRAÇÃO DO OSCILADOR MOVWF OSCCAL ;TRANSFERE PARA O REG.OSCILADOR BSF OPTION_REG,7 ;DESAHABILITA PULL-UP DA PIO CLRF INTCON ;DESLIGA TODAS INTERRUPCOES MOVLW b'11111011' ;DEFINE ENTRADAS (1) E SAIDAS (0) NA PIO MOVWF TRISIO ; IFDEF F675 CLRF ANSEL ENDIF BANK0 MOVLW .7 MOVWF CMCON ;DESLIGA COMPARADORES CLRF GPIO ;LIMPA PORTA E C BSF T_232 ;TX SERIAL NIVEL ALTO CLRF FLAGS ; RESET FLAGS CLRF PAG MOVLW MSG1 CALL ENV_SERIAL CLRF PAG MOVLW MSG2 CALL ENV_SERIAL MOVLW .5 CALL DELAYW CLRF PAG MOVLW MSG3 CALL ENV_SERIAL MAIN_C MOVLW C_Z1 MOVWF Z1 MOVLW C_Z2 MOVWF Z2 CLRF FLAGS ; RESET FLAGS CLRF CSR7 ; APAGA RESULTADOS DE COMPARAÇÃO CLRF CSR6 CLRF CSR5 CLRF CSR4 CLRF CSR7A CLRF CSR6A CLRF CSR5A CLRF CSR4A CLRF HC ;APAGA REGISTRADORES DE UNS E ZEROS CLRF LC MOVLW .28 MOVWF QB ;QUANTIDADE DE BITS A RECEBER MAIN: CALL RECEIVE ;ROTINA DE RECEPÇAO DE TRANSMISSÕES HT6P/HCS BTFSC FLAGX CALL ROT_HT6P ;ROTINA DE APRESENTAÇÃO HT6P BTFSC FLAGY CALL ROT_HCS ;ROTINA DE APRESENTAÇÃO HCS GOTO MAIN ;INICIA ROTINA DE RECEPÇÃO DE SINAL DO HT6P20B/HCS200...301 ;========================================================== RECEIVE: SS5: DECFSZ Z1,F GOTO SPN DECFSZ Z2,F GOTO SPN CLRF PAG MOVLW MSG1 CALL ENV_SERIAL CLRF PAG MOVLW MSG3 CALL ENV_SERIAL MOVLW C_Z1 MOVWF Z1 MOVLW C_Z2 MOVWF Z2 SPN BTFSS FLAGH ;TESTA FLAG DE HUM RECEBIDO ;FLAG=0 VAI PARA L2 GOTO L2 BTFSC FLAG_HCS GOTO W47 BTFSS RFIN GOTO MO ;SIN ? TESTA SINAL DE ENTRADA DO RECEPTOR DE RF SIN=0 VAI PARA 'MO' GOTO L2 W47: BTFSC RFIN ;SE '1' VAI MO GOTO MO W48: L2: BTFSS RFIN ;SIN=0 VAI INCREMENTAR LC EM 'LA1' GOTO LA1 BTFSC FLAG_HCS ;SIN=1 VAI INCREMENTAR HC E SETAR FLAG GOTO W45 BSF FLAGH ;SIN=1 W45: INCF HC,F MOVF HC,F ;TESTA BTFSS STATUS,Z GOTO LA2 ;SE DIFERENTE DE '0' VAI PARA LA2 DECF HC,F ;RETORNA VALOR DE 0XFF GOTO LA2 ;VAI PARA 'LA2' CONTAR TEMPO DE 50 MICRO SEGUNDOS LA1: BTFSS FLAG_HCS ;SE '0' VAI PARA W46 GOTO W46 BSF FLAGH ;SIN=1 W46: INCF LC,F ;INCREMENTA REGISTRADOR DE LOW SIGNAL NA ENTRADA RF MOVF LC,F ;TESTA BTFSS STATUS,Z GOTO LA2 ;SE DIFERENTE DE '0' VAI PARA LA2 DECF LC,F ;RETORNA VALOR DE 0XFF LA2: MOVLW .12 ;24D = 50 MICROSEG DELAY (ACERTA TEMPO ENTRE LEITURAS DA ENTRADA DE RF) MOVWF R0 DECFSZ R0,F GOTO $-1 GOTO L1 MO: ;OK LC>TMAX C=0 (VAI PARA O INICIO) BCF STATUS,C ;TESTA SE NÃO PASSOU DO LIMITE MAXIMO DE TEMPO EM LOW NA ENTRADA DE RF MOVLW #TMAX SUBWF LC,W BTFSS STATUS,C ;SE LCTMAX (REJEITAR DADO - SEM TRANSMISSÃO ) CLRF CSR7 CLRF CSR6 CLRF CSR5 CLRF CSR4 ; APAGA RESULTADOS DE COMPARAÇÃO CLRF CSR3 CLRF CSR2 CLRF CSR1 CLRF CSR0 L0: BCF FLAGH CLRF HC ;APAGA REGISTRADORES DE UNS E ZEROS CLRF LC L1: RETURN ;=============================================================================================== NK: ;OK C=1 SE LC>HC ;G SEG58: MOVFW HC SUBWF LC,W ;OBTEM O VALOR DE 'CARRY'(HUM OU ZERO) RRF CSR7,F RRF CSR6,F RRF CSR5,F ;DESLOCA O BIT NOS REGISTRADORES DE RESULTADO RRF CSR4,F BTFSS FLAG_HCS GOTO SEG44 RRF CSR3,F RRF CSR2,F ;DESLOCA O BIT NOS REGISTRADORES DE RESULTADO RRF CSR1,F RRF CSR0,F SEG44: DECFSZ QB,F ;DECREMENTA O CONTADOR DE BITS A SER RECEBIDO GOTO L0 BTFSC FLAG_HCS ;SE '1' VAI SEG66 GOTO SEG66 MOVLW .4 ;DESPREZA OS 4 BITS DE 'ANTICODE' 1010 MOVWF QB ACERTA: BCF STATUS,C RRF CSR7,F ;DESLOCA O BIT NOS REGISTRADORES DE RESULTADO RRF CSR6,F RRF CSR5,F ;RESULTADO FICA SOMENTE EM RES2 A RES0,DESPREZA RES3 RRF CSR4,F DECFSZ QB,F GOTO ACERTA BTFSC FLAG1 ;SE '1' VAI PULA1 GOTO PULA1 MOVFW CSR6 MOVWF CSR6A ;SALVA A PRIMEIRA LEITURA PARA COMPARAÇÃO COM UMA SEGUNDA MOVFW CSR5 MOVWF CSR5A MOVFW CSR4 MOVWF CSR4A BSF FLAG1 ;SETA FLAG DE PRIMEIRA RECEPÇÃO MOVLW .28 MOVWF QB GOTO RET_ PULA1: BCF FLAG1 ;SEGUNDA RECEPÇÃO, COMPARA COM A PRIMEIRA MOVFW CSR6 XORWF CSR6A,W BTFSS STATUS,Z GOTO ERROR_ ;ERRO DE RECEPÇAO MOVFW CSR5 XORWF CSR5A,W BTFSS STATUS,Z GOTO ERROR_ MOVFW CSR4 XORWF CSR4A,W BTFSS STATUS,Z GOTO ERROR_ BSF FLAGX ;OK - BOA RECEPÇÃO HT6P20B MOVLW .28 MOVWF QB GOTO RET_ SEG66: BSF FLAGY ;OK - BOAS RECEPÇÃO HCS BCF FLAG1 MOVLW .28 MOVWF QB BCF FLAG_HCS GOTO L0 ERROR_: CLRF CSR6A ; APAGA RESULTADOS DE COMPARAÇÃO CLRF CSR5A CLRF CSR4A SAI_ROT: BCF FLAGX BCF FLAGH MOVLW .28 MOVWF QB GOTO RET_ ROT_HT6P: MOVFW CSR6 XORLW .0 BTFSS STATUS,Z GOTO J1 MOVFW CSR5 XORLW .0 BTFSS STATUS,Z GOTO J1 MOVFW CSR4 XORLW .0 BTFSS STATUS,Z GOTO J1 GOTO MAIN ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXTESTE ; LIMPA ; LINHA1 ; MOVLW MSG1 ; CALL ENV_LCD ; MOVLW 0XC5 ; CALL EC ; MOVLW .1 ;ESTAVA 20 ; CALL DELAYW ; GOTO MAIN J1: CLRF PAG MOVLW MSG5 CALL ENV_SERIAL SWAPF CSR6A,W CALL BIN_ASC_ED MOVFW CSR6A CALL BIN_ASC_ED SWAPF CSR5A,W CALL BIN_ASC_ED MOVFW CSR5A CALL BIN_ASC_ED SWAPF CSR4A,W CALL BIN_ASC_ED MOVFW CSR4A CALL BIN_ASC_ED MOVLW .5 ;ESTAVA 20 CALL DELAYW MOVLW 0X0A CALL SEND MOVLW 0X0D CALL SEND BCF FLAGX BCF FLAGY GOTO MAIN_C ROT_HCS: CLRF PAG MOVLW MSG4 CALL ENV_SERIAL SWAPF CSR7,W CALL BIN_ASC_ED MOVFW CSR7 CALL BIN_ASC_ED SWAPF CSR6,W CALL BIN_ASC_ED MOVFW CSR6 CALL BIN_ASC_ED SWAPF CSR5,W CALL BIN_ASC_ED MOVFW CSR5 CALL BIN_ASC_ED SWAPF CSR4,W CALL BIN_ASC_ED MOVFW CSR4 CALL BIN_ASC_ED SWAPF CSR3,W CALL BIN_ASC_ED MOVFW CSR3 CALL BIN_ASC_ED SWAPF CSR2,W CALL BIN_ASC_ED MOVFW CSR2 CALL BIN_ASC_ED SWAPF CSR1,W CALL BIN_ASC_ED MOVFW CSR1 CALL BIN_ASC_ED SWAPF CSR0,W CALL BIN_ASC_ED MOVFW CSR0 CALL BIN_ASC_ED MOVLW .5 ;ESTAVA 20 CALL DELAYW MOVLW 0X0A CALL SEND MOVLW 0X0D CALL SEND BCF FLAGX BCF FLAGY GOTO MAIN_C ;================================================================================= ; SUB-ROTINAS ;================================================================================= ;================================================================================= ;Rotina de retardo, onde w=tempo em ms - clock=4MHz ;================================================================================= DELAY2 MOVLW .20 DELAYW MOVWF TEMP VJ1 call LcdDelay1 DECFSZ TEMP,F GOTO VJ1 DELAY1 LcdDelay1 MOVLW .255 ;DELAY PARA VISUALIZAÇAO DELAY LcdDelay goto $+1 movwf LC+1 ;duas variáveis em uma LcdDelayLoop decfsz LC+0,F ;dec. o prim. cont. goto LcdDelayLoop decfsz LC+1,F ;dec. o seg. cont. goto LcdDelayLoop return DEBOUNCE WAIT_16MSEC movlw .16 WAIT_WMSEC movwf LC+1 WAITSET movlw .250 movwf LC WAITLOOP decfsz LC,F goto WAITLOOP decfsz LC+1,F goto WAITSET return ;===================================================== WAIT_uS movwf LC WAIT_uS_A decfsz LC, F goto WAIT_uS_A return ;=============================================================== ;SERIAL ;======================================================================== ;======================================================================== BIN_ASC_ED ;ROTINA DE BINARIO PARA HEX 0-F COM ENVIO PARA SERIAL ANDLW 0X0F ;LIMITA 0-F ADDLW 0XF6 ;SOMA 0XF6 BTFSC STATUS,C ;TESTA CARRY ADDLW 0X07 ;C=1 ,ENTÃO SOMA + 7 ADDLW 0X3A ;SOMA 0X3A ;ENVIA PARA A SERIAL E RETORNA PARA O PONTO DE CHAMADA ;======================================================================== ;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 end