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

routine de division pour le PIC 16f84



  1. #1
    siden

    routine de division pour le PIC 16f84


    ------

    bonjour tout le monde,

    j'aimerais tester 2 routine de divisions de 32bit par 16 bit avant d'en implanter une dans mon programme principal.
    J'ai fait un petit programme pour les tester mais je n'arrive pas a les faire aller comme il faut.
    ils bouclent indéfiniment j'ai peut-être oublié un truc

    voici mes codes assembleur:

    celui ci a été trouvé sur ce site : http://www.piclist.com/techref/micro.../div/index.htm
    Code:
          list      p=16F84             ; Type du processeur
            #include  <p16F84.inc>        ; Définition des variables
        __CONFIG _RC_OSC & _WDT_ON & _PWRTE_OFF & _CP_OFF
    
    
    bitcnt		equ	0x10
    remdrH		equ	0x11
    remdrL		equ	0x12
    divid0		equ	0x13
    divid1		equ	0x14
    divid2		equ	0x15
    divid3		equ	0x16
    divisL		equ	0x17
    divisH		equ	0x18
    ;LSB		equ	0x19
    
    		MOVLW	h'D2'
    		MOVWF	divid0
    		MOVLW	h'11'
    		MOVWF	divid1
    		MOVLW	h'50'
    		MOVWF	divid2
    		MOVLW	h'87'
    		MOVWF	divid3
    		MOVLW	h'13'
    		MOVWF	divisL
    		MOVLW	h'A4'
    		MOVWF	divisH
    		
    		CALL	divide
    
    divide movlw 32      ; 32-bit divide by 16-bit
           movwf bitcnt
           clrf remdrH   ; Clear remainder
           clrf remdrL
    
    dvloop clrc          ; Set quotient bit to 0
                         ; Shift left dividend and quotient
           rlf divid0    ; lsb
           rlf divid1
           rlf divid2
           rlf divid3    ; lsb into carry
           rlf remdrL    ; and then into partial remainder
           rlf remdrH
    
           skpnc         ; Check for overflow
           goto subd
           movfw divisH  ; Compare partial remainder and divisor
           subwf remdrH,w
           skpz 
           goto testgt   ; Not equal so test if remdrH is greater
           movfw divisL  ; High bytes are equal, compare low bytes
           subwf remdrL,w
    testgt skpc          ; Carry set if remdr >= divis
           goto remrlt
    
    subd   movfw divisL  ; Subtract divisor from partial remainder
           subwf remdrL
           skpc          ; Test for borrow
    
           decf remdrH   ; Subtract borrow
           movfw divisH
           subwf remdrH
           bsf divid0,0  ; Set quotient bit to 1
                         ; Quotient replaces dividend which is lost
    remrlt decfsz bitcnt
           goto dvloop
           return
    
    END
    L'autre viens de chez microchip

    Code:
           list      p=16F84             ; Type du processeur
            #include  <p16F84.inc>        ; D�finition des variables
        __CONFIG _RC_OSC & _WDT_OFF & _PWRTE_OFF & _CP_OFF
    
    
    LOOPCOUNT	equ	0x10
    REMB0		equ	0x11
    REMB1		equ	0x12
    AARGB0		equ	0x13
    AARGB1		equ	0x14
    AARGB2		equ	0x15
    AARGB3		equ	0x16
    BARGB0		equ	0x17
    BARGB1		equ	0x18
    LSB		equ	0x19
    
    		MOVLW	h'D2'
    		MOVWF	AARGB0
    		MOVLW	h'11'
    		MOVWF	AARGB1
    		MOVLW	h'50'
    		MOVWF	AARGB2
    		MOVLW	h'87'
    		MOVWF	AARGB3
    		MOVLW	h'13'
    		MOVWF	BARGB0
    		MOVLW	h'A4'
    		MOVWF	BARGB1
    		
    		CALL	FXD3115U
    
    UDIV3115L       macro
    ;       Max Timing:    9+6*17+16+16+6*17+16+16+6*17+16+16+6*17+16+8 = 537 clks
    ;       Min Timing:    9+6*16+15+15+6*16+15+15+6*16+15+15+6*16+15+3 = 501 clks
    ;       PM: 157                                DM: 9
                    MOVF           BARGB1,W
                    SUBWF          REMB1, F
                    MOVF           BARGB0,W
                    BTFSS          STATUS,C
                    INCFSZ         BARGB0,W
                    SUBWF          REMB0, F
               RLF    AARGB0, F
               MOVLW  7
               MOVWF  LOOPCOUNT
    LOOPU3115A RLF    AARGB0,W
               RLF    REMB1, F
               RLF    REMB0, F
               MOVF   BARGB1,W
               BTFSS  AARGB0,LSB
               GOTO   UADD15LA
               SUBWF  REMB1, F
               MOVF   BARGB0,W
               BTFSS  STATUS,C
               INCFSZ BARGB0,W
               SUBWF  REMB0, F
               GOTO   UOK15LA
    UADD15LA   ADDWF  REMB1, F
               MOVF   BARGB0,W
               BTFSC  STATUS,C
               INCFSZ BARGB0,W
               ADDWF  REMB0, F
    UOK15LA    RLF    AARGB0, F
               DECFSZ LOOPCOUNT, F
               GOTO   LOOPU3115A
               RLF    AARGB1,W
               RLF    REMB1, F
               RLF    REMB0, F
               MOVF   BARGB1,W
               BTFSS  AARGB0,LSB
               GOTO   UADD15L8
               SUBWF  REMB1, F
               MOVF   BARGB0,W
               BTFSS  STATUS,C
               INCFSZ BARGB0,W
               SUBWF  REMB0, F
               GOTO   UOK15L8
    UADD15L8   ADDWF  REMB1, F
               MOVF   BARGB0,W
               BTFSC  STATUS,C
               INCFSZ BARGB0,W
               ADDWF  REMB0, F
    UOK15L8    RLF    AARGB1, F
               MOVLW  7
               MOVWF  LOOPCOUNT
    LOOPU3115B RLF    AARGB1,W
               RLF    REMB1, F
               RLF    REMB0, F
               MOVF   BARGB1,W
               BTFSS  AARGB1,LSB
               GOTO   UADD15LB
               SUBWF  REMB1, F
               MOVF   BARGB0,W
               BTFSS  STATUS,C
               INCFSZ BARGB0,W
               SUBWF  REMB0, F
               GOTO   UOK15LB
    UADD15LB   ADDWF  REMB1, F
               MOVF   BARGB0,W
               BTFSC  STATUS,C
               INCFSZ BARGB0,W
               ADDWF  REMB0, F
    UOK15LB    RLF    AARGB1, F
               DECFSZ LOOPCOUNT, F
               GOTO   LOOPU3115B
               RLF    AARGB2,W
               RLF    REMB1, F
               RLF    REMB0, F
               MOVF   BARGB1,W
               BTFSS  AARGB1,LSB
               GOTO   UADD15L16
               SUBWF  REMB1, F
               MOVF   BARGB0,W
               BTFSS  STATUS,C
               INCFSZ BARGB0,W
               SUBWF  REMB0, F
               GOTO   UOK15L16
    UADD15L16  ADDWF  REMB1, F
               MOVF   BARGB0,W
               BTFSC  STATUS,C
               INCFSZ BARGB0,W
               ADDWF  REMB0, F
    UOK15L16   RLF    AARGB2, F
               MOVLW  7
               MOVWF  LOOPCOUNT
    LOOPU3115C RLF    AARGB2,W
               RLF    REMB1, F
               RLF    REMB0, F
               MOVF   BARGB1,W
               BTFSS  AARGB2,LSB
               GOTO   UADD15LC
               SUBWF  REMB1, F
               MOVF   BARGB0,W
               BTFSS  STATUS,C
               INCFSZ BARGB0,W
               SUBWF  REMB0, F
               GOTO   UOK15LC
    UADD15LC   ADDWF  REMB1, F
               MOVF   BARGB0,W
               BTFSC  STATUS,C
               INCFSZ BARGB0,W
               ADDWF  REMB0, F
    UOK15LC    RLF    AARGB2, F
               DECFSZ LOOPCOUNT, F
               GOTO   LOOPU3115C
               RLF    AARGB3,W
               RLF    REMB1, F
               RLF    REMB0, F
               MOVF   BARGB1,W
               BTFSS  AARGB2,LSB
               GOTO   UADD15L24
               SUBWF  REMB1, F
               MOVF   BARGB0,W
               BTFSS  STATUS,C
               INCFSZ BARGB0,W
               SUBWF  REMB0, F
               GOTO   UOK15L24
    UADD15L24  ADDWF  REMB1, F
               MOVF   BARGB0,W
               BTFSC  STATUS,C
               INCFSZ BARGB0,W
               ADDWF  REMB0, F
    UOK15L24   RLF    AARGB3, F
               MOVLW  7
               MOVWF  LOOPCOUNT
    LOOPU3115D RLF    AARGB3,W
               RLF    REMB1, F
               RLF    REMB0, F
               MOVF   BARGB1,W
               BTFSS  AARGB3,LSB
               GOTO   UADD15LD
               SUBWF  REMB1, F
               MOVF   BARGB0,W
               BTFSS  STATUS,C
               INCFSZ BARGB0,W
               SUBWF  REMB0, F
               GOTO   UOK15LD
    UADD15LD   ADDWF  REMB1, F
               MOVF   BARGB0,W
               BTFSC  STATUS,C
               INCFSZ BARGB0,W
               ADDWF  REMB0, F
    UOK15LD    RLF    AARGB3, F
               DECFSZ LOOPCOUNT, F
               GOTO   LOOPU3115D
               BTFSC  AARGB3,LSB
               GOTO   UOK15L
               MOVF   BARGB1,W
               ADDWF  REMB1, F
               MOVF   BARGB0,W
               BTFSC  STATUS,C
               INCFSZ BARGB0,W
               ADDWF  REMB0, F
    UOK15L
               endm
    
    
    FXD3115U CLRF      REMB0
             CLRF      REMB1
    ;         UDIV3115L
                    MOVF           BARGB1,W
                    SUBWF          REMB1, F
                    MOVF           BARGB0,W
                    BTFSS          STATUS,C
                    INCFSZ         BARGB0,W
                    SUBWF          REMB0, F
               RLF    AARGB0, F
               MOVLW  7
               MOVWF  LOOPCOUNT
    ;
             RETLW     0x00
    	
    
    
    END
    merci d'avance pour l'aide

    -----

  2. Publicité
  3. #2
    invite_P89
    Invité

    Re : routine de division pour le PIC 16f84

    Lu
    Dans ton premier exemple tu dois sortir de ton programme après 32 itérations, quel que soit le résultat, surveille BITCNT s'il passe bien de 32 à zéro.

    Pour le deuxième exemple il faut séparer ta macro de ton programme, mettre un goto après call FD3115U mes macros, je les mets en début prog.

    à bientôt

  4. #3
    siden

    Re : routine de division pour le PIC 16f84

    de fait, à chaque fois je repars dans la routine de division
    après mes CALL ... il faut que je mette un goto mais il doit pointer vers quoi?

    sinon j'ai testé le 1er pas à pas et il marche très bien

  5. #4
    invite_P89
    Invité

    Re : routine de division pour le PIC 16f84

    Citation Envoyé par siden Voir le message
    de fait, à chaque fois je repars dans la routine de division
    après mes CALL ... il faut que je mette un goto mais il doit pointer vers quoi?

    sinon j'ai testé le 1er pas à pas et il marche très bien
    Aprés ton call la suite de ton programme,ou un goto sur lui méme pour stoper ton programme car il n'y a pas la fonction halt ou alors un point d'arrét de debugger.

    Pour les macros, regarde l'organisation d'un programme.

  6. A voir en vidéo sur Futura

Discussions similaires

  1. programme pour pic 16f84 aider moi SVP
    Par gobgob69 dans le forum Électronique
    Réponses: 37
    Dernier message: 28/05/2009, 19h46
  2. Pic 16f84
    Par pcfab dans le forum Électronique
    Réponses: 4
    Dernier message: 07/07/2007, 15h21
  3. pic 16f84
    Par clinon dans le forum Électronique
    Réponses: 7
    Dernier message: 10/01/2007, 14h50
  4. Help pour pic 16f84 et transmission reception d'infra rouge
    Par Vincent dans le forum Électronique
    Réponses: 3
    Dernier message: 27/10/2006, 08h40
  5. programme en C pour pic 16F84
    Par le fouineur dans le forum Électronique
    Réponses: 14
    Dernier message: 20/04/2006, 13h36
Découvrez nos comparatifs produits sur l'informatique et les technologies.