Capture wird nicht erkannt ARM7

OP #3662130
Lesenswert?

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;
  }

}
Gast #3662175
Lesenswert?

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?
OP #3662190
Lesenswert?

@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!!
OP #3662200
Lesenswert?

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
}
Gast #3662234
Lesenswert?

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..

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren