[C / PIC18] - Problème de détection d'interruption
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. #2
    invite7b360637

    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 ?

  3. #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...

  4. #4
    invite7b360637

    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.

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

  7. #6
    invite7b360637

    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.

  8. #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

  9. #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

  10. #9
    invite7b360637

    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!

  11. #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+

  12. #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

  13. #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.

  14. #13
    jorg1n

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

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

  15. #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

  16. #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

  17. #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 invitef7a62343 dans le forum Électronique
    Réponses: 1
    Dernier message: 25/06/2009, 09h17
  2. Probleme d'interruption sur PIC 18F4420
    Par invite919cb150 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. Communication I2C entre PIC et ordinateur / Problème d'interruption
    Par invite68d5b092 dans le forum Électronique
    Réponses: 3
    Dernier message: 01/11/2005, 22h45
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...