Interruption Timer 2 sur PIC18 - C - Programmation
MarshPosté le 01-10-2014 à 09:58:37
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 :
#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
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).
Marsh Posté le 01-10-2014 à 09:58:37
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 :
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).