Forum: Mikrocontroller und Digitale Elektronik Msp430 Tipps


von Ausländer (Gast)


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.
1
#include  "msp430x54x.h"
2
#include   "taster.h"
3
4
volatile unsigned char tasterPressed;
5
volatile unsigned char tasterDebounce; 
6
int s1_index,up_index,down_index,left_index,off_index=0;
7
8
9
void main(void)
10
{
11
  WDTCTL = WDTPW + WDTHOLD;               
12
  P1DIR |= 0x01;                          
13
  P1DIR |= 0x02; 
14
  
15
  
16
    
17
  //Init taster
18
  tasterDebounce = 1;
19
  TastersInit( Taster_ALLE );
20
  TastersInterruptDisable( Taster_ALLE );
21
  tasterPressed = 0;
22
  TastersInterruptEnable(Taster_S1 + Taster_S2 + Taster_UP + Taster_DOWN + 
23
                           Taster_LEFT);
24
 
25
 __bis_SR_register(LPM3_bits + GIE);
26
  
27
  P1OUT &= ~0x01;
28
  P1OUT &= ~0x02;
29
  
30
 while(1) 
31
  {
32
//*************  Led1 Blinkt *********************************
33
    if (tasterPressed &  Taster_S1)          
34
     { 
35
       s1_index   =1;
36
       left_index =0;
37
       down_index =0;
38
       up_index   =0;
39
       off_index  =0;
40
       
41
       P1OUT ^= 0x01;
42
       P1OUT &= ~0x02;
43
       
44
                                 
45
     }                        
46
//************** LED2 Blinkt ***********************************                  
47
    if (tasterPressed &  Taster_UP )      
48
     { 
49
       s1_index   =0;
50
       left_index =0;
51
       down_index =0;
52
       up_index   =1;
53
       off_index  =0;
54
       P1OUT ^= 0x02;
55
       P1OUT &= ~0x01;
56
       
57
       
58
     }
59
 //************ LED1,2  Bliken Gleichzeitig ********************   
60
    if (tasterPressed &  Taster_DOWN)     
61
     { 
62
         
63
      
64
         if ((left_index | s1_index | up_index |off_index)==1) 
65
          {
66
           P1OUT &= ~0x01;
67
           P1OUT &= ~0x02;
68
           
69
           s1_index   =0;
70
           left_index =0;
71
           down_index =1;
72
           up_index   =0;
73
           off_index  =0;
74
                  
75
        }
76
       
77
       
78
       P1OUT ^= 0x01;
79
       P1OUT ^= 0x02;
80
     }
81
//************** LED1,2  Bliken  hintereinander ******************
82
    if (tasterPressed &  Taster_LEFT )         
83
     { 
84
                  
85
         if ((down_index | s1_index | up_index | off_index)==1) 
86
          {
87
           P1OUT |=  0x01;
88
           P1OUT &= ~0x02;
89
         
90
           s1_index   =0;
91
           left_index =1;
92
           down_index =0;
93
           up_index   =0;         
94
           off_index  =0;
95
        }
96
       
97
       P1OUT ^= 0x01;
98
       P1OUT ^= 0x02;
99
    }
100
//*************  LED1,2  AUS *************************************
101
    if (tasterPressed &  Taster_S2)        
102
      {
103
        P1OUT &= ~0x01; 
104
        P1OUT &= ~0x02;
105
        tasterPressed = 0;
106
        
107
        s1_index   =0;
108
        left_index =0;
109
        down_index =0;
110
        up_index   =0;
111
        off_index  =1;
112
      }       
113
    
114
    __delay_cycles(600000); 
115
  }
116
117
118
119
}
120
121
122
void startWDT()
123
{
124
  //WDT as 250ms interval counter
125
  SFRIFG1 &= ~WDTIFG;
126
  WDTCTL = WDTPW + WDTSSEL_1 + WDTTMSEL + WDTCNTCL + WDTIS_5;
127
  SFRIE1 |= WDTIE;
128
}
129
130
131
#pragma vector=WDT_VECTOR
132
__interrupt void WDT_ISR(void)
133
{
134
  if (tasterDebounce == 2)
135
  {
136
    tasterDebounce = 1;
137
    SFRIFG1 &= ~WDTIFG;
138
    SFRIE1 &= ~WDTIE;
139
    WDTCTL = WDTPW + WDTHOLD;
140
  }
141
}
142
143
144
#pragma vector=PORT2_VECTOR
145
__interrupt void Port2_ISR(void)
146
{ 
147
  if (tasterDebounce == 1)   
148
  {
149
    tasterPressed = P2IFG;
150
    tasterDebounce = 2;   
151
    startWDT();     
152
    __bic_SR_register_on_exit(LPM3_bits);    
153
  }
154
  else if (0 == tasterDebounce) 
155
  {
156
    tasterPressed = P2IFG;
157
    __bic_SR_register_on_exit(LPM4_bits);     
158
  }
159
   
160
  P2IFG = 0;
161
}

von Frederik K. (n0ll4k)


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 ;)

von Ausländer (Gast)


Lesenswert?

danke ist ein  guter Tipp ich habe es so gemacht.
1
#include  "msp430x54x.h"
2
#include   "taster.h"
3
4
volatile unsigned char tasterPressed;
5
volatile unsigned char tasterDebounce; 
6
int taster_index,index =0;
7
8
9
void main(void)
10
{
11
  WDTCTL = WDTPW + WDTHOLD;               
12
  P1DIR |= 0x01;                          
13
  P1DIR |= 0x02; 
14
  
15
  
16
    
17
  //Init taster
18
  tasterDebounce = 1;
19
  TastersInit( Taster_ALLE );
20
  TastersInterruptDisable( Taster_ALLE );
21
  tasterPressed = 0;
22
  TastersInterruptEnable(Taster_S1 + Taster_S2 + Taster_UP + Taster_DOWN + 
23
                           Taster_LEFT);
24
 
25
 __bis_SR_register(LPM3_bits + GIE);
26
  
27
  P1OUT &= ~0x01;
28
  P1OUT &= ~0x02;
29
  
30
 while(1) 
31
  {
32
33
//*************  LED1,2  AUS **********************************
34
    if (tasterPressed &  Taster_S2)     index   =0; 
35
36
//*************  Led1 Blinkt **********************************
37
    if (tasterPressed &  Taster_S1)     index   =1;
38
                           
39
//************** LED2 Blinkt ***********************************                  
40
    if (tasterPressed &  Taster_UP )    index   =2;       
41
     
42
 //************ LED1,2  Bliken Gleichzeitig ********************   
43
    if (tasterPressed &  Taster_DOWN)   index   =3;
44
    
45
//************** LED1,2  Bliken  hintereinander *****************
46
    if (tasterPressed &  Taster_LEFT )   index   =4;   
47
    
48
   
49
   switch(index)
50
   {
51
   case 0 :                                //leds Aus
52
        taster_index =0;
53
        P1OUT &= ~0x01; 
54
        P1OUT &= ~0x02;
55
        tasterPressed = 0; break;
56
        
57
   case 1:                               //led1 blinkt
58
        taster_index =1;
59
        P1OUT ^= 0x01;
60
        P1OUT &= ~0x02;    break;
61
   case 2:                                //led2 blinkt
62
        taster_index =2;
63
        P1OUT ^= 0x02;
64
        P1OUT &= ~0x01;     break;
65
   case 3:                                // beide blinken gleichzeitig
66
        if (taster_index == 1 | taster_index == 2 |taster_index == 4 |taster_index == 0 ) 
67
         {
68
       P1OUT &= ~0x01;
69
       P1OUT &= ~0x02;
70
       taster_index =3;
71
        }   
72
       P1OUT ^= 0x01;
73
       P1OUT ^= 0x02;       break ;
74
   case 4:                               //leds blinken hintereinander
75
         if (taster_index == 1 | taster_index == 2 |taster_index == 3 |taster_index == 0) 
76
          {
77
       P1OUT |=  0x01;
78
       P1OUT &= ~0x02;         
79
           taster_index   =4;           
80
        }  
81
        P1OUT ^= 0x01;
82
        P1OUT ^= 0x02;        break;
83
    
84
   }
85
   
86
  
87
    
88
    __delay_cycles(600000); 
89
  }
90
91
92
93
}
94
95
96
void startWDT()
97
{
98
  //WDT as 250ms interval counter
99
  SFRIFG1 &= ~WDTIFG;
100
  WDTCTL = WDTPW + WDTSSEL_1 + WDTTMSEL + WDTCNTCL + WDTIS_5;
101
  SFRIE1 |= WDTIE;
102
}
103
104
105
#pragma vector=WDT_VECTOR
106
__interrupt void WDT_ISR(void)
107
{
108
  if (tasterDebounce == 2)
109
  {
110
    tasterDebounce = 1;
111
    SFRIFG1 &= ~WDTIFG;
112
    SFRIE1 &= ~WDTIE;
113
    WDTCTL = WDTPW + WDTHOLD;
114
  }
115
}
116
117
118
#pragma vector=PORT2_VECTOR
119
__interrupt void Port2_ISR(void)
120
{ 
121
  if (tasterDebounce == 1)   
122
  {
123
    tasterPressed = P2IFG;
124
    tasterDebounce = 2;   
125
    startWDT();     
126
    __bic_SR_register_on_exit(LPM3_bits);    
127
  }
128
  else if (0 == tasterDebounce) 
129
  {
130
    tasterPressed = P2IFG;
131
    __bic_SR_register_on_exit(LPM4_bits);     
132
  }
133
   
134
  P2IFG = 0;
135
}

von Klaus R. (klara)


Lesenswert?

Hallo,
sieht schon übersichtlicher aus.
Gruss Klaus.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.