Forum: Mikrocontroller und Digitale Elektronik ISR Port wird nicht aufgerufen


von rocket (Gast)


Angehängte Dateien:

Lesenswert?

hi

hat jemand eine Ahnung, warum die ISR vom Port 2 nicht aufgerufen wird?

von Stefan F. (Gast)


Lesenswert?

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?

von lukker (Gast)


Lesenswert?

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

von Stefan F. (Gast)


Lesenswert?

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?

von HummingGerd (Gast)


Lesenswert?

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?

von lukker (Gast)


Lesenswert?

ich habe keine Ahnung...

von HummingGerd (Gast)


Lesenswert?

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

von lukker (Gast)


Lesenswert?

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?

von lukker (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.