// TP PWM : PWM variable (poussoirs UP et 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; } // Programme principal : //====================== void main(void) { WDTCTL = WDTPW | WDTHOLD; InitCarteBlanche(); uint8_t pwmLed1; // valeur du PWM, 0 à 255 (8 bits) uint8_t cptPwm; // compteur du PWM pwmLed1 = 0; // valeur initiale du PWM cptPwm = 0; // compteur du PWM volatile uint16_t i; while(1) { // Boucle infinie, durée 39us (256 * 39us = ~10ms, donc 100 Hz) if(cptPwm==0) { // début du cycle if (Pous2On) { if (pwmLed1<255) pwmLed1++; } // augmente l'intensité, si possible if (Pous1On) { if (pwmLed1>0) pwmLed1--; } // diminue l'intensité, si possible if (pwmLed1>0) Led1On; // LED allumée pour un PWM non nul } if(cptPwm==pwmLed1) Led1Off; // fin du cycle cptPwm++; // passe automatiquement de 255 à 0 (overflow) for (i=0; i<4; i++) {} // Attente d'environ 40 us } } // Poussoir 2 pour augmenter l'intensité // Poussoir 1 pour diminuer l'intensité