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

Aide à la comprehension d'un morceau de C desassemblé



  1. #1
    paulfjujo

    Aide à la comprehension d'un morceau de C desassemblé


    ------

    bonjour,


    Je n'arrive pas à saisir comment peut fonctionner le code
    compris dans ma boucle
    Code:
      while(PORTAbits.RA4==1) 
        {
            PT1000=PT1000+1;
        };
    j'ai rajouté dans le Code C18 , 2 instruction ASM NOP , pour bien servir de repere
    dans le code dessassemblé...

    le test
    Code:
      5CB4    A880     BTFSS PORTA, 0x4, ACCESS
      5CB6    D014     BRA 0x5ce0
      5CDE    D7EA     BRA 0x5cb4
    Test du bit 4 du port A
    Skip if SET => va en 5CB4 donc boucle sur le test !
    sinon va en 5CE0 .. qui se situe apres l'incrementation de la varaible PT1000 (entier long signé)?
    le contenu de la boucle while ne serait jamais executé ..
    ce qui n'est pas le cas...

    pour un signal de 608µS etat haut, j'obtient une valeur de 606 ...
    ce qui m'etonne un peu quand meme , avec un cycle machine de 100nS
    j'esperait beaucoup plus..



    Votre avis ?
    Ou est-ce que je me plante ?
    j'ai pourtant deja fait de l'assembleur PIC..





    PIC18F46K22
    Q=10Mhz x 4 (PLL ON) soit 40Mhz
    cycle=4/40= 0,1µseconde

    code en C18 MPLAB IDE 8.92
    Code:
    // acquisition PT1000 Temper extt
     
        INTCONbits.GIE = 0;
        while(PT1000_OSC==1); // synchro sur niveau Haut 
        while(PT1000_OSC==0);
        //   while(PORTAbits.RA4==1) // mesure duree niveau haut
        _asm 
            NOP
        _endasm    
        while(PORTAbits.RA4==1) 
        {
            PT1000=PT1000+1;
        };
         _asm 
          NOP
         _endasm 
        INTCONbits.GIE = 1;
        k=sprintf(txt,"\t PT1000=%6ld ",PT1000);
        k=PutStr_RS2(txt);

    View dissambly Listing

    Code:
        
      5CA8    9EF2     BCF INTCON, 0x7, ACCESS
    3621:               // acquisition PT1000 Temper extt
      5CAA    B880     BTFSC PORTA, 0x4, ACCESS
      5CAC    D7FE     BRA 0x5caa
    3622:               
      5CAE    A880     BTFSS PORTA, 0x4, ACCESS
      5CB0    D7FE     BRA 0x5cae
    3623:                  INTCONbits.GIE = 0;
    3624:                  while(PT1000_OSC==1); // synchro sur niveau Haut 
    3625:                  while(PT1000_OSC==0);
      5CB2    0000     NOP
    3626:                  //   while(PORTAbits.RA4==1) // mesure duree niveau haut
    3627:                  _asm 
      5CB4    A880     BTFSS PORTA, 0x4, ACCESS
      5CB6    D014     BRA 0x5ce0
      5CDE    D7EA     BRA 0x5cb4
    3628:                      NOP
    3629:                  _endasm    
      5CB8    C6B4     MOVFF PT1000, PT1000
      5CBA    F6B4     NOP
      5CBC    C6B5     MOVFF 0x6b5, 0x6b5
      5CBE    F6B5     NOP
      5CC0    C6B6     MOVFF 0x6b6, 0x6b6
      5CC2    F6B6     NOP
      5CC4    C6B7     MOVFF 0x6b7, 0x6b7
      5CC6    F6B7     NOP
      5CC8    0106     MOVLB 0x6
      5CCA    2BB4     INCF 0xb4, F, BANKED
      5CCC    0E00     MOVLW 0
      5CCE    0106     MOVLB 0x6
      5CD0    23B5     ADDWFC 0xb5, F, BANKED
      5CD2    0E00     MOVLW 0
      5CD4    0106     MOVLB 0x6
      5CD6    23B6     ADDWFC 0xb6, F, BANKED
      5CD8    0E00     MOVLW 0
      5CDA    0106     MOVLB 0x6
      5CDC    23B7     ADDWFC 0xb7, F, BANKED
    3630:                  while(PORTAbits.RA4==1) 
    3631:                  {
    3632:                      PT1000=PT1000+1;
      5CE0    0000     NOP
    3633:                  };
    3634:                   _asm 
      5CE2    8EF2     BSF INTCON, 0x7, ACCESS

    -----

  2. #2
    Biname

    Re : Aide à la comprehension d'un morceau de C desassemblé

    Hello,

    As-tu déclaré que RA4 est une entrée ? En basic : '#define portA.4 in' en C ???

    Sur de nombreux PIC, la sortie RA4 est à collecteur ouvert, il faut ajouter une résistance pull up pour l'utiliser en sortie. RA4 est une patte à surprises

    Google ("pic ra4 not working") pour t'en convaincre.

    Biname
    Dernière modification par Biname ; 07/02/2015 à 18h07.

  3. #3
    paulfjujo

    Re : Aide à la comprehension d'un morceau de C desassemblé

    bonsoir,


    je n'ai pas de probleme particulier avec l'entree RA4 !
    ce n'est que le code desassemblé qui me semble plus que louche ...




    Code:
    #define PT1000_OSC PORTAbits.RA4
    
    // init hardware
     
    ANSELA=0;
    ANSELAbits.ANSA0=1;
    ANSELAbits.ANSA1=1
    ANSELAbits.ANS2=1;
    TRISA=0b11011111;  // PORTA RA0,RA1,RA2=Analog input RA3,RA4 Input RA5 output  (RA6-RA7 Quartz)


    Je confirme d'ailleurs, qu'il doit y avoir un bug dansMPLAB car j'ai testé le meme bout de code C
    avec MikroC et là, la version asm montre un comportement correct sur le test de RA4==1.

    le code en mikroC
    Code:
     asm{
           NOP
           }
    
        while( PT1000_OSC==1);
        while( PT1000_OSC==0);
        while( PT1000_OSC==1)
        {
          PT1000++;
        }
         asm{
           NOP
           }
    la version equivalente asm
    me parait ici correct au niveau du test etat 1 sur RA4
    La boucle d'incrementation est bien executee tant que RA4==1

    Code:
    ;18F46K22_UART_LM335_PT1000.c,335 :: 		NOP
      	NOP
    ;18F46K22_UART_LM335_PT1000.c,338 :: 		while( PT1000_OSC==1);
    L_main40:
      	BTFSS       PORTA, 4 
      	BRA         L_main41
      	BRA         L_main40
    L_main41:
    ;18F46K22_UART_LM335_PT1000.c,339 :: 		while( PT1000_OSC==0);
    L_main42:
      	BTFSC       PORTA, 4 
      	BRA         L_main43
      	BRA         L_main42
    L_main43:
    ;18F46K22_UART_LM335_PT1000.c,340 :: 		while( PT1000_OSC==1)
    L_main44:
      	BTFSS       PORTA, 4 
      	BRA         L_main45
    ;18F46K22_UART_LM335_PT1000.c,342 :: 		PT1000++;
      	MOVLB       0
      	INFSNZ      _PT1000, 1, 1
      	INCF        _PT1000+1, 1, 1
    ;18F46K22_UART_LM335_PT1000.c,343 :: 		}
      	BRA         L_main44
    L_main45:
    ;18F46K22_UART_LM335_PT1000.c,345 :: 		NOP
      	NOP

  4. #4
    paulfjujo

    Lightbulb Re : Aide à la comprehension d'un morceau de C desassemblé

    SOLVED ou du moins expliqué..
    sur
    http://www.microchip.com/forums/m845657.aspx

Discussions similaires

  1. Aide à la compréhension d'un schéma
    Par jeje22200 dans le forum Électronique
    Réponses: 4
    Dernier message: 27/11/2013, 18h27
  2. Aide compréhension d'un schéma
    Par ttoppeur dans le forum Électronique
    Réponses: 10
    Dernier message: 27/04/2013, 18h33
  3. important: aide a la comprehension du CAN
    Par anouardu82 dans le forum Électronique
    Réponses: 12
    Dernier message: 05/01/2013, 22h18
  4. Aide de comprehension
    Par Brizzio dans le forum Mathématiques du collège et du lycée
    Réponses: 2
    Dernier message: 27/04/2009, 15h54
  5. Aide de comprehension
    Par yohann1906 dans le forum Epistémologie et Logique (archives)
    Réponses: 5
    Dernier message: 26/09/2007, 17h04
Découvrez nos comparatifs produits sur l'informatique et les technologies.