granteeric

LED Flash Independant avec timer16 bits

May 11th, 2021
1,170
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #define LED1 2
  2. #define LED2 3
  3. #define LED3 4
  4. #define LED4 5
  5. #define LED5 6
  6. #define LED1FLASH 500  // changement d'etat on / off toutes les 500ms
  7. #define LED2FLASH 1000
  8. #define LED3FLASH 1500
  9. #define LED4FLASH 2000
  10. #define LED5FLASH 2500
  11.  
  12. //tableau qui comprenne les différent port digital des LEDs
  13. uint8_t digitalPort[5] ={2,3,4,5,6};
  14.  
  15. //tableau qui contient la durée du flash pour chaque LED
  16. uint16_t tempoLed[5] = {LED1FLASH, LED2FLASH,LED3FLASH,LED4FLASH,LED5FLASH};
  17.  
  18. //tableau qui enregistrera le nombre de cycle de delenchement de 5ms par led
  19. volatile uint16_t _compteurTempsLED[5]={0,0,0,0,0};
  20.  
  21. void setup () {
  22. //  Configuration du Timer  (TIMER 1 16BIT)
  23.   // on interdit les interruption le temps de configurer le timer
  24.   cli();
  25.     //configuration timer1 avec prescale de 64
  26.   TCCR1A = 0;
  27.   TCCR1B = ( 1<<WGM12) | (0<<CS12) | (1<<CS11) | (1<<CS10) ; // Prescaler / 64 ==> ce qui nous donne des PAS de 5ms
  28.   TCCR1C = 0;
  29.   TCNT1 = 0; // defini le compteur en 16 bit
  30.  
  31.   OCR1A = 1250; //declenchement de la fonction du timer 1250 correspond a 5ms. on obtient ce nombre en faisant les calculs suivant :
  32.   // temps d'un  cycle d'horloge : prescaler / F_CPU  => 64 / 16000000 = 0.000004   4 nanoseconde  1 cycle d'horloge toutes les 4 nano secondes
  33.   // pour 5 millis seconde, on doit effectuer le calcul suivant :  tempsVoulu / cycled'horloge soit 0.005 / 0.000004  => 1250;  
  34.   // pour un timer 16 bits cette valeur ne doit pas depasser 65535
  35.  
  36.   TIMSK1 = 1 << OCIE1A;     // timer 1 en mode comparaison
  37.   //on reactive les interruptions
  38.   sei();
  39.  
  40. // con  
  41.    for(int i = 0 ; i < 5 ; i++){
  42.     //on initialise les ports des Leds en OUTPUT
  43.    pinMode(digitalPort[i], OUTPUT);
  44.     //on initialise les sortie a LOW les led sont éteinte
  45.    digitalWrite(digitalPort[i], LOW);
  46.    }
  47.  
  48. }
  49.  
  50. void loop() {
  51.  
  52. }
  53.  
  54. ISR(TIMER1_COMPA_vect) // 16 bit timer 1 compare 1A match
  55. {
  56.  
  57.    for(int i = 0 ; i < 5 ; i++){
  58. //on ajoute 1 au compteur de led
  59.       _compteurTempsLED[i] =  _compteurTempsLED[i] +1;      
  60.  
  61. //on effectue le test entre le nombre de declenchement du trigger timmer qui est de 5ms
  62.       if( _compteurTempsLED[i] == (tempoLed[i] / 5)){
  63.      //on change l'etat de la LED
  64.  
  65.      digitalWrite(digitalPort[i], !digitalRead(digitalPort[i]));
  66.  
  67.     //on remet a zero le comteur de led pour la prochaine inversion.
  68.      _compteurTempsLED[i] = 0;
  69.       }
  70.    }
  71. }
  72.  
RAW Paste Data