Hallo,
ich arbeite gerade an einem Projekt mit einem ARM7.
Ziel ist, anhand von 2 Bewegungssensoren zunächst einmal die
Zeitdifferenz zu messen. Ist eigentlich nicht so schwer.
Ich möchte zuerst den einen Sensor in Betrieb nehmen, bevor ich mit 2
arbeite, da ich nicht so gut bin und leicht durcheinander komme.
Nun zu meinem Problem.
Mein Capture wird einfach nicht erkannt. Ich habe bei der
Initialisierung für eine Überprüfung mit einem Match gearbeitet. Einfach
um zu schauen, ob er in meine ISR reinkommt. Da funktioniert alles. Dann
hab ich gedacht, vielleicht bekommt mein Controller kein Signal und habe
es an einem Oszi angeschlossen. Klappt auch wunderbar. Ich hab die
Vermutung, dass vielleicht meine Initialisierung nicht stimmt, aber
soweit erscheint mir das ganze logisch. Aber da es nicht funktioniert,
muss ja irgendwas falsch sein.
Ich wäre wirklich dankbar, wenn ihr mir weiterhelfen könnt. Ich seh den
Wald vor lauter Bäumen nicht mehr und das seit einer Woche. Ich fange
langsam wirklich an zu zweifeln.
Hier mein Programm (ich weiß, ist sehr "unprofessionell")
/*----------------------------------------------------------------------
------
* Name: main.c
*-----------------------------------------------------------------------
-----*/
#include <LPC23xx.h> /* LPC23xx definitions */
#include "LPC2xxx_embedded.h"
//#include "LCD.h" /* LCD function prototypes */
#define pinsel_3 0x00300000
//Definition Strukturzeige
pLPC_PinConnect_TypeDef pPinsel;
pLPC_VIC_TypeDef VIC_Controller_basis;
pLPC_TIMER_TypeDef pTimer;
int zeit1;
//int zeit2;
//int strecke = ...;
//int v;
__irq void timer0_ISR (void);
__irq void timer0_ISR (void)
{
// pTimer->TIR = 0x10; //CR0 interrupt flag; Match register flag ->
0x11;
// pTimer-> TTCR = 0x01; //Timer starten
zeit1 = pTimer-> TTC; //TC-Wert abspeichern
VIC_Controller_basis->VIC_Address = 0;
}
void PinConnectBlock (void)
{
pPinsel->PIN_SEL3 |= 0x00300000; //CAP0.0 input for Timer0
}
void init_Timer0(void)
{
//Initialize Timer
/* pTimer->TMCR = 0x00000003;
pTimer->TMR0 = 144000;
pTimer->TTCR = 1;
*/
pTimer->TIR = 0x10; //CR0 interrupt flag; Match register flag ->
0x11;
pTimer->TCCR = 0x05; //Capture 0 rising edge; interrupt on cap0->
event will generate an interrupt
pTimer-> TTCR = 1; //Timer starten
// pTimer->TMCR = 0x03; //Interrupt on MR0 & reset TC if match on MR0
}
void vic_init(void)
{
VIC_Controller_basis->VIC_VectAddress[4] = (unsigned long)timer0_ISR;
//Vektor
VIC_Controller_basis->VIC_VectPriority[4] = 0x0000000A;
//Priorität
VIC_Controller_basis->VIC_IntEnable |= (1 << 4); //Interrupt
freigeben für Timer0
}
//MAIN function
int main(void)
{
pTimer = TIMER0_BASE;
pPinsel = PinConnectBlock_BASE;
VIC_Controller_basis = VIC_BASE;
// pPinsel->PIN_SEL3 = 0x00300000; //Pin P1.26 function CAP0.0
PinConnectBlock();
init_Timer0();
vic_init();
while (1)
{
// zeit1 = pTimer->TTC;
}
}
P.S. ich erwarte keine Komplettlösung oder sowas. Möchte ja auch etwas lernen, aber über einen kleinen Anstoß würde ich mich wirklich sehr freuen. Vielen Dank! Gruß
Hallo, leider wird aus deinem Post nicht ganz klar was du tun willst. Du hast einen externen bewegungssensor der dir einen statischen pegel oder einen puls liefern soll, wenn etwas passiert? bitte erkläre das genauer, ggfs mit schaltbild. poste deinen code mit[ code] tags für syntax highlighting.. ich persönlich vertu mich öfters beim initialisieren des VIC für eine spezifische quelle, schau dir das datenblatt nochmal genau an, ob alle einstellungen stimmen.. wo kommt das struct VIC_Controller_basis her?
@dunno.. Danke erst mal, dass du mir helfen willst. Also mein Bewegungssensor liefert bei Bewegung einfach nur eine "1" und ansonsten eine "0". Ich habe ihn an einem Capturefähigen Pin angeschlossen. Sobald eine "1" anliegt, soll ein Interrupt geschehen, der mir dann die Zeit abspeichert. VIC_Controller_basis ist einfach eine Instanz von einem Zeiger. Dieser Zeiger zeigt auf die Register von den Vektoren. Aber ich denke nicht, dass es daran liegt, denn wenn ich meinen Timer ohne Capture laufen lasse (also mit dem Matchregister arbeite), springt er in meine ISR. Dann müsste das doch eigentlich stimmen oder?
1 | /*----------------------------------------------------------------------------
|
2 | * Name: main.c
|
3 | *----------------------------------------------------------------------------*/
|
4 | |
5 | #include <LPC23xx.h> /* LPC23xx definitions */ |
6 | #include "LPC2xxx_embedded.h" |
7 | //#include "CAN.h" /* LPC23xx CAN adaption layer */
|
8 | //#include "LCD.h" /* LCD function prototypes */
|
9 | |
10 | #define pinsel_3 0x00300000
|
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 test; |
19 | //int zeit2;
|
20 | //int strecke = ...;
|
21 | //int v;
|
22 | |
23 | __irq void timer0_ISR (void); |
24 | |
25 | __irq void timer0_ISR (void) |
26 | {
|
27 | pTimer->TIR = 0x10; //CR0 interrupt flag; Match register flag -> 0x11; |
28 | // pTimer-> TTCR = 0x01; //Timer starten
|
29 | zeit1 = pTimer-> TTC; //TC-Wert abspeichern |
30 | test = pTimer->TCR0; // Wert von CR0 auslesen |
31 | // Interrupt Flag löschen; TC wieder auf 0
|
32 | VIC_Controller_basis->VIC_Address = 0; |
33 | }
|
34 | |
35 | void PinConnectBlock (void) |
36 | {
|
37 | pPinsel->PIN_SEL3 |= 0x00300000; //CAP0.0 input for Timer0 |
38 | |
39 | }
|
40 | void init_Timer0(void) |
41 | {
|
42 | |
43 | //Initialize Timer
|
44 | pTimer->TMCR = 0x00000003; |
45 | pTimer->TMR0 = 144000; |
46 | pTimer->TTCR = 1; |
47 | /*
|
48 | // pTimer->TIR = 0x10; //CR0 interrupt flag; Match register flag -> 0x11;
|
49 | pTimer->TCCR = 0x05; //Capture 0 rising edge; interrupt on cap0-> event will generate an interrupt
|
50 | pTimer-> TTCR = 1; //Timer starten
|
51 | // pTimer->TMCR = 0x03; //Interrupt on MR0 & reset TC if match on MR0
|
52 | */
|
53 | }
|
54 | |
55 | void vic_init(void) |
56 | {
|
57 | VIC_Controller_basis->VIC_VectAddress[4] = (unsigned long)timer0_ISR; //Vektor |
58 | VIC_Controller_basis->VIC_VectPriority[4] = 0x0000000A; //Priorität |
59 | VIC_Controller_basis->VIC_IntEnable |= (1 << 4); //Interrupt freigeben für Timer0 |
60 | }
|
61 | |
62 | //MAIN function
|
63 | int main(void) |
64 | {
|
65 | pTimer = TIMER0_BASE; |
66 | pPinsel = PinConnectBlock_BASE; |
67 | VIC_Controller_basis = VIC_BASE; |
68 | // pPinsel->PIN_SEL3 = 0x00300000; //Pin P1.26 function CAP0.0
|
69 | PinConnectBlock(); |
70 | init_Timer0(); |
71 | vic_init(); |
72 | |
73 | while (1) |
74 | {
|
75 | // zeit1 = pTimer->TTC;
|
76 | }
|
77 | /*
|
78 | VIC_Controller_basis = VIC-Base; //Initialize VIC Controller Structur
|
79 | //Initialize LCD
|
80 | lcd_init();
|
81 | lcd_clear();
|
82 | lcd_print("Geschwindigkeit: ");
|
83 |
|
84 | //set-cursor usw....
|
85 | |
86 | */
|
87 | |
88 | }
|
Ich hoffe, dass ich mein Problem etwas verständlicher machen konnte. Danke nochmals!!
sorry für doppelpost: benutze das Timer Interrupt Register außerdem in der ISR, um den interrupt vor dem verlassen der ISR wieder freizugeben.
Sorry, hab meine "Capture-Initialisierung" ausgeklammert gehabt. Also du meinst einmal bei der Initialisierung auf enable und einmal in der ISR selber?
1 | /*----------------------------------------------------------------------------
|
2 | * Name: main.c
|
3 | *----------------------------------------------------------------------------*/
|
4 | |
5 | #include <LPC23xx.h> /* LPC23xx definitions */ |
6 | #include "LPC2xxx_embedded.h" |
7 | //#include "CAN.h" /* LPC23xx CAN adaption layer */
|
8 | //#include "LCD.h" /* LCD function prototypes */
|
9 | |
10 | #define pinsel_3 0x00300000
|
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 test; |
19 | //int zeit2;
|
20 | //int strecke = ...;
|
21 | //int v;
|
22 | |
23 | __irq void timer0_ISR (void); |
24 | |
25 | __irq void timer0_ISR (void) |
26 | {
|
27 | pTimer->TIR = 0x10; //CR0 interrupt flag; Match register flag -> 0x11; |
28 | // pTimer-> TTCR = 0x01; //Timer starten
|
29 | zeit1 = pTimer-> TTC; //TC-Wert abspeichern |
30 | test = pTimer->TCR0; // Wert von CR0 auslesen |
31 | // Interrupt Flag löschen; TC wieder auf 0
|
32 | VIC_Controller_basis->VIC_Address = 0; |
33 | }
|
34 | |
35 | void PinConnectBlock (void) |
36 | {
|
37 | pPinsel->PIN_SEL3 |= 0x00300000; //CAP0.0 input for Timer0 |
38 | |
39 | }
|
40 | void init_Timer0(void) |
41 | {
|
42 | |
43 | //Initialize Timer
|
44 | /* pTimer->TMCR = 0x00000003;
|
45 | pTimer->TMR0 = 144000;
|
46 | pTimer->TTCR = 1;
|
47 | */
|
48 | pTimer->TIR = 0x10; //CR0 interrupt flag; Match register flag -> 0x11; |
49 | pTimer->TCCR = 0x05; //Capture 0 rising edge; interrupt on cap0-> event will generate an interrupt |
50 | pTimer-> TTCR = 1; //Timer starten |
51 | // pTimer->TMCR = 0x03; //Interrupt on MR0 & reset TC if match on MR0
|
52 | |
53 | }
|
54 | |
55 | void vic_init(void) |
56 | {
|
57 | VIC_Controller_basis->VIC_VectAddress[4] = (unsigned long)timer0_ISR; //Vektor |
58 | VIC_Controller_basis->VIC_VectPriority[4] = 0x0000000A; //Priorität |
59 | VIC_Controller_basis->VIC_IntEnable |= (1 << 4); //Interrupt freigeben für Timer0 |
60 | }
|
61 | |
62 | //MAIN function
|
63 | int main(void) |
64 | {
|
65 | pTimer = TIMER0_BASE; |
66 | pPinsel = PinConnectBlock_BASE; |
67 | VIC_Controller_basis = VIC_BASE; |
68 | // pPinsel->PIN_SEL3 = 0x00300000; //Pin P1.26 function CAP0.0
|
69 | PinConnectBlock(); |
70 | init_Timer0(); |
71 | vic_init(); |
72 | |
73 | while (1) |
74 | {
|
75 | // zeit1 = pTimer->TTC;
|
76 | }
|
77 | /*
|
78 | VIC_Controller_basis = VIC-Base; //Initialize VIC Controller Structur
|
79 | //Initialize LCD
|
80 | lcd_init();
|
81 | lcd_clear();
|
82 | lcd_print("Geschwindigkeit: ");
|
83 |
|
84 | //set-cursor usw....
|
85 | |
86 | */
|
87 | |
88 | }
|
mh. in der aktuellsten version vom code sehe ich so erstmal keinen fehler mehr.. prüfe ggfs ob dein pinselect auch zum device passt, das du verwendest, nicht dass der cap0 einfach nicht als cap0 pin arbeitet oder sowas..
Das hab ich auch schon überprüft... Seit einer Woche bin ich wirklich von A-Z alles 1000 mal durchgegangen, aber irgendwas überseh ich einfach :( Trotzdem vielen Dank... wäre schön, wenn dir noch was auffällt, was evtl. mein Fehler sein könnte.
läuft der timer denn so? siehst du das er zählt, wenn du in der mainloop den wert abfragst?
Ja, der Timer läuft, denn in der Variable "zeit1" wird der Wert vom Timer-Counter abgespeichert. Da müsste der Timer eigentlich laufen...
Hallo, vielen Dank für die nette Hilfe! Ich habe das Problem ENDLICH gelöst. Ich habe einfach ein anderes Kabel genommen und es mit meinem µC verbunden. Das war mein Problem. Ich dachte, ich schreibe hier die Lösung meines Problems hin. Nochmals vielen Dank. Gruß
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.