Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <msp430g2553.h>
- /* Constantes, variáveis e protótipos de funções */
- #define BUTTON BIT3
- #define SENSOR BIT2
- #define S_MOTOR BIT6
- // Estados.
- #define INITIAL 0
- #define WORKING 1
- #define ATTENTION 2
- double firstTemp, secondTemp, temperatureMean;
- const unsigned char leds = {BIT0, BIT1, BIT6};
- unsigned char count = 0;
- unsigned char pressed = 0;
- unsigned char state = WORKING;
- // Acender amount LEDs.
- void turnOnLeds(unsigned char amount);
- // Apagar todos os LEDs.
- void turnOffAllLeds();
- // Setar PWM pelo ângulo.
- void setPWMDegrees(unsigned char degrees);
- // Obter temperatura.
- double getTemperature(unsigned char channel);
- /* ********************************************* */
- int main(void)
- {
- WDTCTL = WDTPW + WDTHOLD;
- /* Configuração inicial */
- // Saídas.
- P1DIR |= (leds[0] + leds[1] + leds[2] + S_MOTOR);
- // Resistor pull up.
- P1REN |= BUTTON;
- P1OUT |= BUTTON;
- // Função de PWM no servo motor.
- P1SEL |= S_MOTOR;
- // Interrupção no botão.
- P1IE |= BUTTON;
- P1IES |= BUTTON;
- P1IFG &= ~BUTTON;
- // Sensor de temperatura.
- ADC10AE0 = SENSOR;
- ADC10CTL1 = ADC10SSEL_3;
- ADC10CTL0 |= SREF_1;
- ADC10CTL0 |= REFON;
- ADC10CTL0 |= REF2_5V;
- ADC10CTL0 &= ~(ADC10ON);
- ADC10CTL0 &= ~(ENC + ADC10SC);
- // Timer.
- TA0CCR0 = 62499; // 2x -> 1s
- TACTL = TASSEL_2 + MC_1 + ID_3;
- TA0CCTL0 = CCIE;
- _BIS_SR(GIE);
- // Configurar PWM.
- TA1CCTL1 = OUTMOD_7;
- TA1CCR0 = 20000 - 1;
- TA1CCR1 = 0;
- TA1CTL = TASSEL_2 + ID_0 + MC_1;
- /* ******************** */
- while(1)
- {
- // Estados do programa.
- switch(state)
- {
- case INITIAL:
- // Ler dados do PC e iniciar execução do programa (state = WORKING).
- break;
- case WORKING:
- firstTemp = getTemperature(INCH_1);
- secondTemp = getTemperature(INCH_2);
- temperatureMean = (firstTemp + secondTemp) / 2;
- // Enviar dados para PC do usuário.
- // Mostrar LEDs e configurar servo-motor de acordo com o intervalo da temperatura média.
- if(0 < temperatureMean && temperatureMean <= 40)
- {
- turnOnLeds(1);
- // Ajustar servo-motor (30º).
- setPWMDegrees(30);
- }
- else if(40 < temperatureMean && temperatureMean <= 80)
- {
- turnOnLeds(2);
- // Ajustar servo-motor (60º).
- setPWMDegrees(60);
- }
- else if(80 < temperatureMean)
- {
- turnOnLeds(3);
- // Ajustar servo-motor (90º).
- setPWMDegrees(90);
- }
- break;
- case ATTENTION:
- // Modo de economia de energia quando em atenção.
- // A saída deste modo só ocorre na interrupção.
- LPM1;
- break;
- }
- }
- }
- #pragma vector = TIMER0_A0_VECTOR
- __interrupt void Timer_Routine(void)
- {
- count++;
- // 2x count -> 1s
- // Para fins de teste, aumentar p/ 20 (10s)
- if(count == 2 && state == WORKING)
- {
- if(!pressed)
- state = ATTENTION;
- else
- pressed = 0;
- count = 0;
- }
- TA0CCTL0 &= ~ CCIFG;
- }
- #pragma vector = PORT1_VECTOR
- __interrupt void Button_Routine(void)
- {
- pressed = 1;
- if(state == ATTENTION)
- {
- state = WORKING;
- LPM1_EXIT;
- }
- P1IFG &= ~BUTTON;
- }
- void turnOnLeds(unsigned char amount)
- {
- turnOffAllLeds();
- for(unsigned char i = 0; i < amount; i++)
- P1OUT |= leds[i];
- }
- void turnOffAllLeds();
- {
- for(unsigned char i = 0; i < 3; i++)
- P1OUT &= ~(leds[i]);
- }
- void setPWMDegrees(unsigned char degrees)
- {
- if(degrees < 0 || degrees > 90)
- return;
- TA1CCR1 = (((degrees * 0.5) / 90) + 1.5) * 1000;
- }
- double getTemperature(unsigned char channel)
- {
- double temperature = 0;
- ADC10CTL1 = channel;
- for (unsigned char i = 1; i <= 100; i++)
- {
- ADC10CTL0 |= (ENC + ADC10SC);
- while ((ADC10CTL0 & ADC10IFG) == 0) {};
- temperature += ADC10MEM;
- }
- ADC10CTL0 &= ~(ADC10ON);
- ADC10CTL0 &= ~(ENC + ADC10SC);
- return (temperature / 100);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement