problème boucle interruption avec boucle spi
Répondre à la discussion
Affichage des résultats 1 à 9 sur 9

problème boucle interruption avec boucle spi



  1. #1
    invitef9a5b0e0

    problème boucle interruption avec boucle spi


    ------

    Bonjour,

    J'utilise pic32mx360F512
    Mon probleme est le suivant: J'ai ajouté une boucle interruption dans mon programme (main) pour réaliser une tache tout simple (clignoter une led)
    L'interruption est bloquer au niveau de mon boucle spi (utilisé pour communiquer avec une dalle capactitive)
    En mode debug, je vois que le "step" reste coincé dans le boucle ecriture spi (la communication spi marche tres bien sans boucle interruption)

    Voici un peu de code:
    main()
    {
    OpenTimer2(T2_ON | T2_SOURCE_INT | T2_PS_1_256, T2_TICK);

    // set up the timer interrupt with a priority of 2
    ConfigIntTimer2(T2_INT_ON | T2_INT_PRIOR_2);

    // enable multi-vector interrupts
    INTEnableSystemMultiVectoredIn t();

    while(1)
    {
    ....
    stage= TouchGetStage();//communication avec dalle capac par spi
    //programme est bloqué ici
    ....
    }

    }
    //boucle interruption
    void __ISR(_TIMER_2_VECTOR, ipl2) Timer2Handler(void)
    {
    // clear the interrupt flag

    LATBbits.LATB3=~LATBbits.LATB3 ;
    mT2ClearIntFlag();

    }
    ...
    /// fonction TouchGetStage
    short TouchGetStage( void )
    {

    SPI_SS_PORT = 0;

    WriteToAD7147(0xE40B);
    CDC_RESULT_Sx[0]=ReadFromAD7147();
    ....
    SPI_SS_PORT = 1;
    }
    ....
    //boucle spi
    unsigned short WriteToAD7147( unsigned short data )
    {while(SPI1STATbits.SPITBE==0) ;
    SPI1BUF = data; // write to buffer for TX
    while(!SPI1STATbits.SPIRBF);IF S0CLR = 0x03000000; // wait for transfer to complete
    return SPI1BUF; // read the received value
    }//writeSPI1
    unsigned short ReadFromAD7147(void)
    {
    SPI1BUF = 0; // write to buffer for TX
    while(!SPI1STATbits.SPIRBF);IF S0CLR = 0x03000000; // wait for transfer to complete
    return SPI1BUF; // read the received value
    }//readSPI1

    Avez vous une idée pour mon probleme svp?

    Merci d'avance

    -----

  2. #2
    invitef9a5b0e0

    Re : problème boucle interruption avec boucle spi

    J'ai essayer de désactivé le boucle interrup avant le boucle spi : le boucle spi s’exécute bien

    INTDisableInterrupts();
    stage= TouchGetStage();//communication avec ecran capac par spi
    INTDisableInterrupts();

    Est qu'il y a une explication pour cela?
    Est ce qu'il y a un paramètre à activer pour que les 2 boucles fonctionnent bien ensemble?
    Ou si cela n'est pas normale, c'est ou l'erreur de mon programme?

    Avez vous une idée svp?

  3. #3
    spown

    Re : problème boucle interruption avec boucle spi

    Bonsoir/Bonjour,

    Désolé mais ça fait mal au yeux de lire ton programme en cette format.

    Juste pour te dire: on peut pas implanter une interruption dans le main. ( Est ce que tu sais à quoi sert la fonction interruption ? Si oui ton mieux )

  4. #4
    invite5637435c

    Re : problème boucle interruption avec boucle spi

    Bonsoir,

    la routine d'interruption n'est pas dans le main spown

    Alice utilise les balises html [CODE]...programme...[/CODE.] en enlevant le point après le dernier code (sinon tu ne pourrais pas lire ce que j'ai écris).

    Ca donnera ça:

    Code:
    main()
    {
       OpenTimer2(T2_ON | T2_SOURCE_INT | T2_PS_1_256, T2_TICK);
     
        // set up the timer interrupt with a priority of 2
        ConfigIntTimer2(T2_INT_ON | T2_INT_PRIOR_2);
     
        // enable multi-vector interrupts
        INTEnableSystemMultiVectoredIn  t();
     
       while(1)
       {
           ....
           stage=	TouchGetStage();//communication avec dalle capac par spi
                                                     //programme est bloqué ici
           ....
        }
     
    }
    //boucle interruption 
    void __ISR(_TIMER_2_VECTOR, ipl2) Timer2Handler(void)
    {
        // clear the interrupt flag
     
    LATBbits.LATB3=~LATBbits.LATB3  ;
        mT2ClearIntFlag();
     
    }
    ...
    /// fonction TouchGetStage
     short TouchGetStage( void )
    {
     
    				SPI_SS_PORT	= 0;
     
    				WriteToAD7147(0xE40B);		 
    				CDC_RESULT_Sx[0]=ReadFromAD7147();
                                   ....
                                   SPI_SS_PORT = 1;
    }
    ....
    //boucle spi
    unsigned short WriteToAD7147( unsigned short data )
    {while(SPI1STATbits.SPITBE==0)  ; 
        SPI1BUF = data;					// write to buffer for TX
         while(!SPI1STATbits.SPIRBF);IF  S0CLR = 0x03000000;	// wait for transfer to complete
        return SPI1BUF;    				// read the received value
    }//writeSPI1
     unsigned short ReadFromAD7147(void)
    {
        SPI1BUF = 0;					// write to buffer for TX
        while(!SPI1STATbits.SPIRBF);IF  S0CLR = 0x03000000;	// wait for transfer to complete
        return SPI1BUF;    				// read the received value
    }//readSPI1
    Nettement plus lisible comme tu le vois

  5. A voir en vidéo sur Futura
  6. #5
    spown

    Re : problème boucle interruption avec boucle spi

    Merci HULK28,

    Si j'ai bien compris TouchGetStage( void ) fonctionne correctement sans void __ISR(_TIMER_2_VECTOR, ipl2) Timer2Handler(void) ?? ( Avec Timer2 dans le main )

    As-tu vu des exemples ici : ==> http://www.microchip.com/CodeExamplesByFunc.aspx ??

  7. #6
    invite5637435c

    Re : problème boucle interruption avec boucle spi

    J'aurai fait plutôt ça:

    Code:
    //boucle spi
    unsigned short WriteToAD7147( unsigned short data )
    {while(SPI1STATbits.SPITBE==0)  ; // inutile à virer
       // SPI1BUF = data;// write to buffer for TX cette ligne est mal placée
         while(SPI1STATbits.SPITBF); // ajouter cette ligne
     SPI1BUF = data;// write to buffer for TX //la fameuse ligne mal placée du dessus doit être placée ici
         while(!SPI1STATbits.SPIRBF);IF  S0CLR = 0x03000000;	// wait for transfer to complete 
        return SPI1BUF;    				// read the received value
    }//writeSPI1
     unsigned short ReadFromAD7147(void)
    {
        SPI1BUF = 0;					// write to buffer for TX
        while(!SPI1STATbits.SPIRBF);IF  S0CLR = 0x03000000;	// wait for transfer to complete
        return SPI1BUF;    				// read the received value
    
    }//readSPI1
    Essaye je n'ai pas vérifié.

  8. #7
    invite5637435c

    Re : problème boucle interruption avec boucle spi

    Je ne sais pas ce que c'est comme compilo mais que c'est lourdingue comme écriture ce code....

  9. #8
    spown

    Re : problème boucle interruption avec boucle spi

    C'est le compilo C30 de MPLAB .


    while(!SPI1STATbits.SPITBE) ; // C'est pour le Buffer de TX

    while(!SPI2STATbits.SPIRBF) ; // C'est pour le Buffer de RX

  10. #9
    spown

    Re : problème boucle interruption avec boucle spi

    Je confirme ce que HULK a dit :

    Essaye ça:

    Code:
    unsigned int WriteToAD7147( unsigned int data )
    {
            SPI1BUF= data;      
            while( !SPI1STATbits.SPIRBF);        // attendre la transmission 
            return SPI1BUF;
    }
    Dernière modification par Jack ; 16/03/2013 à 09h26. Motif: Autant donner de bonnes habitudes => balises code

Discussions similaires

  1. Diagramme de Bode boucle ouverte et boucle fermée
    Par invite29a24ce3 dans le forum Physique
    Réponses: 4
    Dernier message: 21/06/2012, 14h24
  2. boucle dans une boucle
    Par invite320d6e59 dans le forum Programmation et langages, Algorithmique
    Réponses: 5
    Dernier message: 15/04/2012, 10h51
  3. Probleme boucle for ou boucle do...while imbriquées
    Par invite3d4f2ff3 dans le forum Électronique
    Réponses: 8
    Dernier message: 09/06/2010, 11h32
  4. Boucle ouverte boucle fermée
    Par invitedaf7b98f dans le forum Physique
    Réponses: 5
    Dernier message: 10/01/2010, 16h13
  5. probleme d'indexage de boucle for avec matlab
    Par invitec45730b2 dans le forum Logiciel - Software - Open Source
    Réponses: 2
    Dernier message: 23/10/2007, 03h32
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...