# Problema con el convertidor analogo digital pic 16f877



## ablanco (May 3, 2008)

hola a todos, tengo un pequeño problema, e estado trabajando con el pic16f877 y con su convertidor analogo digital, hice un programa para chekar deacuerdo a una cierta cantidad de voltaje, mostrar ese voltaje en un display de 7 segmentos. Trabajando con el bit carry ya me salio y trabaja sin broncas, pero lo intente hacer con el bit z, y aun no entiendo por que no me sale!, ya lo revise y no tiene errores, pero no funciona, no entiendo en que estoy mal, les dejo el programa gracias de antemano por el tiempo.


```
list	p=16f877
			include	<p16f877.inc>
			__CONFIG  	_WDT_OFF & _CP_OFF & _CPD_OFF & _LVP_OFF & _XT_OSC
			cblock	0x20
			regl
			v0
			v1
			v2
			v3
			v4
			v5
			vg
			endc
			org		0x00
			
			bcf		STATUS,RP1
			bsf		STATUS,RP0
			movlw	b'00000000'
			movwf	TRISD
			movwf	TRISC
			movlw	b'11111111'
			movwf	TRISB
			movlw	b'00000000'	;se configuran los puertos de entrada analogos, en este ;caso todos, ADEMAS
			movwf	ADCON1		; SE CONFIGURA EL FORMATO DE CONVERSION OSEA LO DEL ADRESH, Y ADRESL, EN ESTE CASO TODO SERA LEIDO EN EL ADRESH
			bcf		STATUS,RP0	; ME REGRESO AL BANCO 1
			movlw	b'01000001'	;SE SELECCIONA LA FRECUENCIA Y EL CANAL PARA LEER LA ENTRADA ANALOGA DIGITAL
			movwf	ADCON0
			movlw	d'0'
			movwf	regl
			movwf	vg	;VARIABLE GENERAL QUE HARA SE INCREMENTARA PARA COMPARARSE CON LAS OTRAS VARIABLES
			movwf	v0
			movlw	d'50'
			movwf	v1
			movlw	d'100'
			movwf	v2	
			movlw	d'150';PONGO CADA VARIABLE CON SU CORRESPONDIENTE VALOR, PARA CADA VOLTAJE
			movwf	v3
			movlw	d'200'
			movwf	v4
			movlw	d'250'
			movwf	v5
			clrf	PORTC
			clrf	PORTD
		
			

iniciob		bsf		ADCON0,2	;INICIO LA LECTURA DEL CONVERTIDOR
espera		btfss	ADCON0,2
			goto	espera
			goto	mover

mover		movfw	ADRESH	;MUEVE EL VALOR DEL ADRESH HACIA LA V1
			movwf	regl
			call	chek1
			call	chek2
			call	chek3
			call	chek4
			call	chek5
			goto	iniciob

chek1		incf	vg,f 	;AQUI HAGO EL INCREMENTO DE LA VARIABLE GENERAL, PARA ASI AUMENTAR ESTA VARIABLE HASTA 50,, Y ME HAGA EL PROGRAMA
			movfw	vg	 	;50 COMPARACIONES PARA 1 VOLT
			subwf	v1,w 	;EL RESULTADO DE LA RESTA SE GUARDA EN W
			btfss	STATUS,Z	; SI EL RESULTADO DE LA RESTA ES IGUAL A 0, TONS EL BIT Z SE PONE EN 1, POR LO TANTO EL CICLO SE HIZO 50 VECES Y YA SE REVISO EL CONVERSOR ANALOGO DIGITAL LAS 50 PRIMERAS VECES
			goto	n1		;AQUI SE VA A ESTA ETIQUETA PARA COMPARAR SI ES REALMENTE 1 VOLT
			return			;cuando se haga 50 veces tons se va a regresar a la etiqueta de "mover"

n1			movfw	vg			;AQUI SE MUEVE LA VARIABLE vg QUE TIENE EL NUMERO DEL 1 AL 50
			subwf	regl,w		;SE RESTA ESTA VARIABLE DEL REGISTRO DEL ADRESL
			btfss	STATUS,Z	;SI Z ES IGUAL A 0 (QUE LA RESTA DA UN NUMERO DIFERENTE, OSEA LAS DOS VARIABLES NO SON IGUALES) SE VA A INCREMENTAR LA VARIABLE Y A COMPARAR
			goto	chek1		
			movlw	b'00000110'	;SI NO SACA EL NUMERO DEL VOLTAJE QUE LE CORRESPONDE.
			movwf	PORTC
			movwf	PORTD
			goto	chek1

chek2		incf	vg,f 	;AQUI HAGO EL INCREMENTO DE LA VARIABLE GENERAL, PARA ASI AUMENTAR ESTA VARIABLE HASTA 50,, Y ME HAGA EL PROGRAMA
			movfw	vg	 	;50 COMPARACIONES PARA 2 VOLT
			subwf	v2,w 	;EL RESULTADO DE LA RESTA SE GUARDA EN W
			btfss	STATUS,Z	; SI EL RESULTADO DE LA RESTA ES IGUAL A 0, TONS EL BIT Z SE PONE EN 1, POR LO TANTO EL CICLO SE HIZO 50 VECES Y YA SE REVISO EL CONVERSOR ANALOGO DIGITAL LAS 50 PRIMERAS VECES
			goto	n1		;AQUI SE VA A ESTA ETIQUETA PARA COMPARAR SI ES REALMENTE 1 VOLT
			return	

n2			movfw	vg			;AQUI SE MUEVE LA VARIABLE vg QUE TIENE EL NUMERO DEL 1 AL 50
			subwf	regl,w		;SE RESTA ESTA VARIABLE DEL REGISTRO DEL ADRESL
			btfss	STATUS,Z	;SI Z ES IGUAL A 0 (QUE LA RESTA DA UN NUMERO DIFERENTE, OSEA LAS DOS VARIABLES NO SON IGUALES) SE VA A INCREMENTAR LA VARIABLE Y A COMPARAR
			goto	chek2		
			movlw	b'01011011'	;SI NO SACA EL NUMERO DEL VOLTAJE QUE LE CORRESPONDE.
			movwf	PORTC
			movwf	PORTD
			goto	chek2


chek3		incf	vg,f 	;AQUI HAGO EL INCREMENTO DE LA VARIABLE GENERAL, PARA ASI AUMENTAR ESTA VARIABLE HASTA 50,, Y ME HAGA EL PROGRAMA
			movfw	vg	 	;50 COMPARACIONES PARA 2 VOLT
			subwf	v3,w 	;EL RESULTADO DE LA RESTA SE GUARDA EN W
			btfss	STATUS,Z	; SI EL RESULTADO DE LA RESTA ES IGUAL A 0, TONS EL BIT Z SE PONE EN 1, POR LO TANTO EL CICLO SE HIZO 50 VECES Y YA SE REVISO EL CONVERSOR ANALOGO DIGITAL LAS 50 PRIMERAS VECES
			goto	n1		;AQUI SE VA A ESTA ETIQUETA PARA COMPARAR SI ES REALMENTE 1 VOLT
			return	

n3			movfw	vg			;AQUI SE MUEVE LA VARIABLE vg QUE TIENE EL NUMERO DEL 1 AL 50
			subwf	regl,w		;SE RESTA ESTA VARIABLE DEL REGISTRO DEL ADRESL
			btfss	STATUS,Z	;SI Z ES IGUAL A 0 (QUE LA RESTA DA UN NUMERO DIFERENTE, OSEA LAS DOS VARIABLES NO SON IGUALES) SE VA A INCREMENTAR LA VARIABLE Y A COMPARAR
			goto	chek3		
			movlw	b'01011011'	;SI NO SACA EL NUMERO DEL VOLTAJE QUE LE CORRESPONDE.
			movwf	PORTC
			movwf	PORTD
			goto	chek3

chek4		incf	vg,f 	;AQUI HAGO EL INCREMENTO DE LA VARIABLE GENERAL, PARA ASI AUMENTAR ESTA VARIABLE HASTA 50,, Y ME HAGA EL PROGRAMA
			movfw	vg	 	;50 COMPARACIONES PARA 2 VOLT
			subwf	v4,w 	;EL RESULTADO DE LA RESTA SE GUARDA EN W
			btfss	STATUS,Z	; SI EL RESULTADO DE LA RESTA ES IGUAL A 0, TONS EL BIT Z SE PONE EN 1, POR LO TANTO EL CICLO SE HIZO 50 VECES Y YA SE REVISO EL CONVERSOR ANALOGO DIGITAL LAS 50 PRIMERAS VECES
			goto	n1		;AQUI SE VA A ESTA ETIQUETA PARA COMPARAR SI ES REALMENTE 1 VOLT
			return	

n4			movfw	vg			;AQUI SE MUEVE LA VARIABLE vg QUE TIENE EL NUMERO DEL 1 AL 50
			subwf	regl,w		;SE RESTA ESTA VARIABLE DEL REGISTRO DEL ADRESL
			btfss	STATUS,Z	;SI Z ES IGUAL A 0 (QUE LA RESTA DA UN NUMERO DIFERENTE, OSEA LAS DOS VARIABLES NO SON IGUALES) SE VA A INCREMENTAR LA VARIABLE Y A COMPARAR
			goto	chek4		
			movlw	b'01100110'	;SI NO SACA EL NUMERO DEL VOLTAJE QUE LE CORRESPONDE.
			movwf	PORTC
			movwf	PORTD
			goto	chek4			

chek5		incf	vg,f 	;AQUI HAGO EL INCREMENTO DE LA VARIABLE GENERAL, PARA ASI AUMENTAR ESTA VARIABLE HASTA 50,, Y ME HAGA EL PROGRAMA
			movfw	vg 	;50 COMPARACIONES PARA 2 VOLT
			subwf	v5,w 	;EL RESULTADO DE LA RESTA SE GUARDA EN W
			btfss	STATUS,Z	; SI EL RESULTADO DE LA RESTA ES IGUAL A 0, TONS EL BIT Z SE PONE EN 1, POR LO TANTO EL CICLO SE HIZO 50 VECES Y YA SE REVISO EL CONVERSOR ANALOGO DIGITAL LAS 50 PRIMERAS VECES
			goto	n1		;AQUI SE VA A ESTA ETIQUETA PARA COMPARAR SI ES REALMENTE 1 VOLT
			return	

n5			movfw	vg			;AQUI SE MUEVE LA VARIABLE vg QUE TIENE EL NUMERO DEL 1 AL 50
			subwf	regl,w		;SE RESTA ESTA VARIABLE DEL REGISTRO DEL ADRESL
			btfss	STATUS,Z	;SI Z ES IGUAL A 0 (QUE LA RESTA DA UN NUMERO DIFERENTE, OSEA LAS DOS VARIABLES NO SON IGUALES) SE VA A INCREMENTAR LA VARIABLE Y A COMPARAR
			goto	chek5		
			movlw	b'01101101'	;SI NO SACA EL NUMERO DEL VOLTAJE QUE LE CORRESPONDE.
			movwf	PORTC
			movwf	PORTD
			goto	chek5

			end
```


----------



## Ardogan (May 4, 2008)

Uffffff, que largo el código, por suerte en el .asm está más claro, si querés respetar el espaciado en el mensaje podés usar el botón lista o código que está en la barra donde está negrita/cursiva/etc al redactar el mensaje.

Mirá no lo ví todo completo, pero según veo la idea es chequear si el valor que obtenes del conversor analógico digital está en un rango de valores o en otro.
Para eso me inclinaría absolutamente por usar las instrucciones de comparación mayor/menor:  cpfsgt, cpfslt, cpfseq, algo como:


```
movlw 50;
cpfsgt ADRESH;
goto EsMenorOIguala50
movlw ElOtroValorLimite;
cpfsgt ADRESH;
goto EsMayora50yMenorAElOtroValorLimite;
cpfsgt .....
```

y así sucesivamente. En vez de 50 podés usar v0, v1, etc; lo de arriba es para expresar una idea, no pretendo dar algo hecho.

Bueno, eso era lo que quería decir, en realidad no contesté tu pregunta de porque no anda lo que hiciste, sino que quería que consideraras esta forma de hacerlo, más corta y rápida (y por ende con menos código y menos posibilidad de error).
Saludos


----------



## NachoB (Jun 23, 2008)

Hola, lograste resolver el problema q tenias? q estoy realizando un programa similar y tengo una duda


----------



## ablanco (Jun 23, 2008)

hola, logre resolver el problema, pero cambie el codigo, lo hice diferente, ahora utilizando el bit C (carry), si lo quieres ver dimelo y con gusto te lo facilitare.


----------



## NachoB (Jun 23, 2008)

yaa, te lo agradeceria
Saludos


----------



## ablanco (Jun 25, 2008)

hola, perdon la tardanza, aqui esta ya listo para que funcione, igual esta todo especificado, si tienes alguna duda no dudes en decirmela.


----------



## jp007 (Sep 14, 2008)

ablanco dijo:
			
		

> hola, perdon la tardanza, aqui esta ya listo para que funcione, igual esta todo especificado, si tienes alguna duda no dudes en decirmela.



buenas ablanco, como esta, espero que muy bien

Lo que pasa es que estoy realizando una conversion analogo digital, y pues ya tengo su codigo, pero la verdad no lo he podido implementar.
Usted seria tan amable de colaborarme con un esquema del montaje, estoy trabajando en el proteus por si lo tiene en esa herramienta. Le agradeceria mucho su ayuda

Gracias


----------



## SUPER_HERRERA (Ago 16, 2009)

Saludos ablanco, yo tengo una duda sobre tu código "convertidor analogo-digitalarmin PROBADO"; en una de tus líneas , justo después de la etiqueta "salida" pones la instrucción movfw, pero creo que ese nemónico no existe, ¿o sí?, me podrías explicar por que pusiste movfw o acaso quisiste poner movwf, y si es así,¿ por que el mplab lo marca en azul fuerte como si fuera un nemónico?

De antemano gracias.


----------

