sexta-feira, 22 de abril de 2011

Creating a program and library to the MSP

In this post we will talk about the libraries already used in the previous example and create new libraries from the analysis of the example.
Let's start with the libraries already used, they are: msp430.h , msp430f2013.h, in430.h e intrinsics.h.
These are basic libraries that determine since which MSP microcontroller family is being used, even set some functions used to control the board:
• "msp430.h": this library has only the function to call the “.h” responsible for each version of msp.
• "msp430f2013.h": this is the file that is called to the MSP we are using
• is responsible for basic configurations and settings to control the board, such as doors, inputs and outputs, watchdog, registers, timers, bit settings, memory, interrupt.
• "in430.h": Sets the intrinsic functions and mapping compiler for the MSP430 IAR Systems C / C + +.
• "intrinsics.h": registration code intrinsic of functions of IAR Embedded Workbench for MSP430.

To show how to create libraries we decided to start the analysis from the example of the LED, and modify it to a Morse code.
But before that, a quick and (perhaps) is instructive summary of what the morse code:
Morse code is a system of representing letters, numbers and punctuation marks through a
coded signal sent intermittently.


It was developed by Samuel Morse in 1835, creator of the electric telegraph, a device that uses electrical currents to control electromagnets that work for emission or reception of signals.
A coded message in Morse can be transmitted in various ways in pulses (or tones) short and long:
• electrical pulses transmitted through a cable;
• mechanical waves (noise disturbance);
• visual signals (lights turning on and off, as our LED);
• electromagnetic waves (radio signals);

This system represents letters, numbers and punctuation marks with just a sequence of dots, dashes, and spaces.
Probably the most famous Morse code in the word is the SOS, one of the most used and signals sent in emergency situations.
In popular usage, SOS was associated with phrases such as "Save Our Seamen”, "Save Our Ship”, "Survivors On Shore" or "Save Our souls ". These phrases, however, appeared later, as a way to help remember the letters correctly (a retro-acronym). As a code, the letters SOS do not have a meaning for themselves.
Now back to embedded programming, let's consider a program that can transmit the message with just the led.
Analyzing the code of the flashing LED realize that the command responsible for turning on and off the LED is "P1OUT ^ = 0x01;", and that it must be declared as output "P1DIR | = 0x01;."
From these two commands, and a Morse code table decided to create a library that allows easily for the programmer to send a coded message in Morse code through the LED.
Use a program of your choice to build and save the following code as libraries. The following code corresponding to the library foundation for the program:
#include "CodigoMorse.h"
#include "msp430.h"

#define T_LONGO 30000   //the longer time will be used for the representation of character traits ans between characters
#define T_CURTO 10000   //the shortest time will be used for the representation of points and beyween signals
unsigned int i;

//definitions of times and outputs
void TempoCurto(void)  //TempoCurto means short time
{
      for (i=0;i<T_CURTO;i++);
}

void TempoLongo(void)   //TempoLongo means long time
{
      for (i=0;i<T_LONGO;i++);
}

void TempoEntreSinais (void)  //TempoEntreSinais means time between signals
{
      for (i=0;i<T_CURTO;i++);
}

void TempoEntreLetras (void)  //TempoEntreLetras means time between letters
{
      for (i=0;i<T_LONGO;i++);
}

void CodigoMorseTraco (void)   //TempoEntreLetras morse code traice
{
      P1OUT |= 0x01;   //turn on led
      TempoLongo();
      P1OUT &= ~0x01;  //turn off led
      TempoEntreSinais();
}

void CodigoMorsePonto (void)  //TempoEntreLetras morse code dot
{
      P1OUT |= 0x01;      // turn on led
      TempoCurto();
      P1OUT &= ~0x01;   // turn off led
      TempoEntreSinais();
}

//character sets
void CodigoMorseO (void)
{
      CodigoMorseTraco();
      CodigoMorseTraco();
      CodigoMorseTraco();
      TempoEntreLetras();
}

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

//character selection
void CodigoMorse (char caracter)
{
//teste to see if the character that is coming I possible to represent in Morse Code
      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;
  }
}

Save with the name "CodigoMorse.c." The code only shows how to represent the letters O and S in Morse.
Create another document with the code of library functions:

#ifndef CodigoMorse_H
   #define CODIGOMORSE_H    //This function taks a character encoded in ASCII in the interval of 33 to 122
   void TempoCurto (void);
   void TempoLongo (void);
   void TempoEntreSinais (void);
   void TempoEntreLetras (void);
   void CodigoMorse (char caracter);
#endif

Save this file named "CodigoMorse.h." Notice that the header file only shows the functions of time (in case anyone wanted to do something beyond the standard strings) and a function that takes a character and automatically encodes it in Morse and presents it in the led.
This library will be used as follows:

for (;;) // Start infinite loop
{
      CodigoMorse('S');
      CodigoMorse('O');
      CodigoMorse('S');
      P1OUT = 0x00;      //Ends the message and waits before restarting
      for(i=0;i<10;i++)
      {
            TempoEntreLetras();   //spending time between messages
      }
}

With this, we have everything we need for next week send an SOS through the LED, we know that no one would see our SOS, but it is the basis for those who want to implement the idea to a larger scale.

In the next post we'll show you how to use libraries and how to build and debug the program in the Workbench.

See ya!

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!