reprise de prog aprés interruption (pic16f877)
Répondre à la discussion
Affichage des résultats 1 à 14 sur 14

reprise de prog aprés interruption (pic16f877)



  1. #1
    invite3bf0caa8

    reprise de prog aprés interruption (pic16f877)


    ------

    Bonjour à tous.
    Je suis en train de programmer un pic16f877 afin de réaliser un comparateur à deux seuils mais je ne comprend absolument pas pourquoi, lors de l'interruption, le programme ne reprend pas ou il c'est arrêté.
    Je programme sous MPLAB avec pic-lite puis je programme le pic avec icprog en low voltage (j'ai repris le schéma de Lothar) .

    voila mon code

    Code:
    unsigned char compteur=0;
    unsigned char MesureAN0=0;
    unsigned char MesureAN1=0;
    unsigned char MesureAN2=0;
    static int TempoAD=20;
    static int i=0;
    
    unsigned char GetAN0 (void)
    	{
    	ADCON0=0x81; 
    	for (i=0;i<TempoAD;i++){}
    	ADGO=1; //Lancement de la conversion A/D
    	while(ADGO){} //attente de la conversion
    	return (ADRESH);
    	}
    
    unsigned char GetAN1 (void)
    	{
    	ADCON0=0x89;
    	for (i=0;i<TempoAD;i++){}
    	ADGO=1; //Lancement de la conversion A/D
    	while(ADGO){} //attente de la conversion
    	return (ADRESH);
    	}
    
    unsigned char GetAN2 (void)
    	{
    	ADCON0=0x91; 
    	for (i=0;i<TempoAD;i++){}
    	ADGO=1; //Lancement de la conversion A/D
    	while(ADGO){} //attente de la conversion
    	return (ADRESH);
    	}
    
    /*Gestion de interruptions*/
    interrupt GestionInterruption(void)
    {
    
    if (T0IF==1)
    	{
    
    		MesureAN0=GetAN0();
    		MesureAN1=GetAN1();
    		MesureAN2=GetAN2();
    		if (MesureAN0>MesureAN1) RA3=0;
    		if (MesureAN0<MesureAN2) RA3=1;
    		}
    TMR0=0x00;
    T0IF=0;
    }
    
    void main (void)
    {
    
    /************initialisation du pic************/
    //PortA
    TRISA=0x07;
    ADCON1=0x02;
    RA3=0;
    //Timer0
    OPTION=0x87;
    TMR0=0x00;
    
    
    //interruptions
    INTCON=0xA0;
    
    while (1)
    {}
    }

    A la fin de l'interruption la fonction main et est totalement exécuter (enfin je pense) car RA3 repasse à zéro.
    J'ai aussi essayé de faire clignoter une diode(programme le plus simple possible) mais le même problème est apparue. J'ai pas trouvé la source du problème que ce soit sur le net ou sur les cours de BIGONOFF.

    Merci de votre aide.

    -----

  2. #2
    Seb.26

    Re : reprise de prog aprés interruption (pic16f877)

    Si tu appel GetAN0() & Co dans ton main plutôt que dans ton IT, ça marche ?

    PS: pourquoi tant de haine ? ... ( utiliser le CAN dans une IT ... )
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  3. #3
    invite3bf0caa8

    Re : reprise de prog aprés interruption (pic16f877)

    Re
    Non ça ne change absolument rien. Mais pourquoi ne pas mettre la conversion dans l'IT? Aprés l'interruption je repasse toujours pas la fonction main entièrement et je ne retourne pas directement dans la boucle.
    La conversion AN ne marche absolument pas non plus mais j'essaye de résoudre les problème un par un.
    Merci de ton aide.

  4. #4
    Seb.26

    Re : reprise de prog aprés interruption (pic16f877)

    Citation Envoyé par patwice Voir le message
    Non ça ne change absolument rien.
    OK, donc commence par faire fonctionner la conversion CAN ...

    Il va te falloir repotasser la doc je pense ...
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

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

    Re : reprise de prog aprés interruption (pic16f877)

    En C, je connais pas, mais le même genre de problème en assembleur, j'aurais dit qu'il y a un problème de genre instruction return au lieu de rtfie (return from interrupt).

    Je suppose que en C le compilo place des rtfie tout seul comme un grand. Enfin, à vérifier quand même... Il faut pas lui mettre un mot clef spécial pour lui indiquer que ta routine est une interruption ?

  7. #6
    Seb.26

    Re : reprise de prog aprés interruption (pic16f877)

    Citation Envoyé par mat64 Voir le message
    En C, je connais pas, mais le même genre de problème en assembleur, j'aurais dit qu'il y a un problème de genre instruction return au lieu de rtfie (return from interrupt).
    Je suppose que en C le compilo place des rtfie tout seul comme un grand. Enfin, à vérifier quand même... Il faut pas lui mettre un mot clef spécial pour lui indiquer que ta routine est une interruption ?
    C'est pas un problème d'IT, c'est les conversion qui plantent ... sinon ça marcherait dans le main ...
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  8. #7
    invite3bf0caa8

    Re : reprise de prog aprés interruption (pic16f877)

    Le CAN posant peut être problème j'ai refait un programme que l'on peut qualifier de simple.

    Code:
    #include <pic.h>
    
    void interrupt gestion_IT(void)
    {
    RB0=RB0^1;
    T0IF=0;
    }
    
    void main (void)
    {
    OPTION=0x87;
    TMR0=0;
    INTCON=0xA0;
    TRISB=TRISB&0xfe;
    RB0=1;
    while(1)
    {}
    }
    Dans ce code, l'interruption modifie la sortie RB0 qui repasse à 1 dessuite après(dans le main). J'ai toujours pensé que après interruption le programme revenait ou il s'était arrête et dans le cas si dessus il ne peut absolument pas sortir de la boucle. J'ai ajouté un condensateur entre vdd et vss pensant que le pic repartait a zéros mais ça ne change rien.
    lors de l'envoie du programme WDT,BODEN,LVP,WRT sont coché et l'oscillateur et sur HS (j'ai un quartz à 20MHz). Je ne pense pas que le problème vienne de là mais je préfère le signaler on sait jamais.

  9. #8
    invite3bf0caa8

    Re : reprise de prog aprés interruption (pic16f877)

    Re tous le monde.
    En fait il suffit de décocher toute les case dans Icprog sauf WRT. Je ne sais pas pourquoi mais je devrai relire l'intro de Bigonof j'ai surement sauté un chapitre. Je vais regarder à quoi cela correspond.
    Merci de votre aide.

  10. #9
    invite87be5ae9

    Re : reprise de prog aprés interruption (pic16f877)

    Citation Envoyé par patwice Voir le message
    Re tous le monde.
    En fait il suffit de décocher toute les case dans Icprog sauf WRT. Je ne sais pas pourquoi mais je devrai relire l'intro de Bigonof j'ai surement sauté un chapitre. Je vais regarder à quoi cela correspond.
    Merci de votre aide.
    Bonjour

    Essaie de programmer directement tes fusibles dans ton fichier source original !
    C'est beaucoup plus sûr et tu les as sous les yeux à chaque fois
    A+

  11. #10
    invite3bf0caa8

    Re : reprise de prog aprés interruption (pic16f877)

    Oui je pense que c'est le plus simple et le plus sure. Je pense que mon problème vient de BODEN. En effet, je pense que mon pic redémarrer suite a une chute de tension. Mon régulateur est limite et le condensateur en vdd et vss ne doit pas être suffisant.

    Merci d'avoir donné de votre temps.

  12. #11
    Oncle Archibald

    Re : reprise de prog aprés interruption (pic16f877)

    Salut,
    C'est le fusible WDT (WatchDog Timer) qui est en cause.
    Si tu l'actives sans le gérer (voir l'instruction 'CLRWDT') dans ton programme, il fait son office de chien de garde (reset du programme après dépassement du délai qui lui est imparti).

    Vérifier aussi si l'instruction 'RETFIE' à la fin de la routine d'interruption est gérée par le compilateur C (voir la remarque de mat64).

  13. #12
    invite5637435c

    Re : reprise de prog aprés interruption (pic16f877)

    Salut,

    je rejoins l'avis de seb26, faire des conversions A/D dans la boucle d'interruption c'est pas très sérieux.
    On ne doit trouver dans les interruptions que des activations d'ordres vers des fonctions externes, donc jamais de tempo par exemple ou d'appel de fonctions lourdes ou longues en traitement comme une conversion A/D.
    C'est une très mauvaise habitude que tu prends là.

    Alors qu'il suffit simplement de faire une tempo qui toute les secondes (ou autre) va déclencher automatiquement les mesures à cycles constant dans le main().
    @+

  14. #13
    invite5637435c

    Re : reprise de prog aprés interruption (pic16f877)

    Exemple:


    Clock.Flag10ms = 0; // On efface le flag

    Code:
    main(){
    
    .........
    }
    
    while(1){
    	CLRWDT();   // réarmement du WachtDog (si besoin)
    		
    	if(Clock.Flag10ms) // si Clock.Flag10ms passe à 1 dans l'interruption.	
    	 	{
                    Clock.Flag10ms = 0;  // On efface le flag
    	 	LanceConversions(); // on lance les conversions analogiques à réaliser et éventuellement d'autres tâches ici
                             ......................
                    }
             }
    }
    et dans l'interruption:

    Code:
    void interrupt(){
    if(Timer1InterruptFlag)
    	{
    		Timer1InterruptFlag = 0;
     	 	Clock.Flag10ms = 1;
    	 	Timer1High = 0xF6;
    	 	Timer1Low = 0x3B;	   // 0xFFFF - 0xF63B = 2500 => 2500 x 4 µs = 10 ms
    	}
    }

  15. #14
    invite3bf0caa8

    Re : reprise de prog aprés interruption (pic16f877)

    En effet cette solution est plus logique mais moins évidente à trouver. La lisibilité du programme doit en prendre un coup (dans mon cas je ne pense pas que le code dépasse les 100lignes donc pas de problème). Mais bien commenté...
    Je vais revoir mon programme car cette solution est vraiment plus simple à gérer niveau timing et cela me semble effectivement plus correct.
    Merci de votre aide.

Discussions similaires

  1. Interruption C PIC16F877
    Par invite210e4233 dans le forum Électronique
    Réponses: 2
    Dernier message: 04/10/2007, 23h26
  2. [Divers] reprise beton
    Par kuznik dans le forum Dépannage
    Réponses: 0
    Dernier message: 01/10/2007, 11h12
  3. Reprise d'études après un BTS Electrotechnique et un DNTS conduite de projet
    Par inviteb52c947e dans le forum Orientation après le BAC
    Réponses: 0
    Dernier message: 16/03/2007, 19h26
  4. Reprise d'études
    Par invite2329c2ed dans le forum Orientation après le BAC
    Réponses: 8
    Dernier message: 05/12/2006, 23h38
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...