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
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.
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
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.
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.
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
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.
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...
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 | }
|
hab es auf wesentliche zusammengefasst. leuchten tut sie immernoch nicht. Hat jmd die idee
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.
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...
auf den ersten Blick fällt mir auf, dass bei dem Codeschnipsel keine Interrupts aktiviert sind --wv
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.
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!
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();} }
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.
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...
Übrigens wurde schon erwähnt dass du nirgendwo in deinem Code Interrupts aktivierst.
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?)
wv schrieb: > auf den ersten Blick fällt mir auf, dass bei dem Codeschnipsel keine > Interrupts aktiviert sind übrigens danke für den Hinweis!
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
Analogercontroller schrieb: > Man was ne Beratungsresistenz: habe doch schon alles, was oben steht, gemacht...
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??
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
wenn ich P1OUT |= LED_X; setzte, leuchtet sie. Aber das ist für mich eher der Gegenbeweis, das die ISR nicht funktioniert
Wilfried W Wurstbrot schrieb: > Hast du Interrupts inzwischen aktiviert? ja, habe ich auch oben mitgeteilt
habe die ISR mit mit switch case entfernt, funktioniert immer noch nicht
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.
ein kleiner Hinweis würde mir helfen, wie gesagt, habe mir schon den Kopf zerbrochen
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.
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.
Zeige doch bitte mal den aktuellen Code, besonders die Zeilen in denen Du das GIE-Flag behandelst.
wer kennt alles das Lied: Wen der Topf aber nun ein Loch hat....
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 | }
|
Schaltplan? Hängt die LED zwischen Port und GND oder zwischen Port und VDD? Vorwiderstand? Spannung?
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?
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. ?
Bin ja absolut kein µCler, aber der TO könnte ja auch mit einem Multimeter mal messen, vielleicht ist die Led verkehrt oder defekt...
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.
An alle die nicht lesen können oder wollen: Die LED hat an diesem Port Pin bereits geleuchtet. Nur nicht mit ISR.
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.
MaWin schrieb: > Zum Timer, neben general interrupt enable, musste den timer interrupt > auch enablen. wie soll das denn aussehen?? du meinst TB0CTL = CCIE;?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.