www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Msp430 Tipps


Autor: Ausländer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Tag
es geht immer weiter mit uC programmieren lernen macht echt Spaß:-)
jetzt habe ich ein Code geschrieben
Taster s1-->Led1 blinkt
Taster up--->led2 blinkt
Taster down ---> Led1 und 2 blinken gleichzeitig
Taster left ---->Led1 und 2 blinken nacheinander
(mit dem Entprellen )

Es funktioniert jetzt alles Super.Frage ist:Kann man den Code Optimieren 
oder er ist gut so ich werde echt dankbar für ein paar Tipps.

#include  "msp430x54x.h"
#include   "taster.h"

volatile unsigned char tasterPressed;
volatile unsigned char tasterDebounce; 
int s1_index,up_index,down_index,left_index,off_index=0;


void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;               
  P1DIR |= 0x01;                          
  P1DIR |= 0x02; 
  
  
    
  //Init taster
  tasterDebounce = 1;
  TastersInit( Taster_ALLE );
  TastersInterruptDisable( Taster_ALLE );
  tasterPressed = 0;
  TastersInterruptEnable(Taster_S1 + Taster_S2 + Taster_UP + Taster_DOWN + 
                           Taster_LEFT);
 
 __bis_SR_register(LPM3_bits + GIE);
  
  P1OUT &= ~0x01;
  P1OUT &= ~0x02;
  
 while(1) 
  {
//*************  Led1 Blinkt *********************************
    if (tasterPressed &  Taster_S1)          
     { 
       s1_index   =1;
       left_index =0;
       down_index =0;
       up_index   =0;
       off_index  =0;
       
       P1OUT ^= 0x01;
       P1OUT &= ~0x02;
       
                                 
     }                        
//************** LED2 Blinkt ***********************************                  
    if (tasterPressed &  Taster_UP )      
     { 
       s1_index   =0;
       left_index =0;
       down_index =0;
       up_index   =1;
       off_index  =0;
       P1OUT ^= 0x02;
       P1OUT &= ~0x01;
       
       
     }
 //************ LED1,2  Bliken Gleichzeitig ********************   
    if (tasterPressed &  Taster_DOWN)     
     { 
         
      
         if ((left_index | s1_index | up_index |off_index)==1) 
          {
           P1OUT &= ~0x01;
           P1OUT &= ~0x02;
           
           s1_index   =0;
           left_index =0;
           down_index =1;
           up_index   =0;
           off_index  =0;
                  
        }
       
       
       P1OUT ^= 0x01;
       P1OUT ^= 0x02;
     }
//************** LED1,2  Bliken  hintereinander ******************
    if (tasterPressed &  Taster_LEFT )         
     { 
                  
         if ((down_index | s1_index | up_index | off_index)==1) 
          {
           P1OUT |=  0x01;
           P1OUT &= ~0x02;
         
           s1_index   =0;
           left_index =1;
           down_index =0;
           up_index   =0;         
           off_index  =0;
        }
       
       P1OUT ^= 0x01;
       P1OUT ^= 0x02;
    }
//*************  LED1,2  AUS *************************************
    if (tasterPressed &  Taster_S2)        
      {
        P1OUT &= ~0x01; 
        P1OUT &= ~0x02;
        tasterPressed = 0;
        
        s1_index   =0;
        left_index =0;
        down_index =0;
        up_index   =0;
        off_index  =1;
      }       
    
    __delay_cycles(600000); 
  }



}


void startWDT()
{
  //WDT as 250ms interval counter
  SFRIFG1 &= ~WDTIFG;
  WDTCTL = WDTPW + WDTSSEL_1 + WDTTMSEL + WDTCNTCL + WDTIS_5;
  SFRIE1 |= WDTIE;
}


#pragma vector=WDT_VECTOR
__interrupt void WDT_ISR(void)
{
  if (tasterDebounce == 2)
  {
    tasterDebounce = 1;
    SFRIFG1 &= ~WDTIFG;
    SFRIE1 &= ~WDTIE;
    WDTCTL = WDTPW + WDTHOLD;
  }
}


#pragma vector=PORT2_VECTOR
__interrupt void Port2_ISR(void)
{ 
  if (tasterDebounce == 1)   
  {
    tasterPressed = P2IFG;
    tasterDebounce = 2;   
    startWDT();     
    __bic_SR_register_on_exit(LPM3_bits);    
  }
  else if (0 == tasterDebounce) 
  {
    tasterPressed = P2IFG;
    __bic_SR_register_on_exit(LPM4_bits);     
  }
   
  P2IFG = 0;
}





Autor: Frederik Krämer (n0ll4k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nur grad überflogen aber das auswählen evtl mit ner switch/case machen.

Und nur eine variable für gewünschte Funktion statt 4, man kann ja auch 
mehr als 1 und 0 drin speichern ;)

Autor: Ausländer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke ist ein  guter Tipp ich habe es so gemacht.

#include  "msp430x54x.h"
#include   "taster.h"

volatile unsigned char tasterPressed;
volatile unsigned char tasterDebounce; 
int taster_index,index =0;


void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;               
  P1DIR |= 0x01;                          
  P1DIR |= 0x02; 
  
  
    
  //Init taster
  tasterDebounce = 1;
  TastersInit( Taster_ALLE );
  TastersInterruptDisable( Taster_ALLE );
  tasterPressed = 0;
  TastersInterruptEnable(Taster_S1 + Taster_S2 + Taster_UP + Taster_DOWN + 
                           Taster_LEFT);
 
 __bis_SR_register(LPM3_bits + GIE);
  
  P1OUT &= ~0x01;
  P1OUT &= ~0x02;
  
 while(1) 
  {

//*************  LED1,2  AUS **********************************
    if (tasterPressed &  Taster_S2)     index   =0; 

//*************  Led1 Blinkt **********************************
    if (tasterPressed &  Taster_S1)     index   =1;
                           
//************** LED2 Blinkt ***********************************                  
    if (tasterPressed &  Taster_UP )    index   =2;       
     
 //************ LED1,2  Bliken Gleichzeitig ********************   
    if (tasterPressed &  Taster_DOWN)   index   =3;
    
//************** LED1,2  Bliken  hintereinander *****************
    if (tasterPressed &  Taster_LEFT )   index   =4;   
    
   
   switch(index)
   {
   case 0 :                                //leds Aus
        taster_index =0;
        P1OUT &= ~0x01; 
        P1OUT &= ~0x02;
        tasterPressed = 0; break;
        
   case 1:                               //led1 blinkt
        taster_index =1;
        P1OUT ^= 0x01;
        P1OUT &= ~0x02;    break;
   case 2:                                //led2 blinkt
        taster_index =2;
        P1OUT ^= 0x02;
        P1OUT &= ~0x01;     break;
   case 3:                                // beide blinken gleichzeitig
        if (taster_index == 1 | taster_index == 2 |taster_index == 4 |taster_index == 0 ) 
         {
       P1OUT &= ~0x01;
       P1OUT &= ~0x02;
       taster_index =3;
        }   
       P1OUT ^= 0x01;
       P1OUT ^= 0x02;       break ;
   case 4:                               //leds blinken hintereinander
         if (taster_index == 1 | taster_index == 2 |taster_index == 3 |taster_index == 0) 
          {
       P1OUT |=  0x01;
       P1OUT &= ~0x02;         
           taster_index   =4;           
        }  
        P1OUT ^= 0x01;
        P1OUT ^= 0x02;        break;
    
   }
   
  
    
    __delay_cycles(600000); 
  }



}


void startWDT()
{
  //WDT as 250ms interval counter
  SFRIFG1 &= ~WDTIFG;
  WDTCTL = WDTPW + WDTSSEL_1 + WDTTMSEL + WDTCNTCL + WDTIS_5;
  SFRIE1 |= WDTIE;
}


#pragma vector=WDT_VECTOR
__interrupt void WDT_ISR(void)
{
  if (tasterDebounce == 2)
  {
    tasterDebounce = 1;
    SFRIFG1 &= ~WDTIFG;
    SFRIE1 &= ~WDTIE;
    WDTCTL = WDTPW + WDTHOLD;
  }
}


#pragma vector=PORT2_VECTOR
__interrupt void Port2_ISR(void)
{ 
  if (tasterDebounce == 1)   
  {
    tasterPressed = P2IFG;
    tasterDebounce = 2;   
    startWDT();     
    __bic_SR_register_on_exit(LPM3_bits);    
  }
  else if (0 == tasterDebounce) 
  {
    tasterPressed = P2IFG;
    __bic_SR_register_on_exit(LPM4_bits);     
  }
   
  P2IFG = 0;
}




Autor: Klaus Ra. (klara)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
sieht schon übersichtlicher aus.
Gruss Klaus.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.