segunda-feira, abril 20, 2009

Spoke-o-dometer - Parte 4

Feita a montagem do circuito, é hora de um primeiro teste. O objetivo deste teste e verificar que o microcontrolador está rodando e que os LEDs foram ligados corretamente.

O código (compilado com o IAR) é simples:
  1. /* 
  2.   Spoke-o-dometer 
  3.   Teste1 - teste dos LEDs 
  4.  
  5.   Daniel Quadros - abril, 2009 
  6. */  
  7.   
  8. #include <msp430.h>  
  9.   
  10. // Valor para contar 200ms c/ clock de 12KHz  
  11. #define TEMPO_200MS  2400     // 200ms * 12KHz  
  12.   
  13. typedef unsigned char  byte;  
  14.   
  15. static int iLed;    // indica qual LED piscar  
  16.   
  17. // Rotinas Locais  
  18. static void Led (int iLed, int valor);  
  19.   
  20. // Programa Principal  
  21. void main (void)  
  22. {  
  23.   int cont = 0;  
  24.   
  25.   // Desliga Watchdog  
  26.   WDTCTL = WDTPW + WDTSSEL + WDTHOLD;  
  27.   
  28.   // Altera a configuração de clock para ativar o VLOCLK  
  29.   BCSCTL3 |= LFXT1S1;  
  30.   
  31.   // Programa entradas e saídas  
  32.   P1SEL = 0xC0;               // P1.0 a P1.5 -> LEDs  
  33.                               // P1.6 e P1.7 são A3+ e A3-  
  34.   P1DIR = 0x3F;  
  35.   P1OUT = 0;                  // Todos as saídas em zero  
  36.     
  37.   P2SEL = 0;                  // Todos os pinos como I/O  
  38.   P2DIR = 0xFF;               // Todos os pinos como saída  
  39.   P2OUT = 0;                  // Todos as saídas em zero  
  40.   
  41.   // Inicia os nossos controles  
  42.   iLed = 0;  
  43.   
  44.   // Dá um tempinho para estabilizar a alimentação  
  45.   while (cont < 0xFF)  
  46.     cont++;  
  47.   
  48.   // Alimentação já deve estar estável, vamos ligar o DCO  
  49.   BCSCTL1 = CALBC1_12MHZ;  
  50.   DCOCTL  = CALDCO_12MHZ;  
  51.   
  52.   // Programar a interrupção de tempo real p/ cada 200ms  
  53.   TACCR0 = TEMPO_200MS;  
  54.   TACTL = TASSEL_1 + MC_1 + TAIE; // ACLK, up mode, interrupt  
  55.   
  56.   // O nosso programa principal vai ficar dormindo,  
  57.   // todo o tratamento será feito na interrupção  
  58.   _BIS_SR(LPM3_bits + GIE);     // Dorme tratando interrupção  
  59.   
  60.   // Nuca vai chegar aqui  
  61.   while (1)  
  62.     ;  
  63. }  
  64.   
  65. // Tratamento da interrupção do Timer A  
  66. #pragma vector=TIMERA1_VECTOR  
  67. __interrupt void Timer_A_TO(void)  
  68. {  
  69.   switch (TAIV)  
  70.   {  
  71.       case 10:        // overflow  
  72.           Led (iLed, 0);          // apaga LED anterior  
  73.           iLed = (iLed+1) & 7;    // passa para o seguinte  
  74.           Led (iLed, 1);          // acende o LED  
  75.           break;  
  76.       
  77.       case 2:         // CCR1, não utilizado  
  78.           break;  
  79.   }  
  80. }  
  81.   
  82. // Altera o estado de um LED  
  83. // iLed:  número do LED, de 0 a 7  
  84. // valor: 0 = apaga, 1 = acende  
  85. static void Led (int iLed, int valor)  
  86. {  
  87. if (iLed < 6)  
  88. {  
  89.   if (valor)  
  90.     P1OUT |= (1 << iLed);  
  91.   else  
  92.     P1OUT &= ~(1 << iLed);  
  93. }  
  94. else  
  95. {  
  96.   if (valor)  
  97.     P2OUT |= (1 << iLed);  
  98.   else  
  99.     P2OUT &= ~(1 << iLed);  
  100. }  
  101. }  
O vídeo abaixo mostra o resultado (depois que corrigi as besteiras que eu fiz):



No próximo post, o primeiro teste do sensor.

Nenhum comentário: