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

problème boucle interruption avec boucle spi




  1. #1
    alice123

    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. Publicité
  3. #2
    alice123

    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?

  4. #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 )


  5. #4
    HULK28

    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
    Tout est bien qui finit.

  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. A voir en vidéo sur Futura
  8. #6
    HULK28

    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é.
    Dernière modification par HULK28 ; 16/03/2013 à 01h27.
    Tout est bien qui finit.

  9. #7
    HULK28

    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....
    Tout est bien qui finit.

  10. Publicité
  11. #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

  12. #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 à 08h26. Motif: Autant donner de bonnes habitudes => balises code

Sur le même thème :

Discussions similaires

  1. Diagramme de Bode boucle ouverte et boucle fermée
    Par toniocb dans le forum Physique
    Réponses: 4
    Dernier message: 21/06/2012, 13h24
  2. boucle dans une boucle
    Par nir92 dans le forum Programmation et langages, Algorithmique
    Réponses: 5
    Dernier message: 15/04/2012, 09h51
  3. Probleme boucle for ou boucle do...while imbriquées
    Par Pilou81 dans le forum Électronique
    Réponses: 8
    Dernier message: 09/06/2010, 10h32
  4. Boucle ouverte boucle fermée
    Par bolltt dans le forum Physique
    Réponses: 5
    Dernier message: 10/01/2010, 15h13
  5. probleme d'indexage de boucle for avec matlab
    Par RBM dans le forum Logiciel - Software - Open Source
    Réponses: 2
    Dernier message: 23/10/2007, 02h32