Foros de Electrónica

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
citar
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



Este mensaje contiene archivos adjuntos, para verlos debes estar registrado.

#2  
Ardogan
Ubicación: Argentina
Registrado: 19 Ago 2006
Mensajes: 445
citar
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

#3  
NachoB
Ubicación: Santiago, Chile
Registrado: 23 Jun 2008
Mensajes: 2
citar
Hola, lograste resolver el problema q tenias? q estoy realizando un programa similar y tengo una duda

#4  
ablanco
Ubicación: Mexico
Registrado: 11 Abr 2008
Mensajes: 9
citar
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.

#5  
NachoB
Ubicación: Santiago, Chile
Registrado: 23 Jun 2008
Mensajes: 2
citar
yaa, te lo agradeceria
Saludos

#6  Perdon la tardanza
ablanco
Ubicación: Mexico
Registrado: 11 Abr 2008
Mensajes: 9
citar
hola, perdon la tardanza, aqui esta ya listo para que funcione, igual esta todo especificado, si tienes alguna duda no dudes en decirmela.



Este mensaje contiene archivos adjuntos, para verlos debes estar registrado.

#7  Re: Perdon la tardanza
jp007
Registrado: 14 Sep 2008
Mensajes: 1
citar
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

 Responder





 Otros temas de interés 
No hay mensajes nuevos Detectar cambio de estado (VB)
No hay mensajes nuevos Estado inicial de 555
No hay mensajes nuevos Aumentar potencia en bobina tesla de estado solido
No hay mensajes nuevos amplificador para electromiografo
No hay mensajes nuevos Diseño de un relé de estado solido DC

Foros de Electronica
|| Cuestiones Elementales de Electrónica || Fuentes de alimentacion || Circuitos de radio || Diseño de circuitos en general ||
|| Sistemas de Audio: Preamplificadores, Ecualizadores || Amplificadores || Reparación || Discusión ||
|| Microcontroladores y sistemas embebidos || Circuitos logicos combinacionales y secuenciales || Interfaces y Programacion || Dudas en general || Sistemas de Video || PC Hardware || Telematica y comunicaciones || Tecnologias moviles || Software Electronico || Robotica, Domotica y Mecatronica || Autotrónica || Automatizacion, Electronica industrial y de Potencia || Documentacion, circuitos y esquemas || Donde Las Ideas Convergen... || Tutoriales y Manuales || Proyectos Prácticos ||