Forum: Mikrocontroller und Digitale Elektronik [Launchpad] Programm funktioniert nur in debug session


von Hannes H. (mui)


Lesenswert?

Hallo Zusammen,

ich habe ein kleines Programm mit dem Launchpad geschrieben, welches 
soweit auch funktioniert. Wenn ich allerdings die Debug-Session beende 
und den µC "Standalone" betreiben möchte funktioniert es nicht mehr, so 
als ob das Programm weg wäre. Muss ich das Programm erst irgendwie 
dauerhaft in den µC schreiben? Und wenn ja, wie?

Kann mir da jemand helfen?
Vielen Dank.

Hier noch mein Quelltext:
1
#include  "msp430x20x2.h"
2
3
#define   NUMBER_OF_BURSTS    16
4
5
#define     IR_LED                BIT0
6
#define   LED_2          BIT6
7
#define     LED_DIR               P1DIR
8
#define     LED_OUT               P1OUT
9
10
#define     BUTTON_1              BIT3
11
#define    BUTTON_2        BIT4
12
#define   BUTTON_OUT        P1OUT
13
#define   BUTTON_REN        P1REN
14
#define   BUTTON_IN        P1IN
15
#define     BUTTON_DIR            P1DIR
16
#define     BUTTON_IE             P1IE
17
#define     BUTTON_IES            P1IES
18
#define     BUTTON_IFG            P1IFG
19
20
void SendBursts(void)
21
{
22
  unsigned char i=0;
23
  for (i=0; i < NUMBER_OF_BURSTS*2; i++)
24
  {
25
    __delay_cycles(2);
26
    LED_OUT ^= IR_LED;
27
  }
28
  LED_OUT &=~ IR_LED;
29
}
30
31
void SendImmediateShutter (void)
32
{
33
  SendBursts();
34
  __delay_cycles(8000);
35
  SendBursts();
36
}
37
38
void Send2sDelayedShutter (void)
39
{
40
  SendBursts();
41
  __delay_cycles(5600);
42
  SendBursts();
43
}
44
45
void InitializeButton(void)                 // Configure Push Button 
46
{
47
  BUTTON_DIR &= ~(BUTTON_1 + BUTTON_2);
48
  BUTTON_OUT |= (BUTTON_1 + BUTTON_2);
49
  BUTTON_REN |= (BUTTON_1 + BUTTON_2);
50
  BUTTON_IES |= (BUTTON_1 + BUTTON_2);
51
  BUTTON_IFG &= ~(BUTTON_1 + BUTTON_2);
52
  BUTTON_IE |= (BUTTON_1 + BUTTON_2);
53
}
54
55
void InitIrLed(void)
56
{
57
  LED_DIR |= (IR_LED + LED_2);        //set IR_PORT as output
58
  LED_OUT &=~ (IR_LED + LED_2);        //ir_led off
59
}
60
61
#pragma vector=PORT1_VECTOR
62
__interrupt void PORT1_ISR(void)
63
{    
64
  BUTTON_IE &= ~(BUTTON_1 + BUTTON_2);            /* Debounce */
65
  WDTCTL = WDT_ADLY_250;
66
  IFG1 &= ~WDTIFG;                 /* clear interrupt flag */
67
  IE1 |= WDTIE;  
68
  if (BUTTON_IFG == BUTTON_1) SendImmediateShutter();
69
  if (BUTTON_IFG == BUTTON_2) Send2sDelayedShutter();
70
  BUTTON_IFG = 0;
71
}
72
73
#pragma vector=WDT_VECTOR
74
__interrupt void WDT_ISR(void)
75
{
76
    IE1 &= ~WDTIE;                   /* disable interrupt */
77
    IFG1 &= ~WDTIFG;                 /* clear interrupt flag */
78
    WDTCTL = WDTPW + WDTHOLD;        /* put WDT back in hold state */
79
    BUTTON_IE |= (BUTTON_1 + BUTTON_2);             /* Debouncing complete */
80
}
81
82
void main ()
83
{
84
  WDTCTL = WDTPW + WDTHOLD;    // Stop WDT
85
  InitIrLed();          //init led
86
  InitializeButton();        //init_buttons
87
  __enable_interrupt();           // Enable interrupts.
88
  while(1)
89
  {
90
91
  }      
92
}

von Hannes H. (mui)


Lesenswert?

Keiner ne Idee? Das macht mich gerade wahnsinnig. Nach dem Beenden der 
Debug-Session funktioniert das Programm manchmal noch 1-2 Tastendrücke, 
aber dann ist Schluss. Im Debug-Modus geht alles einwandfrei...ich habe 
keine Ahnung wo da der Unterschied ist?
Die Funktion ist eigentlich auch total simpel, das Programm wartet 
einfach auf einen von 2 Tastendrücken und soll dann eine IR-LED 
ansteuern. Das war's. WO ist da bloß der Wurm drin? Kann es vielleicht 
sein, dass er keinen Takt hat? Aber auf dem Launchpad ist doch auch kein 
Quarz drauf? Er wird doch nicht vom Debugger seinen Takt bekommen, oder?

von C. H. (hedie)


Lesenswert?

Hannes H. schrieb:
> Er wird doch nicht vom Debugger seinen Takt bekommen, oder?

Nein den macht er schon intern...


Es ist wirklich merkwürdig das dein Programm nicht läuft...
Ich verwende selbst Launchpads und wenn der Watchdog ausgeschaltet ist, 
dann läuft es auch... Aber das hast du ja bereits... :S

von Hannes H. (mui)


Lesenswert?

Habe rausgefunden woran es liegt. Es ist zwar merkwürdig, aber der µC 
scheint tatsächlich seinen Takt vom Lanchpad zu bekommen? Kann's zwar 
immer noch nicht so richtig glauben, aber ich muss im Quellcode mit
1
BCSCTL1 |= DIVA_0;                        // ACLK/1
2
BCSCTL3 |= LFXT1S_2;                      // ACLK = VLO

eine Clocksource konfigurieren, damit es funktioniert. Ich hätte 
gedacht, das Teil hat eine default clock?!

naja, so läuft es, muss mich damit nochmal genauer auseinandersetzen.

Trotzdem Danke!

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.