interruption sur pic 18f452 - Page 2
Répondre à la discussion
Page 2 sur 2 PremièrePremière 2
Affichage des résultats 31 à 53 sur 53

interruption sur pic 18f452



  1. #31
    mp3dux

    Re : inerruption sur pic 18f452


    ------

    Citation Envoyé par HULK28 Voir le message

    Comme quoi on a bien fait d'insister, je suis sûr que vous ne vous ferez plus reprendre avec ce piège, et vous avez dû relire la doc en long, en large et en travers, donc bien intégré le fonctionnement de INT0 dans ses moindres détails.
    Tout à fait, maintenant je comprends à quoi sert chaque ligne de mon code

    Et j'ai aussi retenu d'autres conseils sur la façon de programmer.
    Je vous tiendrai au courant de l'évolution lorsque tout sera complet.

    D'autres qui auront le même problème savent au moins comment s'en sortir.

    -----

  2. #32
    invite737fc155

    Re : inerruption sur pic 18f452

    Salut,

    Pour commencer si tu travail avec le compilateur C18 je ne vois pas trop pourquoi tu inséres de l'assembleur dans ton code, mais ceci n'est qu'une remarque personelle.

    Sinon je te dirais que pour te simplifier la vie si tu n'utilises pas les prioritées d'interuption autant ne pas les configurer sa marche quand même.
    Je rajouterais aussi qu'en testant je me suis aprecu qu'une fois rentré dans mon programme d'interuption, le GIE se mettait à 0 il me faut donc le remettre à 1 avant de sortir pour pouvoir rentrer de nouveau en interuption.

    Voici un petit bout de programme non testé car je n'est pas de PIC sous la main mais j'ai de fortes convictions pour qu'il marche, si besoin est fait le moi savoir, je peut le tester.


    Code HTML:
    #include <p18f452.h>
    
    #pragma code high_vector=0x08
    void interrupt(void)
    {
    	if(INTCON3bits.INT2IF==1)
    	{
    		PORTBbits.RB2 = PORTBbits.RB2 ^ 1; //inverser RB2
    
    		INTCON3bits.INT2IF=0;
    	}
    
    	INTCONbits.GIE=1;
    }
    #pragma code
    
    void main(void) 
    {
    	INTCONbits.GIE=1;
    	INTCON3bits.INT2IE=1;
    
    	INTCON3bits.INT2IF=0;
    
    	INTCON2bits.INTEDG2=0; //front décendant
    
    	TRISBbits.TRISB0=1;//rb0 en entree
    	TRISBbits.TRISB2=0;//rb2 en sortie(led)
    
    	while(1);
    }

  3. #33
    invite03481543

    Re : inerruption sur pic 18f452

    Bonjour,

    Citation Envoyé par Raf0338 Voir le message
    Salut,

    Pour commencer si tu travail avec le compilateur C18 je ne vois pas trop pourquoi tu inséres de l'assembleur dans ton code, mais ceci n'est qu'une remarque personelle.
    Il est classique voir courant d'insérer du code assembleur dans un programme, notamment si on cherche à optimiser des fonctions très proches du matériel (UART, flash, etc).

    Je rajouterais aussi qu'en testant je me suis aprecu qu'une fois rentré dans mon programme d'interuption, le GIE se mettait à 0 il me faut donc le remettre à 1 avant de sortir pour pouvoir rentrer de nouveau en interuption.
    Mauvaise conclusion, lorsque le PIC entre en interruption GIE est effectivement mis à 0 mais il reprend automatiquement la position qu'il avait avant le déroutage donc nul besoin de le remettre à 1.

  4. #34
    invite737fc155

    Re : inerruption sur pic 18f452

    Salut,

    Merci Hulk28 pour ces conseils que je prend en note.

  5. #35
    marc2009

    Re : inerruption sur pic 18f452

    Salut,

    tu n'as pas dit quel logiciel tu utilisais, ni quel compilateur tu utilisais Pouvons nous le savoir ?

    Pour l'interruption, il me semble qu'il y a un fichier à "include" pour que ça marche, et il faut mettre #pragma origin 4 ( je sais pas si ça diffère des compilateurs, ou si c'est pas nécessaire )

    ++

  6. #36
    mp3dux

    Re : inerruption sur pic 18f452

    Citation Envoyé par marc2009 Voir le message
    Salut,

    tu n'as pas dit quel logiciel tu utilisais, ni quel compilateur tu utilisais Pouvons nous le savoir ?

    Pour l'interruption, il me semble qu'il y a un fichier à "include" pour que ça marche, et il faut mettre #pragma origin 4 ( je sais pas si ça diffère des compilateurs, ou si c'est pas nécessaire )

    ++
    quant à moi j'utilise le compilo MCC18 avec mplab ide;
    je ne sais pas pour le 16f mais pour le 18f452 que j'utilise, le GIE est automatique dans l'interruption haute.

    En ce qui concerne l'interruption basse j'ai pas encore vérifié
    j'ai lu dans le cours de bigonoff que une interruption haute peut interrompre une basse donc à mon avis dans la basse gie doit etre activé.
    je vérifierai.

    Et pour terminer,j'ai les 2 interruptions haute et basse parce que j'utilise d'autre périphériques timer,usart,eeprom...
    Pour que ce ne soit pas le désordre... je choisirai en quelques sorte les priorités.
    De toute façon pourquoi s'empêcher si on peut avoir Le beurre et l’argent du beurre...

  7. #37
    marc2009

    Re : inerruption sur pic 18f452

    Oui bon cc18 est le compilateur des pic 18XXXX ( cc5x pour les autres )

    sinon
    En ce qui concerne l'interruption basse j'ai pas encore vérifié
    j'ai lu dans le cours de bigonoff que une interruption haute peut interrompre une basse donc à mon avis dans la basse gie doit etre activé.
    je vérifierai.

    Et pour terminer,j'ai les 2 interruptions haute et basse parce que j'utilise d'autre périphériques timer,usart,eeprom...
    Pour que ce ne soit pas le désordre... je choisirai en quelques sorte les priorités.
    De toute façon pourquoi s'empêcher si on peut avoir Le beurre et l’argent du beurre...
    J'ai pas compris ce passage déjà je savais pas qu'il y avait des interruptions basses et hautes Puis, as-tu testé le programme déjà ? ( et tu n'as vraisemblablement pas répondu à ce que j'ai dit ?!
    Pour l'interruption, il me semble qu'il y a un fichier à "include" pour que ça marche, et il faut mettre #pragma origin 4 ( je sais pas si ça diffère des compilateurs, ou si c'est pas nécessaire )
    )

    ++

  8. #38
    invite737fc155

    Re : inerruption sur pic 18f452

    Salut

    Effectivement marc2009 sur les PIC 18F il y a des prioritée sur les interuptions (haute et basse) de plus je ne suis pas sur que la commande #pragma origin 4 passe en C18 je pense que c'est une commande apartenant au CC5X, à confirmer.

    Cordialemenet

  9. #39
    marc2009

    Re : inerruption sur pic 18f452

    Citation Envoyé par Raf0338 Voir le message
    Salut

    Effectivement marc2009 sur les PIC 18F il y a des prioritée sur les interuptions (haute et basse) de plus je ne suis pas sur que la commande #pragma origin 4 passe en C18 je pense que c'est une commande apartenant au CC5X, à confirmer.

    Cordialemenet
    ah d'accord, tu as sûrement raison

  10. #40
    invite03481543

    Re : inerruption sur pic 18f452

    Citation Envoyé par Raf0338 Voir le message
    Salut

    Effectivement marc2009 sur les PIC 18F il y a des prioritée sur les interuptions (haute et basse) de plus je ne suis pas sur que la commande #pragma origin 4 passe en C18 je pense que c'est une commande apartenant au CC5X, à confirmer.

    Cordialemenet
    Oui et de la même manière les bits GIEH et GIEL sont gérés automatiquement par l'interruption qui va bien, du moment que IPEN à été validé.
    Quant à #pragma origin 4 ça ne peut qu'appartenir à CC5X...

  11. #41
    marc2009

    Re : inerruption sur pic 18f452

    Quant à #pragma origin 4 ça ne peut qu'appartenir à CC5X...
    Tu es sûr donc ? Je n'ai donc pas tord de l'utiliser ... ( pour savoir s'il est inutile de le mettre )

  12. #42
    invite03481543

    Re : inerruption sur pic 18f452

    Ce que je voulais dire c'est que ça n'a aucun sens en C ou pour les PIC en général, sauf sans doute pour l'environnement du compilo CC5X... faut donc regarder dans la doc pour voir à quoi ça correspond.

  13. #43
    mp3dux

    Re : inerruption sur pic 18f452

    Citation Envoyé par marc2009 Voir le message

    Puis, as-tu testé le programme déjà ?

    ++
    j'ai testé mon programme il fonctionne.
    Je veux plutôt dire l'interruption fonctionne,
    mais j'ai surement un petit problème dans mon code parce que je n'obtient pas exactement ce que je souhaite.
    Je veux juste calculer la durée écoulé entre 2 appuis sur rb0.

    -au premier appuis je lance le timer1
    -au second je lis la valeur et je calcule la durée en us
    durée_us=valeur du timer+ (nombre debordement*65536)
    (le quartz 4MHz me fait un cycle=1us)

    Code:
    // programme pour calculer la durée de 2 impulsions
    
    #include <p18F452.h>
    #include <delays.h>
    #include <stdlib.h>
    #include <timers.h>
    
    
    //reglages  importants
    //------------------------------------------------------
    
    #pragma config OSC =HS // oscilateur à quartz 4 Mhz
    #pragma config DEBUG = ON // mode debug activé
    #pragma config BOR = OFF  //Brown-out Reset
    #pragma config WDT = OFF   // pas de chien de garde
    #pragma config PWRT = OFF		//Power Up Timer Disabled
    #pragma config LVP = OFF //Low Voltage Programming Disabled
    //------------------------------------------------------
    
    
    volatile unsigned int nombre_debord=0,duree_totale_us=0;// représente le comptage entre 2 fronts
    volatile unsigned float duree_sec=0;
    volatile unsigned char  first0_second1_pulse=0xFF;
    volatile unsigned int duree_timer_us=0;
    
    
    void InterruptHandlerHigh(void);//prototype
    void InterruptHandlerLow(void);
    
    
    
    //---interruption haute--------//
    #pragma code VectorHigh = 0x8 //haute priorité // cette pragma force le compilateur à placer le code à l'adresse indiquée
    void InterruptVectorHigh (void)
    {
    _asm
    goto InterruptHandlerHigh //jump to interrupt routine
    _endasm
    }
    
    #pragma code
    
    
    // sous programme d'interruption
    #pragma interrupt InterruptHandlerHigh
    void InterruptHandlerHigh (void) // sous  prog d'interruption pur rb0
    {
    	duree_timer_us=0;//variable enrégistrant la valeur courante du le  timer1
     
      	
    	if(INTCONbits.INT0IF==1)	// si IT provient du port rb0
    	{  
    		
    	 INTCONbits.INT0IF=0;	// on réactive l'interupption
    	first0_second1_pulse=~first0_second1_pulse;// complement à chaque impusion 00->ff->00->ff...
    
    	
    		if(first0_second1_pulse==0)//1iere impulsion on demarre le timer1
    			{	duree_sec=0;
    				nombre_debord=0;
    				duree_totale_us=0;
    
    
    				//lancement timer
    				OpenTimer1(TIMER_INT_ON 
                   & T1_16BIT_RW  
                   & T1_SOURCE_INT
    	       		& T1_PS_1_1 
                   & T1_OSC1EN_OFF 
                   & T1_SYNC_EXT_OFF);
                   
    				
    				while(PIR1bits.TMR1IF==1)//à chaque débordement sur TMR1 on incrémente
    				{						
    				PIR1bits.TMR1IF = 0;	//efface le drapeau d'IT
    				nombre_debord=nombre_debord+1;//on a compté 2^16 us *nombre_debord;
    				}				
    			}
    			
    			
    	//seconde impulsion: on calcule  la duree_timer_us en us et on arrete  le  timer1;	
    	if(first0_second1_pulse==0xFF)   
    		{
    		PORTBbits.RB2 = !PORTBbits.RB2;//sorte de flag
    		duree_timer_us=	ReadTimer1();//la valeur actuel du timer1
    		duree_totale_us=(65536*nombre_debord)+duree_timer_us;//en us
    		T1CONbits.TMR1ON = 0;  // Disable Timer1
      		duree_sec = (float)duree_totale_us/1000000;  //valeur en us/10^6
    			
    		}
    			
    			
    		
    	}
    	
    }
    
    
    //------interruption basse------//
    #pragma code VectorLow  = 0x18  //basse  priorité
    void InterruptVectorLow(void)
    {
    _asm
     goto InterruptHandlerLow
    _endasm
    }
    
    #pragma code
    
    
    
    #pragma interrupt InterruptHandlerLow  //priorité faible
    void InterruptHandlerLow()
    {
    	
    	PORTBbits.RB1 =0;//sorte de flag
    	
    }
    
    
    
    /////////////////////////////////////////////////
    		/*programme principale*/
    /////////////////////////////////////////////////
    
    
    
    void main (void)
    {
    
    	TRISB=0b00000001;// seul rb0 en entree
    	TRISA=0x00;//pour eviter les parasites sur les autres ports
    	TRISC=0x00;// on les mets à la sortie
    	
    	PORTBbits.RB1 =1;//servira de flag interupt basse
    	RCONbits.IPEN=1; //Interruption prioritaires activées
    	INTCON2bits.INTEDG0=0;//front descendant sur RB0
    	INTCONbits.GIEH = 1;// Toutes les IT démasquées hautes priorités autorisées
    	INTCONbits.GIEL = 1;// Toutes les IT démasquées basses prirités autorisées
    	INTCONbits.INT0IE=1;//activation d'int sur rb0
    	INTCONbits.PEIE = 1;
    	INTCONbits.RBIE=0;//desactivation des int sur (RB4-RB7)
    
    
    
    while(1)// boucle infinie
     {
      
       
    	//attente de pression sur rb0
     
      
      }
    }
    est ce que c'est la bonne méthode ?
    -pour nombre de débordement j'obtiens des fois 4900 pour 1intervale de 1s. C 'est quand même bizarre

  14. #44
    ElMamat

    Re : inerruption sur pic 18f452

    Salut,
    Il y a enormement d erreur dans ton code !
    Y a ca : volatile unsigned int nombre_debord=0,duree_totale_u s=0;//
    et apres je lis ca:duree_totale_us=65536*nombr e_debord)+duree_timer_us;//en us
    Donc direct y a un debordement et tu obtiens n'importe quoi !

    On ne mets jamais de boucle dans une interruption et en plus elle sert a rien.
    while(PIR1bits.TMR1IF==1)
    tu peux la remplacer par un if mais bon placé comme elle l'est,tu ne comptes jamais ton nombre de débordement puisque pour incrementer tes debordements tu dois revenir dans l'interruption de ton bouton !
    Je vais pas plus loin mais je crois qu il en reste encore pas mal. :s

  15. #45
    mp3dux

    Re : inerruption sur pic 18f452

    Le débordement,c 'est l'overflow du timer1 après 0xFFFF.

    J'incrémente la variable nombre_debord à chaque overflow.
    j'avait mis un if mais je craint qu'il n'incrémente qu'une fois nombre_debord...

    merci pour les erreurs, mais je veux tout de même pas vous laisser faire le travail à ma place, ça serait trop facile.
    j'aimerai juste savoir si c'est la bonne méthodologie à suivre.Je sais bien qu'il y a des choses un peu tordues dans mon code.

    Une autre façon est notamment de mettre le code dans le main puis mettre le timer1 en interruption, dand l'intéruption j'incrémente que nombre_debord.

  16. #46
    mp3dux

    Re : inerruption sur pic 18f452

    Citation Envoyé par mp3dux Voir le message
    Une autre façon est notamment de mettre le code dans le main puis mettre le timer1 en interruption, dans l'interruption j'incrémente que nombre_debord.

    Code:
    #pragma interrupt InterruptHandlerLow  //priorité faible
    void InterruptHandlerLow()
    {
    	if(PIR1bits.TMR1IF==1)//à chaque débordement sur TMR1 on incrémente
    				{						
    				PIR1bits.TMR1IF = 0;	//efface le drapeau d'IT
    				++nombre_debord;//=nombre_debord+1;//on a compté 2^16 us *nombre_debord;
    				}
    }

    et dans le main (programme principale)
    Code:
    while(1)// boucle infinie
     {
      
       
    	duree_timer_us=0;//variable enrégistrant la valeur courante du le  timer1
     
      	
    	if(INTCONbits.INT0IF==1)	// si IT provient du port rb0
    	{  
    		
    	INTCONbits.INT0IF=0;	// on réactive l'interupption
    	first0_second1_pulse=~first0_second1_pulse;// complement à chaque impusion 00->ff->00->ff...
    
    	
    		if(first0_second1_pulse==0)//1iere impulsion on demarre le timer1
    			{	duree_sec=0;
    				nombre_debord=0;
    				duree_totale_us=0;
    				
    //lancement timer en interrrupt° + mode16bit + clok systeme + sans diviseur.....
    				OpenTimer1(TIMER_INT_ON  & T1_16BIT_RW & T1_SOURCE_INT 
    				& T1_PS_1_1 & T1_OSC1EN_OFF   & T1_SYNC_EXT_OFF);
                   												
    			}			
    			
    	//seconde impulsion: on calcule  la duree_timer_us en us et on arrete  le  timer1;	
    	if(first0_second1_pulse==0xFF)   
    		{
    	
    		duree_timer_us=	ReadTimer1();//la valeur actuel du timer1
    		duree_totale_us=(65536*nombre_debord)+duree_timer_us;//en us
    		T1CONbits.TMR1ON = 0;  // Disable Timer1
      		duree_sec = duree_totale_us/1000000;  //valeur en us/10^6
    			
    		}					
    	}  
      }
    apparemment c'est la meilleure solution, nombre de débordement indique bien une valeur correcte et quand je calcule à la main c'est incroyablement précis.


    lorsque je fais la somme dans le programme pour stoker dans une variable float là c'est n'imp en 'décimale'.
    je vais revoir mon cours sur les mantisses et exposants voir la valeur réelle à partir du binaire.

    voilà ce que ça donne pour deux appuis espacé de 5 ou 6s (fichier joint).
    Images attachées Images attachées  

  17. #47
    ElMamat

    Re : inerruption sur pic 18f452

    Bonjour, Y a une subtilité qui doit m echapper la,tu mets dans ton main une routine d interruption (qui n est plus une du coup) et la j'avoue que je ne vois absolument pas l interet, tu remplacerais le if(INTCONbits.INT0F) par if(PORTBbits.RB0) et du coup tu desactives l'interruption externe. Moi c est bizard on m a toujours appris a placer les routines d interruption dans le "gestionnaire d interruption" il doit y avoir une raison ...

  18. #48
    mp3dux

    Re : inerruption sur pic 18f452

    Citation Envoyé par ElMamat Voir le message
    Bonjour, Y a une subtilité qui doit m echapper la,tu mets dans ton main une routine d interruption (qui n est plus une du coup) et la j'avoue que je ne vois absolument pas l interet, tu remplacerais le if(INTCONbits.INT0F) par if(PORTBbits.RB0) et du coup tu desactives l'interruption externe. Moi c est bizard on m a toujours appris a placer les routines d interruption dans le "gestionnaire d interruption" il doit y avoir une raison ...
    Bon voilà, tu n'as pas tout à fait tort, j'ai monopolisé un port d'interruption pour une tache qu'un autre port peut réaliser ?!

    pour l'instant sur ma carte picdem j'ai trois boutons poussoirs (reset, ra4, rbo/into) donc pour tester mon code (durée ecoulée en 2 fronts descendants) j'ai pas vraiment le choix .

    si le code fonctionne je peux le remplacer par un autre port qui détecte les fronts, notamment RB1 ou RB2 qui sont pas utilisés chez moi.
    ou peut être aller voir le portC.


    tu remplacerais le if(INTCONbits.INT0F) par if(PORTBbits.RB0)
    la réponse est: je ne peux pas car je travaille sur les "fronts"


    En ce qui concerne la partie dans le main , le but final du code c'est de calculer une durée puis l'envoyer par le port série.

    si la durée n'est pas prête je ne peux rien envoyer donc l'envoi je pense le mettre lui en interruption.

    ps:
    on m a toujours appris a placer les routines d interruption dans le "gestionnaire d interruption
    dommage que tu n'aies pas demandé au prof pourquoi il t'as imposé cela ?

  19. #49
    mp3dux

    Re : inerruption sur pic 18f452

    une petite question pour être sur.

    quand je programme en c avec des interruptions, la sauvegarde des registre statut et de travail est automatique ou c'est moi qui doit la faire comme en assembleur ? Ou ça dépend des compilateurs.

  20. #50
    invite03481543

    Re : inerruption sur pic 18f452

    C'est automatique.

  21. #51
    ElMamat

    Re : inerruption sur pic 18f452

    Citation Envoyé par mp3dux Voir le message
    dommage que tu n'aies pas demandé au prof pourquoi il t'as imposé cela ?
    Hum en meme temps quand on parle de "gestionnaire d'interruption" et d'interruption moi je vois une certaine liaison entre les 2 et le mecanisme de fonctionnement d'une interruption.....

    Parce que je me repete encore une fois mais une routine d interruption ne doit pas se trouver dans le main !! (je suis tetu je sais)

  22. #52
    mp3dux

    Re : inerruption sur pic 18f452

    Citation Envoyé par HULK28 Voir le message
    C'est automatique.
    c'est noté,je préfère en être certain.
    merci.

  23. #53
    mp3dux

    Re : inerruption sur pic 18f452

    juste pour remercier HULK28 et les autres qui m'ont aidé.
    Toutes mes interruptions fonctionnent(hautes et basses).

    Pour la mesure de durée en continue j'utilise le module de capture.
    merci.

Page 2 sur 2 PremièrePremière 2

Discussions similaires

  1. soucis pic 18f452 et affichage sur lcd
    Par inviteb8eac3ab dans le forum Électronique
    Réponses: 0
    Dernier message: 29/04/2009, 16h46
  2. PIC 18F452 creer une interruption
    Par invite4828afd1 dans le forum Électronique
    Réponses: 8
    Dernier message: 25/02/2009, 07h33
  3. interruption PIC 18F452
    Par invite4828afd1 dans le forum Électronique
    Réponses: 4
    Dernier message: 23/02/2009, 20h29
  4. 18F452 interruption timmer 0 et changement etat port possible?
    Par invite4828afd1 dans le forum Électronique
    Réponses: 7
    Dernier message: 22/02/2009, 19h04
  5. interruption haute priorite sur 18F452
    Par invite4828afd1 dans le forum Électronique
    Réponses: 2
    Dernier message: 21/02/2009, 14h51
Découvrez nos comparatifs produits sur l'informatique et les technologies.