Msp430 Tipps

Gast #1838840
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
}
Gast #1839119
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
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren