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 :

Interruption Timer 2 pour PIC18


Sujet :

C

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2014
    Messages : 2
    Points : 3
    Points
    3
    Par défaut Interruption Timer 2 pour PIC18
    Bonjour, je suis en train de travailler sur ma première programmation de PIC18 en langage C.
    Le programme consiste à retarder l'allumage d'une des pins (Bit de Test) à l'instant où a lieu le débordement du Timer 2.
    Le Timer 2 commencera à compter après chaque interruption RB0 qui mettra le bit de test à 0, après chaque débordement du Timer, le bit de test passera à 1.
    N'importe quels valeurs peuvent être placés dans les registres PR2 et T2CON (n'importe quel délai conviendrai).
    Voici donc le programme en question :

    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
    #include <p18F2680.h>
     
    #pragma config PBADEN = OFF
     
    //ROUTINE D'INTERRUPTION PRINCIPALE - A PLACER EN COMMENTAIRE AU MOMENT DES TESTS
    void interrupt delai_sur_pulse(void)		
    {
    	if (INTCONbits.INT0IF)			// Test sur le flag d'interruption RB0
    	{
    		PORTBbits.RB1=0;			// Mise à zéro du bit de Test 
    		TMR2=0x00;					// Initialisation du Timer 2
    		PR2=155;					// Valeur (aléatoire) de référence pour le débordement du Timer
    		T2CON=0b01111111;			// Valeur (aléatoire) des Pré/Post-Diviseurs et Lancement du Timer
    		INTCONbits.INT0IF=0;		// Efface le flag d'interruption
    	}
    	if (PIR1bits.TMR2IF)			// Test sur le flag d'interruption Timer2
    	{
    		T2CON=0b00000000;			// Réinitialisation du registre - Arrêt du Timer 2
    		PORTBbits.RB1=1;			// Mise à 1 du bit de Test
    		PIR1bits.TMR2IF=0;	        // Efface le flag d'interruption
    	}
    }
     
    //ROUTINE D'INTERRUPTION TEST1 - SUR L'INTERRUPTION RB0
    //Objectif recherché : A chaque impulsion envoyée sur RB0 la valeur du bit de test devra s'alterner entre 0 et 1
    /*void interrupt delai_sur_pulse(void)		
    {
    	if (INTCONbits.INT0IF)			
    	{
    		PORTBbits.RB1=!(PORTBbits.RB1);
    		INTCONbits.INT0IF=0;	
    	}
    }*/
    //ROUTINE D'INTERRUPTION TEST2
    //Objectif recherché : Après l'écoulement du même délai (aléatoire) - la valeur du bit de test devra s'alterner entre 0 et 1
    /*void interrupt delai_sur_pulse(void)		
    {
    	if (PIR1bits.TMR2IF)
    	{
    		TMR2=0x10;
    		PR2=155;
    		T2CON=0b01111111;
    		PORTBbits.RB1=!(PORTBbits.RB1);
    		PIR1bits.TMR2IF=0;	
    	}
    }*/
     
    //PROGRAMME PRINCIPAL
    void main (void)
    {
    	PORTB=0b00000000;		// Initialisation PORTB
    	TRISB=0b00000001;		// Direction PORTB
    	T2CON=0b00000000;		// Configuration initiale Timer 2
    	PIR1bits.TMR2IF=0;		// Mise à zéro du flag pour IT Timer 2
    	PIE1bits.TMR2IE=1;		// Interruption Timer 2 activée
    	IPR1bits.TMR2IP=1;		// Interruption Timer 2 en haute prioritée
    	INTCON2bits.RBPU=0;		// Activation des Pull-Up sur les pins du PORTB
    	INTCON2bits.INTEDG0=1;	// Interruption INT0 sur flanc montant
    	INTCONbits.INT0IE=1;	// Interruption RB0 activée
    	RCONbits.IPEN=1;		// Activation des interruptions hiérarchisées (Ce programme ne contient pas d'IT basse priorité)
    	INTCONbits.GIEH=1;		// Activation des interruptions haute priorité
    	INTCONbits.GIEL=1;		// Activation des interruptions basse priorité
    	while(1);				// Boucle infinie - Sera placé en commentaire pour le Test 2
    //PARTIE DU PROGRAMME UNIQUEMENT UTILISEE POUR LE TEST 2
    /*	TMR2=0x00;				// Initialisation du Timer 2
    	PR2=155;				// Valeur de débordement du Timer (aléatoire)
    	T2CON=0b01111111;		// Valeurs (aléatoires)des pré/post-diviseurs et lancement du Timer
    	while(1);				// Boucle infinie*/				
    }
    Par la suite, ce programme sera simulé sur Proteus Isis.

    Des problèmes ont été constatés et voilà quelques diagnostics:
    - L'interruption INT0/RB0 ne marche qu'une fois (Le Test 1 placé en commentaire permet de vérifier s'il y a permutation de niveau du Bit de Test à chaque impulsion sur RB0).
    - L'interruption Timer 2, survient instantanément sans attendre l'écoulement des cycles spécifiés dans les registres PR2 et T2CON) (Le Test 2 permet de le vérifier).
    Pour l'interruption RB0, le problème est peut être causé par la boucle infini while(1) qui cependant marche bien pour l'interruption Timer 2.
    Pour l'interruption Timer 2, le problème est peut être une histoire d'oscillateur, ou autre.

    J'aimerai consulter vos avis sur ces differents points, si vous pouvez m'indiquer les éventuels corrections ou les voies à suivre.
    Merci d'avance.

    PS : J'utilise le PIC18F2680 et le compilateur Hi-Tech C Pro for PIC18 (mais des solutions sur d'autres compilateurs C ou en assembleur MPASM serait les bienvenues).
    En pièce jointe vous trouverez le schéma du circuit de test sur Proteus Isis.
    Fichiers attachés Fichiers attachés

Discussions similaires

  1. Erreur dans BosoKernel pour les interruptions ?
    Par Edouard Kaiser dans le forum Autres architectures
    Réponses: 8
    Dernier message: 05/11/2017, 10h27
  2. Réponses: 0
    Dernier message: 04/05/2012, 10h27
  3. IDE pour PIC18 et PIC32
    Par boboss123 dans le forum MPLAB
    Réponses: 2
    Dernier message: 03/01/2012, 09h28
  4. Interruption Timer sous Borland C
    Par Spacy_green dans le forum C
    Réponses: 3
    Dernier message: 21/06/2006, 00h40
  5. [C++ Builder 6] Timer de précision pour chronomètre
    Par doudoustephane dans le forum C++Builder
    Réponses: 9
    Dernier message: 27/09/2005, 11h45

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