Acionando uma sequência de LEDs com MSP430

Pessoal, como eu comentei no post anterior, desta vez vamos trabalhar com uma sequeência de LEDs ligados ao microcontrolador.

Basicamente, este exemplo além de mostrar como acionar uma sequência de LEDs apresentará como utilizar o microcontrolador em uma protoboard, conectando somente os pinos necessários para fazer a gravação e alimentação do mesmo ao kit de desenvolvimento.

Entâo mãos à obra….

O circuito que iremos montar na protoboard, contempla o microcontrolador (mspg2231), 8 LEDs e 8 resistores de 130 ohms.

Similar ao demonstrado na figura abaixo.

Uma dúvida que pode surgir neste momento é de onde eu tirei que os resistores ligados aos LEDs deveriam ser de 130 ohms. E o legal sobre como cheguei a esta conclusão é que, no auge da minha empolgação, eu estava usando qualquer resistor (inclusive brincando com esquemas que tinham resistores diversos em paralelo), até o professor - ao ver minhas peripécias - me alertar que, dependendo do cenário, eu poderia sobrecarregar o microcontrolador.

É verdade! Eu estava esquecendo da lei de Ohm.

Como não queremos danificar o microcontrolador, vamos ver como definir um resistor para que possamos nos divertir com segurança. Para isso será necessário conhecer algumas características elétricas dos pinos no microcontrolador, informações estas que iremos encontrar no datasheet do mesmo.

Na página 19 do datasheet do microcontrolador, podemos encontrar a seguinte tabela:

Esta tabela nos informa que quando o pino de uma porta está em nível alto (que é o que precisaremos para acender um LED de acordo com o equema que montamos), com uma carga de 6mA ligada ao pino, a tensão de saída é tipicamente VCC – 0,3V. A tabela também especifica a tensão em um pino quando o mesmo está em nível baixo.

Considerado que o led que usaremos provoca uma queda de tensão de 2.2 Volts e que a corrente que queremos que passe por ele seja 6mA, vamos usar a lei de Ohm para calcular o resistor ideal para o nosso circuito.

U = R * i

Onde U é a tensão no circuito, ou seja VCC – 0.3 – 2.2.

R é a resistência que queremos encontrar.

i é a corrente, no caso 6mA.

Substituindo os valores:

(3.6 - 0.3 - 2.2)V = R * 6mA
(3.6 - 0.3 - 2.2)V = R * 0,006mA
R = {1,1}/{0,006}
R = 183.33 {Omega}

Definido o resistor vamos montar o circuito na protoborard. O meu ficou assim.

Repare que fiz a ligação de quatro fios entre a protoboard e o kit de desenvolvimento. Este fios são responsáveis pela alimentação, aterramento, gravação do microcontrolador e provê as condições de funcionamento do microcontrolador.

Logo abaixo montei uma tabela com os pinos do microcontrolador que são necessários ligar ao kit de desenvolvimento.

Pino Nome
1 VCC
14 VSS
11 TEST
10 RST

Os pinos 10 e 11, são necessários para gravar o microcontrolador e provê as condições de funcionamento do mesmo. Em algum post futuro veremos como utilizar o microcontrolador sem o kit de desenvolvimento.

Agora, vamos ao códgo:

// array.c - Aciona sequência de LEDs ligados à port P1
#include 

void Delay(void);

int main(void) {
	WDTCTL = WDTPW | WDTHOLD;
	char leds[16] = {0x0, 0x1, 0x3, 0x7, 0xf, 0x1f, 0x3f, 0x7f, 0xff, 0x7f, 0x3f, 0x1f, 0xf, 0x7, 0x3, 0x1};
    volatile int i = 0;

    P1DIR = 0xff;

    for (;;) {
		P1OUT = leds[i];
		i++;
		Delay();
		if(i==16) i=0;
    }
}

void Delay(void) {
    unsigned int dly = 30000;
    while(--dly); {
        // Nothing:D
    }
}

Considerando que você tenha lido o post anterior, ou que tenha conhecimento prévio em programação C e o microcontrolador mspg2231, irei explicar somente as linhas necessárias para o entendimento deste código.

Na linha 8, estamos declarando um vetor, ou conjunto, de caracteres hexadecimais.

char leds[16] = {0x0, 0x1, 0x3, 0x7, 0xf, 0x1f, 0x3f, 0x7f, 0xff, 0x7f, 0x3f, 0x1f, 0xf, 0x7, 0x3, 0x1};

Na linha 9, estamos declarando um variável inteira de valor 0 para armazenas a informação de qual posição do vetor iremos usar em um determinado instante.

volatile int i = 0;

Na linha 13 estamos usando a função for, sem nenhum atributo, para que o microcontrolador fique executando as instruções entre a linha 13 e a linha 18 repetidas vezes infinitamente.

for (;;) {

Vamos agora analisar a sequência de instruções entre as linas 13 e 18.

for (;;) {
		P1OUT = leds[i];
		i++;
		Delay();
		if(i==16) i=0;
    }

Cada vez que esta instrução for executada, o microcontrolador atribuirá a porta P1 o valor armazenado na posição i da coleção de caracteres hexadecimais. no caso da primeira interação, o valor 0×00.

Logo em seguida incrementamos o valor de i, que na primeira interação vai de 0 para 1.

Chamamos a função Delay() para gastar um pouco de tempo possibilitando percebermos visualmente a alteração dos estados dos LEDs.

Na linha 17 verificamos se estamos usando a ultima posição da coleção, e caso estejamos voltamos para a posição 0.

if(i==16) i=0;

Resumindo, o que o nosso código faz é percorrer do inicio ao fim, infinitas vezes, a coleção de caracteres hexadecimais e atribuir um valor de cada vez a porta P1.

Para facilitar a demonstração, fiz um gif animado, com cada valor do vetor, sua representação binária e o efeito sobre os LEDs no circuito.

Pronto é isso ae, para finalizar, um vídeo do circuito em operação.

Até o próximo post.

11 ideias sobre “Acionando uma sequência de LEDs com MSP430

  1. muito legal assim vou correndo fazer com a minha launch pad que comprei de vc. kkkkk posta mais exemplos assim a gente que ta começando aprende mais com vc, que pra mim sabe d++ valew.

Deixe uma resposta

O seu endereço de email não será publicado Campos obrigatórios são marcados *

*

Você pode usar estas tags e atributos de HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>