ISR Port wird nicht aufgerufen

Gast #6214965
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?
Gast #6215010
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
Gast #6215018
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?
Gast #6215029
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?
Gast #6215849
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?

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