Forum: Mikrocontroller und Digitale Elektronik Interrupt Register ändert sich nicht


von Merve B. (student1990)


Lesenswert?

Hallo,

ich schreibe gerade ein Programm für 2 Bewegungssensoren.
Das Programm soll folgendes tun:
Läuft man von A nach B (wobei an beiden Punkten jeweils ein Sensor 
hängt),
wird ein Interrupt ausgelöst. A startet den Timer und B stoppt dann den 
Timer und die Zeit wird abgespeichert.
Das gleiche soll passieren, wenn man von B nach A läuft. Es soll also 
keinen Unterschied geben.
Zu meinem Problem. Wenn ich von A nach B laufe, funktioniert alles, ABER 
von B nach A passiert etwas seltsames, was ich mir leider nicht erklären 
kann. Also der Timer startet ganz normal, wird aber bei A nicht 
gestoppt, aber komischerweise wird da in der Variable "zeit2" etwas 
abgespeichert. Nach längerem testen habe ich dann eine Variable erzeugt, 
die mir einfach den Wert vom IR anzeigen soll. Da ich den Verdacht 
hatte, dass die Bedingung nicht stimmt und es deswegen nicht ganz so 
rund läuft. Da ist mir dann aufgefallen, dass bei dem eben beschriebenen 
Ablauf der Wert vom Interrupt Register sich gar nicht ändert, obwohl ein 
Signal anliegt(Habe es auch an den Oszi angeschlossen, um ganz sicher zu 
gehen).

Fazit: Von A nach B klappt alles von B nach A passiert im Punkt A etwas 
seltsames.

Hier noch mein Code (ich weiß, ist sehr sehr schlecht programmiert)
1
/*----------------------------------------------------------------------------
2
 * Name:    main.c
3
 *----------------------------------------------------------------------------*/
4
5
#include <LPC23xx.h>           /* LPC23xx definitions */
6
#include "LPC2xxx_embedded.h"
7
//#include "LCD.h"               /* LCD function prototypes */        
8
9
//#define pinsel_3  0x00300000
10
11
//Definition Strukturzeige
12
13
pLPC_PinConnect_TypeDef pPinsel;
14
pLPC_VIC_TypeDef  VIC_Controller_basis;
15
pLPC_TIMER_TypeDef  pTimer;
16
17
int zeit1;
18
int zeit2;
19
//static int zeit2 = 0;
20
int test;
21
int besetzt;
22
int sensor1;
23
int sensor2;
24
//const double strecke = 3.0;
25
//double v = 0.0;
26
27
__irq void timer0_ISR (void);
28
29
__irq void timer0_ISR (void) 
30
  {
31
/*    
32
     if((pTimer->TIR) == 0x1) //Interrupt MR0
33
       {
34
      zeit1++;
35
//      test = pTimer->TIR;
36
      pTimer->TIR |= 1;
37
      }
38
    //Timer starten
39
    */
40
41
    test = pTimer->TIR;
42
    //Fehlfunktion
43
    if(pTimer->TIR == 0x30)
44
    {
45
      pTimer->TIR |= 1 <<4;
46
      pTimer->TIR |= 1 <<5;
47
    }
48
49
    if(((pTimer->TIR == 0x10)|| (pTimer->TIR == 0x20)) && besetzt == 0)
50
    {
51
      pTimer-> TTCR = 0x01;      //Timer starten
52
      besetzt = 1;
53
      if((pTimer->TIR == 0x10))
54
      {
55
      pTimer->TIR |= 1 <<4;
56
      sensor1 = 1;
57
      }
58
      if((pTimer->TIR == 0x20))
59
      {
60
      pTimer->TIR |= 1 <<5;
61
      sensor2 = 1;
62
      }    
63
    }
64
65
    //Timer stoppen & Zeit abspeichern
66
    if(sensor1 == 1 && sensor2 == 0 && (pTimer->TIR == 0x20))
67
    {
68
       pTimer-> TTCR = 0x0;      //Timer stoppen
69
       zeit1 = pTimer-> TTC;  
70
       
71
       zeit2 = zeit1;        // Zeit abspeichern
72
//       test = zeit1;
73
       zeit1 = 0;  
74
       besetzt = 0;
75
       sensor1 = 0;
76
       pTimer->TTC = 0x0;     //TC zurücksetzen
77
       pTimer->TIR |= 1 <<5;
78
79
    }
80
     if(sensor2 == 1 && sensor1 == 0 && (pTimer->TIR == 0x10))
81
    {
82
       pTimer-> TTCR = 0x0;      //Timer stoppen
83
       zeit2 = zeit1;        // Zeit abspeichern
84
//       test = zeit1;
85
       zeit1 = 0;  
86
       besetzt = 0;
87
       sensor2 = 0;
88
       pTimer->TTC = 0x0;
89
       pTimer->TIR |= 1 <<4;
90
91
    }
92
93
    // Interrupt Flag löschen; TC wieder auf 0
94
       VIC_Controller_basis->VIC_Address = 0;  
95
  }
96
97
void PinConnectBlock (void)
98
{
99
//  pPinsel->PIN_SEL3 |= 0x00300000;   //CAP0.0 input for Timer0
100
    pPinsel->PIN_SEL3 |= 0x00F00000;   //CAP0.0 & CAP0.1 input for Timer0
101
}
102
void init_Timer0(void)
103
{
104
  
105
  //Initialize Timer
106
107
  pTimer->TIR = 0x30; //CR0.0 und CR0.1 interrupt flag; Match register flag  -> 0x31;
108
  pTimer->TCCR = 0x2D; //Capture 0.0 und 0.1 rising edge; interrupt on cap0.0 und 0.1-> event will generate an interrupt
109
//    pTimer->TMCR = 0x03; // interrupt on MR0 & Reset TC if Match
110
//  pTimer->TMR0 = 0xDBB9FF; //Einstellung auf 1s
111
//  pTimer-> TTCR = 1; //Timer starten
112
113
114
}
115
116
void vic_init(void)
117
{
118
  VIC_Controller_basis->VIC_VectAddress[4] = (unsigned long)timer0_ISR;   //Vektor
119
    VIC_Controller_basis->VIC_VectPriority[4] = 0x0000000A;    //Priorität
120
    VIC_Controller_basis->VIC_IntEnable |= (1 << 4);    //Interrupt  freigeben für Timer0
121
122
}
123
124
//MAIN function
125
int main(void)
126
{  
127
  pTimer = TIMER0_BASE;
128
  pPinsel = PinConnectBlock_BASE;
129
  VIC_Controller_basis = VIC_BASE;
130
  PinConnectBlock();
131
  init_Timer0();
132
  vic_init();
133
  //test = pTimer->  TIR;
134
135
136
  
137
138
  while (1)
139
  {
140
//     v = strecke/((double)zeit2);  
141
  }
142
143
144
}

Wäre wirklich froh, wenn ihr mir helfen könnt.

Gruß

von (prx) A. K. (prx)


Lesenswert?

1
pTimer->TIR |= 1 <<4;
Lösch alle aktiven TIR Flags. Korrekt ist
1
pTimer->TIR = 1 <<4;
"Writing a logic one to the corresponding IR bit will reset the 
interrupt. Writing a zero has no effect."

von Merve B. (student1990)


Lesenswert?

@A.K. danke für die schnelle Antwort. Ich habe es gleich ausprobiert, 
aber leider besteht noch das Problem.

von Merve B. (student1990)


Lesenswert?

Ach ja, ich sollte vielleicht erwähnen, dass ich mit einem LPC2368FBD100 
arbeite.

von (prx) A. K. (prx)


Lesenswert?


von Merve B. (student1990)


Lesenswert?

@A.K. volatile für alle Variablen?

von (prx) A. K. (prx)


Lesenswert?

Siehe Artikel.

von Merve B. (student1990)


Lesenswert?

Ich habe eben volatile auch ausprobiert, immer noch das selbe Problem...
Ich verstehe wirklich nicht, wie es sein kann, dass nur in der 
Reihenfolge bei nur dem einen Sensor die IR sich nicht ändert. Umgekehrt 
geht es doch auch...
aber mittlerweile speichert er nicht irgendeine Zeit ab, was mich auch 
wundert, da ich eigentlich ja nichts am Programm geändert habe.

von (prx) A. K. (prx)


Lesenswert?

Da ich keine Lust habe, das ganze Gewusel zu verstehen: Funktionieren 
die Interrupts alle wie sie sollen, d.h. wird im gewünschten Fall der 
richtige Zweig im Handler ausgeführt? Kann man mit Testcode rauskriegen, 
z.B. indem dort irgendwelche Testpins aktiviert werden.

von Merve B. (student1990)


Lesenswert?

@A.K. ich verlange ja auch keine Lösungen oder sowas, sondern nur kleine 
Ratschläge, da ich schon sehr lange dran saß und einfach nicht mehr 
weiter weiß. Getestet hab ich das Programm schon mehrmals. Wie gesagt in 
eine Richtung funktioniert das ganze, so wie es soll, bloß in die andere 
Richtung mach er nicht ganz, da der Wert im IR sich nicht ändert und 
deswegen auch die Bedingung im Interrupt nicht erfüllt ist. Warum das 
ganze im Allgemeinem nicht funktioniert weiß ich ja, aber was ich nicht 
verstehe, warum sich das IR nicht ändert, obwohl ein Signal von dem 
entsprechenden Sensor anliegt. Würde es in beide Richtungen nicht gehen, 
hätte ich gesagt: Ok das liegt am Sensor oder ich hab etwas falsches 
konfiguriert. Aber es ist nur in diesem einen Fall. Und der Code ist ja 
auch derselbe....sie unterscheiden sich eben nur durch die Bedingungen.

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.