Autor Tema: srf05  (Leído 8028 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado jo.an.

  • PIC16
  • ***
  • Mensajes: 120
srf05
« en: 05 de Mayo de 2010, 17:39:26 »
Saludos a todos:Estoy con un srf05 modulo ultrasonido,lo estoy trabajando para que cuente mm con 16f84.El programa hace un bucle hasta que se pone a 0 la entrada ra4,va cargando en reg1,dig1,dig2 y dig3.El problema es que cuando incrementa en reg1,el tiempo de la onda recibida por el srf05 es muy corta como para decirme en mm la distancia(aproximadamente la mitad)¿como ampliaria la longitud de onda al srf05 o como arreglaria este programa para que sirviese?att jose


empe    bsf     0x05,3
        movlw  .22
        movwf   reg
des     decfsz  reg,1      ;manda el pulso
        goto    des           ;salida pulso por ra3
        bcf     0x05,3
;--------------------------------------------------------------------
aqui    btfss   0x05,4   ;entrada ra4
        goto    aqui     ;espera a que se ponga en 1 la entrada
;-----------------------------------------------------------------------       
tre     incf    reg1,0
        movwf   reg1
        xorlw   .1         ;incrementa en reg1
        btfss   3,2
        goto    va
        clrf    reg1
        incf    dig1,0       ;cuando llega a 1 incrementa en unidades
        movwf   dig1
        xorlw   .10
        btfss   3,2
        goto    va
        clrf    dig1
        incf    dig2,0      ;cuando es 10 incrementa en decenas
        movwf   dig2
        xorlw   .10
        btfss   3,2
        goto    va
        clrf    dig2
        incf    dig3,0        ;cuando es 10 incrementa en centenas
        movwf   dig3
va      btfsc   0x05,4       ;si pulso  es alto
        goto    tre          ;sigue incrementando dig1

         call    tabla
         clrf   reg1
         clrf   dig1
         clrf   dig2
         clrf   dig3   
        goto    empe     ;vuelve y empieza

Desconectado Javicho

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 570
Re: srf05
« Respuesta #1 en: 19 de Mayo de 2010, 05:49:37 »
Puedes cambiar a un valor mayor el cristal del pic.

Tambien puedes configurar el Timer0 para que se incrementa con cada ciclo de reloj, si usas cristal de 4Mhz el Timer0 puede incrementarse de 1uS en 1uS y habilitas la interrupción por desborde del Timer0 entonces cuando se produzca la interrupción sabras que han pasado 256uS mas, en este instante incrementas en 1 un contador ubicado en el RSI por cada desborde, luego en tu programa principal solo esperas que cambie de estado la linea que viene del sensor en cuyo caso detienes la interrupción y lees el ultimo valor del timer0.

El tiempo final medido será (en uS): contador x 256uS + (ultimo valor del timer0)

Puedes cambiar el prescaler si deseas que el Timer0 incremento de 2 en 2 o de 4 en 4, depende de ti.

Javicho.

Desconectado jo.an.

  • PIC16
  • ***
  • Mensajes: 120
Re: srf05
« Respuesta #2 en: 19 de Mayo de 2010, 18:18:00 »
Gracias javincho:Mas o menos le pude solucionar lo de la distancia,pero la lectura no es estable,si lo dejas en un sitio fijo( ejem 240 )varia entre 240 y 260 aproximadamente.¿que me falta?.att jose

Desconectado Javicho

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 570
Re: srf05
« Respuesta #3 en: 20 de Mayo de 2010, 01:37:37 »
Yo creo que te falta precisión en la lectura, si quieres ser mas exacto seria mejor que uses por lo menos un pic16F628A con un XT=20Mhz y una buena estrategia de programación a fin de que leas de forma mas exacta el pulso enviado por el sensor.

Javicho.

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: srf05
« Respuesta #4 en: 21 de Mayo de 2010, 15:43:31 »
http://www.msebilbao.com/notas/downloads/Medidor%20Ultrasonico%20SRF05.pdf

Esta pagina es sobre el SRF05, es posible que ya la hayas visto, pero por si acaso.
El 16f84A puede trabajar a 20Mh, es de las pocas cosas que sabe hacer igual que el resto de los 16f modernos, en lo que dice Javicho del TIMER se le escapo un detalle importante, y es que el TIMER cuenta de 2 en 2 en la escala mas baja del preescaler, es decir el resultado lo tienes que dividir entre 2, esto lo haces facil haciendo una "rrf" que es lo mismo que dividir entre 2.
Pon el programa entero y lo pasamos por el MPLAB, si quieres. Deberias llamarle a los registros por su nombre, asi como lo tienes es muy dificil de entender, ya que hay que estar mirando el datasheet continuamente.
Haces una cosa sin mucha logica:

 incf    dig1,0       ;cuando llega a 1 incrementa en unidades
        movwf   dig1

si haces esto es lo mismo

 incf    dig1,1

Saludos


Desconectado jo.an.

  • PIC16
  • ***
  • Mensajes: 120
Re: srf05
« Respuesta #5 en: 21 de Mayo de 2010, 22:21:53 »
Saludos tapi8:Agradezco tu ayuda.Aunque no te lo creas:

                    incf     dig1,0
                    movwf dig1        ;funciona pero varian mucho los valores

                    incf     dig1,1      ;se queda en 000

Tampoco se por que,tampoco se por que es tan inestable.No uso el timer,simplemente incremento en los registros hasta que el pulso recibido se ponga a cero,luego salta a la tabla para visualizarlo.Lo mando completo(creo que te liaras mas).Posiblemente la tabla se pueda hacer de otra forma mas  sencilla,pero es una que hice hace años y solo copiar y pegar(me volvi comodo):att jose

Desconectado jo.an.

  • PIC16
  • ***
  • Mensajes: 120
Re: srf05
« Respuesta #6 en: 21 de Mayo de 2010, 22:28:55 »
Saludos tapi8:Agradezco tu ayuda.Aunque no te lo creas:

                    incf     dig1,0
                    movwf dig1        ;funciona pero varian mucho los valores

                    incf     dig1,1      ;se queda en 000

Tampoco se por que,tampoco se por que es tan inestable.No uso el timer,simplemente incremento en los registros hasta que el pulso recibido se ponga a cero,luego salta a la tabla para visualizarlo.Lo mando completo(creo que te liaras mas).Posiblemente la tabla se pueda hacer de otra forma mas  sencilla,pero es una que hice hace años y solo copiar y pegar(me volvi comodo):att jose

        list   p=16f84
reg1    equ     20
reg2    equ     21
dig1    equ     22
dig2    equ     23
dig3    equ     24;

reset   org     00
        goto    inicio
        org     05             

inicio  bsf     3,5
        movlw   b'10000'
        movwf   0x05           ;cofiguracion de puertos
        movlw   b'00000000'
        movwf   0x06
        bcf     3,5
        clrf    0x05
        clrf    0x06
        clrf    reg1
        clrf    reg2
        clrf    dig1
        clrf    dig2
        clrf    dig3

         movlw   .255
         movwf   reg1
fv7     movlw   .255          ;retardo de inicio
         movwf   reg2
fv1     decfsz  reg2,1
         goto    fv1
         decfsz  reg1,1
         goto    fv7

empe  bsf     0x05,3
         movlw   .100
         movwf   reg1
des    decfsz  reg1,1      ;manda el pulso salida de eco
         goto    des
         bcf     0x05,3
;--------------------------------------------------------------------
aqui    btfss   0x05,4
          goto    aqui     ;espera a que se ponga en 1 la entrada eco
;-----------------------------------------------------------------------       
tre     incf     dig1,1
         xorlw   .10
         btfss    3,2
         goto     va
         clrf      dig1
         incf      dig2,1
         xorlw   .10
         btfss    3,2
         goto     va
         clrf      dig2
         incf     dig3,1

va      btfsc   0x05,4       ;si pulso  de eco no es bajo sigue incrementando
         goto    tre

         call    tabla
         
         clrf    dig1
         clrf    dig2
         clrf    dig3   
         goto    empe     ;vuelve y empieza
;------------------------------------------------------------------------
tabla   bsf      0x05,2            ;prende transistor de unidades
         movf     dig1,1
         xorlw    .9                  ;si el valor del registro dig1 es 9
         btfss    3,2
         goto     si1                 ;si no salta
         movlw    b'00010000'  ;prenden los bit correspondientes
         movwf    0x06            ;en puerto b
         goto     pil
si1     movf     dig1,1            ;tabla para unidades           
         xorlw    .8
         btfss    3,2
         goto     si2
         movlw    b'00000000'
         movwf    0x06
         goto     pil
si2     movf     dig1,1
         xorlw    .7
         btfss    3,2
         goto     si3
         movlw    b'01110100'
         movwf    0x06
         goto     pil
si3     movf     dig1,1
         xorlw    .6
         btfss    3,2
         goto     si4
         movlw    b'00000010'
         movwf    0x06
         goto     pil
si4     movf     dig1,1
         xorlw    .5
         btfss    3,2
         goto     si5
         movlw    b'00010010'
         movwf    0x06
         goto     pil
si5     movf     dig1,1
         xorlw    .4
         btfss    3,2
         goto     si6
         movlw    b'10110000'
         movwf    0x06
         goto     pil
si6     movf     dig1,1
         xorlw    .3
         btfss    3,2
         goto     si7
         movlw    b'01010000'
         movwf    0x06
         goto     pil
si7     movf     dig1,1
         xorlw    .2
         btfss    3,2
         goto     si8
         movlw    b'01001000'
         movwf    0x06
         goto     pil
si8     movf     dig1,1
         xorlw    .1
         btfss    3,2
         goto     si9
         movlw    b'11110100'
         movwf    0x06
         goto     pil
si9     movf     dig1,1
         xorlw    .0
         btfss    3,2
         goto     pil
         movlw    b'00000100'
         movwf    0x06
pil      call     retardo
         bcf      0x05,2                  ;apaga transistor de unidades
         call     retardo
;-------------------------------------------------------------------
tabla1  bsf      0x05,1                ;prende transistor de decenas
         movf     dig2,1
         xorlw    .9
         btfss    3,2
         goto     si1a
         movlw    b'00010000'
         movwf    0x06
         goto     pol
si1a    movf     dig2,1            ;tabla para decenas             
         xorlw    .8
         btfss    3,2
         goto     si2a
         movlw    b'00000000'
         movwf    0x06
         goto     pol
si2a    movf     dig2,1
         xorlw    .7
         btfss    3,2
         goto     si3a
         movlw    b'01110100'
         movwf    0x06
         goto     pol
si3a    movf     dig2,1
         xorlw    .6
         btfss    3,2
         goto     si4a
         movlw    b'00000010'
         movwf    0x06
         goto     pol
si4a    movf     dig2,1
         xorlw    .5
         btfss    3,2
         goto     si5a
         movlw    b'00010010'
         movwf    0x06
         goto     pol
si5a    movf     dig2,1
         xorlw    .4
         btfss    3,2
         goto     si6a
         movlw    b'10110000'
         movwf    0x06
         goto     pol
si6a    movf     dig2,1
         xorlw    .3
         btfss    3,2
         goto     si7a
         movlw    b'01010000'
         movwf    0x06
         goto     pol
si7a    movf     dig2,1
         xorlw    .2
         btfss    3,2
         goto     si8a
         movlw    b'01001000'
         movwf    0x06
         goto     pol
si8a    movf     dig2,1
         xorlw    .1
         btfss    3,2
         goto     si9a
         movlw    b'11110100'
         movwf    0x06
         goto     pol
si9a    movf     dig2,1
         xorlw    .0
         btfss    3,2
         goto     pol
         movlw    b'00000100'
         movwf    0x06
pol     call     retardo
         bcf      0x05,1                         ;apaga transistor de decenas
         call     retardo
;--------------------------------------------------------------------------
tabla2  bsf      0x05,0     ;prende transistor de centenas
         movf     dig3,1
         xorlw    .9
         btfss    3,2
         goto     si1b
         movlw    b'00010000'
         movwf    0x06
         call     pul
si1b    movf     dig3,1            ;tabla para centenas             
         xorlw    .8
         btfss    3,2
         goto     si2b
         movlw    b'00000000'
         movwf    0x06
         call     pul
si2b     movf     dig3,1
         xorlw    .7
         btfss    3,2
         goto     si3b
         movlw    b'01110100'
         movwf    0x06
         call     pul
si3b     movf     dig3,1
         xorlw    .6
         btfss    3,2
         goto     si4b
         movlw    b'00000010'
         movwf    0x06
         call     pul
si4b     movf     dig3,1
         xorlw    .5
         btfss    3,2
         goto     si5b
         movlw    b'00010010'
         movwf    0x06
         call     pul
si5b     movf     dig3,1
         xorlw    .4
         btfss    3,2
         goto     si6b
         movlw    b'10110000'
         movwf    0x06
         call     pul
si6b     movf     dig3,1
         xorlw    .3
         btfss    3,2
         goto     si7b
         movlw    b'01010000'
         movwf    0x06
         call     pul
si7b     movf     dig3,1
         xorlw    .2
         btfss    3,2
         goto     si8b
         movlw    b'01001000'
         movwf    0x06
         call     pul
si8b     movf     dig3,1
         xorlw    .1
         btfss    3,2
         goto     si9b
         movlw    b'11110100'
         movwf    0x06
         call     pul
si9b     movf     dig3,1
         xorlw    .0
         btfss    3,2
         call     pul
         movlw    b'00000100'
         movwf    0x06
pul      call     retardo
         bcf      0x05,0             ;apaga transistor centenas
         call     retardo
         return
;-------------------------------------------------------------------------
retardo  movlw    .25
         movwf    reg1
fro      movlw    .25
         movwf    reg2            ;retardo de displays
fre      decfsz   reg2,1
         goto     fre
         decfsz   reg1,1
         goto     fro
         return

        end

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: srf05
« Respuesta #7 en: 22 de Mayo de 2010, 13:36:01 »
Esto lo pone en la pag. que te puse arriba, si es verdad no se pueden medir m/m o por lo menos no con precision, ya que de esto deduzco que el srf05 por debajo de 100us no da esa precision. Seguramente su circuiteria tambien necesita de un cierto tiempo para hacer los cambios de estado, sensado de señal, etc.
Si esa inestabilidad viene por esto no se si se podra hacer mucho....


La duración del pulso eco de salida varía entre 100μS y 25mS, en función de la distancia entre las cápsulas del módulo y el objeto. La velocidad del sonido es de 29.15 μS/cm que, como realiza un recorrido de ida y vuelta, queda establecida en 58.30μS/cm. Así pues el rango mínimo que se puede medir es de 1.7 cm (100μS/58) y el máximo de 431 cm (25mS/58).

De todos modos le echare un vistazo en el MPLAB, dame algo de tiempo que ando muy liado.

Saludos

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: srf05
« Respuesta #8 en: 22 de Mayo de 2010, 14:24:44 »
Por otra parte, fijate lo que haces aqui, vas incrementando dig1 hasta que llega a 10, no? pero no estas haciendo eso, de hecho cuenta hasta 255, dig2 y dig3 nunca se mueven, ahi no llega el programa.



tre     incf     dig1,1
         xorlw   .10
         btfss    3,2
         goto     va
         clrf      dig1
         incf      dig2,1
         xorlw   .10
         btfss    3,2
         goto     va
         clrf      dig2
         incf     dig3,1

va      btfsc   0x05,4       ;si pulso  de eco no es bajo sigue incrementando
         goto    tre

para saber si un reg llega a 10 se hace asi:


tre
       incf     dig1,1
       movlw  .10
       xorwf   dig1,0   o tambien   subwf   dig1,0
       btfss    STATUS,Z   ;STATUS,Z=3,2
       goto    no es 0
       goto    es 0

fijate que le llamo STATUS,Z Y NO 3,2 SON LO MISMO PERO ES MAS ENTENDIBLE.Para eso en el encabezado debes de poner esto:


; **** Encabezado ****
list p=16F84A
#include P16F84A.inc
__CONFIG   _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

saludos





Desconectado jo.an.

  • PIC16
  • ***
  • Mensajes: 120
Re: srf05
« Respuesta #9 en: 22 de Mayo de 2010, 21:47:31 »
Saludos tapi8.Gracias por tomarte tantas molestias. De esta forma si cuenta (probando con con el sim84)(simulador viejito),tambien corren los displays
Tomate el tiempo que necesites,pero si no se puede sacar precision,habra que buscar otra forma de contar mm¿se te ocurre alguna otra forma?.El la red vi  unos videos uno con lcd y otro con displays y tenian mucha precision ¿como lo haran? :att jose

tre     incf     dig1,0
         movwf dig1
         xorlw   .10
         btfss    3,2
         goto     va
         clrf      dig1
         incf      dig2,0
         movwf  dig2
         xorlw   .10
         btfss    3,2
         goto     va
         clrf      dig2
         incf     dig3,1  ;este si se va hasta 255

va      btfsc   0x05,4       ;si pulso  de eco no es bajo sigue incrementando
         goto    tre
 

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: srf05
« Respuesta #10 en: 23 de Mayo de 2010, 06:42:34 »
Primero vamos a poner bien el programa, o al menos intentarlo, y haber que hace, despues ya nos pondremos con el srf05.
Una pregunta, este es un trabajo urgente para la universidad, y solo quieres presentarlo aprobar y ya esta, o tienes tiempo y ganas para aprender y saber hacerlo   :lol: :lol:  lo digo porque empieza la epoca de los trabajos de la universidad y bueno...


Claro que se va a 255 porquq no le dices que pare en un numero determinado como en los otros, prueba este que te pongo corregido, porque lo vuelves a tener mal.

este es el tuyo:

tre     incf     dig1,0
         movwf dig1
         xorlw   .10
         btfss    3,2
         goto     va
         clrf      dig1
         incf      dig2,0
         movwf  dig2
         xorlw   .10
         btfss    3,2
         goto     va
         clrf      dig2
         incf     dig3,1  ;este si se va hasta 255

Este deberia funcionar, no lo simule pero deberia ir:

tre     incf     dig1,1
         movf dig1,0
         xorlw   .10
         btfss    3,2
         goto     va
         clrf      dig1
         incf      dig2,1
         movf  dig2,0
         xorlw   .10
         btfss    3,2
         goto     va
         clrf      dig2
         incf     dig3,1 
         movf  dig3,0
         xorlw   .10
         btfss    3,2
         goto     va
         clrf      dig3





Esta es una tabla para 7 segmentos, en el programa principal tienes que hacer "movf reg,0" a continuacion "call BCD7SEG" y te volvera al programa principal con el codigo para mostrar el numero.
Fijate "movf reg,0" esto es mover un reg a W y el valor queda en W, en esta instruccion igual que en "incf" y otras muchas ese "0" indica que el resultado se queda en W si pones un 1 el resultado se va al reg y la tabla te dara un resultado erroneo, incluso se desbordara, cuando haces "incf reg1,1" incrementas el valor del reg. y lo guardas en ese reg. porque si aqui le pones 0 el reg queda como estaba y no se incrementa. Te explico esto porque lo has vuelto a hacer mal. En tu tabla tambien lo haces mal.

 movf     dig3,1            ;tabla para centenas             
         xorlw    .8
         btfss    3,2

Aqui es movf dig3,0. Y es ",0" porque el valor del reg tiene que quedarse en W para despues hacer la "xor" con el 8 que le pones , y btfss 3,2=STATUS,Z este flag se pondra a 1 si el resultado es 0




BCD7SEG:               
         addwf   PCL,1      
         retlw   0x3F
         retlw   0x06
         retlw   0x5B
         retlw   0x4F
         retlw   0x66
         retlw   0x6D
         retlw   0x7D
         retlw   0x07
         retlw   0xFF
         retlw   0x6F
         clrf   contador
         retlw   0x3F



Tambien se puede poner asi:



BCD7SEG            ; para display catodo comun
   addwf   PCL,1      ; Se incrementa el contador del programa.-
   DT 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0xFF, 0x6F   

esto es un multiplexado de tres displays, gentileza de Suki

;**** Se multiplexan los Display ****   
Actualizo_Display
   movlw   d'10'      ; Cargo Contador = 10
   movwf   Contador   ; Para repeticiones de visualizacion del mismo valor
            ; durante 150 ms.-
Refresco
   movfw   Unidad      ; Obtengo codigo de 7 Segmentos para Unidad.-
   call   BCD7SEG      ;
   bcf   PORTA,MuestroC   ; Apago Display de Centena, Se entiende al mirar rutina.-
   movwf   PORTB      ; Cargo unidad en PORTB   .-
   bsf   PORTA,MuestroU   ; Enciendo Display de Unidad.-
   call   Demora_5ms   
   movfw   Decena      ; Obtengo codigo 7 Segmentos para Decena.-
   call   BCD7SEG
   bcf   PORTA,MuestroU   ; Apago Display de Unidad.-
   movwf   PORTB      ; Cargo PORTB con Decena.-   
   bsf   PORTA,MuestroD   ; Enciendo Display de Decena.-
   call   Demora_5ms
   movfw   Centena      ; Obtengo codigo de 7 Segmentos para Centena.-
   call   BCD7SEG
   bcf   PORTA,MuestroD   ; Apago Display   de Decena.-
   movwf   PORTB      ; Cargo PORTB con Centena.-
   bsf   PORTA,MuestroC   ; Enciendo Display Centena.-
   call   Demora_5ms
   decfsz   Contador,1   ; Pregunto si ya se ha repetido 10 veces el ciclo?
   goto   Refresco   ; No, repito.-
   goto   Bucle      ; Si, actualizo cuenta.-
;**** Demora ****
Demora_5ms
      movlw   0xFF         ;
      movwf   Contador1      ; Iniciamos contador1.-
Repeticion1
      movlw   0x05         ;
      movwf   Contador2      ; Iniciamos contador2
Repeticion2
      decfsz   Contador2,1      ; Decrementa Contador2 y si es 0 sale.-      
      goto   Repeticion2      ; Si no es 0 repetimos ciclo.-
      decfsz   Contador1,1      ; Decrementa Contador1.-
      goto   Repeticion1      ; Si no es cero repetimos ciclo.-
      return            ; Regresa de la subrutina.-

   end






Desconectado jo.an.

  • PIC16
  • ***
  • Mensajes: 120
Re: srf05
« Respuesta #11 en: 24 de Mayo de 2010, 00:28:54 »
Saludos tapi8:Llevo muchos años en la eletronica como hobby,algunas veces le he sacado algun provecho.Esta vez se le ocurrio a un amigo(siempre son ellos los que siembran inquietudes),que trabaja con una maquina de cortar laminas de hierro,poder medir la distancia ha cortar en display(con un metro bastaria,pero hay que complicarse).No tiene que ser ya,es cuando puedas,pues me lo tome como hobby.Me pongo en la tarea que me has mandado y te contare como me va:att jose

Desconectado jo.an.

  • PIC16
  • ***
  • Mensajes: 120
Re: srf05
« Respuesta #12 en: 30 de Mayo de 2010, 18:59:17 »
Saludos tapi8:Ya lo hice como me dijiste,con esa tabla para display no pude,entonces puse la mia(mas larga).Pero sigo con el mismo problema.Le pongo algo para que rebote la señal,pasa de 39 a 40,lo alejo un poco mas 55,otro poco mas 43,otro poco mas lo que le da la gana.No puedo que aumente proporcional a la distancia:gracias por tu tiempo:att jose

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: srf05
« Respuesta #13 en: 01 de Junio de 2010, 15:25:01 »
Pon el programa otra vez y lo miramos, he estado mirando sensores ultrasonicos y no veo ninguno que de precision de milimetros, ni el srf08 ni el srf10 ni tampoco de otros modelos, esa parte esta dificil por lo que parece.

La tabla que te puse va perfecta, pero para catodo comun, y ahora mirando tu programa la tuya esta para anodo comun, creo que tienes el mismo conexionado, deberia ir bien haciendo "comf  W,0" antes de hacer el "movwf  0x06" o hacerlo despues sobre el PORTB como pongo abajo, esto del comf se me ocurrio ahora y nunca lo probe pero creo que funciona, ya que al hacer el complemento conviertes el codigo del catodo comun a anodo comun, no olvides al llamar la tabla poner en W el valor del numero asi:

   movf   dig1,0  ; fijate que es ",0" si pones ",1" te pondra cualquier numero o se desbordara.
   call     BCD7SEG
   movwf  0x06   ; aqui ya tienes el codigo a mostrar para catodo comun
   comf    0x06,1  ; y aqui lo tienes para anodo comun que es el tuyo


En la tuya te da mal los valores porque vas haciendo comparaciones con los distintos numeros, pero no lo haces bien, por lo menos en la que has posteado aqui al principio, "movf     dig1,1" aqui mueves el contenido de dig1 a W pero en vez de dejarlo en W para hacer la "xorlw .8" lo devuelves al registro por tanto en W hay cualquier valor, por eso te salen numeros de manera aleatoria y sin ningun sentido, si pones "movf  dig1,0" es posible que te de numeros coherentes 

Asi es como la tienes para todos los numeros en el primer post:

si1     movf     dig1,1            ;tabla para unidades           
         xorlw    .8
         btfss    3,2    ; si aqui pones STATUS,Z, es mas facil de entender.
         goto     si2
         movlw    b'00000000'
         movwf    0x06  ; y aqui PORTB
         goto     pil

Para poner STATUS,Z y PORTB debes poner el encabezado que te puse arriba

Desconectado jo.an.

  • PIC16
  • ***
  • Mensajes: 120
Re: srf05
« Respuesta #14 en: 04 de Junio de 2010, 01:52:08 »
Saludos tapi8:Echale un vistazo en esta direccion.aat jose   http://tech-freaks.net/?p=35