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:

/*
Spoke-o-dometer
Teste1 - teste dos LEDs

Daniel Quadros - abril, 2009
*/

#include <msp430.h>

// Valor para contar 200ms c/ clock de 12KHz
#define TEMPO_200MS 2400 // 200ms * 12KHz

typedef unsigned char byte;

static int iLed; // indica qual LED piscar

// Rotinas Locais
static void Led (int iLed, int valor);

// Programa Principal
void main (void)
{
int cont = 0;

// Desliga Watchdog
WDTCTL = WDTPW + WDTSSEL + WDTHOLD;

// Altera a configuração de clock para ativar o VLOCLK
BCSCTL3 |= LFXT1S1;

// Programa entradas e saídas
P1SEL = 0xC0; // P1.0 a P1.5 -> LEDs
// P1.6 e P1.7 são A3+ e A3-
P1DIR = 0x3F;
P1OUT = 0; // Todos as saídas em zero

P2SEL = 0; // Todos os pinos como I/O
P2DIR = 0xFF; // Todos os pinos como saída
P2OUT = 0; // Todos as saídas em zero

// Inicia os nossos controles
iLed = 0;

// Dá um tempinho para estabilizar a alimentação
while (cont < 0xFF)
cont++;

// Alimentação já deve estar estável, vamos ligar o DCO
BCSCTL1 = CALBC1_12MHZ;
DCOCTL = CALDCO_12MHZ;

// Programar a interrupção de tempo real p/ cada 200ms
TACCR0 = TEMPO_200MS;
TACTL = TASSEL_1 + MC_1 + TAIE; // ACLK, up mode, interrupt

// O nosso programa principal vai ficar dormindo,
// todo o tratamento será feito na interrupção
_BIS_SR(LPM3_bits + GIE); // Dorme tratando interrupção

// Nuca vai chegar aqui
while (1)
;
}

// Tratamento da interrupção do Timer A
#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A_TO(void)
{
switch (TAIV)
{
case 10: // overflow
Led (iLed, 0); // apaga LED anterior
iLed = (iLed+1) & 7; // passa para o seguinte
Led (iLed, 1); // acende o LED
break;

case 2: // CCR1, não utilizado
break;
}
}

// Altera o estado de um LED
// iLed: número do LED, de 0 a 7
// valor: 0 = apaga, 1 = acende
static void Led (int iLed, int valor)
{
if (iLed < 6)
{
if (valor)
P1OUT |= (1 << iLed);
else
P1OUT &= ~(1 << iLed);
}
else
{
if (valor)
P2OUT |= (1 << iLed);
else
P2OUT &= ~(1 << iLed);
}
}
O vídeo abaixo mostra o resultado (depois que corrigi as besteiras que eu fiz):

video

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

Nenhum comentário: