Forum: Mikrocontroller und Digitale Elektronik Wartezeit mit Match oder besser ohne?


von Merve B. (student1990)


Lesenswert?

Hallo,

ich hab da eine kleine Frage. Ich möchte 2 Funktionen meines Timers 
ausnutzen. Einmal die Capture Funktion und einmal die Match Funktion. 
Nun will ich aber, dass bei Capture was anderes passiert und bei Match. 
Soweit ich weiß, hat jeder Timer nur eine ISR. Ich habe mir gedacht, 
dass ich in der ISR überprüfe, welches Bit denn nun gesetzt worden ist, 
sprich ich überprüfe, ob der Capture jetzt auf "1" gegangen ist oder 
Match. Habe es auch ausprobiert, aber leider bleibt der in der ISR an 
dieser Stelle hängen. Deswegen habe ich mir gedacht, ich frage direkt in 
der main() (hab also die komplette Match Funktion rausgenommen) den Wert 
des Timer Counter Registers ab (soll bei einer Minute eine Variable 
hochzählen). Doch der geht nicht mal in die Bedingung rein, obwohl mein 
Timer aufgrund des Captures schon gestartet hat. Also im TC stehen 
Werte, aber die Bedingung in meiner main() wird komischerweise nie 
erfüllt. Kann mir jemand mal einen Tipp geben?
Vielen Dank.

von Peter II (Gast)


Lesenswert?

Merve B. schrieb:
> Kann mir jemand mal einen Tipp geben?

ohne den µC zu kennen - nein.

von Merve B. (student1990)


Lesenswert?

Tut mir leid.
Ich benutze einen LPC2368

von Mike (Gast)


Lesenswert?

Merve B. schrieb:
> Ich benutze einen LPC2368

Der hat doch genug Timer

von Merve B. (student1990)


Lesenswert?

@Mike
Ja das ist mir klar, aber mein Timer startet, wenn ein Capture anliegt 
und soll dann, wenn kein 2. Capture kommt, stoppen (nach 1 Minute).

von Falk B. (falk)


Lesenswert?

@ Merve B. (student1990)

>Ja das ist mir klar, aber mein Timer startet, wenn ein Capture anliegt

Nö. Der Timer läuft STÄNDIG. Wenn ein Capture-Ereignis erkannt wird, 
wird der aktuelle Zählerstand in das Capture-Register kopiert.

>und soll dann, wenn kein 2. Capture kommt, stoppen (nach 1 Minute).

Das ist eine leichte Übung. In fast jedem Mikrcontrollerprogramm braucht 
man so oder so eine Zeitbasis, hier reichen 100ms locker. Also muss der 
oder ein anderer Timer einen Interrupt alle 100ms erzeugen. Dort kannst 
du dann deine 1 Minute runterzählen und entsprechend reagieren. Siehe 
Interrupt, Timer und Statemachine.

von Merve B. (student1990)


Lesenswert?

@Falk Brunner

Was ich gemeint habe, dass mein Timer erst bei einem Interrupt startet. 
Folglich läuft er davor nicht.
Danke für die Links. Ich habe es mir durchgelesen.

Habe jetzt mal was anderes ausprobiert und mit 2 Timern gearbeitet, 
wobei der eine Timer vom anderen abhängt. Hierfür habe ich dann eine 
extra ISR geschrieben, welche mit dem Match arbeitet. Das ganze habe ich 
ausprobiert. Beide Timer starten FAST zeitgleich, ABER jetzt zu meinem 
Problem. Obwohl ich den 2. Timer mit dem Match arbeiten lasse, geht er 
nicht in die entsprechende ISR rein. Ich sehe zwar, dass er den 
TC-Register wieder auf Null setzt, aber der Timer läuft ständig weiter. 
Was mir noch aufgefallen ist-der ist irgendwie ständig in der ISR von 
dem anderen Timer (der mit dem Capture arbeitet), obwohl ich eigentlich 
die Flags wieder freigebe. An was kann das liegen? Komplett Lösungen 
oder sowas möchte ich nicht keine Sorge. Will lediglich nur Tipps, die 
mir weiterhelfen könnten. Will ja was lernen und nicht ständig euch 
damit belästigen. Vielen dank im voraus.
Hier mein Code (der leider nicht so sauber programmiert ist)
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
#include <stdio.h>
9
10
//Definition Strukturzeige
11
12
pLPC_PinConnect_TypeDef pPinsel;
13
pLPC_VIC_TypeDef  VIC_Controller_basis;
14
pLPC_TIMER_TypeDef  pTimer;
15
pLPC_TIMER_TypeDef pTimer2;
16
17
18
volatile int zeit1;
19
//volatile int zeit2;
20
static volatile int zeit2 = 0;
21
static volatile int personen = 0;
22
volatile int test;
23
static volatile int besetzt;
24
volatile int sensor1;
25
volatile int sensor2;
26
const double strecke = 3.0;
27
unsigned int wait;
28
static volatile int timeout = 0;
29
double v = 0.0;
30
int hilfe1 = 0;
31
32
//Var. für LCD
33
char wert1[12];
34
char wert2[12];
35
36
__irq void timer0_ISR (void);
37
__irq void timer3_ISR (void);
38
39
__irq void timer0_ISR (void)
40
{
41
  pTimer2-> TTCR = 0x0;      //Timer0 stoppen
42
  pTimer-> TTCR = 0x0;      //Timer3 stoppen
43
  besetzt = 0;
44
  timeout = 1;
45
  pTimer2->TIR |= 1;
46
  pTimer->TIR = 1 <<4;
47
  pTimer->TIR = 1 <<5;
48
  VIC_Controller_basis->VIC_Address = 0;  
49
}
50
__irq void timer3_ISR (void) 
51
  {
52
53
    /*  
54
    //Fehlfunktion
55
    if(pTimer->TIR == 0x30)
56
    {
57
      pTimer->TIR |= 1 <<4;
58
      pTimer->TIR |= 1 <<5;
59
    }
60
*/
61
//    if(pTimer->TIR == 0x10 || pTimer->TIR == 0x20)
62
//    {  
63
/*    if((pTimer->TIR) == 0x01)
64
    {
65
      hilfe1 = 1;
66
      timeout = 1;
67
      pTimer->TIR |= 1;
68
    }
69
*/    
70
    if(pTimer->TTCR == 0x0)
71
    {
72
      pTimer-> TTCR = 0x01;      //Timer starten
73
      besetzt = 1;
74
      if((pTimer->TIR == 0x10))
75
      {
76
      pTimer->TIR = 1 <<4;
77
      sensor1 = 1;
78
      }
79
      if((pTimer->TIR == 0x20))
80
      {
81
      pTimer->TIR = 1 <<5;
82
      sensor2 = 1;
83
      }    
84
    }
85
86
    //Timer stoppen & Zeit abspeichern
87
    if((sensor1 == 1) && (sensor2 == 0) && (pTimer->TIR == 0x20))
88
    {
89
       pTimer-> TTCR = 0x0;      //Timer stoppen
90
       zeit1 = pTimer-> TTC;  
91
       zeit2 = zeit1;        // Zeit abspeichern
92
       zeit2/= 0xDBBA00;  // 1s
93
       test = zeit1;
94
       personen++;
95
       zeit1 = 0;  
96
       besetzt = 0;
97
       sensor1 = 0;
98
       pTimer->TTC = 0x0;     //TC zurücksetzen
99
       pTimer->TIR = 1 <<5;
100
101
    }
102
103
     if(sensor2 == 1 && sensor1 == 0 && (pTimer->TIR == 0x10))
104
    {
105
       pTimer-> TTCR = 0x0;      //Timer stoppen
106
       zeit1 = pTimer-> TTC;
107
       zeit2 = zeit1;        // Zeit abspeichern
108
       zeit2/= 0xDBBA00;  // 1s
109
       test = zeit1;
110
       personen++;
111
       zeit1 = 0;  
112
       besetzt = 0;
113
       sensor2 = 0;
114
       pTimer->TTC = 0x0;
115
       pTimer->TIR = 1 <<4;
116
117
    }
118
  
119
      
120
    // Interrupt Flag löschen; TC wieder auf 0
121
       VIC_Controller_basis->VIC_Address = 0;  
122
  }
123
124
void PinConnectBlock (void)
125
{
126
    pPinsel->PIN_SEL1 |= 0x3C000;   //CAP3.0 & CAP3.1 input for Timer3
127
}
128
129
  //Initialize Timer
130
void init_Timer3(void)
131
{
132
  
133
  PCONP |=(1<<23);     //PONCONP Timer3 wird "geweckt"
134
  pTimer->TIR = 0x31; //CR0.0 und CR0.1 interrupt flag; Match register flag  -> 0x31;
135
  pTimer->TCCR = 0x2D; //Capture 0.0 und 0.1 rising edge; interrupt on cap0.0 und 0.1-> event will generate an interrupt
136
  pTimer->TMCR = 0x05; // interrupt on MR0 & Reset TC if Match
137
  pTimer->TMR0 = 0x337F9800; //Einstellung auf 1 min 0xDBBA00 * 60
138
}
139
void init_Timer0(void)
140
{
141
  pTimer2->TIR = 0x01; //Match Register
142
  pTimer2->TMCR = 0x03; // interrupt on MR0 & Reset TC if Match
143
  pTimer2->TMR0 = 0x337F9800; //Einstellung auf 1 min 0xDBBA00 * 60
144
}
145
void vic_init(void)
146
  
147
{
148
    VIC_Controller_basis->VIC_VectAddress[27] = (unsigned long)timer3_ISR;   //Vektor
149
    VIC_Controller_basis->VIC_VectPriority[27] = 0x0000000A;    //Priorität
150
    VIC_Controller_basis->VIC_IntEnable |= (1 << 27);    //Interrupt  freigeben für Timer3
151
  
152
    VIC_Controller_basis->VIC_VectAddress[4] = (unsigned long)timer3_ISR;   //Vektor
153
    VIC_Controller_basis->VIC_VectPriority[4] = 0x0000000B;    //Priorität
154
    VIC_Controller_basis->VIC_IntEnable |= (1 << 4);    //Interrupt  freigeben für Timer0
155
  
156
157
}
158
159
//MAIN function
160
int main(void)
161
{  
162
  pTimer = TIMER3_BASE;
163
  pTimer2 = TIMER0_BASE;
164
  pPinsel = PinConnectBlock_BASE;
165
  VIC_Controller_basis = VIC_BASE;
166
  PinConnectBlock();
167
  vic_init();
168
  init_Timer0();
169
  init_Timer3();
170
  
171
  //Initialize LCD
172
  lcd_init();
173
  lcd_clear();
174
175
  while (1)
176
  {
177
    /* if(zeit2>=60)
178
     {
179
      set_cursor(0,0);
180
      lcd_print("Zeitueberschreitung");
181
     }
182
     for(wait=0;wait<(1440000/2);wait++);
183
     lcd_clear();
184
     */
185
/*     if(pTimer->TTC == 0x337F9800)
186
     {  
187
       pTimer-> TTCR = 0x0;      //Timer stoppen
188
       lcd_clear();
189
       set_cursor(0,0);
190
       lcd_print("Timeout");
191
       timeout = 0;
192
     }
193
    */
194
//     for(wait=0;wait<(1440000/2);wait++);
195
//     lcd_clear();
196
/*     
197
     if(pTimer->TTC == 0x337F9800)
198
     {  
199
       pTimer-> TTCR = 0x0;      //Timer stoppen
200
       timeout = 1;
201
     }
202
*/  
203
     if(besetzt == 1)
204
     {
205
        pTimer2->TTCR = 0x01;
206
     }
207
     
208
     hilfe1 = 0;
209
     set_cursor(0,0);
210
     v = strecke/((double)zeit2);  
211
     sprintf(wert1, "t: %ds Pers. %d    ",zeit2,personen);
212
     lcd_print(wert1);
213
  
214
     set_cursor(0,1);
215
     sprintf(wert2, "v: %4.2f m/s",v);
216
     lcd_print(wert2);
217
    
218
  }
219
  
220
221
}

von Merve B. (student1990)


Lesenswert?

Habe gerade einen Fehler entdeckt! Ich habe vergessen von Timer 3 die 
Einstellungen für das Match-Register raus zu nehmen. Vielleicht lag es 
daran. Ich probiere es gleich aus und werde hier dann das Verhalten 
schreiben.

von Merve B. (student1990)


Lesenswert?

Hab es ausprobiert. Mein Problem ist, dass er nicht in die entsprechende 
ISR reinspringt. Das ist total seltsam, denn als ich ein Testprogramm 
geschrieben habe, hat das alles wunderbar funktioniert und es waren die 
selben Einstellungen für den Timer...
Kann mir wirklich keiner einen Tipp geben, warum er nicht in die ISR 
reinspringt, obwohl er ein Match erkennt?

Danke

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.