Help me: Programa C + Launchpad Msp430

277 views
Skip to first unread message

EdiFirst

unread,
Jun 27, 2013, 1:03:38 PM6/27/13
to hacker...@googlegroups.com

 Boa tarde, Galera!


 Sei que deveria ser simples, mas estou aqui novamente tentando aprender a programar este microcontrolador, vi alguns exemplos na net,
mas estão usando algo um pouquinho mais avançado, que é são as interrupção, e por enquanto só quero que um led acende ao apertar o botão, mas não vai, ao meu ver
o código está correto:

Obs>.> (DQ se vc ver estiver vendo este tópico quero comentar que encontrei os códigos no seu blog, mas por enquanto o que quero é bem mais simples..estou tentando entender estes registradores PxIN, PxOUT, PxREN,etc):

Meu código:

//******************************************************************************
//  MSP430 com linguagem c.
// by Edmar-----------------IAR versão 5.50.2
//******************************************************************************

  #include <msp430G2553.h>

  void main(void)
   {
     WDTCTL = WDTPW+WDTHOLD;                 // Desliga Watchdog Time
     P1DIR  = 0x01;                                       // P1.0 como Saída, os demais entradas
     P1REN  = 0x09;                                         // Habilita no P1.0 e P1.3 Resistor Pull-up

      while(1)             // Loop Infinito
          {
             if (P1IN==0)         // Se o botão está em 0
            P1OUT = 0xff; //Acende Led 1 (Verde) >> Na verdade manda tensão para todos os pinos que estão configurados como saída
               else
                   P1OUT = 0x00;   //Apaga Led 1 (Verde)>> Na verdade desliga a tensão para todos os pinos que estão configurados como saída
           }
  }
 
    É isto galerinha, se puderem ajudar, fico muito grato, Abraço!!


       

DQ

unread,
Jun 27, 2013, 1:32:25 PM6/27/13
to hacker...@googlegroups.com

Eu acho que o erro está em (P1IN == 0), devia ser ((P1IN & 0x08) == 0), supondo que o botão esteja entre o P1.3 e terra.

DQ

EdiFirst

unread,
Jun 27, 2013, 1:49:04 PM6/27/13
to hacker...@googlegroups.com


 Obrigado, DQ pela ajuda!

 Melhorou um pouco, já que pelo menos vejo alguma coisa acontecer na placa rss.., só que o led já inicia aceso (bem fraquinho mas aceso),
e o fato de apertar o botão não produz nenhum efeito, eis o esquema elétrico (tirado do datasheet):

DQ

unread,
Jun 27, 2013, 2:07:12 PM6/27/13
to hacker...@googlegroups.com

Experimente retirar a linha do P1REN (pelo circuito já tem um pullup em P1.3 e desconfio que o pullup em P1.0 é que faz o LED acender fraquinho). Experimente também mexer só no bit que interesse na P1OUT: P1OUT |= 1; para acender e P1OUT &= ~1; para apagar.

DQ

DQ

unread,
Jun 27, 2013, 2:13:42 PM6/27/13
to hacker...@googlegroups.com
Resolvi olhar o que eu tinha feito no meu Blog e reparei que para colocar um pullup em uma entrada não basta ligar o bit correspondente em P1REN, precisa ligar o bit também em P1OUT.  Caso contrário, é um pull down (o que força a entrada a estar sempre em zero no seu caso).

DQ

EdiFirst

unread,
Jun 27, 2013, 3:01:38 PM6/27/13
to hacker...@googlegroups.com


 DQ, então :

 Tirei o registrador P1REN  da jogada, agora o Led fica aceso powerful, com mais brilho, mas não consegui fazer funcionar o botão...

EdiFirst

unread,
Jun 27, 2013, 3:46:39 PM6/27/13
to hacker...@googlegroups.com

DQ se aparecer a postagem aqui 2 vezes vc me desculpa mas não estou visualizando o que tinha acabado de postar.
 
 Bom, pesquisando mais um pouco , consegui adaptar o meu código e funcionou:


      #include <msp430G2553.h>

           void main(void)
             {
               WDTCTL = WDTPW+WDTHOLD;             // Desliga Watchdog Time
               P1DIR  |= 0x01;                                      // P1.0 como Saída, os demais entradas
               P1OUT  &= ~0x01;                                 // P1.0 como Desligado
               P1REN  |= 0x08;                                   // Habilita Pull-up no botão P1.3

            while(1)        // Loop Infinito
             {
               if ((P1IN & 0x08)==0)                          // Se o botão está em 0
  
                P1OUT |= 0x01;                                 //Acende Led 1 (Verde)
              else

               P1OUT &= ~0x01;                        //Apaga Led 1 (Verde)
   }

Você poderia por favor me dá  uma palhinha (explicada) do que acontece com estas atribuições que destaquei (em vermelho)? Sei que o ~ é vai 1, e o | se não me engano é uma negação, mas não estou entendendo eles aqui.

 Valeu!!

Luis Rossi

unread,
Jun 27, 2013, 3:58:57 PM6/27/13
to hacker...@googlegroups.com
Explicando P1DIR |= 0x01 é o equivalente a P1DIR = P1DIR | 0x01;

Logo ele lê o registrador P1DIR, faz a lógica OU bit a bit com o valor 0x01 e escreve no registrador P1DIR;

Explicando P1OUT &= ~0x01 é o equivalente a P1OUT = P1OUT & ~0x01;

Logo ele lê o registrador P1OUT, inverte bit a bit o valor 0x01, faz a operação lógica E entre os dois e escreve no registrador P1OUT.

O primeiro é utilizado para colocar o valor de um bit específico (no caso o bit 0) de uma variável em nível lógico 1 sem modificar os outros bits.
O segundo para colocar o nível lógico de de um bit específico de uma variável em nível lógico 0 sem modificar os outros bits.

Recomendação. Nos compiladores de MSP430 (CCS, IAR e GCC) existem macros definidas para cada bit. Por exemplo no lugar de 0x01 escreva BIT0, no ligar de 0x08 escreva BIT3. Fica bem mais legível. 

Recomendo procurar na internet por operações de bitwise em C. São muito importantes.

Abraços.




2013/6/27 EdiFirst <egs....@uol.com.br>

--
.--. .- .-. .- .--. --- ... - .- .-. . ... -.-. .-. . ...- .- .--. .- .-. .- .... .- -.-. -.- . .-. ... .--. .- -.-. . ... .--. .- - --. --- --- --. .-.. . --. .-. --- ..- .--. ... -.. --- - -.-. --- --
Regras da Lista: http://garoa.net.br/wiki/Lista:LeiaAntesDeClicarNoSend
Para mais informações sobre o Garoa Hacker Clube acesse http://garoa.net.br
Maiores opções sobre o Google Groups, visite: http://groups.google.com/group/hackerspacesp
.--. .- .-. .- -- .- .. ... .. -. ..-. --- .-. -- .- . ... .- -.-. . ... ... . --- .-- .. -.- ..
Epoch 0 <=> Fundação: 1298244863 s ~ 2.408064*10^52 tP (tempos de Planck)
 
 
 



--
Luís Filipe Rossi
Electrical Engineer
Escola Politécnica
Universidade de São Paulo

DQ

unread,
Jun 27, 2013, 4:04:00 PM6/27/13
to hacker...@googlegroups.com
Vamos lá...

Primeiro, o C tem esta forma de reduzida de escrever atribuições:  x += 1 é o mesmo que x = x +1. Esta mesma forma reduzida pode ser usada com outros operadores, no caso | e &.

Segundo os operadores | e & são os chamados OU e E binários. Eles fazem operações booleanas sobre os bits dos operando, bit a bit:

0x03 | 0x5 = 0x7
0 0 0 0 0 0 1 1
0 0 0 0 0 1 0 1
0 0 0 0 0 1 1 1

0x03 & 0x5 = 0x1
0 0 0 0 0 0 1 1
0 0 0 0 0 1 0 1
0 0 0 0 0 0 0 1

No OU, o resultado será 1 se pelo menos um dos operandos for 1, usamos isto para "ligar" bits. No E, o resultado será zero se pelo menos um dos operandos for 0, usamos isto para "desligar" bits.

Pegando o primeiro caso, P1DIR |= 0x01. Isto é o mesmo que P1DIR = P1DIR | 0x01. O resultado é que o bit menos significativo de P1DIR passará a ser 1, sem alterar o resto.

O ~ é a negação (ou complemento de 1). 0 vira 1 e 1 vira 0. P1OUT &= ~0x01 é o mesmo que P1OUT = P1OUT & 0xFE. O resultado é que o bit menos significativo de P1OUT passará a ser 0, sem alterar o resto.

O uso direto dos "periféricos" dos microcontroladores é, em grande parte, ficar mudando bits em registradores, daí este monte de |= e &=

E tem ainda o ^= onde o operador é o XOR (ou exclusivo) que resulta em 1 somente se os dois operandos forem diferentes. Isto é usado em um monte de truques, como:

x ^= 1  inverte o bit menos significativo
x ^= x é zero (velho truque Jedi para zerar um registrador)

Espero que tenha ajudado.

DQ

EdiFirst

unread,
Jun 27, 2013, 4:38:18 PM6/27/13
to hacker...@googlegroups.com


   Com certeza ajudou e muito DQ, quero agradecer também Filipe pela explicação.

         Valeu mesmo galera!!

                                Agora dá para prosseguir,  qualquer dúvida já sei onde encontro "os Caras!!" 
Reply all
Reply to author
Forward
0 new messages