Autor Tema: Cómo pasar 6 registros BCD a Binario  (Leído 2087 veces)

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

Desconectado teve

  • PIC12
  • **
  • Mensajes: 65
Cómo pasar 6 registros BCD a Binario
« en: 08 de Julio de 2005, 13:06:00 »
Hola compañeros, necesito pasar 6 registros en BCD ejemplo 124569878296 a bienario. Complicada la cosa,  pensare como puedo realizar este programita, pero si os surgido este programita  y lo teneis me ahorraria  que mi cabeza dilatara un centimetro. GiñoUn saludo a todos los compañeros del foro.Giño

Desconectado antoniof

  • Moderadores
  • PIC24F
  • *****
  • Mensajes: 729
RE: Cómo pasar 6 registros BCD a Binario
« Respuesta #1 en: 08 de Julio de 2005, 19:22:00 »
He modificado esta rutina a partir de una que funciona que es de 8 digitos tranformados en un binario de 32 bits. la he modificado para que acepte 12 dígitos y los transforme en 40 bits. Pruebala antes con el simulador del MPLAB:

Codigo:
;*********************************************************************
;DEC2BIN:    Tranforma el código bcd de los digitos en uno binario
;      de 40 bits y lo guarda en los registros resultadox
;               siendo resultado4 el MSB y resultado0 el LSB
;               Los registros digitox deben definirse como digito0 LSB
;               y digito11 el MSB, todos seguidos, ya que se utiliza
;               el fsr para direccionarlos
;*********************************************************************

dec2bin   movlw   d"40"      ;Hay que rotar 40 bits
   movwf   temp0      ;Contador de bits
d2bbck1   movlw   digito0-1   ;Puntero al digito msb
   movwf   fsr
   movlw   d"12"
   movwf   temp1      ;Contador de dígitos
   movlw   d"10"
   bcf   status,c   ;Borra el carry
d2bbck2   incf   fsr,f
   btfsc   status,0
   addwf   indf,f      ;Add 10 if "1" bit from prev digit
   rrf   indf,f      ;Shift out LSB of digit
   decfsz   temp1,f      ;Siguiente dígito
   goto   d2bbck2
   rrf   resultado4,f   ;Shift in carry from digits
   rrf   resultado3,f   ;Shift in carry from digits
   rrf   resultado2,f
   rrf   resultado1,f
   rrf   resultado0,f
   decfsz   temp0,f      ;Siguiente bit
   goto   d2bbck1
   return


Es muy sencillo ampliarla hasta los 64 bits si se quiere.

Desconectado teve

  • PIC12
  • **
  • Mensajes: 65
RE: Cómo pasar 6 registros BCD a Binario
« Respuesta #2 en: 09 de Julio de 2005, 01:59:00 »
Muchas gracias compañero por responder, he simulado el programa y no me funciona, en principio no veo ningun error en las rutinas, lo has probado y si es asi, haber si me lo puedes poner entero, un saludo y eternamente agradecido.Giño

Desconectado antoniof

  • Moderadores
  • PIC24F
  • *****
  • Mensajes: 729
RE: Cómo pasar 6 registros BCD a Binario
« Respuesta #3 en: 09 de Julio de 2005, 03:44:00 »
La rutina anterior no la he probado sino que la he modificado a partir de esta que si que funciona perfectamente:

Codigo:
;*********************************************************************
;DEC2BIN:    Tranforma el código bcd de los digitos en uno binario
;      de 32 bits y lo guarda en los registros dividendox
;*********************************************************************

dec2bin   movlw   d"32"
   movwf   temp0      ;Contador de bits
d2bbck1   movlw   disp0-1      ;Puntero al digito msb
   movwf   fsr
   movlw   0x08
   movwf   temp1      ;Contador de dígitos
   movlw   d"10"
   bcf   status,c   ;Borra el carry
d2bbck2   incf   fsr,f
   btfsc   status,0
   addwf   indf,f      ;Add 10 if "1" bit from prev digit
   rrf   indf,f      ;Shift out LSB of digit
   decfsz   temp1,f      ;Siguiente dígito
   goto   d2bbck2
   rrf   dividendo3,f   ;Shift in carry from digits
   rrf   dividendo4,f
   rrf   dividendo5,f
   rrf   dividendo6,f
   decfsz   temp0,f      ;Siguiente bit
   goto   d2bbck1
   return


Prueba esta de 32 bits y si no te funciona es que tienes algo mal a la hora de definir o tratar los registros

Desconectado teve

  • PIC12
  • **
  • Mensajes: 65
RE: Cómo pasar 6 registros BCD a Binario
« Respuesta #4 en: 09 de Julio de 2005, 04:58:00 »
Hola compañero, ya me da cosa,  la rutina es sencilla, yo no veo problema e incluso como bien has hecho se puede modificar sin problema, pero lo he probado y no me funciona.

He cambiado el orden de los registros por si estuviera hay el error, pero nada. Un saludo desde huelva compañero.


   List   p=16F84   ;Tipo de procesador
      include   "P16F84.INC"   ;Definiciones de                 ;   registros  internos
temp1           equ      0x0c
temp0           equ      0x0d
dividendo3      equ       0x0e
dividendo2      equ      0x0f
dividendo1      equ      0x10
dividendo0      equ      0x11
BCD_7           equ      0x12
BCD_6           equ      0x13
BCD_5           equ      0x14
BCD_4           equ      0x15
BCD_3           equ      0x12
BCD_2           equ      0x13
BCD_1           equ      0x14
BCD_0           equ      0x15
      org   0x00      ;Vector de Reset
      goto   Inicio
      org   0x05      ;Vector de interrupción
                goto    final

Inicio           clrf    PORTB      ;Borra los latch de salida
      clrf   PORTA      ;Borra los latch de salida
      bsf   STATUS,RP0   ;Selecciona banco 1
      clrf   TRISB      ;Puerta B se configura como salida
      clrf   TRISA      ;Puerta A se configura como salida
                movlw   b"00000000"
      movwf   OPTION_REG   ;Preescaler de 256 asociado al TMR0
      bcf   STATUS,RP0   ;Selecciona banco 0
                clrf    BCD_7
                clrf    BCD_6
                clrf    BCD_5
                clrf    BCD_4
                clrf    BCD_3
                clrf    BCD_2
                clrf    BCD_1
                movlw   0x06
                movwf   BCD_0
                clrf    dividendo0
                clrf    dividendo1
                clrf    dividendo2
                clrf    dividendo3          
                call    dec2bin
                goto    final

;Codigo:--------------------------------------------------------------------------------;*********************************************************************
;DEC2BIN:    Tranforma el código bcd de los digitos en uno binario
;      de 32 bits y lo guarda en los registros dividendox
;*********************************************************************

dec2bin   movlw   d"32"
   movwf   temp0      ;Contador de bits
d2bbck1   movlw   BCD_0       ;Puntero al digito msb
   movwf   FSR
   movlw   0x08
   movwf   temp1      ;Contador de dígitos
   movlw   d"10"
   bcf   STATUS,C   ;Borra el carry
d2bbck2   incf   FSR,f
        btfsc   STATUS,C
   addwf   INDF,f      ;Add 10 if "1" bit from prev digit
   rrf   INDF,f      ;Shift out LSB of digit
   decfsz   temp1,f      ;Siguiente dígito
   goto   d2bbck2
        rrf     dividendo3,f    ;Shift in carry from digits
        rrf     dividendo2,f
        rrf     dividendo1,f
        rrf     dividendo0,f
   decfsz   temp0,f      ;Siguiente bit
   goto   d2bbck1
        return------------------

 final  nop
        clrwdt
        end                     ;Fin del programa fuente

Giño

Desconectado antoniof

  • Moderadores
  • PIC24F
  • *****
  • Mensajes: 729
RE: Cómo pasar 6 registros BCD a Binario
« Respuesta #5 en: 10 de Julio de 2005, 03:07:00 »
El fallo está en la definición de los registros:

Codigo:
BCD_0 equ 0x12
BCD_1 equ 0x13
BCD_2 equ 0x14
BCD_3 equ 0x15
BCD_4 equ 0x16
BCD_5 equ 0x17
BCD_6 equ 0x18
BCD_7 equ 0x19


y en mi comentario en el programa como acabo de darme cuenta:

Codigo:
d2bbck1 movlw BCD_0 ;Puntero al digito msb


queria decir LSB...SonrojadoSonrojado

Tienen que empezar por el lsb y definirse en direcciones consecutivas. Pruebalo acon esta modificación verás como funcionan.

Desconectado teve

  • PIC12
  • **
  • Mensajes: 65
RE: Cómo pasar 6 registros BCD a Binario
« Respuesta #6 en: 11 de Julio de 2005, 04:58:00 »
Hola compañero, parece que la rutina se resiste a funcionar, lo estoy probando con simupic,  pero nada, luego lo probare con proteus haber que tal, he corregido todo, aunque tambien pense que el error podria estar ahi, con lo que probe cambiando y demas, un saludo y abrazo compañero.Giño


 

anything