// TP PWM : LED dormeur et UP-DOWN // EPFL 2020/03/22, Pierre-Yves Rochat, pyr@pyr.ch #include #include // Définition des LED et des poussoirs pour la carte "blanche" #define Led1On P1OUT|=(1<<0) #define Led1Off P1OUT&=~(1<<0) #define Led1Toggle P1OUT^=(1<<0) #define InitLed1 P1DIR|=(1<<0);Led1Off #define Led2On P8OUT|=(1<<1) #define Led2Off P8OUT&=~(1<<1) #define Led2Toggle P8OUT^=(1<<1) #define InitLed2 P8DIR|=(1<<1);Led2Off #define Led3On P8OUT|=(1<<2) #define Led3Off P8OUT&=~(1<<2) #define Led3Toggle P8OUT^=(1<<2) #define InitLed3 P8DIR|=(1<<2);Led3Off #define Led4On P1OUT|=(1<<1) #define Led4Off P1OUT&=~(1<<1) #define Led4Toggle P1OUT^=(1<<1) #define InitLed4 P1DIR|=(1<<1);Led4Off #define Led5On P1OUT|=(1<<2) #define Led5Off P1OUT&=~(1<<2) #define Led5Toggle P1OUT^=(1<<2) #define InitLed5 P1DIR|=(1<<2);Led5Off #define Led6On P1OUT|=(1<<3) #define Led6Off P1OUT&=~(1<<3) #define Led6Toggle P1OUT^=(1<<3) #define InitLed6 P1DIR|=(1<<3);Led6Off #define Led7On P1OUT|=(1<<4) #define Led7Off P1OUT&=~(1<<4) #define Led7Toggle P1OUT^=(1<<4) #define InitLed7 P1DIR|=(1<<4);Led7Off #define Led8On P1OUT|=(1<<5) #define Led8Off P1OUT&=~(1<<5) #define Led8Toggle P1OUT^=(1<<5) #define InitLed8 P1DIR|=(1<<5);Led8Off #define Pous1On (!(P1IN&(1<<7))) #define InitPous1 P1DIR&=~(1<<7);P1REN|=(1<<7);P1OUT|=(1<<7) #define Pous2On (!(P2IN&(1<<2))) #define InitPous2 P2DIR&=~(1<<2);P2REN|=(1<<2);P2OUT|=(1<<2) void InitCarteBlanche() { InitLed1; InitLed2; InitLed3; InitLed4; InitLed5; InitLed6; InitLed7; InitLed8; InitPous1; InitPous2; } // Variables globales : uint8_t pwmLed1; // valeur du PWM, 0 à 255 (8 bits) uint8_t pwmLed8; uint16_t temps; void Dormeur () { // calcule les valeurs if (temps<100) { // première seconde pwmLed8 = temps * 256/100;// droite montante } else if (temps<200) { // deuxième seconde pwmLed8 = 255 - ((temps-100) * 256/100); // droite descendante } else { pwmLed8 = 0; if (temps==400) { temps = 0; } } } void UpDown() { if ((Pous2On) && (pwmLed1<255)) { pwmLed1++; } if ((Pous1On) && (pwmLed1>0)) { pwmLed1--; } } // Programme principal : //====================== void main(void) { WDTCTL = WDTPW | WDTHOLD; InitCarteBlanche(); uint8_t cptPwm = 0; // compteur du PWM temps = 0; pwmLed1 = 0; // Valeur intiale volatile uint16_t i; while(1) { // Boucle infinie, durée 39us (256 * 39us = ~10ms, donc 100 Hz) if(cptPwm==0) { // début du cycle temps++; Dormeur(); // calcul de la valeur du PWM pour la LED dormeur UpDown(); // prise en compte des poussoirs pour le LED réglable if (pwmLed1>0) Led1On; // LED allumée pour un PWM non nul if (pwmLed8>0) Led8On; } if(cptPwm==pwmLed1) Led1Off; // fin du cycle pour LED 1 if(cptPwm==pwmLed8) Led8Off; cptPwm++; // passe automatiquement de 255 à 0 (overflow) for (i=0; i<4; i++) {} // Attente d'environ 40 us } }