sexta-feira, 15 de abril de 2011

Understanding the program's MSP430-F2013

In this post we will explain how sample program that flashes the LEDs embedded in the board and also understand a little more of time operations in the hard way. Below is the example of program coded in C language, since there is no display on the board to write "Hello World", there is an LED to inform you if the computer is responding, and we will use this LED to program.

#include "msp430.h"

int main(void)
{
            WDTCTL = WDTPW + WDTHOLD;         // Stop o watchdog
            P1DIR |= 0x01;                                             // Define Door 1 like exit
            volatile unsigned int i;         
            for (;;)                                                           // Start infinite loop
            {
                        P1OUT ^= 0x01;                               // Alternates P1 usando X-OR*
                        for (i=0;i<10000;i++);                                              // Decrement of time by software     
      }
}

We can see that the change of variable P1OUT is done using an XOR operation *, known as the Exclusive OR, a logic comparison that results 1 if compares different values:

Value A
0
0
1
1
 Value B
0
1
0
1
 A XOR B
0
1
1
0

In the example we are doing an XOR with the value 1. So each time this operation is performed the value of P1OUT will be changed.
Taking the same basic program, we modify it to test the device. Let's try to modify intuitively (trial and error) how long the LED is lit through the delay generated by the function for.

void main(void)
{
            volatile unsigned long int i;              // unsigned long int can receive up to 4*10^6
            WDTCTL = WDTPW + WDTHOLD;
            P1DIR |= 0x01;

            for(;;)
            {
                        P1OUT ^= 0x01;
                        for (i=0;i<100000;i++);                    // Bigger incremental delay
            }
}

The variable i has been modified so long as we wanted to test as long as possible. Making an analysis of empirical values​​, we obtained an average time trial between a wink and another 1.70 seconds (i = 100000).
Folding the final value of i (200 000) obtained the time of 2.8 seconds and when we did the test by dividing the final value of i by half (50000) resulted in 1.05 seconds. Making the relationship between the times and values ​​of i obtained the following proportions:



led [μs]
2,80
1,70
1,05
for [loop]
200.000,00
100.000,00
50.000,00
T [μs/loop]
1,40E-05
1,70E-05
2,10E-05

T = 1,7 10-5 second (17μs)

.
Making one evaluation of the graph we inferred that time average period T is 1.16 (uS) and one loop with I from 0 to 0 would 0.5 (s).

Realize there one big difference between times for each situation. This is due to overhead instructions that it constant and impacts more times smaller and mainly to measurement errors.
So we can approximate an account:

Suppose we want a 60 time (s) or 1 minute.

So the code for the LED flash every 1 minute should be:
void main(void)
{
            volatile unsigned long int i;             
            WDTCTL = WDTPW + WDTHOLD;
            P1DIR |= 0x01;

            for(;;)
            {
                        P1OUT ^= 0x01;
                        for (i=0;i<3529411;i++);                  // Delay of 60s
            }
}

With this information we can create a first function that creates a delay of t (ms):
void tempo (unsigned long int t)
{
            unsigned long int i;
            unsigned long int max;

            if (t < t_max)              //t_max is the maximm that t can have witgout breaking                 {
                        max = t*58823;                      // max = t_wanted/t_cycle
                        for (i=0;i<max;i++);              // Delay of 60s
            }
}

In the next post will be learning more about the basic libraries of the MSP and create our own library.
Bye-bye!

sexta-feira, 8 de abril de 2011

Compreendendo o programa do MSP430-F2013

Neste post, vamos explicar como funciona programa exemplo que faz piscar o led embutido na placa e também compreender um pouco mais sobre operações de tempo na marra. Abaixo vemos o programa exemplo codificado em linguagem C, já que não há um display na placa para escrever “Hello World”, há um led para informar que o micro está respondendo e com este led iremos programar, por enquanto.

#include "msp430.h"

int main(void)
{
   WDTCTL = WDTPW + WDTHOLD;      // Pára o watchdog
   P1DIR |= 0x01;                 // Seta Porta 1 como saída
   volatile unsigned int i;       // Volatile para que o compilador não
                                  // tenha que otimizar erroneamente no assembly

   for (;;)                       // Inicia loop infinito
   {
       P1OUT ^= 0x01;             // Alterna P1 usando X-OR*
       for (i=0;i<10000;i++);     // Gasto decremental de tempo por software
   }
}

Podemos perceber que a alteração da variável P1OUT é feita usando uma operação de *XOR, conhecida como Exclusive OR, comparação lógica que resulta em 1 se compara valores diferentes:

 Valor A
0
0
1
1
 Valor B
0
1
0
1
 A XOR B
0
1
1
0

No exemplo estamos fazendo uma XOR com o valor 1. Então cada vez que essa operação for executada o valor de P1OUT será trocado.

Tomando de base o mesmo programa, vamos modificá-lo para testar o dispositivo. Vamos tentar modificar intuitivamente (tentativa e erro) o tempo que o led fica acesso através do delay gerado pela função for.

void main(void)
{
   volatile unsigned long int i;  // unsigned long int pode receber até 4*10^6
        WDTCTL = WDTPW + WDTHOLD;
   P1DIR |= 0x01;

   for(;;)
   {
      P1OUT ^= 0x01;
       for (i=0;i<100000;i++);  // Delay incremental maior
   }
}

A variável i foi modificada para long pois queriamos testar o maior tempo possível. Fazendo uma análise dos valores empíricos, obteve-se um tempo médio experimental entre uma piscada e outra de 1,70 segundos (i=100000).
Dobrando-se o valor final de i (200000) obtivemos o tempo de 2,8 segundos e quando fizemos o teste dividindo o valor final de i pela metade (50000) resultou em 1,05 segundos. Fazendo a relação entre os tempos e valores de i obtivemos  as seguintes proporções:


led [μs]
2,80
1,70
1,05
for [loop]
200.000,00
100.000,00
50.000,00
T [μs/loop]
1,40E-05
1,70E-05
2,10E-05

T = 1,7 10-5 segundos (17μs)

.

Fazendo uma avaliação do gráfico, depreendemos que o tempo médio do período T é de 1,16(μs), e um loop com i de 0 a 0 teria 0,5(s).

Percebemos que existe uma grande diferença entre os tempos para cada situação. Isso se deve ao overhead de instruções, que é constante e impacta mais os tempos menores e principalmente aos erros de medida.
Com isso podemos fazer uma conta aproximada:

Supondo que queremos um tempo de 60(s) ou 1 minuto.




Então o código para o led piscar a cada 1 minuto deverá ser:

void main(void)
{
   volatile unsigned long int i;   
        WDTCTL = WDTPW + WDTHOLD;
   P1DIR |= 0x01;

   for(;;)
   {
       P1OUT ^= 0x01;
       for (i=0;i<3529411;i++);       // Delay de 60s
   }
}

Com essas informações podemos criar uma primeira função que cria um delay de  t (ms):

void tempo (unsigned long int t)
{
   unsigned long int i;
   unsigned long int max;

   if (t < t_max)            //t_max é o maximo que t pode ter sem estourar           {
       max = t*58823;        // max = t_desejado/t_ciclo
       for (i=0;i<max;i++);  // Delay de 60s
   }
}

No próximo post estaremos aprendendo mais sobe as bibliotecas básicas do MSP e criaremos a nossa própria biblioteca.

Até semana que vem!

Programando no MSP430-F2013


Como já falamos, este blog foi desenvolvido para apresentar os resultados das pesquisas que faremos com o MSP430F2013. Nossa idéia é publicar posts semanais discutindo primeiramente sobre o desenvolvimento do software do micro, para depois passarmos ao hardware.
Neste primeiro post da série, vamos explicar como programar o micro controlador MSP430F2013 através da IDE Workbench usando o gravador ez430.

Em primeiro lugar, inicie o Workbench (Start → Programs → IAR Systems → IAR Embedded Workbench Kicks start for MSP430 V3 → IAR Embedded Workbench).

Abra File → Open Workspace em:
C:\ProgramFiles\IARSystems\EmbeddedWorkbench4.0\430\FET_examples\Flashing the LED.eww.
A área de trabalho ira abrir.

Clique em msp430x2xx (C – SpyBiWire) clique no botão da área de trabalho que corresponde ao eZ430-F2013.

Defina o dispositivo correto clicando em Projects → Options →General Options → Selecione MSP430F2013 na lista.

Na janela de configurações, vá para FET Debugger → Setup →Connection → TI USB FET para usar a interface da USB.

Project → Rebuild All. Você pode visualizar o código do programa clicando duas vezes no projeto, e depois duas vezes sobre o arquivo exibido.

Project → Debug.C-SPY irá limpar a memoria Flash, e realizar o download do código para o dispositivo.

Debug → Go. O programa começa, o LED deve piscar.

Debug → Stop Debugging para parar o debug (programa) e sair do C-SPY e retornar ao Workbench.

Use File → Exit para sair do Workbench.

Se o procedimento foi realizado com sucesso então tudo está funcionando, e você está pronto para começar a programar o MSP430-F2013.
No próximo post apresentaremos o programa de exemplo que vem junto com o kit de demonstração e começaremos a explorar as possibilidades desse kit!

Até semana que vem!


sexta-feira, 1 de abril de 2011

Installation

1.      1. Open the CD of installation and execute “FET_R600.exe”, it should install the “IAR Systems Workspace”, which is the programming environment.
2.     2. Run "GANG430_R150.exe" which is the communicator RS232 of the board.
3.     3. Insert the USB device and it should be recognized, automatically installing the driver.
4.     4. If  it wasn’t recognized go in: C:\Program Files (x86)\IAR Systems\Embedded Workbench 6.0 Kickstart\430\drivers\TIUSBFET.
5.     5. Open the folder for your operating system and run "Dpinst.exe."