asm code
;**************************************************************
;PROJETO: TESTE45.ASM
;DATA: 05/11/2014
;VERSÃO: 00L/A44
;PROGRAMADOR: ANDRÉ MOREIRA DE ALMEIDA
;*************DESCRIÇÃO DO PROJETO******************************
;ESTE PROJETO FAZ A CAPTURA DA TEMPERATURA ATRAVÉS DO
;SENSOR LM35
;***************************************************************
LIST P=18F452 ;TIPO DE MICROCONTROLADOR
#INCLUDE <P18F452.INC> ;DECLARA TODOS OS BITS E SFRS DO PIC
ERRORLEVEL -302 ;DESABILITA MENSAGEM DE ERRO
;*****************************************************************
CONFIG1H_HS_OSC ;OSC DE 8MHZ
CONFIG2H_WDT_OFF ;DESABILITA O WHATCDOG TIMER
CONFIG2L_PWRT_ON ;AGUARDA 72MS EM RESET
CONFIG3H_PBADEN_OFF ;PORTB<RB0:RB4> COMO I/O DIGITAL
CONFIG4L_LVP_OFF ;DESABILITA GRAVAÇÃO POR BAIXA TENSÃO
CONFIG4L_DEBUGG_OFF ;DESABILITA DEBUGADOR EXTERNO
;************DECLARAÇÕES DAS VÁRIAVEIS**************************
CBLOCK 0X00
TEMPO1
TEMPO2
TEMPO3 ;DEFINE AS VÁRIAVEIS AUXILIARES
AUX ;DEFINE VARIÁVEL AUXILIAR
CONVERSAO_0
CONVERSAO_1
CONVERSAO_2 ;REGISTRADORES DE CONVERSÃO
LSB
ENDC
;***************************************************************
;SAÍDAS DO SISTEMA
;***************************************************************
;AQUI SÃO DEFINIDAS AS SAÍDAS QUE SERÃO UTILIZADAS PELO
;SISTEMA
#DEFINE BUS PORTD ;DEFINE O BARRAMENTO DO SISTEMA
#DEFINE RS PORTE,2 ;DEFINE O PINO DE RS
#DEFINE EN PORTE,1 ;DEFINE O PINO DE EN
;***************************************************************
;*VETOR DE RESET
;***************************************************************
ORG 0X0000 ;INICIO DO PROGRAMA
GOTO INICIO ;SALTA PARA INICIO
;***************************************************************
;*VETOR DE INTERRUPÇÃO
;***************************************************************
ORG 0X0008 ;ENDEREÇO INICIAL DO VETOR DE INTERRUPÇÃO
RETFIE FAST ;RETORNA DA INTERRUPÇÃO
;***************************************************************
;*ENVIA COMANDO
;***************************************************************
ENVIA_COMANDO
MOVWF BUS ;CARREGA O DADO NO BARRAMENTO
BCF RS ;COLOCA EM MODO COMANDO
BSF EN ;
NOP
BCF EN ;GERA O PULSO DE ENABLE
MOVLW 0X05
RCALL DELAY ;CHAMA A ROTINA DE DELAY
RETURN ;RETORNA DA ROTINA
;***************************************************************
;*ENVIA DADO
;***************************************************************
ENVIA_DADO
MOVWF BUS ;CARREGA O DADO NO BARRAMENTO
BSF RS ;COLOCA EM MODO COMANDO
BSF EN
NOP
BCF EN ;GERA O PULSO DE ENABLE
MOVLW 0X01
RCALL DELAY ;CHAMA A ROTINA DE DELAY
RETURN ;RETORNA DA ROTINA
;***************************************************************
;*ROTINA DE DELAY EM SEG
;***************************************************************
ENVIA_232
BTFSS PIR1,RCIF
;BRA ENVIA_232
MOVWF TXREG ;MOVE W PARA O REGISTRADOR;DE TRANSMISSÃO
BTFSS TXSTA,TRMT ;O BYTE JA FOI TRANSMITIDO?
BRA $-.2 ;NÃO, ENTÃO AGUARDA
RETURN
;****************************************************************************
DELAY_SEG
MOVWF TEMPO3 ;CARREGA O TEMPO A AGUARDAR EM
;TEMPO3
DELAY_SEG_A
MOVLW .250
RCALL DELAY ;AGUARDA 250ms
MOVLW .250
RCALL DELAY ;AGUARDA 250ms
MOVLW .250
RCALL DELAY ;AGUARDA 250ms
MOVLW .250
RCALL DELAY
DECFSZ TEMPO3,F ;DECREMENTA TEMPO3,ACABOU?
BRA DELAY_SEG_A ;NÃO, ENTÃO REPETE TODO O BLOCO
RETURN ;RETORNA DA ROTINA
;***************************************************************
;*ROTINA DE DELAY EM MS
;***************************************************************
DELAY
MOVWF TEMPO1 ;MOVE O CONTEÚDO DE W EM TEMPO1
DELAY_A
MOVLW .250
MOVWF TEMPO2 ;INICIALIZA O REG.TEMPO2
NOP ;PERDE TEMPO DE UM CICLO
DECFSZ TEMPO2 ;DECREMENTA TEMPO2, ACABOU?
BRA $-.4 ;VOLTA DUAS LINHAS DE PROGRAMA
DECFSZ TEMPO1,F ;DECREMENTA TEMPO1. CHEGOU A 0?
BRA DELAY_A ;NÃO, ENTÃO SALTA PARA DELAY_A
RETURN ;RETORNA DA ROTINA
;****************************************************************
;*ROTINA DE CONVERSÃO BINÁRIO PARA DECIMAL
;*ENTRADAS: MSB:LSB
;*SAÍDA: CONVERSÃO_2:CONVERSÃO_1:CONVERSÃO_0
;****************************************************************
BIN_TO_DEC
MOVWF LSB
CLRF CONVERSAO_0
CLRF CONVERSAO_1
CLRF CONVERSAO_2 ;INICIALIZA AS VÁRIAVEIS DE CONVERSÃO
MOVF LSB,F ;VALOR A SER CONVERTIDO É IGUAL A 0?
BZ SAI_CONVERTE ;SIM, ENTÃO SAI DO LOOP
CONVERSAO_A
INCF CONVERSAO_0,F ;INCREMENTA CONVERSÃO_0
MOVLW .10
XORWF CONVERSAO_0,W ;REGISTRADOR É IGUAL A 10?
BNZ CONVERSAO_B ;NÃO, ENTÃO SALTA PARA A CONVERSAO_B
CLRF CONVERSAO_0 ;INICIALIZA CONVERSAO_0
INCF CONVERSAO_1,F ;INCREMENTA CONVERSAO_1
MOVLW .10
XORWF CONVERSAO_1,W ;REGISTRADOR É IGUAL A 10?
BNZ CONVERSAO_B ;NÃO, ENTÃO SALTA PARA CONVERSAO_B
CLRF CONVERSAO_1 ;INICIALIZA CONVERSAO_1
INCF CONVERSAO_2,F ;INCREMENTA CONVERSAO_2
CONVERSAO_B
DECFSZ LSB,F ;DECREMENTA LSB. CHEGOU A 0?
BRA CONVERSAO_A ;NÃO, ENTÃO SALTA PARA CONVERSAO_A
SAI_CONVERTE
RETURN ;RETORNA DA ROTINA
;********************************************************************
;*CONFIGURAÇÕES INICIAIS
;********************************************************************
INICIO
CLRF LATC
CLRF LATD ;INICIALIZA COM O PORTD EM 0
CLRF LATE ;INICIALIZA COM O PORTE EM 0
MOVLW B'00001000' ;CONFIGURA O AN3 COMO ENTRADA
MOVWF TRISA
MOVLW B'00000000' ;TODO OS PINOS DO PORTD COMO
CLRF LATA
MOVWF TRISD ;SAÍDA
MOVLW B'00000000' ;TODO OS PINOS DO PORTE COMO
MOVWF TRISE ;SAÍDA
MOVLW B'01011001'
MOVWF ADCON0 ;AD LIGADO
;CONVERSÃO EM FOSC/8
;CANAL 3 SELECIONADO
MOVLW B'00000100'
MOVWF ADCON1 ;COLOCA OS PINOS AN0,AN1 E AN3
;COMO ANALÓGICOS
;E O RESTANTE COMO I/O DIGITAL
MOVLW B'10000000';CONFIGURA O RC7 COMO ENTRADA
MOVWF TRISC ;E O RESTANTE COMO SAÍDA
MOVLW .25
MOVWF SPBRG ;CARREGA O VALOR DA TAXA DE
;COMUNICAÇÃO
;PARA FUNCIONAR A 9.600 bps
MOVLW B'00100100' ;TRANSMISSÃO HABILITADA
MOVWF TXSTA ;TRANSMISSÃO EM MODO ASSÍNCRONO
;TRANSMISSÃO EM 9 BITS DESABILITADA
MOVLW B'10010000' ;PORTA SERIAL HABILITADA
MOVWF RCSTA ;RECEPÇÃO EM 9 BITS DESABILITADA
;RECEPÇÃO CONTÍNUA HABILITADA
MOVLW .1
RCALL DELAY_SEG ;AGUARDA 1 SEGUNDO PARA DAR O
;START UP NO DISPLAY
;*********************************************************************
;INICIALIZAÇÃO DO LCD
;*********************************************************************
MOVLW 0X38
RCALL ENVIA_COMANDO ;ENVIA COMANDO PARA O DISPLAY
MOVLW 0X38
RCALL ENVIA_COMANDO ;ENVIA COMANDO PARA O DISPLAY
MOVLW 0X06
RCALL ENVIA_COMANDO ;ENVIA COMANDO PARA O DISPLAY
MOVLW 0X0C
RCALL ENVIA_COMANDO ;ENVIA COMANDO PARA O DISPLAY
MOVLW 0X01
RCALL ENVIA_COMANDO ;ENVIA COMANDO PARA O DISPLAY
MOVLW ' '
RCALL ENVIA_DADO ;CHAMA A ROTINA DE ENVIO DE DADO
MOVLW ' '
RCALL ENVIA_DADO ;CHAMA A ROTINA DE ENVIO DE DADO
MOVLW 'T'
RCALL ENVIA_DADO ;CHAMA A ROTINA DE ENVIO DE DADO
MOVLW 'E'
RCALL ENVIA_DADO ;CHAMA A ROTINA DE ENVIO DE DADO
MOVLW 'M'
RCALL ENVIA_DADO ;CHAMA A ROTINA DE ENVIO DE DADO
MOVLW 'P'
RCALL ENVIA_DADO ;CHAMA A ROTINA DE ENVIO DE DADO
MOVLW 'E'
RCALL ENVIA_DADO ;CHAMA A ROTINA DE ENVIO DE DADO
MOVLW 'R'
RCALL ENVIA_DADO ;CHAMA A ROTINA DE ENVIO DE DADO
MOVLW 'A'
RCALL ENVIA_DADO ;CHAMA A ROTINA DE ENVIO DE DADO
MOVLW 'T'
RCALL ENVIA_DADO ;CHAMA A ROTINA DE ENVIO DE DADO
MOVLW 'U'
RCALL ENVIA_DADO ;CHAMA A ROTINA DE ENVIO DE DADO
MOVLW 'R';
RCALL ENVIA_DADO ;CHAMA A ROTINA DE ENVIO DE DADO
MOVLW 'A'
RCALL ENVIA_DADO ;CHAMA A ROTINA DE ENVIO DE DADO
;************************************************************************
;*ROTINA PRINCIPAL
;************************************************************************
LOOP
BSF ADCON0,GO_DONE ;INICIA A CONVERSÃO DO AD
BTFSC ADCON0,GO_DONE ;CONVERSÃO ACABOU?
BRA $-2 ;NÃO, ENTÃO AGUARDA FINALIZAR
RLNCF ADRESH,W ;MULTIPLICA O RESULTADO DA CONVERSÃO
;POR 2 E MOVE PARA W
RCALL BIN_TO_DEC ;CHAMA A ROTINA DE CONVERSÃO PARA
;********************* *****************************************
;******************** *******************************************
MOVLW .198
RCALL ENVIA_COMANDO ;POSICIONA O CURSOR NA SEGUNDA
;LINHA
MOVF CONVERSAO_1,W ;MOVE O RESULTADO DA CONVERSÃO PARA
;W
ADDLW '0' ;SOMA COM O ASCII DE 0
RCALL ENVIA_DADO ;CHAMA A ROTINA PARA ENVIO DE DADO
MOVF CONVERSAO_0,W ;MOVE O RESULTADO DA CONVERSAO PARA
;W
;**************************************************************************
ADDLW '0' ;SOMA COM ASCII DE 0
RCALL ENVIA_DADO ;CHAMA A ROTINA PARA ENVIO DE DADO
MOVLW ' '
RCALL ENVIA_DADO ;CHAMA A ROTINA PARA ENVIO DE DADO
MOVLW 'C'
RCALL ENVIA_DADO ;CHAMA A ROTINA PARA ENVIO DE DADO
;***************************************************************************
MOVLW '0'
ADDWF CONVERSAO_0,F ;DEIXA COMO CARACTERES ASCII
ADDWF CONVERSAO_1,F ;DEIXA COMO CARACTERES ASCII
ADDWF CONVERSAO_2,F ;DEIXA COMO CARACTERES ASCII
MOVF CONVERSAO_2,W ;MOVE CONVERSAO_2 PARA W
MOVFF CONVERSAO_2,TXREG
CALL ENVIA_232 ;CHAMA ROTINA PARA ENVIAR
MOVF CONVERSAO_1,W ;MOVE CONVERSAO_2 PARA W
MOVFF CONVERSAO_1,TXREG
CALL ENVIA_232 ;CHAMA ROTINA PARA ENVIAR
MOVF CONVERSAO_0,W ;MOVE CONVERSAO_2 PARA W
MOVFF CONVERSAO_0,TXREG
CALL ENVIA_232 ;CHAMA ROTINA PARA ENVIAR
BRA LOOP ;SALTA PARA LOOP
;********************************************************************************
;*FIM DO PROGRAMA
;********************************************************************************
END ;FIM DO PROGRAMA