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

Calcul unsigned int pic18f4420



  1. #1
    sifourquier

    Calcul unsigned int pic18f4420


    ------

    Bonjour j'ai un problème que je n'arrive pas à comprendre avec mon programme
    je souhaite faire des calcule sur un unsigned int
    la multiplication pas de problème mais la division par 16 ne marche pas (j'ai aussi tester avec un décalage de 4 même résulta) la valeur de degré ne change pas

    void tourner(unsigned int degre,type_mouvement droite_gauche)
    {
    degre*=23;
    degre=degre/16 ;
    ...

    Je compile avec le compilateur C18, j'ai désactiver les optimisation
    et S'est un pic18f4420

    Tester en réel et avec le simulateur de mplab

    Je début sur pic mais j'ai beaucoup programmer sur C8051

    Mplab me dit qu'elle que chose en rapport au jeux d'instructions avancer à la compilateur sa peut venir de la? si ou comment les désactiver

    -----

  2. Publicité
  3. #2
    sdec25

    Re : Calcule unsigned int pic18f4420

    Salut.
    A ma connaissances les divisions ne sont pas buggées dans C18 (et heureusement !).
    "La division ne marche pas" n'est pas assez précis pour qu'on puisse t'aider.
    Que vaut degre au début ?
    Après *= 23 ?
    Après / 16 ?

  4. #3
    sifourquier

    Re : Calcule unsigned int pic18f4420

    merci de t'intéresser à mon problème
    J'ai testé avec degré = 5 et en mode simulation ça me donne
    (Je mette la valeur de degré en commentaire)

    void tourner(unsigned int degre,type_mouvement droite_gauche)
    {
    //degre=5
    degre*=23;
    //degre=115
    degre=degre/16 ;
    //degre=115 ???

  5. #4
    sdec25

    Re : Calcule unsigned int pic18f4420

    Que donne le code assembleur correspondant à la division ?
    Et à un décalage de 4 vers la droite ?
    (view > disassembly listing)

  6. A voir en vidéo sur Futura
  7. Comparatifs

    Gagnez du temps et de l'argent grâce à nos comparatifs de produits. Parmi nos sujets :
  8. #5
    sifourquier

    Re : Calcul unsigned int pic18f4420

    je pensait que c'était une astuce des pic que je ne connaissait pas mais visiblement s'est plus complexe voici le code asembleur
    Code:
    165: degre=degre/16;
    0168 0E10 MOVLW 0x10
    016A 6E10 MOVWF [0x10]
    016C 6A11 CLRF [0x11]
    016E 0EFD MOVLW 0xfd
    0170 CFDB MOVFF 0xfdb, 0x6
    0172 F006 NOP
    0174 0EFE MOVLW 0xfe
    0176 CFDB MOVFF 0xfdb, 0x7
    0178 F007 NOP
    017A C010 MOVFF 0x10, 0xb
    017C F00B NOP
    017E C011 MOVFF 0x11, 0xc
    0180 F00C NOP
    0182 EC42 CALL 0x484, 0
    0184 F002 NOP
    0186 0EFD MOVLW 0xfd
    0188 C006 MOVFF 0x6, 0xfdb
    018A FFDB NOP
    018C 0EFE MOVLW 0xfe
    018E C007 MOVFF 0x7, 0xfdb
    0190 FFDB NOP
    je suit pas trè douer en asembleur mais j'ai tout de même comprit qu'il apelle c'ette fonction
    Code:
    9: void FXD1616U (/*unsigned arg0, unsigned arg1*/)
    10: {
    11: // use INDF1 for the counter...
    12: 
    13: _asm
    14: 
    15: // REM = 0
    16: clrf __REMB0, 0
    0484 6A03 CLRF [0x3]
    17: clrf __REMB1, 0
    0486 6A02 CLRF [0x2]
    18: 
    19: // INDF1 = 16
    20: movlw 16
    0488 0E10 MOVLW 0x10
    21: movwf INDF1, 0
    048A 6EE7 MOVWF 0xfe7, ACCESS
    22: 
    23: // Clear the carry
    24: bcf STATUS, 0, 0
    048C 90D8 BCF 0xfd8, 0, ACCESS
    25: 
    26: loop:
    27: 
    28: //AARG16 <<= 1; Carry is always clear at this point.
    29: rlcf __AARGB1, 1, 0
    048E 3606 RLCF [0x6], F
    30: rlcf __AARGB0, 1, 0
    0490 3607 RLCF [0x7], F
    31: 
    32: //PROD = (PROD << 1) | (AARG16 >> 16)
    33: rlcf __REMB1, 1, 0
    0492 3602 RLCF [0x2], F
    34: rlcf __REMB0, 1, 0
    0494 3603 RLCF [0x3], F
    35: 
    36: //if (PROD >= BARG16)
    37: movf __BARGB1, 0, 0
    0496 500B MOVF [0xb], W
    38: subwf __REMB1, 0, 0
    0498 5C02 SUBWF [0x2], W
    39: movf __BARGB0, 0, 0
    049A 500C MOVF [0xc], W
    40: subwfb __REMB0, 0, 0
    049C 5803 SUBWFB [0x3], W
    41: bnc endloop
    049E E305 BNC 0x4aa
    42: //{
    43: //PROD -= BARG16;
    44: movf __BARGB1, 0, 0
    04A0 500B MOVF [0xb], W
    45: subwf __REMB1, 1, 0
    04A2 5E02 SUBWF [0x2], F
    46: movf __BARGB0, 0, 0
    04A4 500C MOVF [0xc], W
    47: subwfb __REMB0, 1, 0
    04A6 5A03 SUBWFB [0x3], F
    48: 
    49: //++AARG16; Since AARG16 was shift to the left above, the increment will
    50: // simply set the LSbit. Using incf also clears the carry, which
    51: // means we don't have to clear the carry at the top of the loop.
    52: incf __AARGB1, 1, 0
    04A8 2A06 INCF [0x6], F
    53: //}
    54: 
    55: endloop:
    56: decfsz INDF1, 1, 0 // does not affect the carry bit
    04AA 2EE7 DECFSZ 0xfe7, F, ACCESS
    57: bra loop
    04AC D7F0 BRA 0x48e
    58: 
    59: _endasm
    60: 
    61: /* result in AARG already... */
    62: }
    04AE 0012 RETURN 0
    et avec le decalage
    Code:
    165: degre=degre>>4;
    0168 0EFD MOVLW 0xfd
    016A CFDB MOVFF 0xfdb, 0x2
    016C F002 NOP
    016E 0EFE MOVLW 0xfe
    0170 CFDB MOVFF 0xfdb, 0x3
    0172 F003 NOP
    0174 0E04 MOVLW 0x4
    0176 90D8 BCF 0xfd8, 0, ACCESS
    0178 3203 RRCF [0x3], F
    017A 3202 RRCF [0x2], F
    017C 04E8 DECF 0xfe8, W, ACCESS
    017E E1FB BNZ 0x176
    0180 0EFD MOVLW 0xfd
    0182 C002 MOVFF 0x2, 0xfdb
    0184 FFDB NOP
    0186 0EFE MOVLW 0xfe
    0188 C003 MOVFF 0x3, 0xfdb
    018A FFDB NOP
    voila personnellement je trouve vraiment incompréhensible que la valeur ne change pas

    voici le .c en complet (linge 165)
    http://cortexet.free.fr/pic/pic18f.c
    et le asm
    http://cortexet.free.fr/pic/pic18f.asm

  9. #6
    sifourquier

    Re : Calcul unsigned int pic18f4420

    j'ai une solution mais pas d'explication avec
    degre>>=4 ; sa fonctionne

    en asm
    Code:
    000170    0x50D9    movf    0xd9, 0, 0        165: 	degre>>=4;
    000172    0x0FFD    addlw   0xfd
    000174    0x6EE9    movwf   0xe9, 0
    000176    0x0EFF    movlw   0xff
    000178    0x20DA    addwfc  0xda, 0, 0
    00017A    0x6EEA    movwf   0xea, 0
    00017C    0x0E04    movlw   0x4
    00017E    0x0B0F    andlw   0xf
    000180    0xE006    bz      0x18e
    000182    0x52EC    movf    0xec, 0x1, 0
    000184    0x90D8    bcf     0xd8, 0, 0
    000186    0x32ED    rrcf    0xed, 0x1, 0
    000188    0x32EF    rrcf    0xef, 0x1, 0
    00018A    0x06E8    decf    0xe8, 0x1, 0
    00018C    0xE1FA    bnz     0x182

  10. Publicité

Discussions similaires

  1. unsigned demande explication dans programme
    Par kixxxx dans le forum Logiciel - Software - Open Source
    Réponses: 1
    Dernier message: 04/05/2010, 23h06
  2. X=int(A) U Fr(A) U int(X\A) ?
    Par anouar437 dans le forum Mathématiques du supérieur
    Réponses: 1
    Dernier message: 29/11/2008, 15h49
  3. Réponses: 14
    Dernier message: 29/05/2006, 09h30
  4. int management
    Par biba dans le forum Orientation après le BAC
    Réponses: 0
    Dernier message: 22/04/2005, 18h36
  5. INT management / Telecom INT
    Par biba dans le forum Orientation après le BAC
    Réponses: 0
    Dernier message: 02/02/2005, 17h44
Découvrez nos comparatifs produits sur l'informatique et les technologies.