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
- /*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).