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ß