Forum: Mikrocontroller und Digitale Elektronik ARM LPC Problem mit externen Interrupts


von fredy (Gast)


Lesenswert?

Hallo miteinander,
Ich habe ein Problem: Ich möchte mit meinem LPC2148 4 Servo-Signale 
(RC-Signal) messen, bzw. die Pulsweite dieser Signale. Nun habe ich die 
Messung mit einem einzelnen Kanal getestet: Funktioniert.
Jetzt aber: Wenn ich mehrere Interrupts laufen lasse (Signale 
anschliesse) scheinen sich die Interrupts zu beeinflussen. Wie ist das 
möglich?
Hier die Initialisation:
1
void EINTInit( void )
2
{ 
3
  PINSEL0 |=   0x000000CC ;    
4
                      
5
  EXTMODE = (1<<0|1<<1);    // INTx is Edge-sensitive
6
  EXTPOLAR |= (1<<0|1<<1);  // Interrupt on positive Edge
7
                            //Install all Interrupts 
8
  install_irq( EINT0_INT, (void *)EINT0_Handler );
9
  install_irq( EINT1_INT, (void *)EINT1_Handler );
10
11
}// EINTInit (...

Muss ich die Interrupts getrennt initialisieren, oder wie schaffe ich 
es, dass die sich nicht mehr übersprechen/beeinflussen? An was könnte 
das liegen?

Ach ja, ich compiliere mit ARMcc RealView, programmieren tu ich unter 
uVision3 (V3.62c).

Gruss, fredy

von roborob (Gast)


Lesenswert?

Hi,
kannste noch ne Interruptfunktion zeigen?

von fredy (Gast)


Lesenswert?

Achso... Ehm, dies könnte für Verwirrung sorgen, aber bitte:
1
void EINT0_Handler (void) __irq
2
{
3
  VICIntEnClr = 1<<EINT0_INT;
4
  if(eint0.edge)                //Positive edge
5
  {
6
    eint0.edge = FALLING;
7
    edge_pol(EINT0, FALLING);  //Change Polarity
8
    eint0.val1 = T1TC;    //Save Counter Value
9
  }
10
  else                     //Negative edge
11
  {
12
     eint0.edge = RISING;
13
    edge_pol(EINT0, RISING);  //Change Polarity
14
    eint0.val2 = T1TC;    //Save Counter Value
15
16
    //Calculate Value(Pulsewide)
17
    if(eint0.val2 > eint0.val1)
18
    {
19
      eint0.pw = (eint0.val2 - eint0.val1);
20
    }
21
    else
22
    {
23
      eint0.pw = (eint0.val2 + (_VarMax - eint0.val1));
24
    }
25
  }
26
27
   EXTINT = 1<<EINT0;      //Clear interrupt Flag EINT0
28
  VICVectAddr = 0;      // Acknowledge Interrupt
29
  VICIntEnable = 1<<EINT0_INT;
30
31
}//EINT0_Handler (...

Ich hoffe, es ist verständlich... Wichtig sind eigentlich nur folgende 
Zeilen:
1
void EINT0_Handler (void) __irq
2
{
3
    VICIntEnClr = 1<<EINT0_INT;
4
5
    //...
6
7
    EXTINT = 1<<EINT0;          // Clear interrupt Flag EINT0
8
    VICVectAddr = 0;            // Acknowledge Interrupt
9
    VICIntEnable = 1<<EINT0_INT;
10
11
}//EINT0_Handler (...

Gruss, fredy

von (prx) A. K. (prx)


Lesenswert?

Eine Pulsbreitenmessung geht weitaus besser und genauer über 
Timer-Capture statt externem Interrupt.

Welchen Sinn hat die Interrupt-Disable Klammer:
1
  VICIntEnClr = 1<<EINT0_INT;
2
  ....
3
  VICIntEnable = 1<<EINT0_INT;

von fredy (Gast)


Lesenswert?

A. K. schrieb:
> Eine Pulsbreitenmessung geht weitaus besser und genauer über
> Timer-Capture statt externem Interrupt.

Hoi A.K.,
Es ist in der Tat so, dass dies genauer ginge, aber: Ich hab keinen 
Timer mehr frei...
Einen Timer benötige ich für diverse Frequenzen zu erzeugen (rel. 
komplex), den anderen Timer benutze ich als Task Manager und Rampengeni.

Und da ich nur 2 Timer habe, ist dieses Thema leider vom Tisch...

A. K. schrieb:
> Welchen Sinn hat die Interrupt-Disable Klammer:

Diese klammer stellt mir sicher, dass dieser Interrupt nicht gleich 
nochmal auslöst... obschon dies überflüssig ist, ich weiss. Aber ich bin 
schon so lange am suchen, ich hab schon fast alles ausprobiert! Aber das 
hat keine sinnvolle Auswirkung, ich lösch das dann wieder mal.

Danke für deine Antwort, ich werde einfach weiter suchen...

Gruss, fredy

von (prx) A. K. (prx)


Lesenswert?

Kannst du versuchen, das auftretende Problem etwas verständlicher zu 
beschreiben? Was konkret verstehst du unter 
"Beeinflussung/Übersprechen"?

von fredy (Gast)


Angehängte Dateien:

Lesenswert?

Also,
ein RC-Signal ist so aufgebaut:
http://api.ning.com/files/WmjViE3faLYy73Ry7eTzn4XMryr8qlAMeb*edCbrzW1BVUPtR1iXBIGgsS93iG1x5roVRkAWHqg7V3FAhK*o8NYsajr5nW7G/RC_Receiver_Timing_Diagram1.jpg
Zu beachten sind Channel1 bis 6 (Servo- oder RC-Signale)

Diese Pulsweiten müssen gemessen werden (Es werden lediglich 4 Kanäle 
gemessen, mehr sind nicht notwendig).

Der Kontroller hat nebst diesen Signalen noch ca. 10 weitere Kanäle, die 
er einlesen (10bit Genauigkeit) und auf eine SD-Karte abspeichern muss.

Das Ganze Projekt ist rel. Umfangreich, wenn genauere Infos verlangt 
werden muss ich vielleicht passen (Wegen zu viel Aufwand).

Problem:
Die Kanäle werden korrekt gemessen, wenn sie einzeln angeschlossen sind.
Wenn aber min. 2 Kanäle angeschlossen sind, ist Schluss. Ein Kanal wird 
immer richtig gemessen. Dieser Kanal ist aber nicht immer derselbe - Sie 
wechseln sich immer schön ab (Es lebt! ...) Alle anderen Kanäle bilden 
ein Abbild dieses Kanals,d.h. ein ziemlich verzerrtes, deformiertes 
Abbild, aber ein Abbild (ist in grafischer Darstellung zu erkennen, 
siehe Anhang).

So, ich hoffe das reicht fürs erste...
Hab gerade ne heisse Spur gefunden. Schreib sobald als möglich zurück.

Gruss, fredy

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.