Répondre à la discussion
Affichage des résultats 1 à 4 sur 4

Routines de calcul pour 16F84



  1. #1
    twinotter

    Routines de calcul pour 16F84


    ------

    Bonjour,

    Je suis à la recherche de routines de calcul en assembleur pour 16F84.

    En fait j'ai besoin de réaliser des multiplications (16 bits * 16 bits dans 32 bits) et des divisions (32 / 16 dans 16) pour effectuer des mises à l'échelle.

    D'avance merci !

    -----

  2. Publicité
  3. #2
    Bigonoff

    Re : Routines de calcul pour 16F84

    Salut
    -----

    Tout se trouve sur le site de Microchip.
    Cherche les documents AN526 et AN617

    Voici les routines que j'utilise

    A+
    Bigonoff

    ***************************
    ;***************************** ****************************** ******************
    ;***************************** ****************************** ******************
    ; ROUTINES MATHEMATIQUES *
    ;***************************** ****************************** ******************
    ;***************************** ****************************** ******************
    ;-----------------------------------------------------------------------------
    ;
    ; Toutes les variables sont utilisées dans l'ordre poids fort/poids faible
    ; Les variables sont détruites après leur utilisation
    ;
    ; sous-routine mul1616u
    ; ---------------------
    ;
    ; Déclarations : oper1 : 32 bits : multiplicand (16 bits), et résultat (32bits)
    ; oper2 : 16 bits : multiplicateur
    ; mlocals : variables locales pour usage interne (24 bits)
    ;
    ; Entrées : oper1 : multiplicand (16 bits)
    ; oper2 : multiplicateur (16 bits)
    ; Sortie : oper1 : résultat (32 bits)
    ;
    ; nombre de cycles : de 107 à 256
    ;
    ;
    ;
    ; sous-routine div3216u
    ; ---------------------
    ;
    ; Déclarations : oper1 : 32 bits : dividante (32 bits), et résultat (32bits)
    ; oper2 : 16 bits : diviseur
    ; reste : 32 bits : reste de la division
    ; mlocals : variables locales pour usage interne (16 bits)
    ;
    ; Entrées : oper1 : multiplicand (16 bits)
    ; oper2 : multiplicateur (16 bits)
    ; Sortie : oper1 : résultat (32 bits)
    ;
    ;
    ; nombre de cycles : de 667 à 703
    ;
    ;
    ; div32_16u : division 32 bits par 16 bits non signés
    ;
    ;-----------------------------------------------------------------------------

    #DEFINE _C STATUS,C ; raccourci pour bit C

    #DEFINE AARGB0 oper1 ; operande 1 / poids fort
    #DEFINE AARGB1 oper1+1 ; autres octets opérande 1
    #DEFINE AARGB2 oper1+2
    #DEFINE AARGB3 oper1+3

    #DEFINE BARGB0 oper2 ; opérande 2 / poids fort
    #DEFINE BARGB1 oper2+1 ; autres octets opérande 2
    #DEFINE BARGB2 oper2+2
    #DEFINE BARGB3 oper2+3

    #DEFINE LOOPCOUNT mlocals ; compteur de boucles local
    #DEFINE TEMPB0 mlocals+1 ; variable temporaire 1
    #DEFINE TEMPB1 mlocals+2 ; variable temporaire 2
    #DEFINE TEMP TEMPB0 ; si 8 bits, porte un autre nom

    #DEFINE REMB0 reste ; reste poids fort
    #DEFINE REMB1 reste+1 ; reste poids faible

    MSB equ 7 ; numéro de bit poids fort
    LSB equ 0 ; numéro de bit poids faible


    ;***************************** ****************************** ******************
    ; MULTIPLICATION 16 X 16 NON SIGNES *
    ;***************************** ****************************** ******************
    ;-----------------------------------------------------------------------------
    ; multiplicand : AARGB0 AARGB1 (MSB/LSB)
    ; multiplicateur : BARGB0 BARGB1 (MSB/LSB)
    ; résultat : AARGB0 AARGB1 AARGB3 AARGB3 (MSB/../../LSB)
    ;
    ; variables locales : TEMPB0 TEMPB1 LOOPCOUNT
    ;
    ; nombre de cycles : de 107 à 256
    ; remarque : on peut gagner entre 64 et 73 cycles en déroulant les boucles
    ;
    ;-----------------------------------------------------------------------------


    UMUL1616L macro ; multiplication (utilisée par mul16_16u)
    MOVLW 0x08 ; nombre de boucles
    MOVWF LOOPCOUNT ; dans variable locale
    LOOPUM1616A
    RRF BARGB1, F
    BTFSC _C
    GOTO ALUM1616NAP
    DECFSZ LOOPCOUNT, F
    GOTO LOOPUM1616A
    MOVWF LOOPCOUNT
    LOOPUM1616B
    RRF BARGB0, F
    BTFSC _C
    GOTO BLUM1616NAP
    DECFSZ LOOPCOUNT, F
    GOTO LOOPUM1616B

    CLRF AARGB0
    CLRF AARGB1
    RETLW 0x00

    BLUM1616NAP
    BCF _C
    GOTO BLUM1616NA

    ALUM1616NAP
    BCF _C
    GOTO ALUM1616NA

    ALOOPUM1616
    RRF BARGB1, F
    BTFSS _C
    GOTO ALUM1616NA
    MOVF TEMPB1,W
    ADDWF AARGB1, F
    MOVF TEMPB0,W
    BTFSC _C
    INCFSZ TEMPB0,W
    ADDWF AARGB0, F

    ALUM1616NA
    RRF AARGB0, F
    RRF AARGB1, F
    RRF AARGB2, F
    DECFSZ LOOPCOUNT, F
    GOTO ALOOPUM1616
    MOVLW 0x08
    MOVWF LOOPCOUNT

    BLOOPUM1616
    RRF BARGB0, F
    BTFSS _C
    GOTO BLUM1616NA
    MOVF TEMPB1,W
    ADDWF AARGB1, F
    MOVF TEMPB0,W
    BTFSC _C
    INCFSZ TEMPB0,W
    ADDWF AARGB0, F

    BLUM1616NA
    RRF AARGB0, F
    RRF AARGB1, F
    RRF AARGB2, F
    RRF AARGB3, F
    DECFSZ LOOPCOUNT, F
    GOTO BLOOPUM1616
    endm


    mul1616u
    CLRF AARGB2 ; effacer résultat bits 16/23
    CLRF AARGB3 ; effacer résultat bits 24/31
    MOVF AARGB0,W ; prendre MSB multiplicand
    MOVWF TEMPB0 ; sauver dans variable temporaire
    MOVF AARGB1,W ; prendre LSB multiplicand
    MOVWF TEMPB1 ; sauver dans variable temporaire
    UMUL1616L ; macro de multiplication
    Return ; et retour


    ;***************************** ****************************** ******************
    ; DIVISION 32 PAR 16 NON SIGNES *
    ;***************************** ****************************** ******************
    ;-----------------------------------------------------------------------------
    ; dividande : AARGB0 AARGB1 AARGB2 AARGB3 (MSB/.../.../LSB)
    ; diviseur : BARGB0 BARGB1 (MSB/LSB)
    ; résultat : AARGB0 AARGB1 AARGB3 AARGB3 (MSB/../../LSB)
    ; reste : REMB0 REMB1 (MSB/LSB)
    ;
    ;
    ;
    ; nombre de cycles : de 667 à 703
    ;-----------------------------------------------------------------------------


    UDIV3216L macro
    CLRF TEMP
    RLF AARGB0,W
    RLF REMB1, F
    MOVF BARGB1,W
    SUBWF REMB1, F
    MOVF BARGB0,W
    BTFSS _C
    INCFSZ BARGB0,W
    SUBWF REMB0, F
    CLRW
    BTFSS _C
    MOVLW 1
    SUBWF TEMP, F
    RLF AARGB0, F
    MOVLW 7
    MOVWF LOOPCOUNT

    LOOPU3216A
    RLF AARGB0,W
    RLF REMB1, F
    RLF REMB0, F
    RLF TEMP, F
    MOVF BARGB1,W
    BTFSS AARGB0,LSB
    GOTO UADD26LA
    SUBWF REMB1, F
    MOVF BARGB0,W
    BTFSS _C
    INCFSZ BARGB0,W
    SUBWF REMB0, F
    CLRW
    BTFSS _C
    MOVLW 1
    SUBWF TEMP, F
    GOTO UOK26LA

    UADD26LA
    ADDWF REMB1, F
    MOVF BARGB0,W
    BTFSC _C
    INCFSZ BARGB0,W
    ADDWF REMB0, F
    CLRW
    BTFSC _C
    MOVLW 1
    ADDWF TEMP, F

    UOK26LA
    RLF AARGB0, F
    DECFSZ LOOPCOUNT, F
    GOTO LOOPU3216A
    RLF AARGB1,W
    RLF REMB1, F
    RLF REMB0, F
    RLF TEMP, F
    MOVF BARGB1,W
    BTFSS AARGB0,LSB
    GOTO UADD26L8
    SUBWF REMB1, F
    MOVF BARGB0,W
    BTFSS _C
    INCFSZ BARGB0,W
    SUBWF REMB0, F
    CLRW
    BTFSS _C
    MOVLW 1
    SUBWF TEMP, F
    GOTO UOK26L8

    UADD26L8
    ADDWF REMB1, F
    MOVF BARGB0,W
    BTFSC _C
    INCFSZ BARGB0,W
    ADDWF REMB0, F
    CLRW
    BTFSC _C
    MOVLW 1
    ADDWF TEMP, F

    UOK26L8
    RLF AARGB1, F
    MOVLW 7
    MOVWF LOOPCOUNT

    LOOPU3216B
    RLF AARGB1,W
    RLF REMB1, F
    RLF REMB0, F
    RLF TEMP, F
    MOVF BARGB1,W
    BTFSS AARGB1,LSB
    GOTO UADD26LB
    SUBWF REMB1, F
    MOVF BARGB0,W
    BTFSS _C
    INCFSZ BARGB0,W
    SUBWF REMB0, F
    CLRW
    BTFSS _C
    MOVLW 1
    SUBWF TEMP, F
    GOTO UOK26LB

    UADD26LB
    ADDWF REMB1, F
    MOVF BARGB0,W
    BTFSC _C
    INCFSZ BARGB0,W
    ADDWF REMB0, F
    CLRW
    BTFSC _C
    MOVLW 1
    ADDWF TEMP, F

    UOK26LB
    RLF AARGB1, F
    DECFSZ LOOPCOUNT, F
    GOTO LOOPU3216B
    RLF AARGB2,W
    RLF REMB1, F
    RLF REMB0, F
    RLF TEMP, F
    MOVF BARGB1,W
    BTFSS AARGB1,LSB
    GOTO UADD26L16
    SUBWF REMB1, F
    MOVF BARGB0,W
    BTFSS _C
    INCFSZ BARGB0,W
    SUBWF REMB0, F
    CLRW
    BTFSS _C
    MOVLW 1
    SUBWF TEMP, F
    GOTO UOK26L16

    UADD26L16
    ADDWF REMB1, F
    MOVF BARGB0,W
    BTFSC _C
    INCFSZ BARGB0,W
    ADDWF REMB0, F
    CLRW
    BTFSC _C
    MOVLW 1
    ADDWF TEMP, F

    UOK26L16
    RLF AARGB2, F
    MOVLW 7
    MOVWF LOOPCOUNT

    LOOPU3216C
    RLF AARGB2,W
    RLF REMB1, F
    RLF REMB0, F
    RLF TEMP, F
    MOVF BARGB1,W
    BTFSS AARGB2,LSB
    GOTO UADD26LC
    SUBWF REMB1, F
    MOVF BARGB0,W
    BTFSS _C
    INCFSZ BARGB0,W
    SUBWF REMB0, F
    CLRW
    BTFSS _C
    MOVLW 1
    SUBWF TEMP, F
    GOTO UOK26LC

    UADD26LC
    ADDWF REMB1, F
    MOVF BARGB0,W
    BTFSC _C
    INCFSZ BARGB0,W
    ADDWF REMB0, F
    CLRW
    BTFSC _C
    MOVLW 1
    ADDWF TEMP, F

    UOK26LC
    RLF AARGB2, F
    DECFSZ LOOPCOUNT, F
    GOTO LOOPU3216C
    RLF AARGB3,W
    RLF REMB1, F
    RLF REMB0, F
    RLF TEMP, F
    MOVF BARGB1,W
    BTFSS AARGB2,LSB
    GOTO UADD26L24
    SUBWF REMB1, F
    MOVF BARGB0,W
    BTFSS _C
    INCFSZ BARGB0,W
    SUBWF REMB0, F
    CLRW
    BTFSS _C
    MOVLW 1
    SUBWF TEMP, F
    GOTO UOK26L24

    UADD26L24
    ADDWF REMB1, F
    MOVF BARGB0,W
    BTFSC _C
    INCFSZ BARGB0,W
    ADDWF REMB0, F
    CLRW
    BTFSC _C
    MOVLW 1
    ADDWF TEMP, F

    UOK26L24
    RLF AARGB3, F
    MOVLW 7
    MOVWF LOOPCOUNT

    LOOPU3216D
    RLF AARGB3,W
    RLF REMB1, F
    RLF REMB0, F
    RLF TEMP, F
    MOVF BARGB1,W
    BTFSS AARGB3,LSB
    GOTO UADD26LD
    SUBWF REMB1, F
    MOVF BARGB0,W
    BTFSS _C
    INCFSZ BARGB0,W
    SUBWF REMB0, F
    CLRW
    BTFSS _C
    MOVLW 1
    SUBWF TEMP, F
    GOTO UOK26LD

    UADD26LD
    ADDWF REMB1, F
    MOVF BARGB0,W
    BTFSC _C
    INCFSZ BARGB0,W
    ADDWF REMB0, F
    CLRW
    BTFSC _C
    MOVLW 1
    ADDWF TEMP, F

    UOK26LD
    RLF AARGB3, F
    DECFSZ LOOPCOUNT, F
    GOTO LOOPU3216D
    BTFSC AARGB3,LSB
    GOTO UOK26L
    MOVF BARGB1,W
    ADDWF REMB1, F
    MOVF BARGB0,W
    BTFSC _C
    INCFSZ BARGB0,W
    ADDWF REMB0, F
    UOK26L
    endm









    div3216u
    CLRF REMB0 ; effacer reste MSB
    CLRF REMB1 ; et LSB
    UDIV3216L ; macro de division
    return ; et retour
    Vive l'Internet libre

  4. #3
    twinotter

    Smile Re : Routines de calcul pour 16F84

    Un grand merci à BIGONOFF pour la réponse qu'il m'envoie.

    Félicitations pour tout le travail que représentent les cours qu'il met à notre disposition et sans lesquels je n'en serais pas là aujourd'hui.

    A+

  5. #4
    Bigonoff

    Re : Routines de calcul pour 16F84

    Salut
    -----

    Pas de quoi
    Heureux d'avoir pu t'aider

    A+
    Bigonoff
    Vive l'Internet libre

  6. A voir en vidéo sur Futura

Discussions similaires

  1. [PIC] Routines pour transmission en code Manchester
    Par lolomatic dans le forum Électronique
    Réponses: 3
    Dernier message: 04/11/2008, 00h37
  2. automatisation de routines
    Par ABN84 dans le forum Logiciel - Software - Open Source
    Réponses: 9
    Dernier message: 30/03/2007, 20h01
  3. programme en C pour pic 16F84
    Par le fouineur dans le forum Électronique
    Réponses: 14
    Dernier message: 20/04/2006, 13h36
  4. 16f84 pour debutant
    Par Peter dans le forum Électronique
    Réponses: 3
    Dernier message: 19/09/2003, 22h35
Découvrez nos comparatifs produits sur l'informatique et les technologies.