www.mikrocontroller.net

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


Autor: Hannes H. (mui)
Datum:

Bewertung
0 lesenswert
nicht 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:
#include  "msp430x20x2.h"

#define   NUMBER_OF_BURSTS    16

#define     IR_LED                BIT0
#define   LED_2          BIT6
#define     LED_DIR               P1DIR
#define     LED_OUT               P1OUT

#define     BUTTON_1              BIT3
#define    BUTTON_2        BIT4
#define   BUTTON_OUT        P1OUT
#define   BUTTON_REN        P1REN
#define   BUTTON_IN        P1IN
#define     BUTTON_DIR            P1DIR
#define     BUTTON_IE             P1IE
#define     BUTTON_IES            P1IES
#define     BUTTON_IFG            P1IFG

void SendBursts(void)
{
  unsigned char i=0;
  for (i=0; i < NUMBER_OF_BURSTS*2; i++)
  {
    __delay_cycles(2);
    LED_OUT ^= IR_LED;
  }
  LED_OUT &=~ IR_LED;
}

void SendImmediateShutter (void)
{
  SendBursts();
  __delay_cycles(8000);
  SendBursts();
}

void Send2sDelayedShutter (void)
{
  SendBursts();
  __delay_cycles(5600);
  SendBursts();
}

void InitializeButton(void)                 // Configure Push Button 
{
  BUTTON_DIR &= ~(BUTTON_1 + BUTTON_2);
  BUTTON_OUT |= (BUTTON_1 + BUTTON_2);
  BUTTON_REN |= (BUTTON_1 + BUTTON_2);
  BUTTON_IES |= (BUTTON_1 + BUTTON_2);
  BUTTON_IFG &= ~(BUTTON_1 + BUTTON_2);
  BUTTON_IE |= (BUTTON_1 + BUTTON_2);
}

void InitIrLed(void)
{
  LED_DIR |= (IR_LED + LED_2);        //set IR_PORT as output
  LED_OUT &=~ (IR_LED + LED_2);        //ir_led off
}

#pragma vector=PORT1_VECTOR
__interrupt void PORT1_ISR(void)
{    
  BUTTON_IE &= ~(BUTTON_1 + BUTTON_2);            /* Debounce */
  WDTCTL = WDT_ADLY_250;
  IFG1 &= ~WDTIFG;                 /* clear interrupt flag */
  IE1 |= WDTIE;  
  if (BUTTON_IFG == BUTTON_1) SendImmediateShutter();
  if (BUTTON_IFG == BUTTON_2) Send2sDelayedShutter();
  BUTTON_IFG = 0;
}

#pragma vector=WDT_VECTOR
__interrupt void WDT_ISR(void)
{
    IE1 &= ~WDTIE;                   /* disable interrupt */
    IFG1 &= ~WDTIFG;                 /* clear interrupt flag */
    WDTCTL = WDTPW + WDTHOLD;        /* put WDT back in hold state */
    BUTTON_IE |= (BUTTON_1 + BUTTON_2);             /* Debouncing complete */
}

void main ()
{
  WDTCTL = WDTPW + WDTHOLD;    // Stop WDT
  InitIrLed();          //init led
  InitializeButton();        //init_buttons
  __enable_interrupt();           // Enable interrupts.
  while(1)
  {

  }      
}


Autor: Hannes H. (mui)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Claudio H. (Firma: BLS-Electronics) (hedie)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hannes H. (mui)
Datum:

Bewertung
0 lesenswert
nicht 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
BCSCTL1 |= DIVA_0;                        // ACLK/1
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!

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.