Skip to content

Terry Laundos Aguiar (terryvel)

Compartilhando experiências para inspirar e apoiar outras jornadas

Menu
Menu

Acionando uma sequência de LEDs com MSP430

Posted on 5 de outubro de 201123 de outubro de 2011 by terryvel

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.

[pmath size=16]U = R * i[/pmath]

Onde [pmath size=16]U[/pmath] é a tensão no circuito, ou seja VCC – 0.3 – 2.2.

[pmath size=16]R[/pmath] é a resistência que queremos encontrar.

[pmath size=16]i[/pmath] é a corrente, no caso 6mA.

Substituindo os valores:

[pmath size=16](3.6 – 0.3 – 2.2)V = R * 6mA[/pmath]
[pmath size=16](3.6 – 0.3 – 2.2)V = R * 0,006mA[/pmath]
[pmath size=16]R = {1,1}/{0,006}[/pmath]
[pmath size=16]R = 183.33 {Omega}[/pmath]

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 0x00.

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.

Category: microcontroladores, msp430

Navegação de Post

← Pisca Led MSP430 LaunchPad (mspgcc)
Alta disponibilidade em rede com Ubuntu 11.10 Server (GNU/Linux) →

11 thoughts on “Acionando uma sequência de LEDs com MSP430”

  1. Angel Portal disse:
    5 de outubro de 2011 às 16:54

    Legal, vou tentar fazer o mesmo em casa com os software que ganhei da Texas… Até mais…..

    Responder
  2. Marcos Ribeiro disse:
    31 de outubro de 2011 às 14:25

    Bacana, parabéns por compartilhar!!!

    Responder
  3. Marco_A disse:
    15 de março de 2012 às 8:54

    boas!! vi o teu post e curti…mas gostaria de saber se não da para postar uma sequencia de 5 leds utilizando um timer_A… abraço

    Responder
    1. terryvel disse:
      25 de março de 2012 às 23:39

      Opa Marco, obrigado pelo incentivo, vou colocar na lista, o mais breve possível tento fazer alguma brincadeira com o timer A e posto por aqui.

      Responder
  4. stenio disse:
    27 de agosto de 2012 às 11:37

    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.

    Responder
    1. terryvel disse:
      4 de setembro de 2012 às 21:05

      É isso ae Stênio, qualquer coisa estamos aqui!

      Responder
  5. Rodrigo disse:
    25 de janeiro de 2013 às 16:36

    Legal sua iniciativa! Parabéns!

    Responder
  6. Edmar disse:
    3 de julho de 2013 às 22:10

    E se fosse mais leds, utilizando mais de uma porta?

    Responder
    1. terryvel disse:
      26 de abril de 2014 às 13:55

      O código pode ser facilmente modificado para utilizar mais portas e mais portas.

      Responder
  7. Angelo disse:
    1 de dezembro de 2013 às 10:17

    Vc faz um programa e o circuito usando um pic pequeno, ou pode indicar alguém que faça.
    Obrigado

    Responder
    1. terryvel disse:
      26 de abril de 2014 às 13:54

      Opa Angelo, estive em um período intenso de trabalho. O blog ficou meio de lado. Mas agora estou de volta. Ainda tem necessidade?

      Responder

Deixe um comentário para Marco_A Cancelar resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Este site utiliza o Akismet para reduzir spam. Saiba como seus dados em comentários são processados.

Terry Laundos Aguiar
Gerente de Arquitetura de TI, apaixonado por dados, integrações e arquitetura empresarial, conectando estratégia de negócios e tecnologia.
  • LinkedIn
  • Instagram
  • X

Análise Estática de Código Azure Bluetooth DevOps Energia Enterprise Architecture Tools Essential Open Source Essential Project interrupções LED linux Microcontroladores msp430 mspgcc Python Qualidade de Código rede SonarQube Texas Instruments Windows

© 2025 Terry Laundos Aguiar (terryvel) | Powered by Minimalist Blog WordPress Theme