Interruption Timer 2 sur PIC18

Interruption Timer 2 sur PIC18 - C - Programmation

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 :
 

Code :
  1. #include <p18F2680.h>
  2. #pragma config PBADEN = OFF
  3. //ROUTINE D'INTERRUPTION PRINCIPALE - A PLACER EN COMMENTAIRE AU MOMENT DES TESTS
  4. void interrupt delai_sur_pulse(void)
  5. {
  6. if (INTCONbits.INT0IF)   // Test sur le flag d'interruption RB0
  7. {
  8.  PORTBbits.RB1=0;   // Mise à zéro du bit de Test  
  9.  TMR2=0x00;     // Initialisation du Timer 2
  10.  PR2=155;     // Valeur (aléatoire) de référence pour le débordement du Timer
  11.  T2CON=0b01111111;   // Valeur (aléatoire) des Pré/Post-Diviseurs et Lancement du Timer
  12.  INTCONbits.INT0IF=0;  // Efface le flag d'interruption
  13. }
  14. if (PIR1bits.TMR2IF)   // Test sur le flag d'interruption Timer2
  15. {
  16.  T2CON=0b00000000;   // Réinitialisation du registre - Arrêt du Timer 2
  17.  PORTBbits.RB1=1;   // Mise à 1 du bit de Test
  18.  PIR1bits.TMR2IF=0;         // Efface le flag d'interruption
  19. }
  20. }
  21. //ROUTINE D'INTERRUPTION TEST1 - SUR L'INTERRUPTION RB0
  22. //Objectif recherché : A chaque impulsion envoyée sur RB0 la valeur du bit de test devra s'alterner entre 0 et 1
  23. /*void interrupt delai_sur_pulse(void)  
  24. {
  25. if (INTCONbits.INT0IF)    
  26. {
  27.  PORTBbits.RB1=!(PORTBbits.RB1);
  28.  INTCONbits.INT0IF=0;  
  29. }
  30. }*/
  31. //ROUTINE D'INTERRUPTION TEST2
  32. //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
  33. /*void interrupt delai_sur_pulse(void)  
  34. {
  35. if (PIR1bits.TMR2IF)
  36. {
  37.  TMR2=0x10;
  38.  PR2=155;
  39.  T2CON=0b01111111;
  40.  PORTBbits.RB1=!(PORTBbits.RB1);
  41.  PIR1bits.TMR2IF=0;  
  42. }
  43. }*/
  44. //PROGRAMME PRINCIPAL
  45. void main (void)
  46. {
  47. PORTB=0b00000000;  // Initialisation PORTB
  48. TRISB=0b00000001;  // Direction PORTB
  49. T2CON=0b00000000;  // Configuration initiale Timer 2
  50. PIR1bits.TMR2IF=0;  // Mise à zéro du flag pour IT Timer 2
  51. PIE1bits.TMR2IE=1;  // Interruption Timer 2 activée
  52. IPR1bits.TMR2IP=1;  // Interruption Timer 2 en haute prioritée
  53. INTCON2bits.RBPU=0;  // Activation des Pull-Up sur les pins du PORTB
  54. INTCON2bits.INTEDG0=1; // Interruption INT0 sur flanc montant
  55. INTCONbits.INT0IE=1; // Interruption RB0 activée
  56. RCONbits.IPEN=1;  // Activation des interruptions hiérarchisées (Ce programme ne contient pas d'IT basse priorité)
  57. INTCONbits.GIEH=1;  // Activation des interruptions haute priorité
  58. INTCONbits.GIEL=1;  // Activation des interruptions basse priorité
  59. while(1);    // Boucle infinie - Sera placé en commentaire pour le Test 2
  60. //PARTIE DU PROGRAMME UNIQUEMENT UTILISEE POUR LE TEST 2
  61. /* TMR2=0x00;    // Initialisation du Timer 2
  62. PR2=155;    // Valeur de débordement du Timer (aléatoire)
  63. T2CON=0b01111111;  // Valeurs (aléatoires)des pré/post-diviseurs et lancement du Timer
  64. while(1);    // Boucle infinie*/    
  65. }


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

Reply

Marsh Posté le 01-10-2014 à 09:58:37   

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed