IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Timer du pic18f452


Sujet :

C

  1. #1
    Membre à l'essai
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Janvier 2008
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Janvier 2008
    Messages : 45
    Points : 24
    Points
    24
    Par défaut Timer du pic18f452
    bonjour a tous,

    J'essaie de programmer mon PIC18f452, j'utilise mplab 8.00 et winpic pour le programateur.

    J'essai de maitriser les timers du PIC, mais j'ai un souci d'execution, je pense qu'il se situe dans la definition du timer, voici mon programme qui devrait faire clignoter une led grace a ce timer, mais ca marche pas.

    J'ai un quartz 10 MHz, et j'utilise le PLL.

    voci la source:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    //**********************************************
    //**   PIC 18F452 quartz 10Mhz + PLL = 40Mhz  **
    //**     pilotage d'une LED  avec un timer    ** 
    //**********************************************
     
    //includes
    //========
    #include <p18f452.h>   /* déclarations pour le PIC18F252 */
    #include <timers.h>    /* fonctions pour les timers */
     
     
    // configurations des bits fusibles :
    //===================================
    #pragma config OSC = HSPLL     // oscilateur à quartz 10 Mhz + PLL=40 MHZ
    #pragma config PWRT = ON       // power up timer
    #pragma config BOR = OFF       //brown out reset
    #pragma config WDT = OFF       // watchdog timer
    #pragma config CCP2MUX = OFF
    #pragma config LVP = OFF       //low voltage
     
    // definitions des entrees sorties 
    //=================================
    #define LED1     PORTAbits.RA0
     
    //  variables globales
    //=====================
    #define ON   1    // pour stocker l'etat de la led 
    #define OFF  0
     
    int led_status;
    int temporisation;
     
    //Prototype des fonctions et interruptions
    //========================================
     
    void it_pulse (void);
     
     
    // declaration de l'interruption pulse
    //++++++++++++++++++++++++++++++++++++
    //void it_pulse(void);
     
    #pragma code adresse_it=0x08        // Adresse prioritaire pour utiliser l'interruption 
    void it_pulse (void)
         { _asm GOTO it_pulse _endasm }   //on execute le code de it_pulse 
    #pragma code // retour à la zone de code
     
     
    // ++++++++++++++++++++++++++++++
    //  sous programme d'interruption
    // ++++++++++++++++++++++++++++++
     
    #pragma interrupt it_pulse
     
    {// traitement de l'interuption  pulse
        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 (PIR1bits.TMR1IF) 
    	 {
    		// on va réautoriser l'interruption
    		PIR1bits.TMR1IF = 0; 
     
    		// ca y est on a attendu 2 500 000 cycles (0,25s)
    		if (temporisation >= 38) 
    		  {
    			// on remet à 0 pour le prochain timer
    			temporisation = 0;  
     
    			// si la LED était allumée
    			if (led_status == 1) 
    			  {
    				// on l'éteint 
    				LED1 = 0;
    				// stock le nouvel état de la LED
    				led_status = 0; 
    			  }
    			else // sinon la LED était éteinte
    			  {
    				// on l'allume
    				LED1 = 1;
    				// stock le nouvel état de la LED
    				led_status = 1;
    		      }
    	       }
    		else // on n'a pas encore attendu 2 500 000 cycles
    		  {
    			// on incrémente notre variable compteur
    			temporisation++;
    		  }	
    	}// fin du if
     
    	// on restaure les registres de calcul
    	PRODL = sauv1;
    	PRODH = sauv2;		
     
    }// fin de l'interuption
     
     
     
    // fonction principale 
    //====================
    void main (void)
     
    {// debut main
     
        temporisation=0;       // RAZ tempo
        TRISAbits.TRISA0=0;    // On configutre le port RA0 en sortie    
        LED1=0;              // On verifie led eteinte
        led_status=0;
     
    	 // on créer le timer
         OpenTimer1(TIMER_INT_ON 
                   & T1_16BIT_RW  
                   & T1_SOURCE_INT
    	       & T1_PS_1_1 
                   & T1_OSC1EN_OFF 
                   & T1_SYNC_EXT_OFF);
     
     
    	INTCONbits.GIE = 1;// On autorise toutes les interruptions
    	INTCONbits.PEIE = 1;
     
     
         while (1) //boucle infinie
           {}
     
     
    }//fin main
    merci de votre aide ....

  2. #2
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Eh comme ça c'est mieux?? :-)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
     
    //**********************************************
    //**   PIC 18F452 quartz 10Mhz + PLL = 40Mhz  **
    //**     pilotage d'une LED  avec un timer    ** 
    //**********************************************
     
    //includes
    //========
    #include <p18f452.h>   /* déclarations pour le PIC18F252 */
    #include <timers.h>    /* fonctions pour les timers */
     
     
    // configurations des bits fusibles :
    //===================================
    #pragma config OSC = HSPLL     // oscilateur à quartz 10 Mhz + PLL=40 MHZ
    #pragma config PWRT = ON       // power up timer
    #pragma config BOR = OFF       //brown out reset
    #pragma config WDT = OFF       // watchdog timer
    #pragma config CCP2MUX = OFF
    #pragma config LVP = OFF       //low voltage
     
    // definitions des entrees sorties 
    //=================================
    #define LED1     PORTBbits.RB0
     
    //  variables globales
    //=====================
    #define ON   1    // pour stocker l'etat de la led 
    #define OFF  0
     
    int led_status;
    int temporisation;
     
    //Prototype des fonctions et interruptions
    //========================================
     
    void it_pulse (void);
     
     
    // declaration de l'interruption pulse
    //++++++++++++++++++++++++++++++++++++
    //void it_pulse(void);
     
    #pragma code adresse_it=0x08        // Adresse prioritaire pour utiliser l'interruption 
    void bidon (void)
         { _asm GOTO it_pulse _endasm }   //on execute le code de it_pulse 
    #pragma code // retour à la zone de code
     
     
    // ++++++++++++++++++++++++++++++
    //  sous programme d'interruption
    // ++++++++++++++++++++++++++++++
    #pragma interrupt it_pulse
    void it_pulse (void){
     
     
    	// traitement de l'interuption  pulse
        //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 (PIR1bits.TMR1IF) 
    	 {
    		// on va réautoriser l'interruption
    		PIR1bits.TMR1IF = 0; 
     
    		// ca y est on a attendu 2 500 000 cycles (0,25s)
    		if (temporisation >= 38) 
    		  {
    			// on remet à 0 pour le prochain timer
    			temporisation = 0;  
     
    			// si la LED était allumée
    			if (led_status == 1) 
    			  {
    				// on l'éteint 
    				LED1 = 0;
    				// stock le nouvel état de la LED
    				led_status = 0; 
    			  }
    			else // sinon la LED était éteinte
    			  {
    				// on l'allume
    				LED1 = 1;
    				// stock le nouvel état de la LED
    				led_status = 1;
    		      }
    	       }
    		else // on n'a pas encore attendu 2 500 000 cycles
    		  {
    			// on incrémente notre variable compteur
    			temporisation++;
    		  }	
    	}// fin du if
     
    	// on restaure les registres de calcul
    	//PRODL = sauv1;
    	//PRODH = sauv2;		
     
    }// fin de l'interuption
     
     
     
    // fonction principale 
    //====================
    void main (void)
     
    {// debut main
     
        temporisation=0;       // RAZ tempo
        TRISB=0;    // On configutre le port RA0 en sortie    
        LED1=0;              // On verifie led eteinte
        led_status=0;
     
    	 // on créer le timer
         OpenTimer1(TIMER_INT_ON 
                   & T1_16BIT_RW  
                   & T1_SOURCE_INT
    	       & T1_PS_1_1 
                   & T1_OSC1EN_OFF 
                   & T1_SYNC_EXT_OFF);
     
     
    	INTCONbits.GIE = 1;// On autorise toutes les interruptions
    	INTCONbits.PEIE = 1;
     
     
         while (1) //boucle infinie
           {}
    }

Discussions similaires

  1. Comment faire un Timer de fonction PORTABLE ?
    Par dieuP1guin dans le forum C
    Réponses: 3
    Dernier message: 04/07/2003, 10h44
  2. [horloge] conflit caractère / timer
    Par JeanJean dans le forum C
    Réponses: 10
    Dernier message: 09/05/2003, 23h47
  3. [] [Réseau] Anti-timer, anti-idle
    Par clonevince dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 15/01/2003, 22h19
  4. Timer de précision
    Par guigui dans le forum MFC
    Réponses: 1
    Dernier message: 04/12/2002, 15h21
  5. Timer en µsecondes
    Par Dagobert dans le forum x86 16-bits
    Réponses: 3
    Dernier message: 25/11/2002, 00h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo