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

Baisse flag timer pic18 impossible



  1. #1
    jerome0

    Baisse flag timer pic18 impossible

    Bonjour,

    J'utilise en ce moment dans un projet un pic18f4520 sur MPlab X.

    Dans le programme, j'utilise les 3 interruptions du pic ainsi que 2 timers, le 0 et le 2.
    Pour le moment j'ai désactivé le timer0 et je baisse uniquement les flags pour chaque interruptions ( pas encore testé)

    Donc pour le moment je cherche juste à faire un timer de 4ms.
    Le probleme est que lorsque je fait tourner le programme, le flag ne se baisse pas.

    voici mon code

    Code:
    /*
     * File:   newmain.c
     * Author: asus
     *
     * Created on 12 mai 2017, 09:30
     */
    #include <xc.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <pic18f4520.h>
    #pragma config OSC = INTIO67
    #pragma config WDT = OFF
    #define _XTAL_FREQ 32000000 
    
    void main (void)
    {
    
    	OSCCON|=0x70; // oscillo intern à 8 Mhz
    	OSCTUNE=0x4F; // Utilisaion de la PLL ->*4 = 32Mhz
    
    	//Init PORTA	
    	TRISA=0x0B;
    	
    	//Init PORTE
    	TRISE=TRISE&0xF8;
    	PORTE=0x00;
    
    	//Init PORTD
    	TRISD=0x00;
    	PORTD=0x00;
        LATE=0x00;
        TRISA=0x00;   
        PORTA=0x0A;
    
    	//Initialistation timer0
    
    	INTCON|=0x20;
    	INTCON&=0x3B;
        INTCON2|=0xFB;
    	T0CON=0x03;
    	TMR0H=0xC2;
    	TMR0L=0xF6;
        T0CONbits.TMR0ON=0;
        INTCONbits.TMR0IF=0;
    
    	//Initialistation timer2
    
    	T2CON=(T2CON&0xFB)|0x7A;
    	TMR2=156;
    	PIR1&=0xFD;
    	PIE1|=0x02;
    	IPR1&=0xFD;
    
    	//Initialistation interruption0
    	INTCON&=0x2D;
    
    	//Initialistation interruption1
    	INTCON&=0x3F; //inutile car déjà dans int0
    	INTCON3|=0x40;
    	INTCON3&=0xF6;
    
    	//Initialistation interruption2
    	INTCON&=0x3F; // inutile car déjà dans int0	
    	INTCON3|=0x80;		
    	INTCON3&=0xED;
    	INTCON2=(INTCON2|0x40)&0xCF; // front des interruptions 
    
    	//INTCON3&=0xE7; // eteindre interrupt du capteur pour le moment
    	//Deverouillage
    	
        
    	INTCON|=0x10;
    	INTCON3|=0x18;
    	RCON|=0x80;
    	INTCON|=0xC0;
    	T2CON|=0x04;
        
       	while(1)
    	{
      
    	}
        
        
        
    }
    
    /********************************************************************************/
    /* Mise en place des routines d'interruptions hautes et basses					*/
    /****************************************************²****************************/
    void interrupt tc_int(void)             // High priority interrupt
    {
    	if(INTCON3&0x01) //	si flag du A
    	{
    		INTCON3&=0xFE;								// je baisse le flag
    	}
        
        if(INTCON3&0x02)								// Meme fonctionnement que pour A 
    	{	
    		INTCON3&=0xFD;
    	}
        
        if(INTCON&0x02)  							// Flag d'interruption sur retournement du sablier
    	{	
    		INTCON&=0xFD;								// on baisse le flag
    	}
        
    
    }
     
    void interrupt low_priority   LowIsr(void)    //Low priority interrupt
    {
    if(PIR1&0x02)									// si flag sur interruption de 20ms
    	{
    
    
            PIR1bits.TMR2IF=0;				// on rebaisse le flag
            TMR2=156;
        }	
    	
    	if(INTCON&=0x20)				// flag signalant que le % de luminosité de la ligne modulé est atteint. 
    	{
    	INTCON&=0xDF;					// Baisse du flag
    	}
        
    }
    Impossible de trouver d'où peux venir le probleme... Il y aurait il un rapport avec la fréquence ? j'utilise l'ocsillo interne + pll pour avoir 32 MHz

    Merci pour votre aide

    -----


  2. #2
    jerome0

    Re : Baisse flag timer pic18 impossible

    J'ai essayé d'enlever un maximum de chose pour ne laisser que le timer 2, avec ce code :

    Code:
    /*
     * File:   newmain.c
     * Author: asus
     *
     * Created on 12 mai 2017, 09:30
     */
    #include <xc.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <pic18f4520.h>
    #pragma config OSC = INTIO67
    #pragma config WDT = OFF
    #define _XTAL_FREQ 32000000 
    
    
    void main (void)
    {
    
    	OSCCON|=0x70; // oscillo intern à 8 Mhz
    	OSCTUNE=0x4F; // Utilisaion de la PLL ->*4 = 32Mhz
    
    	//Init PORTA	
    	TRISA=0x0B;
    	
    	//Init PORTE
    	TRISE=TRISE&0xF8;
    	PORTE=0x00;
    
    	//Init PORTD
    	TRISD=0x00;
    	PORTD=0x00;
        LATE=0x00;
        TRISA=0x00;   
        PORTA=0x0A;
    
    	
    	//Initialistation timer2
    
    	T2CON=(T2CON&0xFB)|0x7A;
    	TMR2=156;
    	PIR1&=0xFD;
    	PIE1|=0x02;
    	IPR1&=0xFD;
    
    	//Deverouillage
    	
    
    	INTCON|=0x80;
    	T2CON|=0x04;
        
       	while(1)
    	{ 
    	}
        
        
        
    }
    
    /********************************************************************************/
    /* Mise en place des routines d'interruptions hautes et basses					*/
    /****************************************************²****************************/
    void interrupt tc_int(void)             // High priority interrupt
    {    
        if(PIR1&0x02)									// si flag sur interruption de 20ms
    	{
    
    
            PIR1bits.TMR2IF=0;				// on rebaisse le flag
            TMR2=156;
        }	
    	if(INTCON3&0x01) //	si flag du A
    	{
    		INTCON3&=0xFE;								// je baisse le flag
    	}
        
        if(INTCON3&0x02)								// Meme fonctionnement que pour A 
    	{	
    		INTCON3&=0xFD;
    	}
        
        if(INTCON&0x02)  							// Flag d'interruption sur retournement du sablier
    	{	
    		INTCON&=0xFD;								// on baisse le flag
    	}
    
    	
    
    }
     
    void interrupt low_priority   LowIsr(void)    //Low priority interrupt
    {
    if(PIR1&0x02)									// si flag sur interruption de 20ms
    	{
    
    
            PIR1bits.TMR2IF=0;				// on rebaisse le flag
            TMR2=156;
        }	
    	
    	if(INTCON&=0x20)				// flag signalant que le % de luminosité de la ligne modulé est atteint. 
    	{
    	INTCON&=0xDF;					// Baisse du flag
    	}
        
    }
    Mais ici je vois le flag dans la liste des registres et le programme ne va jamais dans les interruptions....
    Dernière modification par jerome0 ; 13/05/2017 à 18h41.

  3. #3
    paulfjujo

    Re : Baisse flag timer pic18 impossible

    bonjour,


    et le bit GIE .. autorisation generale ?

Sur le même thème :

Discussions similaires

  1. Réponses: 3
    Dernier message: 03/09/2012, 20h58
  2. qu'est-ce qu'un flag d'optimisation ?
    Par bbdoll dans le forum Programmation et langages, Algorithmique
    Réponses: 9
    Dernier message: 18/07/2012, 14h15
  3. vol et flag
    Par tazzz59 dans le forum Électronique
    Réponses: 1
    Dernier message: 03/09/2010, 07h37
  4. flag menbrane pvc
    Par 29sud dans le forum Habitat bioclimatique, isolation et chauffage
    Réponses: 2
    Dernier message: 04/11/2009, 11h38
  5. Réponses: 1
    Dernier message: 22/01/2007, 11h30