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.
@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).
@ 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.
@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 | }
|
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.