;************************************************* www.x-robotics.com ******* ; PROGRAMA : X-Temp_LM35.asm ; Funcion :Medicion de temperatura de 4 canales con 2,56V +Vref externo y ; sensores LM35, indicacion de temp. en LCD 2x16. ; ; Medición de 0 a +150 ºC ; ;--------------------------------------------------------------------------- ; Revision : 1.00 Fecha: 22/2/2003 Programa para : PIC16F876 ; CPU Clock : 4 MHz Tiempo instruccion : 1uS ; WDT : OFF Tipo de reloj : XT ; Code Prot : OFF cfg USART rs232 ; none ; Autor : Daniel C. Martin -> ionitron@x-robotics.com <- ;************************************************* www.x-robotics.com ******* processor 16F876 LIST P=16F876 ;Se indica el modo de procesador INCLUDE ;se incluye la definicion de los ;registros internos __config 3D31 PDel0 EQU 0x21 PDel1 EQU 0x22 PDel2 EQU 0x23 BUFFER EQU 0x24 DATO_A EQU 0x25 DATO_B EQU 0x26 Digito EQU 0x27 INNER EQU 0x28 OUTER EQU 0x29 cnt_bit EQU 0x2A ASCII_H EQU 0x2B ASCII_M EQU 0x2C ASCII_L EQU 0x2D HEXADECIMAL EQU 0x2E Canal EQU 0x2F ;---------------------------------------------------------------------------- org 0x00 ;vector de inicio goto INICIO org 0x05 ;despues del vector de interrupcion ;<<<<<<----------------- INICIO PROGRAMA PRINCIPAL ------------------->>>>>>> ;---------------------------------------------------------------------------- INICIO bcf STATUS,RP0 ;banco 0 bcf STATUS,RP1 clrf PORTA bsf STATUS,RP0 ;banco 1 clrf TRISB ;portb como salida clrf TRISC bcf STATUS,RP0 ;banco 0 clrf PORTA clrf PORTB clrf PORTC ;'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' START CALL LCD_INI ;Inicia LCD (CFG puertos...) START_1 MOVLW b'00000001' ;Borrar LCD y Home CALL LCD_REG MOVLW b'00000110' ; CALL LCD_REG MOVLW b'00001100' ;LCD On, cursor Off,Parpadeo Off CALL LCD_REG MOVLW 0x80 ;Direccion caracter CALL LCD_REG REPETIR ;MOVF Digito,w ;W=Digito ;CALL DATO_1 ;Coge el caracter ;IORLW 0x00 ;Compara ;BTFSC STATUS,2 ;Es el ultimo? ;GOTO acabar ;Si ;CALL LCD_DATOS ;Visualiza caracter ;INCF Digito,f ;Incrementa numero de Digito ;GOTO REPETIR ;Vuelve a escribir acabar ;termino inicializacion de lcd y muestra primeros datos ;=========================================================================== ; Inicio de conversion de valores analogicos ;=========================================================================== ;---------------------Configuracion CONVERTIDOR A/D------------------------- CFGADC bsf STATUS,RP0 ;Banco 1 bcf STATUS,RP1 movlw b'00000011' ;seleccion tipo puertos A/D movwf ADCON1 movlw b'11111111' movwf TRISA ;PORTA como entrada bcf STATUS,RP0 ;Banco 0 movlw b'01000001' ;seleccion Tad, canales para movwf ADCON0 ;conversion y A/D=ON bcf PIR1,ADIF ;limpia flag de conversion completa ; FIN de configuracion de registros ;--------------------------------------------------------------------------- lecturas movlw d'0' ;selecciona canal ADC movwf Canal call RUN_ADC movlw 0x80 ;pone cursor en 80------------------ call LCD_REG movlw 'T' call LCD_DATOS ;Visualiza caracter movlw '1' call LCD_DATOS ;Visualiza caracter movlw '=' call LCD_DATOS ;Visualiza caracter call inLCD ;visualiza dato--------------------- movlw 0xDF ;º call LCD_DATOS ;Visualiza caracter movlw 0x20 ;" " call LCD_DATOS ;Visualiza caracter ;''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' movlw d'5' call delay ;''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' movlw d'1' ;selecciona canal ADC movwf Canal call RUN_ADC movlw 0x88 ;pone cursor en 80------------------ call LCD_REG movlw 'T' call LCD_DATOS ;Visualiza caracter movlw '2' call LCD_DATOS ;Visualiza caracter movlw '=' call LCD_DATOS ;Visualiza caracter call inLCD ;visualiza dato--------------------- movlw 0xDF ;º call LCD_DATOS ;Visualiza caracter movlw 0x20 ;" " call LCD_DATOS ;Visualiza caracter ;''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' movlw d'5' call delay ;;''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' movlw d'2' ;selecciona canal ADC movwf Canal call RUN_ADC movlw 0xC0 ;pone cursor en 80------------------ call LCD_REG movlw 'T' call LCD_DATOS ;Visualiza caracter movlw '3' call LCD_DATOS ;Visualiza caracter movlw '=' call LCD_DATOS ;Visualiza caracter call inLCD ;visualiza dato--------------------- movlw 0xDF ;º call LCD_DATOS ;Visualiza caracter movlw 0x20 ;" " call LCD_DATOS ;Visualiza caracter ;''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' movlw d'5' call delay ;''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' movlw d'4' ;selecciona canal ADC movwf Canal call RUN_ADC movlw 0xC8 ;pone cursor en 80------------------ call LCD_REG movlw 'T' call LCD_DATOS ;Visualiza caracter movlw '4' call LCD_DATOS ;Visualiza caracter movlw '=' call LCD_DATOS ;Visualiza caracter call inLCD ;visualiza dato--------------------- movlw 0xDF ;º call LCD_DATOS ;Visualiza caracter movlw 0x20 ;" " call LCD_DATOS ;Visualiza caracter ;''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' movlw d'5' call delay ;;''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' goto lecturas ;/////////////////////////////////////////////////////////////////////////// ;/////////////////////////////////////////////////////////////////////////// ;/////////////////////////////////////////////////////////////////////////// ;--------------------------------------------------------------------------- RUN_ADC bcf STATUS,RP0 ;Banco 0 bcf STATUS,RP1 ;Banco 0 movlw b'01000001' ;repone a cero para que iorlw pueda movwf ADCON0 ;bcf ADCON0,ADON ;apaga el convertidor rlf Canal,F ;posiciona los bits rlf Canal,F rlf Canal,W iorwf ADCON0,F ;bsf ADCON0,ADON ;enciende el convertidor rrf Canal,F rrf Canal,F ;retorna a la anterior bcf PIR1,ADIF ;limpia flag de conversion completa nop nop GO_ADC bsf ADCON0,GO_DONE ;Inicio conversion wait_ADC btfsc ADCON0,GO_DONE ;espera a que finalice la conversion goto wait_ADC ;bucle READ_OK ;La conversion esta en ADRESH:ADRESL return ;mostrar en lcd!************************************************************ inLCD movf ADRESH,W call Hex_Ascii bcf STATUS,RP0 ;banco 0 bcf STATUS,RP1 bcf STATUS,Z movf ASCII_H,W ;sobreescribe el dato distancia xorlw 0x30 ;Comprueba si es cero a la izquierda btfsc STATUS,Z goto cero_izquierda movf ASCII_H,W CALL LCD_DATOS ;Visualiza caracter cero_izquierda movf ASCII_M,W ;iorlw 0x00 ;Comprueba si es cero a la izquierda ;btfss STATUS,Z CALL LCD_DATOS ;Visualiza caracter movf ASCII_L,W CALL LCD_DATOS ;Visualiza caracter call DELAY_5MS call DELAY_5MS return ;/////////////////////////////////////////////////////////////////////////// ;/////////////////////////////////////////////////////////////////////////// ;/////////////////////////////////////////////////////////////////////////// ;#########################################################RUTINAS DE LCD#### LCD_E BSF PORTC,2 ;Activa señal E NOP NOP NOP ;Espera 1uS BCF PORTC,2 ;Desactiva señal E RETURN LCD_BUSY BSF PORTC,1 ;Pone el LCD en modo lectura BSF STATUS,RP0 ;Selecciona el Banco 1 MOVLW 0xFF MOVWF TRISB ;Puerta B act£a de entrada BCF STATUS,RP0 ;Selecciona el Banco 0 BSF PORTC,2 ;Activa el LCD (Señal E) NOP L_BUSY BTFSC PORTB,7 ;Chequea el bit BUSY GOTO L_BUSY ;Est a "1" (Ocupado) BCF PORTC,2 ;Desactiva el LCD (Se¤al E) BSF STATUS,RP0 ;Selecciona el Banco 1 CLRF TRISB ;Puerta B actua como salida BCF STATUS,RP0 ;Selecciona el Banco 0 BCF PORTC,1 ;Pone el LCD en modo escritura RETURN LCD_REG BCF PORTC,0 ;Desactiva RS (Modo instruccion) MOVWF PORTB ;Saca el codigo de instruccion CALL LCD_BUSY ;Espera a que se libere el LCD GOTO LCD_E ;Genera pulso en señal E LCD_DATOS BCF PORTC,0 ;Desactiva RS (Modo instrucci¢n) MOVWF PORTB ;Valor ASCII a sacar por PORTB CALL LCD_BUSY ;Espera a que se libere el LCD BSF PORTC,0 ;Activa RS (Modo dato) GOTO LCD_E ;Genera pulso en señal E LCD_INI MOVLW b'00111000' CALL LCD_REG ;Codigo de instruccion CALL DELAY_5MS ;Temporiza 5 mS. MOVLW b'00111000' CALL LCD_REG ;Codigo de instruccion CALL DELAY_5MS ;Temporiza 5 mS. MOVLW b'00111000' CALL LCD_REG ;Codigo de instruccion CALL DELAY_5MS ;Temporiza 5 mS. RETURN ;**************************************************************************** ;DELAY_5MS genera una temporizacion de 5mS necesario para la secuencia de ;inicio del LCD DELAY_5MS movlw .6 ; 1 set number of repetitions (B) movwf PDel0 ; 1 | PLoop1 movlw .207 ; 1 set number of repetitions (A) movwf PDel1 ; 1 | PLoop2 nop ; 1 clear watchdog decfsz PDel1, 1 ; 1 + (1) is the time over? (A) goto PLoop2 ; 2 no, loop decfsz PDel0, 1 ; 1 + (1) is the time over? (B) goto PLoop1 ; 2 no, loop PDelL1 goto PDelL2 ; 2 cycles delay PDelL2 nop ; 1 cycle delay return ; 2+2 Done ;########################################################################### del_1ms movlw d'199' ;delay 1mS movwf INNER in_lp nop nop decfsz INNER,F goto in_lp return delay movwf OUTER ;vueltas de 1mS out_lp call del_1ms decfsz OUTER,F goto out_lp return ;()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()() ;()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()() ;()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()() Hex_Ascii ;cargar en W el dato hex. ; ;MOVLW .254 MOVWF HEXADECIMAL clrf ASCII_H ;Para BCD D'0' clrf ASCII_M ;Para BCD D'0' clrf ASCII_L ;Para BCD D'0' ; Centenas ; movlw D'100' ;D'100' --> W subwf HEXADECIMAL,W ;HEXADECIMAL - D'100' --> W btfss STATUS,C ;¿ HEXADECIMAL es menor que D'100' ? goto Decenas ;Si movwf HEXADECIMAL ;Salva el resto incf ASCII_H,F ;Incrementa el contador de centenas BCD goto Centenas ;Vuelve por otros D'100' ; Decenas ; movlw D'10' ;D'10' --> W subwf HEXADECIMAL,W ;HEXADECIMAL - D'10' --> W btfss STATUS,C ;¿ HEXADECIMAL es menor que D'10' ? goto Unidades ;Si movwf HEXADECIMAL ;Salva el resto incf ASCII_M,F ;Incrementa el contador de decenas BCD goto Decenas ;Vuelve por otros D'10' ; Unidades ; movf HEXADECIMAL,W ;El resto pertenece movwf ASCII_L ;a las unidades BCD clrf HEXADECIMAL ;Pone a cero el registro HEXADECIMAL ; Bcd_A_Ascii ; movlw H'30' ;H'30' --> W iorwf ASCII_L,F ;Convierte de BCD a ASCII iorwf ASCII_M,F ;Convierte de BCD a ASCII ; movf ASCII_H,F ;ASCII_H --> F btfsc STATUS,Z ;? ASCII_H es D'00' ? goto Espacio ;Si movlw H'30' ;H'30' --> W iorwf ASCII_H,F ;Convierte de BCD a ASCII return ;Retorna ; Espacio ; movlw '0' ;A' ' --> W movwf ASCII_H ;A' ' --> ASCII_H ;movwf ASCII_M ;A' ' --> ASCII_H ;movwf ASCII_L ;A' ' --> ASCII_H return ;Retorna ;()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()() ;()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()() ;()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()() ; Description: Waits 100 cycles ;------------------------------------------------------------- Delayp1 movlw .23 ; 1 set number of repetitions movwf PDel0 ; 1 | PLoop02 nop ; 1 clear watchdog decfsz PDel0, 1 ; 1 + (1) is the time over? goto PLoop02 ; 2 no, loop PDelL12 goto PDelL22 ; 2 cycles delay PDelL22 nop ; 1 cycle delay return ; 2+2 Done END ;************************************************* www.x-robotics.com *******