Forum: Mikrocontroller und Digitale Elektronik Rote LED an Port 1.0 will nicht


von Commer (Gast)


Angehängte Dateien:

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

von Stefan F. (Gast)


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.

von Commer (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> Wenn am Ende nur noch 3 Zeilen übrig bleiben, die immer noch nicht
> funktionieren, sollte der Fehler offensichtlich sein.

ich habe bereits die halbe Welt auf den kopf gestellt, komme trzd nicht 
drauf

von Wolfgang (Gast)


Lesenswert?

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

Lass wie Welt links liegen und kümmere dich nur um den Dreizeiler, der 
das Problem zeigt.

von Stefan F. (Gast)


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.

von Commer (Gast)


Lesenswert?

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

von Helmut -. (dc3yc)


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.

von JJ (Gast)


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

Der Dreizeiler würde zeigen ob dein Setup und die Elektronik ok sind.
just sayin...

von Commer (Gast)


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
}

von Commer (Gast)


Lesenswert?

hab es auf wesentliche zusammengefasst. leuchten tut sie immernoch 
nicht. Hat jmd die idee

von Herman Kokoschka (Gast)


Lesenswert?

Bitte noch weiter vereinfachen:

ISR/TIMER-Scheisse ersmal raus!
Nur die LED einschalten und fertig.

NUR SO erfährst Du ob die LED, PORT, POLUNG
überhaupt intakt/korrekt sind.

von Mani W. (e-doc)


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...

von wv (Gast)


Lesenswert?

auf den ersten Blick fällt mir auf, dass bei dem Codeschnipsel keine 
Interrupts aktiviert sind

--wv

von Stefan F. (Gast)


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.

von Stefan F. (Gast)


Lesenswert?

Commer schrieb:
> hab es auf wesentliche zusammengefasst. leuchten tut sie immernoch
> nicht.

Noch weiter vereinfachen. Schalte einfach nur die LED an, ohne Timer. Es 
sollte ungefähr auf drei Zeilen Code hinauslaufen, das war kein Scherz!

von Pieter (Gast)


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();}
}

von Commer (Gast)


Lesenswert?

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.

von Wilfried W Wurstbrot (Gast)


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...

von Wilfried W Wurstbrot (Gast)


Lesenswert?

Übrigens wurde schon erwähnt dass du nirgendwo in deinem Code Interrupts 
aktivierst.

von Max B. (citgo)


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?)

von Commer (Gast)


Lesenswert?

wv schrieb:
> auf den ersten Blick fällt mir auf, dass bei dem Codeschnipsel keine
> Interrupts aktiviert sind

übrigens danke für den Hinweis!

von Analogercontroller (Gast)


Lesenswert?

Man was ne Beratungsresistenz:

Mein Tipp

mach doch ne grüne LED dran;-)

von Commer (Gast)


Lesenswert?

Max B. schrieb:
> abtippen, starten... Leuchtet die LED? Ja? Dann weiter...
> Leuchtet sie nicht dann stimmt etwas ganz anderes nicht! (Hardware?)

ja den Punkt habe ich schon abgehagt. Nächster Schritt ist für mich die 
ISR

von Commer (Gast)


Lesenswert?

Analogercontroller schrieb:
> Man was ne Beratungsresistenz:

habe doch schon alles, was oben steht, gemacht...

von Max B. (citgo)


Lesenswert?

Commer schrieb:
> Max B. schrieb:
>> abtippen, starten... Leuchtet die LED? Ja? Dann weiter...
>> Leuchtet sie nicht dann stimmt etwas ganz anderes nicht! (Hardware?)
>
> ja den Punkt habe ich schon abgehagt. Nächster Schritt ist für mich die
> ISR

ja was denn jetzt? Leuchtet die LED mit dem Codeschnippsel?
Wieso sagst du denn nichts??

von Commer (Gast)


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

von Stefan F. (Gast)


Lesenswert?

Pieter schrieb:
> na, Stefan, wo bleibt Dein Helfersymtom?

Verpufft, heute abwesend.

von Commer (Gast)


Lesenswert?

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

von Wilfried W Wurstbrot (Gast)


Lesenswert?

Hast du Interrupts inzwischen aktiviert?

von Commer (Gast)


Lesenswert?

Wilfried W Wurstbrot schrieb:
> Hast du Interrupts inzwischen aktiviert?

ja, habe ich auch oben mitgeteilt

von Commer (Gast)


Lesenswert?

habe die ISR mit mit switch case entfernt, funktioniert immer noch nicht

von Commer (Gast)


Lesenswert?

auch die andere ISR arbeitet für sih alleine nicht

von Stefan F. (Gast)


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.

von Commer (Gast)


Lesenswert?

ein kleiner Hinweis würde mir helfen, wie gesagt, habe mir schon den 
Kopf zerbrochen

von Stefan F. (Gast)


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.

von Stephan (Gast)


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.

von Herman Kokoschka (Gast)


Lesenswert?

Zeige doch bitte mal den aktuellen Code,
besonders die Zeilen in denen Du das GIE-Flag behandelst.

von Pieter (Gast)


Lesenswert?

wer kennt alles das Lied:
Wen der Topf aber nun ein Loch hat....

von Commer (Gast)


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
}

von langsamwollenwirauchnichtmehr (Gast)


Lesenswert?

Schaltplan? Hängt die LED zwischen Port und GND oder zwischen Port und 
VDD? Vorwiderstand? Spannung?

von Pieter (Gast)


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?

von MaWin (Gast)


Lesenswert?

Der Stefan ist ein wenig selbstverliebt und arrogant. Hat halt einfach 
nur ne große Fr....

Zum Timer, neben general interrupt enable, musste den timer interrupt 
auch enablen. ?

von Hugo H. (hugohurtig1)


Lesenswert?

Kannst Du Dich für einen Thread entscheiden?

Beitrag "Konfiguration Ports"

von Mani W. (e-doc)


Lesenswert?

Bin ja absolut kein µCler, aber der TO könnte ja auch mit
einem Multimeter mal messen, vielleicht ist die Led verkehrt oder
defekt...

von Hugo H. (hugohurtig1)


Lesenswert?

Mani W. schrieb:
> Bin ja absolut kein µCler, aber der TO könnte ja auch mit
> einem Multimeter mal messen, vielleicht ist die Led verkehrt oder
> defekt...

Nein - nur resistent gegen die Aktivierung von Interrupts.

von Stefan F. (Gast)


Lesenswert?

An alle die nicht lesen können oder wollen: Die LED hat an diesem Port 
Pin bereits geleuchtet. Nur nicht mit ISR.

von Commer (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> An alle die nicht lesen können oder wollen: Die LED hat an diesem Port
> Pin bereits geleuchtet. Nur nicht mit ISR.

Genau, LED leuchtet außerhalb der ISR.

von Commer (Gast)


Lesenswert?

MaWin schrieb:
> Zum Timer, neben general interrupt enable, musste den timer interrupt
> auch enablen.

wie soll das denn aussehen?? du meinst TB0CTL = CCIE;?

von Commer (Gast)


Lesenswert?

Commer schrieb:
> TB0CTL = CCIE;?

sry, falsches Register: TB0CCTL1 bzw TB0CCTL2 = CCIE;

von Commer (Gast)


Lesenswert?

Commer schrieb:
> sry, falsches Register: TB0CCTL1 bzw TB0CCTL2 = CCIE;

hiermit funktioniert es tatsächlich, also die LED leuchtet auch 
innerhalb der ISR. Es funktioniert aber nur die ISR für CCR0, für CCR2 
nicht

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.