Rote LED an Port 1.0 will nicht

Gast #6171275
Lesenswert?

hey

habe anbei der Code. Damit er bei euch läuft, müsstet ihr noch eine asm 
Datei von mir kriegen. Ich zerbreche mir schon seit einiger Zeit den 
Kopf, wie ich die rote LED an port 1.0 zum laufen bekomme. 
Initialisierung der Ports scheint mir soweit korrekt, in der ISR vom 
TimerB0 setzte/ lösche ich P1OUT der LED. Wer mir helfen kann, ist 
wirklich ein Schatz!

Grüße
Angehängte Dateien:
Gast #6171282
Lesenswert?

Reduziere das Programm schrittweise, bis das Problem verschwindet.

Spätestens wenn am Ende nur noch 3 Zeilen übrig bleiben, die immer noch 
nicht funktionieren, sollte der Fehler offensichtlich sein.
Gast #6171294
Lesenswert?

Commer schrieb:
> ich habe bereits die halbe Welt auf den kopf gestellt, komme trzd nicht
> drauf

Du musst das Problem einkreisen. Die Chancen stehen ziemlich schlecht, 
dass hier jemand durch reine Sichtkontrolle in so vielen Zeilen Code den 
fehler sieht. Zumal du auch weder den dazugehörigen Schaltplan noch eine 
Beschreibung der Programmlogik beigelegt hast.

Wenn du das nicht kannst, fange anders herum an. Schreibe ein Programm, 
dass einfach nur diese eine LED einschaltet. Wenn das geht, baust du 
alles andere Schritt für Schritt dazu, bis der Fehler wieder kommt.

Dann weißt du, welcher Code-Abschnitt der fragwürdige ist.
#6171382
Lesenswert?

Commer schrieb:
> leute, ich will nicht unhöflich sein, aber eure Sprücheklopferei hilft
> mir null weiter. dann lieber kommentar sparen, spart mir zeit und nerven

Dann frag hier nicht so dumm herum. Mit deinen Angaben kann kein Mensch 
was anfangen. Die angegebene Fehlersuchstrategie sollte dir helfen. 
Ausserdem könntest du an deinem Deutsch arbeiten: Großschreibung und so.
Gast #6171413
Lesenswert?

1
#include "msp430f5529.h"            // Einbinden der Definitionen
2
#define  LED_X     0x01     // LED (rot) an P1.0
3

4

5

6
int main( void )
7
{
8
   WDTCTL = WDTPW + WDTHOLD;   // WatchDogTimer abschalten
9
   
10
 // -- INIT_Port1
11
  P1SEL &= ~(LED_X);            // Beide sind BIN-IO       
12
  P1DIR |= LED_X;               // LED    = BIN-OUT
13
  P1OUT &= ~(LED_X);            // LED_X = AUS (weil H-aktiv)
14
  
15
  
16
  
17
 //-- TimerB0
18

19
  TB0CTL = TBCLR;
20
  TB0CTL = TBSSEL_2 + ID_0 + MC_1;
21
  TB0CCR0 = 1048;  // entspricht 1000 Hz, Freq [18]
22
  TB0CCR2 = 2096;  // entspricht 2*10^-3 s, also CCR0/2 (Pulsbreite halb so groß wie Freq)
23
  TB0CCTL2 = OUTMOD_7;
24
 // TB0CCTL0 = CLLD_1;          // Änderung der Frequenz wird erst übernommen, wenn 
25
                            // CCR0 erreicht ist
26
 // TB0CCTL2 = CLLD_1;
27

28
  while(1) {_NOP();} 
29
}
30
  
31

32
#pragma vector = TIMER0_B0_VECTOR
33
__interrupt void TimerB0_0_ISR ()
34
{
35
 P1OUT ^= (LED_X);
36
}
37

38
#pragma vector = TIMER0_B1_VECTOR
39
 __interrupt void TIMERB0_1_ISR ()
40
{
41
  switch (TB0IV)
42
  {
43
  case TB0IV_TBCCR2:       // TB0CCR2, da LED nur so lange wie PBreite [i] andauert leuchten soll
44
    {
45
      P1OUT ^= (LED_X);
46
      break;
47
    } 
48
  }
49
}
#6171459
Lesenswert?

Commer schrieb:
> Wolfgang schrieb:
>> ss wie Welt links liegen und kümmere dich nur um den Dreizeiler, der
>> das Problem zeigt.
>
> leute, ich will nicht unhöflich sein, aber eure Sprücheklopferei hilft
> mir null weiter. dann lieber kommentar sparen, spart mir zeit und nerven

Es wird Dir schon längere Zeit geholfen, merkst Du das nicht?
Etwas selbst denken, dann löst sich das Problem...
Gast #6171572
Lesenswert?

Commer schrieb:
> leute, ich will nicht unhöflich sein, aber eure Sprücheklopferei hilft
> mir null weiter

Wir haben Dir eine bewährte Methode zur Fehleranalyse empfohlen. Wenn du 
sie nicht anwenden willst, steht es Dir frei, deine eigenen Methoden zu 
entwickeln. Aber die müssen dann von dir kommen, nicht von uns.
Gast #6172027
Lesenswert?

na, Stefan, wo bleibt Dein Helfersymtom?

..den prof kenne ich nicht.
ok. Sind 8 Zeilen

int main( void )
{
   WDTCTL = WDTPW + WDTHOLD;   // WatchDogTimer abschalten
 // -- INIT_Port1
  P1SEL &= ~(LED_X);            // Beide sind BIN-IO
  P1DIR |= LED_X;               // LED    = BIN-OUT
  P1OUT = 0xFF ;            // LED_X = EIN (weil H-aktiv)
  while(1) {_NOP();}
}
Gast #6172195
Lesenswert?

Commer schrieb:
> Pieter schrieb:
>> P1OUT = 0xFF ;            // LED_X = EIN (weil H-aktiv)
>
> also das würde bedeuten, dass die LED leuchtet, sobald ich mein Programm
> starte. Soll sie aber nicht. ich möchte die LED zum leuchten bringen,
> wenn der TimerB seine ISR aktiviert.

Junge was ist denn los mit dir? Verstehst du nicht, dass du nur so das 
Problem einkreisen kannst?
Ändere den Code so dass die LED immer leuchten muss. Leuchtet sie dann? 
Wenn ja, funktioniert dein Interrupt nicht. Wenn nein, funktioniert dein 
Aufbau nicht. Gott manche Individuen ey...
#6172198
Lesenswert?

Commer schrieb:
> Pieter schrieb:
>> P1OUT = 0xFF ;            // LED_X = EIN (weil H-aktiv)
>
> also das würde bedeuten, dass die LED leuchtet, sobald ich mein Programm
> starte. Soll sie aber nicht. ich möchte die LED zum leuchten bringen,
> wenn der TimerB seine ISR aktiviert.

Mach doch erstmal das was man dir vorgeschlagen hat und lass die LED 
doch eeeeeeinfach mal leuchten!!! Ob du das später willst oder nicht ist 
doch egal.
Immerhin leuchtet die LED bei dir momentan noch überhaupt nicht!

Also:
1
int main( void )
2
{
3
   WDTCTL = WDTPW + WDTHOLD;   // WatchDogTimer abschalten
4
 // -- INIT_Port1
5
  P1SEL &= ~(LED_X);            // Beide sind BIN-IO
6
  P1DIR |= LED_X;               // LED    = BIN-OUT
7
  P1OUT = 0xFF ;            // LED_X = EIN (weil H-aktiv)
8
  while(1) {_NOP();}
9
}

abtippen, starten... Leuchtet die LED? Ja? Dann weiter...
Leuchtet sie nicht dann stimmt etwas ganz anderes nicht! (Hardware?)
Gast #6172218
Lesenswert?

Max B. schrieb:
> int main( void )
> {
>    WDTCTL = WDTPW + WDTHOLD;   // WatchDogTimer abschalten
>  // -- INIT_Port1
>   P1SEL &= ~(LED_X);            // Beide sind BIN-IO
>   P1DIR |= LED_X;               // LED    = BIN-OUT
>   P1OUT = 0xFF ;            // LED_X = EIN (weil H-aktiv)
>   while(1) {_NOP();}
> }

hier leuchtet sie

bei den isr nicht mehr. Habe auch die zeile _BIS_SR(GIE); hinzugefügt
Gast #6172265
Lesenswert?

Commer schrieb:
> wenn ich P1OUT |= LED_X; setzte, leuchtet sie. Aber das ist für mich
> eher der Gegenbeweis, das die ISR nicht funktioniert

Aber dennoch ein wichtiger Hinweis, denn nun weißt du dass die Hardware 
funktioniert und dass du nun herausfinden musst, warum die ISR nicht 
aufgerufen wird.
Gast #6172370
Lesenswert?

Ich kenne diesem µC nicht, aber ich würde Dir vorschlagen, es mit einem 
neuen Thread zu versuchen.

Titel: msp430f5529 Timer-ISR wird nicht aufgerufen

Dann zeigst du einen minimalen Code, wo der Timer gestartet wird und 
beim ersten Interrupt die LED eingeschaltet wird. Schreibe noch dazu, 
dass die LED problemlos an geht, wenn du das außerhalb der ISR machst.

Der neue Titel könnte hilfreich sein, die richtigen für das Thema 
Experten anzulocken.
Gast #6172411
Lesenswert?

Manche µC haben nicht nur Timerinterrupts sondern auch eine Globale 
Freigabe der Interrupts. Vielleicht Vergessen?
Interruptflags sollte man in der ISR auch löschen, sonst suchst Du dann 
den Fehler warum die LED nicht mehr aus geht.
Gast #6172650
Lesenswert?

Herman Kokoschka schrieb:
> Zeige doch bitte mal den aktuellen Code,
> besonders die Zeilen in denen Du das GIE-Flag behandelst.
1
 #include "msp430f5529.h"            // Einbinden der Definitionen
2
#define  LED_X     0x01     // LED (rot) an P1.0
3

4

5

6
int main( void )
7
{
8
   WDTCTL = WDTPW + WDTHOLD;   // WatchDogTimer abschalten
9
   
10
 // -- INIT_Port1
11
  P1SEL &= ~(LED_X);            // Beide sind BIN-IO       
12
  P1DIR |= LED_X;               // LED    = BIN-OUT
13
  P1OUT &=~ (LED_X);            // LED_X = AUS (weil H-aktiv)
14
  
15
  
16
  
17
 //-- TimerB0
18

19
  TB0CTL = TBCLR;
20
  TB0CTL = TBSSEL_2 + ID_0 + MC_1;
21
  TB0CCR0 = 1048;  // entspricht 1000 Hz, Freq [18]
22
  TB0CCR2 = 2096;  // entspricht 2*10^-3 s, also CCR0/2 (Pulsbreite halb so groß wie Freq)
23
  TB0CCTL2 = OUTMOD_7;
24
 // TB0CCTL0 = CLLD_1;          // Änderung der Frequenz wird erst übernommen, wenn 
25
                            // CCR0 erreicht ist
26
 // TB0CCTL2 = CLLD_1;
27
_BIS_SR(GIE);
28
  while(1) {_NOP();} 
29
}
30

31

32
#pragma vector = TIMER0_B0_VECTOR
33
__interrupt void TB0_ISR ()
34
{
35
 P1OUT ^= (LED_X);
36
}
37

38

39
#pragma vector = TIMER0_B1_VECTOR
40
 __interrupt void TIMERB0_1_ISR ()
41
{
42
  switch (TB0IV)
43
  {
44
  case TB0IV_TBCCR2:       // TB0CCR2, da LED nur so lange wie PBreite [i] andauert leuchten soll
45
    {
46
      P1OUT ^= (LED_X);
47
      break;
48
    } 
49
  }
50
}
Gast #6172746
Lesenswert?

neuer Versuch

int main( void )
{
   WDTCTL = WDTPW + WDTHOLD;   // WatchDogTimer abschalten
 // -- INIT_Port1
  P1SEL &= ~(LED_X);            // Beide sind BIN-IO
  P1DIR |= LED_X;               // LED    = BIN-OUT
  P1OUT = 0xFF ;            // LED_X = EIN (weil H-aktiv)


  while(1)
  {
    _NOP();
   P1OUT = P1OUT +1;
  }
}

Blinkt das jetzt gaanz schnell?

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