sexta-feira, 22 de abril de 2011

Criando um programa e sua biblioteca para o MSP

Neste post iremos falar sobre as bibliotecas já usadas no exemplo anterior e criaremos novas bibliotecas a partir da analise do exercício exemplo.
Vamos começar pelas bibliotecas já utilizadas, elas são: msp430.h , msp430f2013.h, in430.h e intrinsics.h.
Essas são bibliotecas básicas, que fazem desde definir qual microcontrolador da família MSP esta sendo usado, até definir algumas funções utilizadas para controlar a própria placa:
  • msp430.h”: esta biblioteca tem apenas a função de chamar o “.h” responsável por cada versão do msp.
  • msp430f2013.h”: este é o arquivo que será chamado para o MSP que estamos utilizando
  • é responsável pelas configurações e definições básicas para o controle da placa, como portas, entradas e saídas, watchdog, registros, timers, definições de bits, memória, interrupção.
  • in430.h”: Define as funções intrínsecas e o mapeamento para o compilador MSP430 IAR Systems C/C++.
  • intrinsics.h”: código de registro intrínseco das funções do IAR Embedded Workbench para MSP430.
Para mostrar como criar bibliotecas decidimos partir apenas da analise do exemplo do led, e modificá-lo para um código morse.
Mas antes disso, um rápido e (talvez) instrutivo resumo do que é o codigo morse:
O código morse é um sistema de representação de letras, números e sinais de pontuação através de um sinal codificado enviado intermitentemente.


Ficheiro:Samuel Morse.jpg


Ficheiro:Bencher paddle.jpg


Foi desenvolvido por Samuel Morse em 1835, criador do telégrafo elétrico , dispositivo que utiliza correntes elétricas para controlar eletroímãs que funcionam para emissão ou recepção de sinais.
Uma mensagem codificada em Morse pode ser transmitida de várias maneiras em pulsos (ou tons) curtos e longos:
  • pulsos eléctricos transmitidos em um cabo;
  • ondas mecânicas (perturbações sonoras);
  • sinais visuais (luzes acendendo e apagando, como nosso led);
  • ondas eletromagnéticas (sinais de rádio);
Este sistema representa letras, números e sinais de pontuação apenas com uma sequência de pontos, traços, e espaços.
Provavelmente o código morse mais famoso do mundo é SOS, um dos sinais mais usados e enviados em situações de emergência.
No uso popular, SOS foi associado a frases como "Save Our Seamen" ("Salve nossos marinheiros"), "Save Our Ship" ("Salve nosso Navio"), "Survivors On Shore" ("Sobreviventes na costa") ou "Save Our Souls" ("Salve nossas almas"). Essas frases, no entanto, surgiram depois, como forma de ajudar a lembrar as letras corretamente (um retro-acrônimo). Sendo um código, as letras de SOS não têm um significado por si mesmas.
Agora de volta a programação embarcada, vamos pensar em um progorama que possa transmitir a mensagem com apenas o led.
Analisando o código do flashing the led percebemos que o comando responsável por acender e apagar o led é “P1OUT ^= 0x01;”, e que ele precisa ser declarado como saída “P1DIR |= 0x01;”.
Partindo desses dois comandos, e de uma tabela de código morse resolvemos criar uma biblioteca que permitisse de maneira fácil para o programador enviar uma mensagem codificada em morse através do led.
Use um programa de sua escolha para construir e salvar os seguintes códigos como bibliotecas. O código a seguir correspondente ao arquivo da biblioteca base para o programa:

#include "CodigoMorse.h"
#include "msp430.h"

#define T_LONGO 30000    //o tempo maior sera utilizado para a representação dos traços e entre caracteres
#define T_CURTO 10000  //o tempo menor sera utilizado para a representação dos pontos e entre sinais

unsigned int i;

// definições de tempos e saídas
void TempoCurto(void)
{
      for (i=0;i<T_CURTO;i++);
}

void TempoLongo(void)
{
      for (i=0;i<T_LONGO;i++);
}

void TempoEntreSinais (void)
{
      for (i=0;i<T_CURTO;i++);
}

void TempoEntreLetras (void)
{
      for (i=0;i<T_LONGO;i++);
}

void CodigoMorseTraco (void)
{
      P1OUT |= 0x01 //liga led
      TempoLongo();
      P1OUT &= ~0x01 //desliga led
      TempoEntreSinais();
}

void CodigoMorsePonto (void)
{
      P1OUT |= 0x01;      //liga led
      TempoCurto();
      P1OUT &= ~0x01;   //desliga led
      TempoEntreSinais();
}

// definições de caracteres
void CodigoMorseO (void)
{
      CodigoMorseTraco();
      CodigoMorseTraco();
      CodigoMorseTraco();
      TempoEntreLetras();
}

void CodigoMorseS (void)
{
      CodigoMorsePonto();
      CodigoMorsePonto();
      CodigoMorsePonto();
      TempoEntreLetras();
}

//seleção de caracteres
void CodigoMorse (char caracter)
{
//teste para verificar se o caracter que está vindo é possível de representar em codigo morse
      if  
  (
     (caracter == 33) ||
     (caracter == 44) ||
     (caracter == 46) ||
     (caracter >= 48 && caracter <= 58) ||
     (caracter == 63) ||
     (caracter >= 65 && caracter <= 90) ||
     (caracter >= 97 && caracter <= 122)
      )
  {
           case 'O':
           case 'o':
           CodigoMorseO();
           break;

           case 'S':
           case 's':
           CodigoMorseS();
           break;
  }
}

Salve com o nome “CodigoMorse.c”. O código apresentado apenas mostra como representar as letras O e S em morse.
Crie outro documento com o código de funções da biblioteca:

#ifndef CodigoMorse_H
   #define CODIGOMORSE_H
//essa função recebe um caracter codificado em ASCII no intervalo de 33 à 122
   void TempoCurto (void);
   void TempoLongo (void);
   void TempoEntreSinais (void);
   void TempoEntreLetras (void);
   void CodigoMorse (char caracter);
#endif

Salve esse arquivo com o nome “CodigoMorse.h”. Notem que o arquivo de header apenas mostra as funções de tempo (caso alguém queria fazer alguma coisa além dos caracteres padrões) e uma função que recebe um caracter e automaticamente o codifica em morse e apresenta-o no led.
Essa biblioteca será utilizada da seguinte forma:

for (;;) // Inicia loop infinito
{
      CodigoMorse('S');
      CodigoMorse('O');
      CodigoMorse('S');
      P1OUT = 0x00;      //Termina a mensagem e aguarda antes de reiniciar
      for(i=0;i<10;i++)
      {
            TempoEntreLetras();   //gastando um tempo entre as mensagens
      }
}
Com isso, temos tudo que precisamos para semana que vem mandar um SOS através do led, sabemos que ninguém iria ver o nosso SOS, mas já é a base para quem quiser implementar a idéia para uma escala maior.

No próximo post mostraremos como usar as bibliotecas, e como montar e debugar o programa no Workbench. 

Até semana que vem!

Nenhum comentário:

Postar um comentário