;PROGRAMA QUE REALIZA LA CONVERSION A/D POR EL PUERTO A PIN ;RA0 Y VISUALIZA EL VOLTAJE POR EL PUERTO B ;**********************DECLARACION DE VARIABLES*************************** DELAY EQU 21 ;GUARDA EL TEIMPO DEL RETARDO H_BYTE EQU 23 ;REGISTRO QUE INCREMENTA O DECREMENTA L_BYTE EQU 24 ;REGISTRO QUE CUENTA R0 EQU 26 ;BYTE MAS SIGNIFICATIVO CONVERSION 16 BITS A BCD R1 EQU 27 ;BYTE MEDIO CONVERSION 16 BITS A BCD R2 EQU 28 ;BYTE MENOS SIGNIFICATIVO CONVERSION 16 BITS A BCD TEMP EQU 29 ;REGISTRO CONVERSION 16 BITS A BDC CONTA EQU 30 ;REGISTRO DE RUTINA DE 16 BITS A BCD MSD1 EQU 31 ;MILESIMAS LSD1 EQU 32 ;CENTENAS MSD EQU 33 ;DECENAS LSD EQU 34 ;UNIDAD MULCND EQU 37 ;8 BIT MULTIPLICAND MULPLR EQU 38 ;8 BIT MULTIPLIER COUNT EQU 39 ;LOOP COUNTER ;********************DECLARACION DEL PROCESADOR******************************* LIST P=16F873 INCLUDE ;********************RUTINA DE INICIALIZACION************************************* ORG 0X00 GOTO MAIN ;*********************RUTINA DE INTERRUPCIÓN************************************** ORG 0X04 INT BTFSS INTCON,2 ;PREGUTO SI LA BANDERA DE INTERRUPCION POR ;TMR0 (TOIF) ESTA EN UNO RETFIE INT_10 BCF INTCON,2 ;LIMPIO LA BANDERA DE INTERRUPCION POR ;TMR0 (TOIF) MOVLW .131 ;CARGO A W CON 131 MOVWF TMR0 ;LLEVO LO QUE HAY EN W AL TMR0 INT_20 MOVF DELAY,0 ;CARGO A W CON DELAY XORLW 0X00 ;COMPARO W CON LITERAL BTFSS STATUS,Z ;PREGUNTO SI EL RESULTADO DE LA ANTERIOR ;OPERACION ESTA EN 1 GOTO INT_30 ;SI NO LO ESTA SALTO A LA RUTINA INT_30 RETFIE ;RETORNE A LA INTERRUPCION INT_30 DECF DELAY,1 ;DECREMENTO EL DELAY RETFIE ;RETORNE A LA INTERRUPCION ;****************************PROGRAMA PRINCIPAL*********************************** ORG 0X30 MAIN CALL CONFIG ;LLAMA LA RUTINA DE CONFIGURACIÓN DE ;PUERTOS Y REGISTROS MAIN_2 CALL CONVERSION ;LLAMO RUTINA DE CONVERCION A/D CALL MULTIPLICACION ;LLAMO RUTINA DE MULTIPLICACION CALL B2_BCD ;LLAMO RUTINA CONVERSION 16 BITS A BCD CALL BINBCD8 ;LLAMO RUTINA PARA ORGANIZAR LOS NUMEROS ;PARA LA VISUALIZACION CALL VISUAL_DISPLAY ;LLAMO RUTINA DE VISUALIZAR GOTO MAIN_2 ;SALTO A MAIN_2 ;************************************SUBRUTINAS****************************************** CONFIG BSF STATUS,RP0 ;CAMBIO A BANK1 MOVLW B'11111111' ;CARGO W CON UNOS MOVWF TRISA ;CARGO PUERTO A COMO ENTRADAS MOVLW B'10000000' ;W SE CARGA CON CEROS MOVWF TRISC ;LLEVO LO QUE HAY EN W AL TRISC MOVLW B'00000000' ;CONFIGURACION DEL REGISTRO TRISB MOVWF TRISB ;LLEVO LO QUE HAY EN W AL TRISB MOVLW B'10000010' ;CONFIGURACIÓN DEL REGISTRO OPTION MOVWF OPTION_REG ;LLEVO LO QUE HAY EN W A OPTION_REG MOVLW B'00001110' ;CONFIGURACION DE ADCON1 CAMBIE CONFIGURACION 1110 MOVWF ADCON1 ;CARGO EL VALOR EN ADCON1 BSF PIE1,RCIE MOVLW B'11100000' MOVWF INTCON BCF STATUS,RP0 ;CAMBIO A BANK0 MOVLW B'01000000' ;CONFIGURACION DE ADCON0 CAMBIE EL UNTIMO DIGITO ERA 1 MOVWF ADCON0 ;CARGO EL VALOR EN ADCON0 CLRF PORTC ;LIMPIO EL PUERTO CERO CLRF PORTB ;LIMPIO EL PUERTO B CLRF DELAY ;LIMPIO LA VARIABLE DE RETARDO CLRF L_BYTE CLRF H_BYTE CLRF CONTA CLRF MSD CLRF MSD1 CLRF LSD1 CLRF LSD MOVLW .131 ;CARGO W CON 132 MOVWF TMR0 ;CARGO TMR0 CON LO QUE HAY EN W RETURN ;*********** RUTINA DE CONVERSION DE BINARIO DE 16 BITS A BCD ********************** B2_BCD: BCF STATUS,0 ;LIMPIA EL CARRY MOVLW .16 ;CARGO A W CON 16 MOVWF COUNT ;CONFIGURO COUNT CLRF R0 ;LIMPIO LA VARIABLE DE DECENAS DE MIL ;Y CENTENAS DE MIL CLRF R1 ;LIMPIO LA VARIABLE DE CENTENAS Y UNIDADES DE MILES CLRF R2 ;LIMPIO LA VARIABLE DE UNIDADES Y DECENAS LOOP16: RLF L_BYTE,1 RLF H_BYTE,1 RLF R2,1 RLF R1,1 RLF R0,1 DECFSZ COUNT,1 ;DECREMENTO COMPARO Y SI ES CERO BRINCA GOTO ADJDEC RETURN ADJDEC: MOVLW R2 ;CARGO A W CON LO QUE HAY EN R2 MOVWF FSR ;MUEVO EL CONTENIDO DE W A FSR CALL ADJBCD ;LLAMO A ADJBCD MOVLW R1 ;CARGO A W CON LO QUE HAY EN R1 MOVWF FSR ;MUEVO EL CONTENIDO DE W A FSR CALL ADJBCD ;LLAMO A ADJBCD MOVLW R0 ;CARGO A W CON LO QUE HAY EN R0 MOVWF FSR ;MUEVO EL CONTENIDO DE W A FSR CALL ADJBCD ;LLAMO A ADJBCD GOTO LOOP16 ;BRICO A LOOP16 ADJBCD: MOVLW 3 ;CARGO A W CON 3 ADDWF INDF,0 ;SUMO EL CONTENIDO DE W CON INDF Y EL RESULTADO SE ;GUARDA EN W MOVWF TEMP BTFSC TEMP,3 ;COMPRUEBA SI EL RESULTADO > 7 MOVWF INDF MOVLW 30 ADDWF INDF,0 MOVWF TEMP BTFSC TEMP,7 ;COMPRUEBA SI EL RESULTADO > 7 MOVWF INDF ;SALVA COMO MSD RETURN ;****** RUTINA PARA VISUALIZAR EN DISPLAYS ********************************** VISUAL_DISPLAY MOVF MSD1,1 ;CARGO A MSD1 CON MSD1 SWAPF MSD1,0 ;INVIERTE NIBLLES Y LOS GUARDA EN W MOVWF PORTB ;CORGO A PORT C CON LO QUE HAY EN W BSF PORTC,5 ;SETEO BIT 3 DEL PUERTOB BCF PORTB,4 ;RESET BIT 2 PORTB BCF PORTB,1 ;IDEM BCF PORTB,0 ;IDEM MOVLW .5 ;CARGO A W CON 5 CALL RETARDO ;LLAMO A RETARDO MOVF LSD1,0 ;LLEVO LO QUE HAY EN LSD1 A W MOVWF PORTB ;CARGO EL PORTC CON LO QUE HAY EN W BCF PORTC,5 ;RESET BIT 3 PORTB BSF PORTC,4 ;SET BIT 2 DEL PORTB BCF PORTC,1 ;RESET BIT 1 DEL PORTB BCF PORTC,0 ;RESET BIT 0 DEL PORTB MOVLW .5 ;CARGO A W CON 5 CALL RETARDO ;LLAMO RETARDO BCF PORTC,4 ;RESET BIT 2 PORTB MOVF MSD,1 ;CARGO A MSD CON LO QUE HAY EN MSD SWAPF MSD,0 ;INVIERTE NIBLLES Y LOS GUARDA EN W MOVWF PORTB ;CARGO A PORTC CON LO QUE HAY EN W BSF PORTC,1 ;SET BIT 1 PORTB BCF PORTC,4 ;RESET BIT 2 PORTB BCF PORTC,5 ;RESET BIT 3 PORTB BCF PORTC,0 ;RESET BIT 0 PORTB MOVLW .5 ;CARGO A W CON 5 CALL RETARDO ;LLAMO A RETARDO MOVF LSD,0 ;CARGO A W CON LO QUE HAY EN LSD MOVWF PORTB ;LLEVO LO QUE HAY EN W A PORTC BCF PORTC,1 ;RESET BIT 1 PORTB BSF PORTC,0 ;SET BIT 0 PORTB MOVLW .5 ;CARGO A W CON 5 CALL RETARDO ;LLAMO A RETARDO BCF PORTC,0 ;RESET BIT 0 PORTB RETURN ;RETORNO ;*********************RUTINA DE CONVERSION******************************** CONVERSION BSF ADCON0,0 ;SETEO BIT 0 DEL REGISTRO ADCON0 MOVLW .2 ;CARGO W CON 2 CALL RETARDO ;LLAMO RETARDO BCF INTCON,7 ;RESETEO BIT 7 DEL REGISTRO INTCON BSF ADCON0,2 ;SETEO BIT 2 DEL REGISTRO ADCON0 CONVE_10 CO BTFSC ADCON0,2 ;PREGUNTO POR EL BIT 2 DEL REGISTRO ADCON0 ;SALTO SI ES CERO GOTO CO ;SALTO A CO BSF INTCON,7 ;SETEO BIT 7 DEL REGISTRO INTCON BCF ADCON0,0 ;RESETEO EL BIT O DEL REGISTRO ADCON0 RETURN ;RETORNO ;********************RUTINA DE RETARDO************************************* RETARDO MOVWF DELAY ;CARGO DELAY CON LO QUE EN W RETARDO_10 MOVLW 0X00 ;CARGO W CON CEROS XORWF DELAY,0 ;COMPARO W CON DELAY BTFSS STATUS,Z ;PREGUNTO SI EL ANTERIOR RESULTADO ES UN UNO GOTO RETARDO_10 ;SALTO A RETARDO_10 RETURN ;RETORNO ;*****RUTINA QUE ORGANIZA LOS NUMEROS PARA LA VISUALIZACION************************ BINBCD8 MOVF R1,W ;EL CONTENIDO DE R1 SE CARGA EN W ANDLW B'11110000' ;HAGO UNA AND DEL LITERAL CON W MOVWF MSD1 ;LLEVO LO QUE HAY EN W A MSD1 MOVF R1,W ;CARGOW CON R1 (CENTENAS Y UNIDADES DE MIL) ANDLW B'00001111' ;HAGO UNA AND DEL LITERAL CON W MOVWF LSD1 ;LLEVO LO QUE HAY EN W A LSD1 MOVF R2,W ;CARGO W CON R2 (UNIDADES Y DECENAS ANDLW B'11110000' ;HAGO UNA AND DEL LITERAL CON W MOVWF MSD ;LLEVO LO QUE HAY EN W A MSD MOVF R2,W ;CARGO W CON R2 ANDLW B'00001111' ;HAGO UNA AND CON W MOVWF LSD ;LLEVO LO QUE HAY EN W A LSD RETURN ;*********RUTINA DE MULTIPLICACION DE DOS NUMEROS****************** MULTIPLICACION GOTO MAIN3 SAME EQU 1 MPY_S CLRF H_BYTE CLRF L_BYTE MOVLW 8 MOVWF COUNT MOVF MULCND,W BCF STATUS,C ; CLEAR THE CARRY BIT IN THE STATUS REG. LOOP RRF MULPLR, F BTFSC STATUS,C ADDWF H_BYTE,SAME RRF H_BYTE,SAME RRF L_BYTE,SAME DECFSZ COUNT, F GOTO LOOP ; RETLW 0 ; ;******************************************************************** ; TEST PROGRAM ;********************************************************************* MAIN3 MOVF ADRESH,W MOVWF MULPLR ; MULTIPLIER (IN MULPLR) = 0FF MOVLW 02 ; MULTIPLICAND(W REG ) = 0FF MOVWF MULCND ; CALL MPY_S ; THE RESULT 0FF*0FF = FE01 IS IN LOCATIONS ; ; H_BYTE & L_BYTE ; RETURN ; END