Comunidad de discusión sobre Automatización, Electrónica industrial, Microcontroladores y electrónica digital, Robótica, Domótica, Telemática, Tecnologías móviles, y muchos temas más.
Problema con el convertidor analogo digital pic 16f877
 | #1 Problema con el convertidor analogo digital pic 16f877 |  |
|
ablanco
| Ubicación: Mexico |
| Registrado: 11 Abr 2008 |
| Mensajes: 9 |
|
 |
| Publicado: Sab May 03, 2008 2:06 pm |
|
|
 |
 |
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.
- Código: Seleccionar todo
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
| Ubicación: Argentina |
| Registrado: 19 Ago 2006 |
| Mensajes: 445 |
|
 |
| Publicado: Dom May 04, 2008 10:51 am |
|
|
 |
 |
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:
- Código: Seleccionar todo
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
| Ubicación: Santiago, Chile |
| Registrado: 23 Jun 2008 |
| Mensajes: 2 |
|
 |
| Publicado: Lun Jun 23, 2008 1:21 am |
|
|
 |
 |
Hola, lograste resolver el problema q tenias? q estoy realizando un programa similar y tengo una duda
|
|
|
|
ablanco
| Ubicación: Mexico |
| Registrado: 11 Abr 2008 |
| Mensajes: 9 |
|
 |
| Publicado: Lun Jun 23, 2008 10:44 am |
|
|
 |
 |
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
| Ubicación: Santiago, Chile |
| Registrado: 23 Jun 2008 |
| Mensajes: 2 |
|
 |
| Publicado: Lun Jun 23, 2008 12:17 pm |
|
|
 |
 |
yaa, te lo agradeceria
Saludos
|
|
|
 | #6 Perdon la tardanza |  |
|
ablanco
| Ubicación: Mexico |
| Registrado: 11 Abr 2008 |
| Mensajes: 9 |
|
 |
| Publicado: Mie Jun 25, 2008 11:30 am |
|
|
 |
 |
hola, perdon la tardanza, aqui esta ya listo para que funcione, igual esta todo especificado, si tienes alguna duda no dudes en decirmela.
|
|
|
 | #7 Re: Perdon la tardanza |  |
|
jp007
|
| Registrado: 14 Sep 2008 |
| Mensajes: 1 |
|
 |
| Publicado: Dom Sep 14, 2008 4:41 pm |
|
|
 |
 |
ablanco escribió:
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
|
|
|
 | Foros de Electronica |  |
|
 |