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

PIC18F interuption et variable globale



  1. #1
    manuj

    Angry PIC18F interuption et variable globale


    ------

    Bonjour,

    Je viens de réaliser une interruption avec un timer. Dans ma fonction d'interruption je réalise une conversion analogique/numérique. La valeur de ma conversion est enregistré dans une variable globale.
    Puis dans mon main je réutilise cette variable.

    Mon interruption fonctionne, mon convertisseur A/N aussi.
    Mais quand je repasse dans le main ma variable global et j'ai remarqué qu'elle changait aussi d'adresse .

    J'ai déclaré ma variable global en volatile et en static mais rien ne change, elle est toujours modifier quand je sort de mon interruption.

    Code:
    volatile short temporisation,tpwm;
    volatile int C_courant;
    
    void MyInterrupt(void);
    
    // on déclare que lors d'une interruption
    #pragma code highVector=0x008
    void atInterrupthigh(void)
    {
    // on doit éxecuter le code de la fonction MyHighInterrupt
    _asm GOTO MyInterrupt _endasm		
    }
    #pragma code // retour à la zone de code
    
    
    // ************************
    // ****  Interruptions ****
    // ************************
    #pragma interrupt MyInterrupt 
    void MyInterrupt(void)
    {
    	unsigned char sauv1;
    	unsigned char sauv2;
    
    	// on sauvegarde le contenu des registres de calcul
    	sauv1 = PRODL;
    	sauv2 = PRODH;	
    
    	// c'est le Timer1 qui a levé l'interruption
    	if (INTCONbits.TMR0IF) 
    	{
    		// on va réautoriser l'interruption
    		INTCONbits.TMR0IF = 0; 
    		
    		//
    		if ( temporisation >= 65 ) 
    		{
    			// on remet à 0 pour le prochain timer
    			temporisation = 0;  
    			//Vmoteur = adc(Imoteur);
    
    
    			if ( tpwm >=10){
    			tpwm=0;
    			C_courant = adc(POT1);
    			} else { 
    			tpwm++; }
    			
    			
    		}
    		else
    		{
    			// on incrémente notre variable compteur
    			temporisation++;
    		}	
    	}
    
    	// on restaure les registres de calcul
    	PRODL = sauv1;
    	PRODH = sauv2;		
    }
    
    
    
    
    //------------------------------------------------------------------------
    //
    //                   MAIN
    //
    //------------------------------------------------------------------------
    
    
    void main(void){
    
    int PWM_moteur,C_courant;
    
    InitPic();
    temporisation=0;
    tpwm=0;
    
    
    			LATCbits.LATC0 = 0;
    			LATAbits.LATA4 = 1;
    
    
    while(1){
    
    //temp=test-0x200;
    //
    //		if ( temp > 0){
    //			C_courant=temp;
    //			LATCbits.LATC0 = 0;
    //			LATAbits.LATA4 = 1;
    //		} else {
    //			C_courant=512-(512+ temp);
    //			LATCbits.LATC0 = 1;
    //			LATAbits.LATA4 = 0;
    //		}
    //
    Nop();
    
    PWM_moteur=(C_courant);
    
    
    
    //--------------------------------------------
    //					PWM
    //--------------------------------------------
    	
    	SetDCPWM1(0);
    //	SetDCPWM1(PWM_moteur);
    	
    	}
    }
    Comment remédier à cela ?

    Merci par avance.

    -----

  2. Publicité
  3. #2
    Seb.26

    Re : PIC18F interuption et variable globale

    Normal que ça marche pas ... tu as aussi déclaré c_courant comme une variable locale à ton main ... pourquoi ???

    PS: perso, j'aime pas mettre trop de code dans les IT, j'aime bien que mes IT soient très courtes ... surtout sur desuCPU quoi n'ont qu'un ou deux niveaux d'IT ... ... sans parler du temps CPU qui est gaspillé pour l'empilement/dépilement du contexte ...
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  4. #3
    manuj

    Re : PIC18F interuption et variable globale

    J'ai trouvé ma place
    Pourtant j'ai bien regardé.

    Sinon tu fais comment pour avoir des interruptions les plus courte possible, car dans mon cas je veux faire 3 mesures à fréquence d'échantillonnage différentes.

  5. #4
    Seb.26

    Re : PIC18F interuption et variable globale

    Citation Envoyé par manuj Voir le message
    J'ai trouvé ma place
    Pourtant j'ai bien regardé.
    Normal ... je sais pas pourquoi, mais c'est toujours simple de trouver les bugs des autres, et on reste souvent 2 ou 3 jours à chercher les siens ...

    Citation Envoyé par manuj
    Sinon tu fais comment pour avoir des interruptions les plus courte possible, car dans mon cas je veux faire 3 mesures à fréquence d'échantillonnage différentes.
    Je ne mets presque aucun code dans les IT quand c'est possible, par exemple dans ton cas ou tu veux faire des mesures, j'utiliserais un flag (un bit) que ton IT positionne à 1 pour dire "il faudrait faire une conversion" et ta boucle principale traite le flag : "OK, j'ai fait la conversion, le remets le flag à 0" ...

    De cette façon, tu peux avoir x taches qui tournent en même temps, et tu es maitre de quelle tache a la priorité, alors que si c'est dans une IT, le reste STOP le temps de l'IT ...
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

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

    Re : PIC18F interuption et variable globale

    Bonjour à tous,

    Comme manuj, j'ai presque le même problème de variable, à la différence que ma routine d'interruption et mon main ne sont pas dans le même fichier .c. J'ai tenté plusieurs initialisations (extern, volatil,...) mais rien n'y fait.
    Idéalement, je souhaiterais avoir un fichier où je stocke toutes les variables utilisées dans plusieurs fonctions (variables.h par exemple) et n'inclure que ce fichier dans mes autres fichiers .c.

    Est-ce possible et si oui, comment? Je travaille avec un PIC 18F4550 et C 18.

    D'avance merci pour vos réponses.

    Gub

  8. #6
    RISC

    Re : PIC18F interuption et variable globale

    Salut,

    Je te conseille de télécharger un projet existant pour le C18 soit dans les exemples de code soit dans les cartes pour voir comment déclarer des variables dans un fichier header et inclure ce fichier dans les fichiers C du même projet. Tu trouveras des exemples ici :
    * http://www.microchip.com/codeexamples
    * http://www.microchip.com/pickit3 (voir les tutoriels pour la carte avec un PIC18F45K20 qui fait partie du kit Pickit3 Debug Express)

    a+
    Ma marotte ? les microcontrôleurs ;=)

  9. Publicité
  10. #7
    gub156

    Re : PIC18F interuption et variable globale

    Merci pour ta réponse plus que rapide, RISC, mais je n'ai malheureusement pas trouvé mon bonheur.

    Avec le PICkit3, les exemples donnés ne comportent malheureusement qu'un seul fichier avec toutes les fonctions et pour la recherche d'exemple de programmes, il n'existe rien pour le 18F4550 autre qu'un programme pour de l'USB que j'ai déjà utilisé.

    N'as-tu pas un exemple à me donner?

    Je précise encore comment j'ai structuré mon programme:

    Un fichier (variable.h) est utilisé pour déclarer les variables globales. J'intègre ce fichier (en #include) dans chaque fichier .c où j'ai besoin de variables globale. Malheureusement, cela ne fonctionne pas.

    Est-ce plus clair maintenant?

    Merci pour vos réponses.


    Gub

  11. #8
    gub156

    [Résolu] Re : PIC18F interuption et variable globale

    J'ai trouvé mon erreur: le principe de fonctionnement était juste. J'avais simplement fait un ajout de trop dans les librairies d'une fonction et cela faisait tout planter!

    Merci quand même pour le coup de main!

    Gub

Discussions similaires

  1. PIC18F & langage C : Sauvegarder une variable dans la rom
    Par The Viking dans le forum Électronique
    Réponses: 14
    Dernier message: 08/02/2010, 15h04
  2. Problème interuption UART PIC16F877
    Par Paulochon dans le forum Électronique
    Réponses: 4
    Dernier message: 28/09/2008, 19h49
  3. Interuption volontaire de grossesse
    Par lolodecarvin dans le forum Contraception, gynécologie, grossesse et sexualité
    Réponses: 8
    Dernier message: 17/03/2008, 09h18
  4. AOLBOX interuption ligne telephonique
    Par youva dans le forum Internet - Réseau - Sécurité générale
    Réponses: 2
    Dernier message: 13/02/2007, 13h00
  5. consommation globale d'énergie
    Par grhum dans le forum Environnement, développement durable et écologie
    Réponses: 0
    Dernier message: 19/11/2005, 12h08
Découvrez nos comparatifs produits sur l'informatique et les technologies.