Forum: Mikrocontroller und Digitale Elektronik MSP430G2553 Startet nur nach Reset


von Smazze (Gast)


Lesenswert?

Hallo Freunde,
ich möchte, wie der Titel schon sagt, das der MSP430, wenn er mit 
Spannung vom USB-Anschluss versorgt wird, automatisch "losrennt".
Die Pinnne Test und RST habe ich abgezogen.

Komisch ist, dass wenn ich den Resetknopf drücke, dann alles 
funktioniert.
Mein Programm sieht folgendermaßen aus:
1
#include <msp430.h>
2
#define USSensoren 4
3
4
int RXByteCtr, RPT_Flag = 0;                // enables repeated start when 1
5
unsigned char TXData[2];
6
unsigned char RXData[2];
7
int anzahlTXNachrichten=0;
8
int anzahlRXNachrichten=0;
9
unsigned char TXByteCtr, RX = 0;
10
11
12
char RS232SendeBuffer[4];
13
14
void Setup_TX(int);
15
void Setup_RX(int);
16
void Transmit(void);
17
void Receive(void);
18
void RS232init(void);
19
20
int main(void)
21
{
22
23
24
  int startadresse;
25
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
26
  RS232init();
27
  P1SEL |= BIT6 + BIT7;                     // Assign I2C pins to USCI_B0
28
  P1SEL2|= BIT6 + BIT7;                     // Assign I2C pins to USCI_B0
29
30
31
32
  while(1){
33
34
          //Transmit process
35
          anzahlTXNachrichten=0;          //setze gesendete  Nach-richten auf 0
36
          anzahlRXNachrichten=0;          //setze gesendete  Nach-richten auf 0
37
        TXData[0]=0x00;              //Sende an Register 0
38
        TXData[1]=0x51;              //Schreibe "Messung in cm" auslösen
39
        TXByteCtr = 2;                          // Bytes die übertragen werden
40
      Setup_TX(0);
41
      Transmit();
42
      while (UCB0CTL1 & UCTXSTP);             // Ensure stop condition got sent
43
      _delay_cycles(100000);                //delay ca. 100ms
44
45
    for( startadresse=112; startadresse<112+USSensoren;startadresse++)              //Lese 4 Sensoren aus
46
  {
47
          anzahlTXNachrichten=0;          //setze gesendete  Nach-richten auf 0
48
          anzahlRXNachrichten=0;          //setze gesendete  Nach-richten auf 0
49
      //Transmit process
50
        TXData[0]=0x02;              //Sende an Register 2
51
        TXByteCtr = 1;                          // Load TX byte counter
52
      Setup_TX(startadresse);
53
      RPT_Flag = 1;
54
      Transmit();
55
      while (UCB0CTL1 & UCTXSTP);             // Ensure stop condition got sent
56
57
      //Receive process
58
      RXByteCtr = 2;                          // lese zwei Bytes aus
59
      Setup_RX(startadresse);
60
      Receive();
61
62
63
       switch(startadresse){
64
       case 112: RS232SendeBuffer[0] = (char)RXData[1];
65
                 break;
66
       case 113: RS232SendeBuffer[1] = (char)RXData[1];
67
                 break;
68
       case 114: RS232SendeBuffer[2] = (char)RXData[1];
69
                 break;
70
       case 115: RS232SendeBuffer[3] = (char)RXData[1];
71
                 break;
72
       }
73
74
      while (UCB0CTL1 & UCTXSTP);             // Ensure stop condition got sent
75
   }
76
   }
77
}
78
79
//-------------------------------------------------------------------------------
80
// The USCI_B0 data ISR is used to move received data from the I2C slave
81
// to the MSP430 memory. It is structured such that it can be used to receive
82
// any 2+ number of bytes by pre-loading RXByteCtr with the byte count.
83
//-------------------------------------------------------------------------------
84
#pragma vector = USCIAB0TX_VECTOR
85
__interrupt void USCIAB0TX_ISR(void)
86
{
87
  if(RX == 1){                                        // Master Recieve?
88
    RXByteCtr--;                                    // Decrement RX byte counter
89
    if (RXByteCtr)
90
    {
91
      RXData[anzahlRXNachrichten++] = UCB0RXBUF;  // Move RX data to address PRxData
92
    }
93
    else
94
    {
95
    if(RPT_Flag == 0)
96
      UCB0CTL1 |= UCTXSTP;                      // No Repeated Start: stop condition
97
      if(RPT_Flag == 1){                          // if Repeated Start: do nothing
98
      RPT_Flag = 0;
99
      }
100
      RXData[anzahlRXNachrichten++] = UCB0RXBUF;  // Move RX data to address PRxData
101
    __bic_SR_register_on_exit(CPUOFF);            // Exit LPM0
102
    }
103
  }
104
105
  else
106
  {                                     // Master Transmit
107
  if (TXByteCtr)                        // Check TX byte counter
108
    {
109
    UCB0TXBUF = TXData[anzahlTXNachrichten++];                   // Load TX buffer
110
    TXByteCtr--;                          // Decrement TX byte counter
111
    }
112
    else
113
    {
114
    if(RPT_Flag == 1){
115
      RPT_Flag = 0;
116
      __bic_SR_register_on_exit(CPUOFF);
117
    }
118
    else{
119
      UCB0CTL1 |= UCTXSTP;                    // I2C stop condition
120
      IFG2 &= ~UCB0TXIFG;                     // Clear USCI_B0 TX int flag
121
      __bic_SR_register_on_exit(CPUOFF);      // Exit LPM0
122
    }
123
    }
124
 }
125
126
}
127
128
void Setup_TX(int USSensor){
129
  _DINT();
130
  RX = 0;
131
  IE2 &= ~UCB0RXIE;
132
  while (UCB0CTL1 & UCTXSTP);               // Ensure stop condition got sent// Disable RX interrupt
133
  UCB0CTL1 |= UCSWRST;                      // Enable SW reset
134
  UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC;     // I2C Master, synchronous mode
135
  UCB0CTL1 = UCSSEL_2 + UCSWRST;            // Use SMCLK, keep SW reset
136
  UCB0BR0 = 30;                             // fSCL = SMCLK/12 = ~100kHz
137
  UCB0BR1 = 0;
138
  UCB0I2CSA = USSensor;                         // Slave Address is 048h
139
  UCB0CTL1 &= ~UCSWRST;                     // Clear SW reset, resume operation
140
  IE2 |= UCB0TXIE;                          // Enable TX interrupt
141
}
142
void Setup_RX(int USSensor){
143
  _DINT();
144
  RX = 1;
145
  IE2 &= ~UCB0TXIE;
146
  UCB0CTL1 |= UCSWRST;                      // Enable SW reset
147
  UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC;     // I2C Master, synchronous mode
148
  UCB0CTL1 = UCSSEL_2 + UCSWRST;            // Use SMCLK, keep SW reset
149
  UCB0BR0 = 30;                             // fSCL = SMCLK/12 = ~100kHz
150
  UCB0BR1 = 0;
151
  UCB0I2CSA = USSensor;                 // Slave Address is 0x70:112  0x71:113  0x72:114 0x73:115
152
  UCB0CTL1 &= ~UCSWRST;                     // Clear SW reset, resume operation
153
  IE2 |= UCB0RXIE;                          // Enable RX interrupt
154
}
155
156
157
158
void Transmit(void){
159
    while (UCB0CTL1 & UCTXSTP);             // Ensure stop condition got sent
160
    UCB0CTL1 |= UCTR + UCTXSTT;             // I2C TX, start condition
161
    __bis_SR_register(CPUOFF + GIE);        // Enter LPM0 w/ interrupts
162
}
163
void Receive(void){
164
    while (UCB0CTL1 & UCTXSTP);               // Ensure stop condition got sent
165
    UCB0CTL1 |= UCTXSTT;                    // I2C start condition
166
    __bis_SR_register(CPUOFF + GIE);        // Enter LPM0 w/ interrupts
167
}
168
169
void RS232init(void)
170
{
171
  if (CALBC1_1MHZ==0xFF)          // If calibration constant erased
172
  {
173
     while(1);                               // do not load, trap CPU!!
174
  }
175
    DCOCTL = 0;                               // Select lowest DCOx and MODx settings
176
    BCSCTL1 = CALBC1_1MHZ;                    // Set DCO
177
    DCOCTL = CALDCO_1MHZ;
178
    P1SEL = BIT1 + BIT2 ;                     // P1.1 = RXD, P1.2=TXD
179
    P1SEL2 = BIT1 + BIT2 ;                    // P1.1 = RXD, P1.2=TXD
180
    UCA0CTL1 |= UCSSEL_2;                     // SMCLK
181
    UCA0BR0 = 104;                            // 1MHz 9600
182
    UCA0BR1 = 0;                              // 1MHz 9600
183
    UCA0MCTL = UCBRS0;                        // Modulation UCBRSx = 1
184
    UCA0CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**
185
    IE2 |= UCA0RXIE;                          // Enable USCI_A0 RX interrupt
186
187
   // __bis_SR_register(LPM0_bits + GIE);       // Enter LPM0, interrupts enabled
188
189
}
190
191
#pragma vector=USCIAB0RX_VECTOR
192
__interrupt void USCI0RX_ISR(void)
193
{
194
   static int bufferCounter;
195
196
197
   while (!(IFG2&UCA0TXIFG));                // USCI_A0 TX buffer ready?
198
   //UCA0TXBUF = UCA0RXBUF;
199
200
   bufferCounter++;
201
202
   switch(bufferCounter){
203
204
   case 1: UCA0TXBUF = RS232SendeBuffer[0];
205
             break;
206
   case 2: UCA0TXBUF = RS232SendeBuffer[1];
207
             break;
208
   case 3: UCA0TXBUF = RS232SendeBuffer[2];
209
             break;
210
   case 4: UCA0TXBUF = RS232SendeBuffer[3];
211
             break;
212
   case 5:
213
       bufferCounter=0;
214
       IFG2 &= ~UCA0RXIFG;
215
             break;
216
   }
217
218
     //UCA0TXBUF = TX_StringRS232;                    // TX -> RXed character)
219
220
     //UCA0TXBUF = TX_StringRS232[2];                    // TX -> RXed character)
221
     //UCA0TXBUF = TX_StringRS232[3];                    // TX -> RXed character)
222
223
}

Vielen Dank im Vorraus!!
Smazze

--

Quelltext bitte in [ c ] [ /c ] - Tags einschließen.

-rufus

: Bearbeitet durch User
von spontan (Gast)


Lesenswert?

Sieht doch eher nach einem Hardware-Problem aus. Gibts einen Schaltplan?

von Smazze (Gast)


Lesenswert?

Muss dazu noch sagen..
Wenn ich im Debugmodus auf Run klicke rennt der auch los.
Nur dieses "Autolosrennen" bei Spannungsanlage funzt nicht.. :((

von Oppa (Gast)


Lesenswert?

Mal das Errata gescheckt ? Der hier vielleicht ?

BCL12 BCS Module
Function Switching RSELx or modifying DCOCTL can cause DCO dead time or 
a complete DCO stop

http://www.ti.com/lit/er/slaz440f/slaz440f.pdf

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Sieh Dir mal den Schaltplan des Launchpads an. Dort ist eine 
RC-Kombination am Reset-Pin angeschlossen, die kannst Du nachbilden. 
Möchtest Du per SBW in Deiner Schaltung debuggen, darf der Kondensator 
aber nicht größer als 2.2 nF werden.

Oder lässt Du Dein Programm auf dem im Launchpad steckenden Controller 
laufen?

Dein Quelltext ist übrigens ... grässlich formatiert.

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.