Programa de conversión A/D con Pic 16f877/A

hola alli te pongo el codigo para pasar de un numero de 8 bits a decimal.
el numero decimal se almacena en tres registros: HSD, MSD y LSD.
el goto validar sale con el valor del decimal en los tres registros antes mencionados.

clrf HSD
clrf MSD
movf DATO,w ;valor a transformar
movwf LSD
rest movlw d'10'
subwf LSD,W
btfss STATUS,C
goto validar
movwf LSD
incf MSD
movlw d'10'
subwf MSD,0
btfss STATUS,Z
goto rest
clrf MSD
incf HSD
goto rest
 
EINNER come ta va, estoy incursionando en los micros pic y encontre tu post podes ayudarme a ver como influyen las variables N1 , N2 y entrar, en el proyecto que utiliza el 16f877 para controlar la temperatura?

Otra preg. como controlas cual es la variable que se debe cambiar? si bien entiendo que con los valores de hard_inc y hardw_decr pero como diferencias VAR1, VAR2, VAR3, VAR4.

Saludos.
 
hola fernandopos

gracias por ves el proyecto y me parece bn que te interese esto de los pic

en cuanto a tu duda, quiero pedir disculpas por no habr quitado las variables N1, N2, entrar, ya que no las uso, las tenia alli por que estaba implementado control desde el pc, que se realizara lo mismo que con los pulsadores pero de una forma grafica mas amigable,,,,,, en cuanto a lo de las otras variables, puedes ver que la configuracion se realiza en una secuencia, luego de entrar al menu de configuracion empiezas con var1 que indica la temperatura inferior minima, sigue var2 (temp superior maxima), var3 temp muy muy baja y var4 temp muy muy alta, y como aprecias en el main se trabaja en base a estas para prender o apagar dispositivos que controlaran la temperatura

cualquier duda o sugerencia es bienvenida,,

nota: termine lo de la comunicacion con el pc, espero pronto subirlo, no he tenido mucho tiempo de volver a retomar estos temas,,,,,,,
 
Gracias por contestar. Efectivamente Einner luego de estudiar al detalle el codigo imagine eso que comentas.
Me interesa la comunicacion con el pc que comentas, cuando tengas si puedes postear para ir anexando conocimientos.
Me interesa mucho este tema de los microcontroladores.

Saludos cordiales.
 
Hola, como estan? Alguien sabra como hacer la conversion digital/analogico con ese pic? Recuerdo que cuando vi la materia de microcontroladores el profesor dijo que aunque el pic no tenga ese modulo, se le puede "manipular" para que lo haga
 
Hola, como estan? Alguien sabra como hacer la conversion digital/analogico con ese pic? Recuerdo que cuando vi la materia de microcontroladores el profesor dijo que aunque el pic no tenga ese modulo, se le puede "manipular" para que lo haga

Oye.. yo estoy en eso ahorita mismo... la unica manera de hacer una conevercion DIGIAL/ANALOGICA que consegui es con un chip externo, ya sea de comunicacion serial SPI como el TLC5615, o el DAC0800 o DAC0808 de comunicacion paralela..
 
hola fernandopos

gracias por ves el proyecto y me parece bn que te interese esto de los pic

en cuanto a tu duda, quiero pedir disculpas por no habr quitado las variables N1, N2, entrar, ya que no las uso, las tenia alli por que estaba implementado control desde el pc, que se realizara lo mismo que con los pulsadores pero de una forma grafica mas amigable,,,,,, en cuanto a lo de las otras variables, puedes ver que la configuracion se realiza en una secuencia, luego de entrar al menu de configuracion empiezas con var1 que indica la temperatura inferior minima, sigue var2 (temp superior maxima), var3 temp muy muy baja y var4 temp muy muy alta, y como aprecias en el main se trabaja en base a estas para prender o apagar dispositivos que controlaran la temperatura

cualquier duda o sugerencia es bienvenida,,

nota: termine lo de la comunicacion con el pc, espero pronto subirlo, no he tenido mucho tiempo de volver a retomar estos temas,,,,,,,

Hola, disculpa tengo una duda.. cuando doy play para simular en el proteus me salta que hay un error en el codigo. me podrias dar una mano por favor? gracias.
 
hola santiago26

a cual codigo te refieres, subelo y vere que puedo hacer, si te refieres a ejemplo que he subido, dime cual es el error ya que debe ser de configuracion en tu proteus,,,

saludos
 
Hola a todos. Soy nuevo en el foro. He intentado no preguntar y aprender de los posts que la gente ha enviado anteriormente. Con ello (y otras cosas, claro) he conseguido hacer funcionar el ADC de mi pic16f690 ( Naguk10, esto te interesa), pero ahora me encuentro con un escollo que no soy capaz de superar.

El tema es el siguiente:

Tengo conectados dos potenciometros entre VDD y GND con los que puedo hacer variar la tensi'on en los pines correspondientes a AN2 y AN3 (RA2 y RA4, respectivamente). Soy capaz de leer la tensi'on de cada uno de ellos por separado y pasar la parte alta de ADRESH a los 4 bits de menor peso del puerto C (donde tengo sendos leds conectados).
Si leo solo un canal, todo va de lujo, los leds van mostrando la secuencia en biario del 0 al 16, lo cual es maravilloso jeje. Esto con cualquiera de los dos canales por separado.
Ahora bien, cuando quiero leer los dos canales de manera secuencial, solo me lee el segundo (o eso creo). En el codigo adjunto podeis ver lo que hago. El tema es que cuando quiero poner en los leds el resultado del primer canal muestreado, me sale siempre el segundo!! cuando los cambio de orden en el codigo, pasa lo mismo.

El codigo en ASM:

Código:
#include <p16F690.inc>
     __config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF)



     cblock 0x20
Sensor
Comandament
Delay
Delay1              ; Assign an address to label Delay1
Delay2
Delay11
Delay22
Delay111
Delay222
Display             ; define a variable to hold the diplay
resultat
     endc
          
     org 0
Start:
     bsf       STATUS,RP0     ; select Register Page 1
     movlw     0x1F
     movwf     TRISA          ; part baixa port A entrada, part alta, sortida
     clrf      TRISC          ; Make PortC all output
     movlw     0x10           ; A2D Clock Fosc/8
     movwf     ADCON1
     bcf       STATUS,RP0     ; back to Register Page 0
     bsf       STATUS,RP1     ; address Register Page 2
     movlw     0xFF          
     movwf     ANSEL
     bcf       STATUS,RP0     ; address Register Page 0
     bcf       STATUS,RP1
    
	
MainLoop:

	; Conversio canal del sensor


	 movlw	0x09
  	 movwf  ADCON0			  ; configure A2D for Channel 2 (RA2)
	 nop                      ; wait 10uS for A2D amp to settle and capacitor to charge.
     nop                      ; wait 1uS
     nop                      ; wait 1uS
     nop                      ; wait 1uS
	 nop                      ; wait 1uS
     nop                      ; wait 1uS
	 nop                      ; wait 1uS
     nop                      ; wait 1uS
     nop                      ; wait 1uS
     nop                      ; wait 1uS
     bsf       ADCON0,1     ; start conversion
     btfss     ADCON0,1      ; this bit will change to zero when the conversion is complete
     goto      $-1

	
	movf	ADRESH,w
	movwf	Sensor
	swapf	ADRESH,w
	movwf	PORTC

 		; Conversio canal del comandament

 	 movlw	0x0D
  	 movwf  ADCON0            ; configure A2D for Channel 3 (RA4), Left justified, and turn on the A2D modul
	 nop                      ; wait 10uS for A2D amp to settle and capacitor to charge.
     nop                      ; wait 1uS
	 nop                      ; wait 1uS
	 nop                      ; wait 1uS
     nop                      ; wait 1uS
	 nop                      ; wait 1uS
	 nop                      ; wait 1uS
     nop                      ; wait 1uS
     nop                      ; wait 1uS
     nop                      ; wait 1uS
     bsf       ADCON0,1     ; start conversion
     btfss     ADCON0,1      ; this bit will change to zero when the conversion is complete
     goto      $-1

	movf	ADRESH,w
	movwf	Comandament
	;swapf	ADRESH,w
	;movwf	PORTC  

	
	
	;subwf	Comandament,w	;restam comandament menys sensor, el resultat queda a w. si surt negatiu, el bit carry sera 0
	;btfss	STATUS,C
	;goto	MainLoop
	
	movlw	0xFF
	movwf	Delay2
	
	

		

	
	;movf	Delay2,w
	;sublw	0xFF
	;movwf	Delay1
	;movwf	Delay11
	



;Parpadeig






   	bsf PORTA,5 


OndelayLoop:

	movlw	0x01
	movwf	Delay11
	;movwf	Delay22
On:
	 decfsz    Delay11,f            
     goto      On   


	 decfsz    Delay111,f            
     goto      OndelayLoop
	 

     decfsz    Delay1,f            ; The outer loop takes and additional 3 instructions per lap * 256 loops
     goto      OndelayLoop         ; (768+3) * 256 = 197376 instructions / 1M instructions per second = 0.197 sec.
                                  ; call it a two-tenths of a second.
    
	 
     bcf PORTA,5 

OffDelayLoop:

	movlw	0x01
	;movwf	Delay11
	movwf	Delay22

Off:

	 decfsz    Delay22,f
     goto      Off


	 
	 decfsz    Delay222,f            
     goto      OffDelayLoop



	 decfsz    Delay2,f
     goto      OffDelayLoop

	 

	 
     goto      MainLoop
     end


Ha quedado un poco descolocado, pero supongo que se puede ver igual. Lo del parpadeo es para controlar una resistencia mediante un optoacoplador y un triac mediante pulsos.
Los comentarios en ingles son de partes de codigo de micrichip.
Por favor, alguien puede ayudarme?
 
Última edición por un moderador:
Gracias por tu aporte, me gustaria que me hisieras un proteus, porque desea utilizar tu codigo y botar la temperatura en un LCD, se como utilizar el LCD pero no se como realizar la comversion analogico digital desde el P16f877A, CONSIFDERANDO QUE LOGRE MEDIANTE UN AMPLIFICADOR OPERACIONAL QUE LA ENTRADA AL PIC ESTE ENTRE LOS 0 Y 5V, YA QUE EL LM35 BOTA EN mV.
 
Hola MarSteVic,

Lo siento pero nunca he utilizado proteus, no lo tengo instalado. La verdad es que yo trabajo bastante "a pelo", no simulo circuitos ni nada de todo eso, simplemente dibujo el layout con PCBWizart, lo imprimo y lo pruebo (supongo que de momento hago cosas muy sencillas).
Si quieres te cuento a que pines de mi pic va conectada cada cosa, pero eso también se puede deducir del código que adjunté y acaso con ayuda del datasheet de mi pic.
Si te refieres a la configuración que tienes que llevar a cabo para utilizar el A/D del 16f877A, tienes que mirartelo en el DataSheet. El truco está en que hay algunos registros (o posiciones de memória) en los que tiene que haber una serie de 1s y 0s según quieras utilizar un canal, otro, y de que manera (es como lo del TRIS para configurar un puerto como entrada o como salida para encender un led por ejemplo). Busca la sección adecuada en el datasheet (A/D modules, o algo así). Con esa información y un poquito que sepas de programación en ASM (y por supuesto en otros lenguajes de nivel superior con los que puedas operar bit a bit), lo harás funcionar fácilmente.
Si a pesar de todo crees que te puedo ayudar de alguna manera, hazmelo saber.

A mí también me gustaria aprender a utilizar una pantalla LCD. me puedes orientar? algún manual que hayas visto o utilizado? algún ejemplo que esté por ahí colgado??

Gracias por tu comentario acerca de mi aportación, es un placer si te sirve de algo

Ah, se me olvidaba. Yo no puse ninguna etapa de adaptación entre el LM35 y el PIC. Simplemente le puse la tensión de referencia del conversor a 1 volt. Las temperaturas que este sistema controla están siempre por encima de 0 y por debajo de 100 ºC, por tanto, como el LM35 te da 10mv por ºC, puedo cubrir todo el rango de entrada con una buena resolución. Igual puedes hacer lo mismo y te ahorras algo
 
Última edición:
una pregunta si algien me puede ayudar
Necesito crear un programa con el pic 16f877a y el lm35 dond el pic reconozca la variacion del voltaje que emite el lm35 i la transforme en una salida diguital para encender un led
el proyecto es un termometro que te de la lectura en leds de colores asi x ejemplo: 35° se enciende un led verde; 36° se enciende un led naranja
y asiii entoncs algien sabe kuantas entradas analogicas necesitaria i cuantas salidas digitales tiene este pic xfavor
 
una pregunta si algien me puede ayudar
Necesito crear un programa con el pic 16f877a y el lm35 dond el pic reconozca la variacion del voltaje que emite el lm35 i la transforme en una salida diguital para encender un led
el proyecto es un termometro que te de la lectura en leds de colores asi x ejemplo: 35° se enciende un led verde; 36° se enciende un led naranja
y asiii entoncs algien sabe kuantas entradas analogicas necesitaria i cuantas salidas digitales tiene este pic xfavor

Hola que tal, solo necesitas 1 ADC y pues 2 Digitales 1/0 para los leds... ya que con la lectura del ADC pues creas reglas dentro del pic, donde diga:
ejem.

if adc == 123;
{output_b0(0x01);}

siendo que 123 sería por ejemplo 35° solo que no se que valor tenga realmente jeje... y así condicionar el efecto con la variacion del sensor...
 
ahh... asi es entoncs jajaja
i asta kuantas salidas digitales tengo con ese pic?
la verdad no he trabajo con este pic i nose como programarlo mui bn el programa q uso es microcode y para cargar la programacion uso el PICKIT2 pero nose si soolo cargar la programacion puesto que kuando trabajaba con el 16f628A cambiaba la configuracion a 2154 para cargarle la programacion derepente conoces si ay que realizar algun cambio antes de cargarle la programacion?
 
ahh... asi es entoncs jajaja
i asta kuantas salidas digitales tengo con ese pic?
la verdad no he trabajo con este pic i nose como programarlo mui bn el programa q uso es microcode y para cargar la programacion uso el PICKIT2 pero nose si soolo cargar la programacion puesto que kuando trabajaba con el 16f628A cambiaba la configuracion a 2154 para cargarle la programacion derepente conoces si ay que realizar algun cambio antes de cargarle la programacion?


Hola Kriss

Este PIC tienen 40 pines, 4 de los cuales son de alimentacion, 2 mas para el oscilador y el resto los podes configurar como entradas o salidas digitales, el de master clear tambn solo que tienes que configurarlo en los fuses.

saludos
 
Hola a todos. Soy nuevo en el foro. He intentado no preguntar y aprender de los posts que la gente ha enviado anteriormente. Con ello (y otras cosas, claro) he conseguido hacer funcionar el ADC de mi pic16f690 ( Naguk10, esto te interesa), pero ahora me encuentro con un escollo que no soy capaz de superar.

El tema es el siguiente:

Tengo conectados dos potenciometros entre VDD y GND con los que puedo hacer variar la tensi'on en los pines correspondientes a AN2 y AN3 (RA2 y RA4, respectivamente). Soy capaz de leer la tensi'on de cada uno de ellos por separado y pasar la parte alta de ADRESH a los 4 bits de menor peso del puerto C (donde tengo sendos leds conectados).
Si leo solo un canal, todo va de lujo, los leds van mostrando la secuencia en biario del 0 al 16, lo cual es maravilloso jeje. Esto con cualquiera de los dos canales por separado.
Ahora bien, cuando quiero leer los dos canales de manera secuencial, solo me lee el segundo (o eso creo). En el codigo adjunto podeis ver lo que hago. El tema es que cuando quiero poner en los leds el resultado del primer canal muestreado, me sale siempre el segundo!! cuando los cambio de orden en el codigo, pasa lo mismo.

Ha quedado un poco descolocado, pero supongo que se puede ver igual. Lo del parpadeo es para controlar una resistencia mediante un optoacoplador y un triac mediante pulsos.
Los comentarios en ingles son de partes de codigo de micrichip.
Por favor, alguien puede ayudarme?



Oye segun yo solo tienes un registro en donde se guarda la conversion.... si quieres hacer esto guarda la primera onversion en una variable temporal..... el registro un donde se guarda la conversion se queda con la conversion del ultimo canal que se leyo.....
 
Última edición por un moderador:
Saludos amigos.
Tengo ya bastante tiempo trabajando para poder aprender a utilizar el conversor de este pic, decidí colocar un potenciometro en Rao para visualizar los valores en binario por medio de una lcd. He realizado esta rutina muchas veces siguiendo los pasos del datasheep y leyendo en varias paginas de interne, al momento de probar esta rutina en proteus 8 el valor del adc aparece como 00000, al momento de hacerlo en fisico el valor del adc se pone loco y aumenta y disminuye sin yo mover el potenciometro entre valores de 350 y 260, cuando quito el cable que me conecta el ra0 con el pin variable del potenciometro estos valores siguen apareciendo, creo que no deberia. no se si alguien me puede pasar un ejemplo para ver como hacen la conversion y guiarme.

anexo el diagrama y el codigo para ver si alguien me puede ayudar, he intentado de todo, ya no se que podra ser :confused:

agradezco a quien pueda ayudarme:apreton:



Código:
;******************************************************************************************************************************************
;             PRACTICA PARA EL ADC, UTILIZO UN POTENCIOMETRO EN RA0 Y EL VALOR EN BINARIO LO VISUALIZO EN LA LCD
;
;
;
;******************************************************************************************************************************************
      INCLUDE   <P16F877A.INC>
      LIST P=16F877A
        __CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF & _BOREN_ON & _LVP_OFF   

;REDIFINICION DE NOMBRE

#DEFINE  PUERTO_A	PORTA                         
#DEFINE  PUERTO_B  	PORTB
#DEFINE  PUERTO_C  	PORTC
#DEFINE	 LCD_RS	   	PORTC,7
#DEFINE	 LCD_RW	   	PORTC,6
#DEFINE	 LCD_E	   	PORTC,5
#DEFINE	 LCD_PUERTO	PORTB 



		        CBLOCK	H'20'             ;BLOQUE DE VARIABLES O REGISTROS 
			CONT1	
			CONT2
			CONT3
			

			BINARIO_B		
			BINARIO_A			
			DECENAMIL			
			UNIDADMIL		
			CENTENA			
			DECENA	
			UNIDAD	

                        ENDC


  		    	ORG	H'00'
			GOTO        	COMIENZO

			ORG     H'100'
COMIENZO	                CALL	PUERTO 		        ;LLAMDA A PUERTO. 
				CALL	CONFIG_LCD		;LLAMO A CONFIGURACION DE LCD
				CALL    RETARDO3		;ESPERA DE 3 SEGUNDOS
				CALL	VISUALIZAR_LCD		;VISUALIZO EN LA L1 "ING. MECATRONICA"
CICLO				CALL	CONFIG_ADC		;CONFIGURACION DE ADCON 0
				CALL	ADC			;CONFIGURO 
				CALL	VALOR_ADC
				GOTO	CICLO
				
							


 








 
			
								
;*****************************************************************************************************************************************
;          	BLOQUE DE RUTINAS 			BLOQUE DE RUTINAS
;*****************************************************************************************************************************************
PUERTO				BSF 	STATUS,RP0
               			BCF    	STATUS,RP1        
 				MOVLW  	B'111111'
				MOVWF	TRISA
	        		MOVLW  	B'00000000'
				MOVWF	TRISB
				MOVLW	B'00000000'
	          		MOVWF	TRISC
	        		MOVLW	B'00000000' 
	        		MOVWF	TRISD
	        		MOVLW	B'111' 
	        		MOVWF	TRISE
	        		CLRF    OPTION_REG
				NOP
				MOVLW  	B'10000000'  	          
				MOVWF 	ADCON1     	;1PARA ADRSH=2 Y ADRESL=8,0 OSCILADO/8,TODOS ANALOGICOS
 	        		BCF     PIE1,ADIE 	;DESABILITO LA INTERRUPCION DE CONVERSIOB
	        		BCF 	STATUS,RP0	;VUELVO AL BANCO 0
				MOVLW   B'00000000' 
	       			MOVWF   INTCON
	        		RETURN

;******************************************************************************************************************************************
;RUTINA PARA LA CONFIGURACION DE LAS OPERACIONES DE LA LCD

CONFIG_LCD			MOVLW	0X01		;EQUIVALENTE A BORRAR LA LCD
				CALL	CONTROL_LCD	;LLAMO LA HABILITACION DE CONTROL
				MOVLW	0X02		;EQUIVALENTE A RETORDAR EL CURSOR AL INICIO
				CALL	CONTROL_LCD	;LLAMO LA HABILITACION DE CONTROL
				MOVLW	0X06		;CONFIGURA EL MODO DE ENTRADA COMO EL INCREMENTO DEL CURSOR Y MODO NORMAL(AQUIPUEDOACTIVAR DESZPLAZAMIENTO)
				CALL	CONTROL_LCD	;LLAMO LA HABILITACION DE CONTROL
				MOVLW	0X0F		;COFIG DISPLAY CONTROL: DISPALY=ON,CURSOR=ON,PARPADEO DEL CURSOR=ON
				CALL	CONTROL_LCD	;LLAMO LA HABILITACION DE CONTROL
				MOVLW	0X38		;FUNCTION SET:BUS DE 8 BIT,LCD DE 2 LINEAS,CARACTER DE 5X7 PUNTOS
				CALL	CONTROL_LCD	;LLAMO LA HABILITACION DE CONTROL
				MOVLW	0X01		;EQUIVALENTE A BORRAR LA LCD
				CALL	CONTROL_LCD	;LLAMO LA HABILITACION DE CONTROL
				RETURN

;******************************************************************************************************************************************
;RUTINIA DE HABILATACION DE CONTROL Y DATOS PARA LA CONFIGURACION DEL LCD

CONTROL_LCD			MOVWF	LCD_PUERTO	;MUEVO EL VALOR DE W QUE POSEE EL CONTROL AL PUERTO PARA CONFIGURARLO
				BCF	LCD_RW		;COLOCO RW=0 PARA ACTIVAR LA ESCRITURA
				BCF	LCD_RS		;COLOCO RS=0 PARA ACTIVAR EL CONTROL
SALTOX				BSF	LCD_E		;COLOCO	E=0 PARA DAR EL PULSO
				NOP
				NOP			
				BCF	LCD_E		;PARA DAR POR TERMINADO EL PULSO
				BCF	LCD_RW		;PARA LIMPIARLO
				BCF	LCD_RS		;PARA LIMPIARLO
				GOTO	RETARDO1	;VOY AL RETARDO DE 5m SEGUNDOS PARA LA ESPERA DE LA LCD 
DATO_LCD			MOVWF	LCD_PUERTO	;MUEVO EL VALOR DE W QUE POSEE EL DATO A VISUALIZAR EN LA LCD
				BCF	LCD_RW		;COLOCO RW=0 PARA LA ESCRITURA
				BSF	LCD_RS		;COLOCO	RS=1 PARA ACTIVAR EL MODO DE DATOS
				GOTO	SALTOX		;ME VOY A SALTOX PARA DAR EL PULSO DE ACTIVACION Y LIMPIAR LOS REGISTROS

;******************************************************************************************************************************************
VISUALIZAR_LCD			CALL	BORRAR_LCD	;BORRO LA LCD POR SI TENGO ALGO EN ELLA
				MOVLW	'I'		;SEGMENTO 1 LINEA 1
				CALL	DATO_LCD	;LLAMO LA HABILITACION DE DATOS	
				MOVLW	'N'		;SEGMENTO 2 LINEA 1
				CALL	DATO_LCD	;LLAMO LA HABILITACION DE DATOS	
				MOVLW	'G'		;SEGMENTO 3 LINEA 1
				CALL	DATO_LCD	;LLAMO LA HABILITACION DE DATOS	
				MOVLW	'.'		;SEGMENTO 4 LINEA 1
				CALL	DATO_LCD	;LLAMO LA HABILITACION DE DATOS
				MOVLW	' '		;SEGMENTO 5 LINEA 1
				CALL	DATO_LCD	;LLAMO LA HABILITACION DE DATOS
				MOVLW	'M'		;SEGMENTO 6 LINEA 1
				CALL	DATO_LCD	;LLAMO LA HABILITACION DE DATOS
				MOVLW	'E'		;SEGMENTO 7 LINEA 1
				CALL	DATO_LCD	;LLAMO LA HABILITACION DE DATOS
				MOVLW	'C'		;SEGMENTO 8 LINEA 1
				CALL	DATO_LCD	;LLAMO LA HABILITACION DE DATOS
				MOVLW	'A'		;SEGMENTO 9 LINEA 1
				CALL	DATO_LCD	;LLAMO LA HABILITACION DE DATOS
				MOVLW	'T'		;SEGMENTO 10 LINEA 1
				CALL	DATO_LCD	;LLAMO LA HABILITACION DE DATOS
				MOVLW	'R'		;SEGMENTO 11 LINEA 1
				CALL	DATO_LCD	;LLAMO LA HABILITACION DE DATOS
				MOVLW	'O'		;SEGMENTO 12 LINEA 1
				CALL	DATO_LCD	;LLAMO LA HABILITACION DE DATOS
				MOVLW	'N'		;SEGMENTO 13 LINEA 1
				CALL	DATO_LCD	;LLAMO LA HABILITACION DE DATOS
				MOVLW	'I'		;SEGMENTO 14 LINEA 1
				CALL	DATO_LCD	;LLAMO LA HABILITACION DE DATOS
				MOVLW	'C'		;SEGMENTO 15 LINEA 1
				CALL	DATO_LCD	;LLAMO LA HABILITACION DE DATOS
				MOVLW	'A'		;SEGMENTO 16 LINEA 1
				CALL	DATO_LCD	;LLAMO LA HABILITACION DE DATOS
			
				MOVLW	0XC0		;LO UTILIZO PARA MOVERME A LA LINEA 2
				CALL	CONTROL_LCD	;HABILITACION DE CONTROL
				MOVLW	'A'		;SEGMENTO 1 LINEA 2
				CALL	DATO_LCD	;LLAMO LA HABILITACION DE DATOS	
				MOVLW	'D'		;SEGMENTO 2 LINEA 2
				CALL	DATO_LCD	;LLAMO LA HABILITACION DE DATOS	
				MOVLW	'C'		;SEGMENTO 3 LINEA 2
				CALL	DATO_LCD	;LLAMO LA HABILITACION DE DATOS	
				MOVLW	'='		;SEGMENTO 4 LINEA 2
				CALL	DATO_LCD	;LLAMO LA HABILITACION DE DATOS
				MOVLW	' '		;SEGMENTO 5 LINEA 2
				CALL	DATO_LCD	;LLAMO LA HABILITAION DE DATOS
				RETURN

;******************************************************************************************************************************************
;RUTINA PARA BORRAR LA LCD
BORRAR_LCD			MOVLW	0X01		;EQUIVALENTE AL CONTROL BORRAR LCD
				GOTO	CONTROL_LCD	;LLAMO LA HABILITACION DE CONTROL	
;******************************************************************************************************************************************
;RUTINA PARA REGRESAR EL CURSOR AL INICIO
REGRESAR_LCD			MOVLW	0X02		;EQUIVALENTE A RETORDAR EL CURSOR AL INICIO
				GOTO	CONTROL_LCD	;LLAMO LA HABILITACION DE CONTROL
;******************************************************************************************************************************************
CONFIG_ADC			MOVWF	B'01000001'
				MOVWF	ADCON0		;CONFIGURO OSCILADO/8,CANAL 0, GO, ENCIENDO
				GOTO	RETARDO5	;ESPERA EL TIEMPO DE ADQUISICION 25uS
				
;******************************************************************************************************************************************
ADC				BSF	ADCON0,GO	;INICIA EL PROCESO
				CALL	RETARDO5	;ESPERA DE ADQUISICION
REPETIR				BTFSC	ADCON0,2	;CHEQUEO SI LA CONVERSION TERMINO
				GOTO	REPETIR
				MOVFW	ADRESH		;MUEVO LOS 2 BITS MAS SIGNIFICATIVOS A W
				MOVWF	BINARIO_B	;CARGO LOS 2 BITS MAS SIGNIFICATVIOS A 	BINARIO_B
				BANKSEL	ADRESL		;ME MUEVO AL BANCO 1 DONDE ESTA EL ADRESL
				MOVFW	ADRESL		;CARGO EN W EL VALOR DE ADRESL
				BANKSEL	BINARIO_A	;ME MUEVO AL BANCO 0 DONDE ESTA BINARIO_A
				MOVWF	BINARIO_A	;CARGO EL BINARIO_A CON EL VALOR DE 2 QUE VIENE DEL ADRESL
				GOTO	BIN_BCD		;VOY A LA SUBRUTINA BIN_BCD, YA QUE TENGO LOS VALORES DELCONVERTIDOR
				
;****************************************************************************************************************************************
BIN_BCD 			SWAPF 	BINARIO_B,W
				ANDLW 	0X0F
				ADDLW 	0XF0
				MOVWF 	UNIDADMIL
				ADDWF 	UNIDADMIL,F
				ADDLW 	0XE2
				MOVWF 	CENTENA
				ADDLW 	0X32
				MOVWF 	UNIDAD
				MOVF 	BINARIO_B,W
				ANDLW 	0X0F
				ADDWF 	CENTENA,F
				ADDWF 	CENTENA,F
				ADDWF 	UNIDAD,F
				ADDLW 	0XE9
				MOVWF 	DECENA
				ADDWF 	DECENA,F
				ADDWF 	DECENA,F
				SWAPF 	BINARIO_A,W
				ANDLW 	0X0F
				ADDWF 	DECENA,F
				ADDWF 	UNIDAD,F
				RLF 	DECENA,F
				RLF 	UNIDAD,F
				COMF 	UNIDAD,F
				RLF 	UNIDAD,F
				MOVF 	BINARIO_A,W
				ANDLW 	0X0F
				ADDWF 	UNIDAD,F
				RLF 	UNIDADMIL,F
				MOVLW 	0X07
				MOVWF 	DECENAMIL
				MOVLW 	0X0A
LB1				ADDWF 	UNIDAD,F
				DECF 	DECENA,F
				BTFSS	STATUS,C
				GOTO 	LB1
LB2				ADDWF 	DECENA,F
				DECF 	CENTENA,F
				BTFSS 	STATUS,C
				GOTO 	LB2
LB3				ADDWF 	CENTENA,F
				DECF 	UNIDADMIL,F
				BTFSS 	STATUS,C
				GOTO 	LB3
LB4				ADDWF 	UNIDADMIL,F
				DECF 	DECENAMIL,F
				BTFSS 	STATUS,C
				GOTO 	LB4
				RETURN

;****************************************************************************************************************************************
VALOR_ADC			MOVLW	0X30
				ADDWF   DECENAMIL,W
				CALL	DATO_LCD
				MOVLW	0X30
				ADDWF   UNIDADMIL,W
				CALL	DATO_LCD
				MOVLW	0X30
				ADDWF   CENTENA,W
				CALL	DATO_LCD
				MOVLW	0X30
				ADDWF   DECENA,W
				CALL	DATO_LCD
				MOVLW	0X30
				ADDWF   UNIDAD,W
				CALL	DATO_LCD
				MOVLW	0X0C		;COFIG DISPLAY CONTROL: DISPALY=ON,CURSOR=OFF,PARPADEO DEL CURSOR=OFF
				CALL	CONTROL_LCD
				MOVLW	B'11000101'	;POSICIONO EL CURSOR EN LA SEGUNDA FILA POSICION 5 
				GOTO	CONTROL_LCD
;******************************************************************************************************************************************
RETARDO1		   	MOVLW 	.41		;RETARDO DE 5MILISEGUNDOS
				MOVWF 	CONT1
				MOVlW	.41
				MOVWF	CONT2
DEMORA1				DECFSZ 	CONT1,F 
				GOTO 	DEMORA1	
				DECFSZ 	CONT2,F
				GOTO	DEMORA1
				RETURN
;****************************************************************************************************************************************
RETARDO2		  	MOVLW 	.183		;RETARDO DE 1 SEGUNDOS
				MOVWF 	CONT1
				MOVlW	.183
				MOVWF	CONT2
				MOVLW 	.11
				MOVWF 	CONT3
DEMORA2				DECFSZ 	CONT1,F 
				GOTO 	DEMORA2	
				DECFSZ 	CONT2,F
				GOTO	DEMORA2
				DECFSZ 	CONT3,F
				GOTO	DEMORA2
				RETURN
;****************************************************************************************************************************************
RETARDO3		   	CLRF	CONT1		;RETARDO DE 3 SEGUNDOS PARA MOSTRAR EL NUMERO
				CLRF	CONT2
				MOVLW 	.16
				MOVWF 	CONT3
DEMORA3				DECFSZ 	CONT1,F 
				GOTO 	DEMORA3	
				DECFSZ 	CONT2,F
				GOTO	DEMORA3
				DECFSZ 	CONT3,F
				GOTO	DEMORA3
				RETURN
;****************************************************************************************************************************************
RETARDO4			MOVLW 	.18		;RETARDO DE 1MILISEGUNDOS
				MOVWF 	CONT1
				MOVlW	.18
				MOVWF	CONT2
DEMORA4				DECFSZ 	CONT1,F 
				GOTO 	DEMORA4	
				DECFSZ 	CONT2,F
				GOTO	DEMORA4
				RETURN
;****************************************************************************************************************************************
RETARDO5			MOVLW 	.8		;RETARDO DE 25u SEGUNDOS
				MOVWF 	CONT1
DEMORA5				DECFSZ 	CONT1,F 
				GOTO 	DEMORA5	
				RETURN
;****************************************************************************************************************************************
 END
 
Atrás
Arriba