MSP430 : LPM + Interrupções

597 views
Skip to first unread message

EdiFirst

unread,
Jul 2, 2013, 8:06:00 PM7/2/13
to hacker...@googlegroups.com

 Fala galera!

 Então, travei de novo aqui nos códigos, já pesquisei bastante mas sempre falta alguma coisa.. Novamente vou precisar de helps ; )

 Este código abaixo funciona razoavelmente bem, ( é que tem vezes que aperto o botão, seja ele S1 ou S2 e não obtenho resposta), mas não quero me preocupar com isto agora.
 A ação é bem simples, ele inicia com os leds ligados, apertando um dos botão o led desliga.(correspondente aquele botão),eis o código:

     #include <msp430G2553.h>

         void main(void)
         {
         volatile unsigned int i;
         WDTCTL = WDTPW+WDTHOLD;        // Desliga Watchdog Timer
         P1DIR  |= BIT0 + BIT6;                       // P1.0 e P1.6 como Saída, os demais entradas
         P1OUT  &= ~BIT0 + BIT6;                  // P1.0 e P1.6  como Desligado
         P1REN  |= BIT1 + BIT3;                    // Habilita Pull-up no botão P1.3 e P1.1

          while(1)                                       // Loop Infinito
             {
               if ((P1IN & BIT3)==0)                 // Se  botão S1 está em 0
    
                P1OUT &= ~BIT0;              //Apaga Led 1 (Vermelho)
                     else 
      
                 P1OUT |= BIT0;                   //Acende Led 1 (Vermelho)
                 for(i=60000;i>0;i--);             // Dar um tempo
   
                   if ((P1IN & BIT1)==0)         // Se  botão S2 está em 0
        
                    P1OUT &= ~BIT6;          //Apaga Led 2 (Verde) 
                    else 
      
                  P1OUT |= BIT6;        //Acende Led 2 (Verde) 
                    for(i=60000;i>0;i--);      // Dar um tempo
                     }
             }


Agora gostaria de fazer a mesma coisa  do código acima usando Low Power Mode e Interrupções, com 1 Led e 1 botão cheguei no resultado:

         #include <msp430G2553.h>

         void main(void)
         {
         
         WDTCTL = WDTPW+WDTHOLD;        // Desliga Watchdog Timer
         P1DIR  |= BIT0                                   // P1.0 como Saída, os demais entradas
         P1REN |= BIT3;                                 // Habilita Pull-up no botão P1.3
         P1OUT =  BIT3;                                 // Inicia o Botão em nível lógico 1
         P1IES |= BIT3;                                  //  Seleciona a borda de interrupção  Hi/Low (neste caso quando for para 0) , não entendi bem esta parte..
         P1IFG &= ~BIT3;                              // Inicia o estado da flag como abaixada (0)
         P1IE |= BIT3;                                    //  Habilita a função de Interrupção onde está o botão
          while(1)                                       // Loop Infinito


       _BIS_SR(LPM4_bits + GIE);               // Função Intrínseca que entra em modo  de LP com o General Interrupt Enable Ativo
        #pragma vector=PORT1_VECTOR     // Começa aqui a rotina de interrupção na Porta 1 (Com o LPM4 todos os clocks estão desligados)    
         __interrupt void Port_1_ISR(void)
           
            while(1)                                      // Loop Infinito
              {
               if ((P1IN & BIT3)==0)                 // Se  botão S1 está em 0
    
                P1OUT |= BIT0;                      //Acende Led 1 (Vermelho)
                     else 
      
                 P1OUT &= ~BIT0;                  //Apaga Led 1 (Vermelho)
                 P1IFG &= ~BIT3;                   // Reseta a flag(0)
                
                }
             }

  Este funcionou bem, sem bug.. mas quando adapto para 2 leds e 2 botões, não funciona.. não acontece nda.. 
 A única alteração que fiz foi acrescentar nos registradores 1 led (onde é saída), e mais 1 botão na entrada.
 Porque será que não funcionou?


DQ

unread,
Jul 2, 2013, 9:31:48 PM7/2/13
to hacker...@googlegroups.com
Não vai dar tempo para eu olhar isto ao fundo agora, mas seguem alguns pitacos:
  • Acho que a programação de pullups está incorreta no primeiro programa. Os bits em P1REN ativam os resistores nos pinos de entrada. Se o bit correspondente em P1OUT for 0, o resistor é de pull down (força bit no P1IN em zero quando aberto), ser for 1 é pull up (força bit no P1IN em um quando aberto).
  • A borda indica com qual a mudança no sinal que vai gerar a interrupção. O botão na Launchpad deixa a entrada aberta quando está solto, ligando o pull up a entrada estará em um, Quando você apertar, a entrada vai para zero; quando soltar ela vai voltar para um. P1IES determina se a interrupção será gerada quando o sinal passar de 1 para 0 (aperto do botão) ou de 0 para 1 (quando soltar o botão). Para interromper nas duas bordas você precisaria reprogramar o P1IES durante a interrupção. Do jeito como está ele vai interromper somente quando o botão é apertado.
  • Uma coisa que pode complicar a sua vida é o "bounce" do botão. Quando você aperta ou solta ele não muda uma única vez de um nível para o outro, os contatos podem "pular" gerando alternância entre 0 e 1 por algum tempo.
  • Uma rotina de interrupção não deve ter um loop. Ela deve fazer um processamento rápido e encerrar. Do jeito como está o código, o processador dorme somente até a primeira apertada, depois fica preso na rotina de interrupção (acordado e com interrupções inibidas).
  • Eu acho que você se atrapalhou no cut-and-paste acima, pois a rotina de interrupção deve estar fora do main.
DQ

EdiFirst

unread,
Jul 2, 2013, 10:04:27 PM7/2/13
to hacker...@googlegroups.com

 Valeu DQ!
   Sobre a aberturas e fechamentos de chaves vc tem razão, esqueci de colocar aqui, mas confirmei e no código está ok..; )
    Sobre o Registrador P1ES ficou mais claro para mim agora...
     Um detalhe  é que neste segundo programa (de 1 led que está funcionando), o led inicia desligado,  quando clico no botão ele entra na rotina para acendar o led, na verdade preciso reformular aqui minhas dúvidas..
    Ele vai acender o led na rotina de interrupção para economizar energia né? Mas vai ficar "acordado" gastando mais energia só para verificar se o botão foi apertado? E se for ao contrário, caso do 2º código(que quero usar a interrupção para apagar o led), o que ponho na rotina e fora dela? 
    Pelo que tem visto o pessoal vem  fazendo é isto, mas estou precisando entender melhor o porquê de usar estas rotinas, sei que se dependendo do que eu quero posso desligar quase todas as fontes de clock  via LPM e muita coisa vai funcionar,deixando um VLO, ( um clock menor acho), para contar tempo, etc..

  
     Na verdade preciso reformular minha dúvida: Na rotina de

Luis Rossi

unread,
Jul 3, 2013, 3:57:16 PM7/3/13
to hacker...@googlegroups.com
Não me interprete mal. Eu sei que parece mais rápido aprender na tentativa e erro, mas tente se organizar antes de escrever o seu código. Antes de escrevê-lo pense no sistema em nível físico, entenda como ele funciona e o que o MSP430 tem que interpretar disso. Depois descreva passos do que você quer fazer em palavras. Depois implemente esses passos em código. 

Alguns exemplos de coisas que você não notou ja comentadas pelo DQ. Você com certeza precisa de um debounce. Você precisa detectar bordas de subidas e descidas dependendo do estado que você estiver.

Eu não costumo entregar a resposta pronta mas veja esse código em anexo que eu escrevi agora. Abra o User Guide. Entenda todos os passos. Entenda o que faz cada registrador. Tente entender a sequência lógica do que está sendo feito....

Leia bastante o User Guide. Ele é a melhor fonte de informações. Tente entender bem como funciona a arquitetura do MSP430.

Abraços


2013/7/2 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
main.c

EdiFirst

unread,
Jul 3, 2013, 4:13:34 PM7/3/13
to hacker...@googlegroups.com
 
  Show de bola, Felipe!!

  Muito obrigado pelas dicas, vou prestar mais atenção nelas, e  dedicar mais as documentações, Valeu!!

DQ

unread,
Jul 4, 2013, 7:32:22 AM7/4/13
to hacker...@googlegroups.com
O User Guide é uma leitura um pouco difícil, pois foi escrita para quem entende do riscado, mas é essencial para programar o MSP430 na ausência de bibliotecas mais "açucaradas" como no Arduino.

Quem sabe a gente consegue organizar um evento específico para o MSP430 no Garoa, onde quem tem mais experiência dá o empurrão inicial em que está começando.

DQ

Aylons Hazzud

unread,
Jul 4, 2013, 10:25:37 AM7/4/13
to hacker...@googlegroups.com

2013/7/4 DQ <d.qu...@yahoo.com>

Quem sabe a gente consegue organizar um evento específico para o MSP430 no Garoa, onde quem tem mais experiência dá o empurrão inicial em que está começando.

Boa. Posso fazer isso numa segunda-feira qualquer (exceto dia 9, quando estarei viajando).

EdiFirst

unread,
Jul 4, 2013, 12:44:34 PM7/4/13
to hacker...@googlegroups.com
Excelente a ideia, DQ!

 Só marcar o dia que vc já tem uma presença garantida ; ) !
 Afinal de contas o Garoa tem vários(alguns) kits interessantes da TI, quem sou eu para "puxar sardinha", para este ou aquele fabricante, mas seria ótimo explorarmos estes kits, Sobre o Users guide é bem isto que vc falou, sem contar que os exemplos são todos em Assembly, o que aumenta a curva de aprendizado.

Leandro Luciano da Silva

unread,
Jul 4, 2013, 9:44:19 PM7/4/13
to hacker...@googlegroups.com

+1

Por enquanto tenho a segunda livre então pode contar comigo.

--

Luis Rossi

unread,
Jul 4, 2013, 9:59:39 PM7/4/13
to hacker...@googlegroups.com
@DQ

Concordo com o você DQ, mas é um mal necessário e muito útil. Se você aprende a ler e entender um User Guide, normalmente facilita entender o User Guide (Datasheet, User Manual e afins....) de outras plataformas. Eu sou da opinião que para quem quer aprender a utilizar microcontroladores (não querer aprender, mas querer usar é totalmente razoável) deve usar bibliotecas prontas do Arduino apenas como uma porta de entrada, e olhe lá. Muito além disso começa a criar alguns vícios e possíveis frustrações quando a pessoa for mais a fundo no assunto.

De qualquer forma com certeza a ideia do curso introdutório é ótima. Na minha opinião é acelerador de aprendizado sem igual. 

@EdiFirst

Concordo que é não é uma leitura fácil de se digerir. Uma boa ajuda é  baixar o MSPWare da texas pois tem inúmeros exemplos de códigos. Tente pegar esses códigos e entender passo a passo o que está sendo feito. 

Abraços




2013/7/4 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)
 
 
 

EdiFirst

unread,
Jul 5, 2013, 10:17:24 AM7/5/13
to hacker...@googlegroups.com
@Felipe

Felipe, não esquenta, só tenho que te agradecer pelas dicas! ; ) All advices are welcome!

Igor Isaias Banlian

unread,
Jul 5, 2013, 10:40:48 AM7/5/13
to hacker...@googlegroups.com
"Só marcar o dia que vc já tem uma presença garantida ; ) !" [+1]

Eu estou aqui com 2 projetos com o MSP430:

=> Player de áudio .au via cartão SD com o MSP430G2231, que peguei do Garoa naquela caixinha para troca de chips (e, obviamente, deixei outro chip funcionando lá), sendo que atualmente o projeto já está com a placa praticamente pronta, só faltando as conexões (estou fazendo em placa ilhada universal), e o código está pronto, disponível aqui:


Só que como eu não manjo nada de programação, então mesmo tendo o Source Code em mãos, e tendo comprado gravadores ICSP - USB, RS232 TTL - USB e FTDI - USB, eu não faço a mínima ideia de como transformar esse source code em um código a ser gravado no MSP430 e nem como gravar tal código nele depois de compilado, haja visto que só sei usar a IDE Energia, e tal código não foi feito para ser usado com ela, mas sim para ser compilado e gravado manualmente...

=> Telemetria para o meu robô humanoide com minha LaunchPad MSP430 + Display LCD (na verdade TFT) colorido de 1.8", sendo que eu já importei todos os componentes para montagem da placa do display, já soldei todos os componentes SMD minúsculos nela, e já rodei o código de exemplo (pela IDE Energia), e está funcionando perfeitamente, porém parei aí, haja visto que não sei como fazer o display mostrar (e, obviamente, o MSP430 monitorar) coisas como tensão das baterias, corrente consumida pelos servomotores, temperatura do Raspberry Pi no robô, etc...

É esta aqui: http://store.43oh.com/index.php?route=product/product&product_id=72 (Tive que comprar cada componente em um canto diferente do mundo, me saiu uma pequena fortuna esse display, e me levou pelo menos uma hora até eu acertar de soldar os componentes SMD nas posições certas, principalmente os LEDs SMD, que soldei na posição errada umas 10 vezes até entender o lado certo, haja visto que a serigrafia da placa é muito precária e não informa nem a posição dos componentes - os CIs eu acertei a posição do pino 1 na cagada, pois a serigrafia não informa nada!)

Não saber programar está me matando com relação a esse projeto, porque não consigo sair do código de exemplo do display, só consigo mudar o texto de exemplo para o meu nome e a cor dele para alguma que conste na tabela de exemplos, hauahauahauahuahauahauahau, o que está ficando monótono de se fazer... Graças a Zeus esse código ao menos é para a IDE Energia, senão eu nem saberia como enfiar ele no MSP430, kkkkkkkkkkkkkkkkkk! :P

Enfim, preciso de um belo workshop sobre como compilar e gravar os programas, manualmente, no MSP430, sem precisar da IDE Energia, bem como de noções básicas que me façam ao menos ser capaz de entender os códigos de exemplo da IDE Energia...

Atenciosamente,
Igor Isaias Banlian

EdiFirst

unread,
Jul 14, 2013, 1:46:04 PM7/14/13
to hacker...@googlegroups.com

  Boa tarde, DQ!

  Então, sobre o possível evento foi falado mais alguma coisa? O Aylons e demais ainda podem contribuir?  O que acham de amanhã?

  Qualquer novidade, dá um alô, Valeu!!

 

Em quinta-feira, 4 de julho de 2013 08h32min22s UTC-3, DQ escreveu:

DQ

unread,
Jul 15, 2013, 6:57:42 AM7/15/13
to hacker...@googlegroups.com
Atualmente as segundas estão um pouco complicadas para mim.

DQ

Aylons Hazzud

unread,
Jul 15, 2013, 9:51:21 AM7/15/13
to hacker...@googlegroups.com

2013/7/14 EdiFirst <egs....@uol.com.br>

  Então, sobre o possível evento foi falado mais alguma coisa? O Aylons e demais ainda podem contribuir?  O que acham de amanhã?

Eu posso, mas não agora. No final da semana eu dou uma data.
Reply all
Reply to author
Forward
0 new messages