Advertisement
Guest User

Untitled

a guest
Apr 22nd, 2019
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.80 KB | None | 0 0
  1. #include <msp430g2553.h>
  2.  
  3.  
  4. /* Constantes, variáveis e protótipos de funções */
  5.  
  6. #define BUTTON BIT3
  7. #define SENSOR BIT2
  8. #define S_MOTOR BIT6
  9.  
  10. // Estados.
  11. #define INITIAL 0
  12. #define WORKING 1
  13. #define ATTENTION 2
  14.  
  15. double firstTemp, secondTemp, temperatureMean;
  16. const unsigned char leds = {BIT0, BIT1, BIT6};
  17. unsigned char count = 0;
  18. unsigned char pressed = 0;
  19. unsigned char state = WORKING;
  20.  
  21. // Acender amount LEDs.
  22. void turnOnLeds(unsigned char amount);
  23.  
  24. // Apagar todos os LEDs.
  25. void turnOffAllLeds();
  26.  
  27. // Setar PWM pelo ângulo.
  28. void setPWMDegrees(unsigned char degrees);
  29.  
  30. // Obter temperatura.
  31. double getTemperature(unsigned char channel);
  32.  
  33. /* ********************************************* */
  34.  
  35.  
  36. int main(void)
  37. {
  38.     WDTCTL = WDTPW + WDTHOLD;
  39.  
  40.     /* Configuração inicial */
  41.  
  42.     // Saídas.
  43.     P1DIR |= (leds[0] + leds[1] + leds[2] + S_MOTOR);
  44.  
  45.     // Resistor pull up.
  46.     P1REN |= BUTTON;
  47.     P1OUT |= BUTTON;
  48.  
  49.     // Função de PWM no servo motor.
  50.     P1SEL |= S_MOTOR;
  51.  
  52.     // Interrupção no botão.
  53.     P1IE |= BUTTON;
  54.     P1IES |= BUTTON;
  55.     P1IFG &= ~BUTTON;
  56.  
  57.     // Sensor de temperatura.
  58.     ADC10AE0 = SENSOR;
  59.     ADC10CTL1 = ADC10SSEL_3;
  60.     ADC10CTL0 |= SREF_1;
  61.     ADC10CTL0 |= REFON;
  62.     ADC10CTL0 |= REF2_5V;
  63.     ADC10CTL0 &= ~(ADC10ON);
  64.     ADC10CTL0 &= ~(ENC + ADC10SC);
  65.  
  66.     // Timer.
  67.     TA0CCR0 = 62499;                          // 2x -> 1s
  68.     TACTL = TASSEL_2 + MC_1 + ID_3;
  69.     TA0CCTL0 = CCIE;
  70.  
  71.     _BIS_SR(GIE);
  72.  
  73.     // Configurar PWM.
  74.     TA1CCTL1 = OUTMOD_7;
  75.     TA1CCR0 = 20000 - 1;
  76.     TA1CCR1 = 0;
  77.     TA1CTL = TASSEL_2 + ID_0 + MC_1;
  78.  
  79.     /* ******************** */
  80.  
  81.     while(1)
  82.     {
  83.         // Estados do programa.
  84.         switch(state)
  85.         {
  86.         case INITIAL:
  87.             // Ler dados do PC e iniciar execução do programa (state = WORKING).
  88.  
  89.             break;
  90.  
  91.         case WORKING:
  92.             firstTemp = getTemperature(INCH_1);
  93.             secondTemp = getTemperature(INCH_2);
  94.  
  95.             temperatureMean = (firstTemp + secondTemp) / 2;
  96.  
  97.             // Enviar dados para PC do usuário.
  98.  
  99.             // Mostrar LEDs e configurar servo-motor de acordo com o intervalo da temperatura média.
  100.             if(0 < temperatureMean && temperatureMean <= 40)
  101.             {
  102.                 turnOnLeds(1);
  103.  
  104.                 // Ajustar servo-motor (30º).
  105.                 setPWMDegrees(30);
  106.             }
  107.             else if(40 < temperatureMean && temperatureMean <= 80)
  108.             {
  109.                 turnOnLeds(2);
  110.  
  111.                 // Ajustar servo-motor (60º).
  112.                 setPWMDegrees(60);
  113.             }
  114.             else if(80 < temperatureMean)
  115.             {
  116.                 turnOnLeds(3);
  117.  
  118.                 // Ajustar servo-motor (90º).
  119.                 setPWMDegrees(90);
  120.             }
  121.  
  122.             break;
  123.         case ATTENTION:
  124.             // Modo de economia de energia quando em atenção.
  125.             // A saída deste modo só ocorre na interrupção.
  126.             LPM1;
  127.  
  128.             break;
  129.  
  130.         }
  131.     }
  132. }
  133.  
  134. #pragma vector = TIMER0_A0_VECTOR
  135. __interrupt void Timer_Routine(void)
  136. {
  137.     count++;
  138.  
  139.     // 2x count -> 1s
  140.     // Para fins de teste, aumentar p/ 20 (10s)
  141.     if(count == 2 && state == WORKING)
  142.     {
  143.         if(!pressed)
  144.             state = ATTENTION;
  145.         else
  146.             pressed = 0;
  147.  
  148.         count = 0;
  149.     }
  150.  
  151.     TA0CCTL0 &= ~ CCIFG;
  152. }
  153.  
  154. #pragma vector = PORT1_VECTOR
  155. __interrupt void Button_Routine(void)
  156. {
  157.     pressed = 1;
  158.  
  159.     if(state == ATTENTION)
  160.     {
  161.         state = WORKING;
  162.         LPM1_EXIT;
  163.     }
  164.  
  165.     P1IFG &= ~BUTTON;
  166. }
  167.  
  168. void turnOnLeds(unsigned char amount)
  169. {
  170.     turnOffAllLeds();
  171.  
  172.     for(unsigned char i = 0; i < amount; i++)
  173.         P1OUT |= leds[i];
  174. }
  175.  
  176. void turnOffAllLeds();
  177. {
  178.     for(unsigned char i = 0; i < 3; i++)
  179.         P1OUT &= ~(leds[i]);
  180. }
  181.  
  182. void setPWMDegrees(unsigned char degrees)
  183. {
  184.     if(degrees < 0 || degrees > 90)
  185.         return;
  186.  
  187.     TA1CCR1 = (((degrees * 0.5) / 90) + 1.5) * 1000;
  188. }
  189.  
  190. double getTemperature(unsigned char channel)
  191. {
  192.     double temperature = 0;
  193.  
  194.     ADC10CTL1 = channel;
  195.     for (unsigned char i = 1; i <= 100; i++)
  196.     {
  197.         ADC10CTL0 |= (ENC + ADC10SC);
  198.         while ((ADC10CTL0 & ADC10IFG) == 0) {};
  199.         temperature += ADC10MEM;
  200.     }
  201.  
  202.     ADC10CTL0 &= ~(ADC10ON);
  203.     ADC10CTL0 &= ~(ENC + ADC10SC);
  204.  
  205.     return (temperature / 100);
  206. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement