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

[C / PIC18] - Problème de détection d'interruption



  1. #1
    jorg1n

    [C / PIC18] - Problème de détection d'interruption


    ------

    Bonjour,

    j'ai réalisé une petite carte qui communique avec mon ordinateur en liaison RS485. la carte est équipé d'un PIC, et l'échange de données entre le maitre (PC) et l'esclave (PIC) marche correctement:
    ->détection de réception d'un message du maitre par IT
    -> traitement de la demande
    -> envoi de la réponse.

    Mon programme est composé en deux parties, un mode ou je gère la communication (mode 1), et un autre ou je ne fais qu'afficher des informations sur un LCD (mode 2). Donc lorsque je suis en mode 1, tout ce passe bien lors d'une demande du maitre, par contre dès que je passe en mode 2, forcément, le maitre arrive au timeout (2sec) et ne reçoit rien, cela ne me dérange pas trop encore, mais dès que je reviens en mode 1, et lorsque le maitre envoi une requete, le maitre ne traite pas la demande alors que l'interruption de reception est bien activée:

    Code:
    	GIE = 1;
    	PEIE = 1;
    	RCIE = 1;
    	RCIF = 0;
    D'où peut venir le problème??

    J'espère que j'ai été assez clair dans mon explication...
    Merci d'avance et bonne journée a tous

    -----

  2. Publicité
  3. #2
    SaiBot

    Re : [C / PIC18] - Problème de détection d'interruption

    Salut,

    As tu verifier que tu fait bien un reset du time out de ton maitre ?

  4. #3
    jorg1n

    Re : [C / PIC18] - Problème de détection d'interruption

    alors la tu me pose une colle... j'utilise un logiciel qui me permet de simuler des envoi de trame maitre et de visualiser la réponse... alors je ne sais pas du tout si il fait le reset du time out...

  5. #4
    SaiBot

    Re : [C / PIC18] - Problème de détection d'interruption

    Quel type de PIC utilise-tu ?
    Il se peut selon la gamme qu'il y est des priorités au niveau des interruptions (Haute et basse).

    A verifier.

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

    Re : [C / PIC18] - Problème de détection d'interruption

    J'utilise un 18F6722... je vais voir ça donc, car mes interruptions sont "appellées" comme ceci:
    Code:
    #pragma code high_vector=0x08
    void TIMER_400MS(void)
    {
    	_asm 
    	goto DEMARRAGE
    	_endasm
    }
    #pragma code
    donc en priorité haute... et toutes, TIMER, WATCHDOG, COM RS485, IT externe.

    Merci d'avance

  8. #6
    SaiBot

    Re : [C / PIC18] - Problème de détection d'interruption

    Voila ici on voit bien que c'est une interruption de "haute" priorité donc elle passera avant les autres.

    Verifie que l'interruption que tu n'arrive pas a traité ne situe pas en basse priorité car les interruptions de hautes priorite "coupent" celle qui sont basse.

  9. Publicité
  10. #7
    sdec25

    Re : [C / PIC18] - Problème de détection d'interruption

    Bonjour,
    J'ai pas bien compris le problème. Est-ce que RCIF ne se met pas à 1, où c'est l'interruption qui ne fonctionne pas ?
    Pour tester :
    • Surveiller RCIF au simulateur
    • Mettre RCIF à 1 manuellement et voir s'il y a l'interruption

  11. #8
    jorg1n

    Re : [C / PIC18] - Problème de détection d'interruption

    Merci pour vos conseils, je vais voir ça et je vous tiens au courant.

    Bonne fin de journée sous ce beau soleil

  12. #9
    SaiBot

    Re : [C / PIC18] - Problème de détection d'interruption

    ouais tiens nous au jus!
    Beau soleil, beau soleil..., moi je le trouve pas beau dans mon bureau a 37 degrés mdrr!

  13. #10
    RISC

    Re : [C / PIC18] - Problème de détection d'interruption

    Salut,

    Peux-tu faire voir ton code dans l'interruption ?
    As-tu plusieurs interruptions activées simultanément ?

    Quelle est la valeur de RCONbits.IPEN ?

    a+

  14. #11
    jorg1n

    Re : [C / PIC18] - Problème de détection d'interruption

    Bonjour RISC,

    Peux-tu faire voir ton code dans l'interruption ?
    Oui, le voici, il s'agit de tout l'ensemble de mon programme en ce qui concerne les interruptions:

    Code:
    #pragma interrupt DEMARRAGE
    void DEMARRAGE(void)
    {
      if (RCONbits.TO == 0)		//	Test du drapeau d'IT du WDT
    	{
         _asm 
    	 RESET
    	 _endasm
        }
    
      if(INTCON3bits.INT1IE)                            // Présence d'un interruption sur INT1
      {
        if(INTCON3bits.INT1IF)                          // Si le flag d'INT est activé
           {
            myState = START;                        	// Démarrage du programme
            INTCON3bits.INT1IF=0;                       // Effacement du flag d'interruption
           }
       }
    
      if(INTCON3bits.INT3IE)                            // Présence d'un interruption sur INT3
      {
        if(INTCON3bits.INT3IF)                          // Si le flag d'INT est activé
           {
    		LCD_ONOFF = 0;
    		BACKLIGHT = 0;
    		SaveCapaRemainBat (); 
            myState = OFF;	                        	//
            INTCON3bits.INT3IF=0;                       // Effacement du flag d'interruption
           }
       }
    
      if(INTCONbits.TMR0IE)                             // Présence d'un interruption sur Timer0
        {
        if(INTCONbits.TMR0IF)                           // Si le flag INT du Timer est activé
            {
              TMR0H = 0xE1;                         	// Valeur pour obtenir un Timer de 400ms
              TMR0L = 0x7C;                         	// Valeur pour obtenir un Timer de 400ms
    
              flagIT_Backlight++;                   	// Incrémentation de la variable flagIT_Backlight
              flagIT_ScreenStandby++;               	// Incrémentation de la variable flagIT_ScreenStandby
              flagIT_400ms = 1;                     	// Mise à 1 du flag Timer 400ms
    		  flagIT_GEStart++;
    
             if(flagIT_AlarmSignal==0)              	//
             {                                      	///
                 flagIT_AlarmSignal=1;              	////
                }                                  	    /////
                                                    	////// Inversement du flagIT_AlarmSignal
             else if(flagIT_AlarmSignal==1)         	/////   
                {                                  		////
                 flagIT_AlarmSignal=0;              	///
                }                                  	    //
    
    
              INTCONbits.TMR0IF = 0;                   	// Effacement du flag d'interruption
            }
        }
    
      if(PIE1bits.RC1IE)								// Demande d'envoi informations
    		{
    		if (PIR1bits.RCIF) 
    			{
    			EndRCIF = 1;
    			fonction =ReadMBFrame();
    			PIR1bits.RCIF = 0;
    			}
    		}
    }
    
    #pragma code high_vector=0x08
    void TIMER_400MS(void)
    {
    	_asm 
    	goto DEMARRAGE
    	_endasm
    }
    #pragma code
    As-tu plusieurs interruptions activées simultanément ?
    J'active mes interruptions une à une, mais au final, elles se retrouvent en fonctionnement ensemble durant le programme, et toutes au même niveau de priorité... est ce bien en fait ?

    Quelle est la valeur de RCONbits.IPEN ?
    "0" -> c'est à dire que les niveaux de priorité sont désactivés.

    Que me conseilles tu de faire RISC?

    Sinon, je n'ai pas eu encore le temps de testé le bit RCIF, mais je le ferai sous peu et je vous tiens au courant

    Merci encore pour votre aide

  15. #12
    DavidDB

    Re : [C / PIC18] - Problème de détection d'interruption

    Salut,
    Code:
    PIR1bits.RCIF = 0;
    Le bit RCIF est en lecture uniquement, donc inutile de tenter de l'effacer par soft, cela ne fonctionne pas...

    Pour effacer RCIF, il faut simplement lire le buffer de réception.

    Même en simulation, il n'est pas possible de passer manuellement RCIF à 1 vu que ce bit n'est accessible qu'en lecture...


    David.

  16. Publicité
  17. #13
    jorg1n

    Re : [C / PIC18] - Problème de détection d'interruption

    Bon bein... merci pour l'infos DavidDB...

  18. #14
    RISC

    Re : [C / PIC18] - Problème de détection d'interruption

    Salut,

    Je ne pense pas que cela porte à conséquence mais il vaudrait mieux mettre la déclaration des vecteurs d'interruption avant la fonction :

    Code:
     
    #pragma code high_vector=0x08
    void TIMER_400MS(void)
    {
    	_asm 
    	goto DEMARRAGE
    	_endasm
    }
    
    #pragma interrupt DEMARRAGE
    void DEMARRAGE(void)
    {
    ...
    Ce qui me fait peur dans ton code c'est que les interruptions sont pleines de variables apparemment globales...As-tu déclaré TOUTES les variables globales modifiées dans les ISR avec l'attribut "volatile" ?
    Si ce n'est pas le cas fait le immédiatement.

    Es-tu sûr de ne pas avoir un problème de temps de traitement ? (ton code d'interruptions est assez long...).
    A quelle vitesse (Fosc) tourne ton PIC18 ?
    Tu pourrais optimiser le temps de latence des interruptions en utilisant les "nosave" pour éviter que le compilateur sauve/restaure des zones de données non utilisées dans l'ISR automatiquement en entrant/sortant des ISR.
    Il existe un webseminar sur ce sujet

    Il est assez difficile de comprendre dans quel cas ton problème se produit. Personnellement, j'utiliserais les points d'arrêt évolués de l'ICD3 pour mettre un point d'arrêt sur l'écriture/la lecture d'un flag de ton application en RAM.

    Y a-t-il un flag particulier qui te permet de savoir dans quel mode tu es ?
    a+
    Dernière modification par RISC ; 20/08/2009 à 20h13. Motif: addition

  19. #15
    jorg1n

    Re : [C / PIC18] - Problème de détection d'interruption

    Bonjour à tous,

    j'ai un peu de temps enfin pour me remettre sur mon projet...

    pour répondre à RISC:
    Ce qui me fait peur dans ton code c'est que les interruptions sont pleines de variables apparemment globales...As-tu déclaré TOUTES les variables globales modifiées dans les ISR avec l'attribut "volatile" ?
    Si ce n'est pas le cas fait le immédiatement.
    Mes variables qui sont dans mon IT sont bien des variables globales, et sont déclarés dans mon fichier.c ainsi que dans un fichier.h avec le préfixe "extern". Je vais donc rajouter le préfixe "volatile" pour mes variables utilisées dans ma routine IT.

    A quelle vitesse (Fosc) tourne ton PIC18 ?
    mon quartz est à 20 Mhz

    Pour le reste, je vais voir, je vais faire un peu de debugage et me renseigner aussi sur les "nosave".

    Merci encore pour ces infos...

    BOnne journée a tous

  20. #16
    jorg1n

    Re : [C / PIC18] - Problème de détection d'interruption

    Bon, j'ai fais un peu de pas à pas...Et voila ce que j'observe:

    - Lors du lancement de mon programme, la communication marche bien, et dès que je passe dans un "mode" ou je ne gère plus la communication, le maitre ne reçoit rien, normal...

    -Et dès que je repasse dans le"mode" où je la gère, la communication ne marche pas mais :
    -> PIE1bits.RC1IE = 1 donc OK
    ->PIR1bits.RCIF est toujours égal à 0
    En ce qui concerne le registre de réception, il est égal à 0x03, je pense qu'il s'agit de la dernière valeur traité avant le "blocage"...

    Je continue de plonger dans le soft, mais si vous avez des infos à me faire part..je suis preneur...

    Merci d'avance

Discussions similaires

  1. probleme d'interruption microcontroleur ATMEGA32
    Par zoro95100 dans le forum Électronique
    Réponses: 1
    Dernier message: 25/06/2009, 09h17
  2. Probleme d'interruption sur PIC 18F4420
    Par mat_31 dans le forum Électronique
    Réponses: 2
    Dernier message: 09/06/2008, 08h45
  3. probleme avec la fonction sprintf sur pic18
    Par modelvincent dans le forum Électronique
    Réponses: 3
    Dernier message: 22/05/2007, 17h17
  4. Réponses: 2
    Dernier message: 23/04/2007, 12h32
  5. Réponses: 3
    Dernier message: 01/11/2005, 22h45
Découvrez nos comparatifs produits sur l'informatique et les technologies.