hi hat jemand eine Ahnung, warum die ISR vom Port 2 nicht aufgerufen wird?
Hallo lukker. Das bist du ja schon wieder. Muss es vielleicht
1 | interrupt(PORT2_VECTOR) P2_ISR(void) |
heissen? Bist du denn sicher, dass die Hardware Ok ist? Hast du eindeutige Logikpegel (HIGH/LOW), oder eventuell einen Pull-Up Widerstand vergessen? Zeige mal deinen Schaltplan. Woher weisst du denn, dass die ISR nicht aufgerufen wird?
Stefan ⛄ F. schrieb: > uss es vielleichtinterrupt(PORT2_VECTOR) P2_ISR(void) > > heissen? nope Stefan ⛄ F. schrieb: > Bist du denn sicher, dass die Hardware Ok ist? Hast du eindeutige > Logikpegel (HIGH/LOW), oder eventuell einen Pull-Up Widerstand > vergessen? also meines Wissens ist es so passend. Hardware ist in Ordnung. Stefan ⛄ F. schrieb: > Woher weisst du denn, dass die ISR nicht aufgerufen wird? zum einen empfange ich die Strings nicht. zum anderen wird das dazugehörige Programm (hab ich hier garnicht beigfügt) nicht abgearbeitet
lukker schrieb: > also meines Wissens ist es so passend. Hardware ist in Ordnung. Woher weisst du das? hast du nachgemessen? Zeige doch mal den Schaltplan und Fotos, dann können wir das mal kontrollieren. > zum einen empfange ich die Strings nicht. Das kann auch 100 andere Gründe haben. Du hast ja nicht einmal eine Startmeldung im Programm. Sende mal eine Startmeldung innerhalb von main() und schalte in der ISR mal ganz am Anfang (ohne if-Bedingung) eine LED ein. Hast du keinen Debugger?
Eine Warteschleife (debounce-Funktion) in einen Interrupt zu setzen ist evtl. nicht sooo klug. Vielleicht wird die ISR ja aufgerufen, wird aber ständig vom nächsten Aufruf überholt, weil die Warteschleife zu lange braucht? Bzw. der nächste Trigger zu schnell kommt?
lukker schrieb: > ich habe keine Ahnung... Dann mach doch mal, was Stefan vorgeschlagen hat. Toggel z.B. eine LED beim Betreten des Interrupts. Oder einfach ohne LED und dann mit dem Oszi messen...
ich habe es jetzt zum laufen bekommen und etwas erweitert.
1 | #pragma vector=PORT2_VECTOR
|
2 | __interrupt void P2_ISR() |
3 | {
|
4 | Entprell(); |
5 | |
6 | if(P2IFG & T_SET) // Wenn Int. von T_SET, dann |
7 | {
|
8 | if(P2IES && 0x02 == T_SET) // Wenn T_SET in P1IES == 1 ist, negative Flanke |
9 | {
|
10 | INIT_TA2(); // aktiviere 2s-Timer |
11 | P2IES &= ~(T_SET); // Int. bei positiver Flanke |
12 | |
13 | }
|
14 | |
15 | else
|
16 | {
|
17 | TA2CTL = 0x00; // Timer Stopp |
18 | P2IES |= T_SET; // Zurück auf negative Flanke |
19 | TX_String("Zu kurz gedrueckt\n"); |
20 | }
|
21 | |
22 | P2IFG &= ~(T_SET); // Flanken Ereignis löschen |
23 | }
|
24 | }
|
25 | |
26 | |
27 | // +----------------------------------------------------------------------
|
28 | // | SubRoutine zum Initialisiern und starten des Timers A2
|
29 | // |
|
30 | // +----------------------------------------------------------------------
|
31 | void INIT_TA2(void) |
32 | {
|
33 | TA2CTL = TACLR; // Timer-Counter RESET auf Null |
34 | TA2CCR0 = 65535; // 2s |
35 | TA2CCTL0 = CCIE; // Interrupt bei TA2CCR0 |
36 | TA2CTL = TASSEL_1 + ID_0 + MC_1; // ACLKK, 1:1, UP-Mode |
37 | }
|
38 | |
39 | |
40 | |
41 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
42 | // + Funktion: TimerA1_0_ISR()
|
43 | // +
|
44 | // +
|
45 | // + Wenn dT erreicht wurde
|
46 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
47 | #pragma vector=TIMER2_A0_VECTOR
|
48 | __interrupt void TA2_0_ISR() |
49 | {
|
50 | P2IES |= T_SET; // Zurück auf negative Flanke |
51 | |
52 | if(Saegezahn == 1) |
53 | {
|
54 | Saegezahn = 0; |
55 | //Wobbel_Dir = 1;
|
56 | TX_String("\nSignal Sinusfoermig\n"); |
57 | }
|
58 | else
|
59 | {
|
60 | Saegezahn = 1; |
61 | // Wobbel_Dir = 1;
|
62 | TX_String("\nSignal Saegezahn\n"); |
63 | }
|
64 | Wobbel_Dir =1; |
65 | i=3; |
66 | TB0CCR0 = Freq [i]; |
67 | TB0CCR2 = PBreite [i]; |
68 | P2IFG &= ~(T_SET); |
69 | TA2CTL = 0x00; |
70 | P2IFG &= ~(T_SET); |
71 | }
|
ich habe das Problem, dass wenn ich T_SET etwas länger als 2 sec drücke, die ISR von TIMER A2 mindestens ein zweites mal aufgerufen wird. D.h. er springt in den anderen Modus und wieder zurück. Hat jemand eine Idee, warum das so ist?
auch das habe ich gelöst bekommen, indem ich die Flag in der 2. if-Bedingung gelöscht habe
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.