Forum: Mikrocontroller und Digitale Elektronik Capture wird nicht erkannt ARM7


von Merve B. (student1990)


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

}

von Merve B. (student1990)


Lesenswert?

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ß

von dunno.. (Gast)


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?

von Merve B. (student1990)


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

von dunno.. (Gast)


Lesenswert?

sorry für doppelpost:

benutze das Timer Interrupt Register außerdem in der ISR, um den 
interrupt vor dem verlassen der ISR wieder freizugeben.

von Merve B. (student1990)


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
}

von dunno.. (Gast)


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

von Merve B. (student1990)


Lesenswert?

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.

von dunno.. (Gast)


Lesenswert?

läuft der timer denn so? siehst du das er zählt, wenn du in der mainloop 
den wert abfragst?

von Merve B. (student1990)


Lesenswert?

Ja, der Timer läuft, denn in der Variable "zeit1" wird der Wert vom 
Timer-Counter abgespeichert.
Da müsste der Timer eigentlich laufen...

von Merve B. (student1990)


Lesenswert?

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
Noch kein Account? Hier anmelden.