Autor Tema: ayuda con subrutina division 16 bits  (Leído 1678 veces)

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

Desconectado lolos123

  • PIC12
  • **
  • Mensajes: 53
ayuda con subrutina division 16 bits
« en: 03 de Mayo de 2005, 13:32:00 »
Hola como va eso. Espero que me podais ayudar con lo siguiente.

Necesito dividir 16/16 bits y de la pagina de microchip tengo unos pdf en los que vienen varias operaciones.He cogido algunas de ellas como la de multiplicar 16x16 bits y parece que va bien.El problema me ha surgido al "adaptar" la de division de 16/16, o lo he hecho mal o es que la comprobación la hago mal, el caso es que el resultado de mi calculadora y el que da el programa no es el mismo. Estoy usando un 16f876 y el programa adaptado seria el siguiente:

;DIVISION 16/16 BITS La salida la da en DIVIDENDOH(parte baja) DIVIDENDOL(parte alta)

DIV1616       CLRF RESTOL
      CLRF RESTOH
      MOVLW 0x10   
      MOVWF LOOPCOUNT
LOOPU1616    clrwdt
      RLF DIVIDENDOL,W
      RLF RESTOH,1
      RLF RESTOL,1
      MOVF DIVISORH,W
      SUBWF RESTOH,1
      MOVF DIVISORL,W
      BTFSS STATUS,C
      INCFSZ DIVISORL,W
      SUBWF RESTOL,1
      BTFSC STATUS,C
      GOTO UOK66LL
      MOVF DIVISORH,W
      ADDWF RESTOH,1
      MOVF DIVISORL,W
      BTFSC STATUS,C
      INCFSZ DIVISORL,W
   ADDWF RESTOL,1
      BCF STATUS,C
UOK66LL    RLF DIVIDENDOH,1
         RLF DIVIDENDOL,1
         DECFSZ LOOPCOUNT,1
         GOTO LOOPU1616
      return

Previamente tengo definido DIVIDENDOh,...etc.

¿donde lo estoy haciendo mal?

Bueno, muchas gracias por vuestro tiempo y si necesitais alguna aclaración os la dare.

Desconectado antoniof

  • Moderadores
  • PIC24F
  • *****
  • Mensajes: 729
RE: ayuda con subrutina division 16 bits
« Respuesta #1 en: 03 de Mayo de 2005, 18:27:00 »
Supongo que te estas basando en esta subrrutina:

Codigo:
;*******************************************************************;
;   Division : ACCb(16 bits) / ACCa(16 bits) -> ACCb(16 bits) with
;                                               Remainder in ACCc (16 bits)
;      (a) Load the Denominator in location ACCaHI & ACCaLO ( 16 bits )
;      (b) Load the Numerator in location ACCbHI & ACCbLO ( 16 bits )
;      (c) CALL D_div
;      (d) The 16 bit result is in location ACCbHI & ACCbLO
;      (e) The 16 bit Remainder is in locations ACCcHI & ACCcLO
;
;   Performance :
;               Program Memory  :       037
;               Clock Cycles    :       310
;
;        NOTE :
;               The performance specs are for Unsigned arithmetic ( i.e,
;               with "SIGNED equ  FALSE "Giño.
;
;
;       Program:          DBL_DIVS.ASM
;       Revision Date:  
;                         1-13-97      Compatibility with MPASMWIN 1.40
;
;*******************************************************************;
;
ACCaLO  equ     10
ACCaHI  equ     11
ACCbLO  equ     12
ACCbHI  equ     13
ACCcLO  equ     14
ACCcHI  equ     15
ACCdLO  equ     16
ACCdHI  equ     17
temp    equ     18
sign    equ     19
;
   include "p16c5x.inc"

PIC54   equ     1FFH    ; Define Reset Vector
TRUE    equ     1
FALSE   equ     0

   org     0
;*******************************************************************
SIGNED  equ     FALSE           ; Set This To "TRUE" if the routines
;                               ; for Multiplication & Division needs
;                               ; to be assembled as Signed Integer
;                               ; Routines. If "FALSE" the above two
;                               ; routines ( D_mpy & D_div ) use
;                               ; unsigned arithmetic.
;*******************************************************************
;       Double Precision Divide ( 16/16 -> 16 )
;
;         ( ACCb/ACCa -> ACCb with remainder in ACCc ) : 16 bit output
; with Quotiont in ACCb (ACCbHI,ACCbLO) and Remainder in ACCc (ACCcHI,ACCcLO).
;
;   NOTE  :  Before calling this routine, the user should make sure that
;            the Numerator(ACCb) is greater than Denominator(ACCa). If
;            the case is not true, the user should scale either Numerator
;            or Denominator or both such that Numerator is greater than
;            the Denominator.
;
;
D_divS
   call    setup
   clrf    ACCcHI
   clrf    ACCcLO
dloop   bcf     STATUS,C
   rlf     ACCdLO, F
   rlf     ACCdHI, F
   rlf     ACCcLO, F
   rlf     ACCcHI, F
   movf    ACCaHI,W
   subwf   ACCcHI,W          ;check if a>c
   btfss   STATUS,Z
   goto    nochk
   movf    ACCaLO,W
   subwf   ACCcLO,W        ;if msb equal then check lsb
nochk   btfss   STATUS,C    ;carry set if c>a
   goto    nogo
   movf    ACCaLO,W        ;c-a into c
   subwf   ACCcLO, F
   btfss   STATUS,C
   decf    ACCcHI, F
   movf    ACCaHI,W
   subwf   ACCcHI, F
   bsf     STATUS,C    ;shift a 1 into b (result)
nogo    rlf     ACCbLO, F
   rlf     ACCbHI, F
   decfsz  temp, F         ;loop untill all bits checked
   goto    dloop
                return

;*******************************************************************
;
setup   movlw   .16             ; for 16 shifts
   movwf   temp
   movf    ACCbHI,W          ;move ACCb to ACCd
   movwf   ACCdHI
   movf    ACCbLO,W
   movwf   ACCdLO
   clrf    ACCbHI
   clrf    ACCbLO
   retlw   0


A simple vista se diferencian en muchas cosas. Porque la modificas tanto?

Te aconsejo que la utilices tal y como viene escrita o, si lo prefieres, cambiarle los nombres a los registros, pero nada más. De todas formas te he puesto en rojo la instrucción que creo que te falta.

Desconectado lolos123

  • PIC12
  • **
  • Mensajes: 53
RE: ayuda con subrutina division 16 bits
« Respuesta #2 en: 04 de Mayo de 2005, 13:18:00 »
Gracias antoniof por responder tan rápido.

No, me parece que no es la misma ,ahora no recuerdo que número es, pero de todas formas provaré esta que me mandas tal cual, sin cambiar nada.

¿me puedes decir de que application notes has sacado ésta?
Mil Gracias por tu tiempo.Giño

Desconectado antoniof

  • Moderadores
  • PIC24F
  • *****
  • Mensajes: 729
RE: ayuda con subrutina division 16 bits
« Respuesta #3 en: 04 de Mayo de 2005, 17:48:00 »
La appnote es la AN526, que trae unas cuantas rutinas de doble precisión, tanto para números con signo como sin signo. Aqui te dejo el enlace:

http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1824&appnote=en011000

Desconectado lolos123

  • PIC12
  • **
  • Mensajes: 53
RE: ayuda con subrutina division 16 bits
« Respuesta #4 en: 05 de Mayo de 2005, 12:59:00 »
Mil gracias antoniof, he provado con ese codigo que me dices y va perfecto, ahora voy a visitar el enlace que me dices.

No sabes el tiempo que he perdido con la dichosa division.

Por cierto tienes razón en lo de no modificar los programas, este lo puse tal cual(bueno cambie lo del micro y dos cositas mas) y listo.

Reitero mi gratitud.Principiantes como yo necesitamos gente como tu.