www.mikrocontroller.net

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


Autor: fredy (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
void EINTInit( void )
{ 
  PINSEL0 |=   0x000000CC ;    
                      
  EXTMODE = (1<<0|1<<1);    // INTx is Edge-sensitive
  EXTPOLAR |= (1<<0|1<<1);  // Interrupt on positive Edge
                            //Install all Interrupts 
  install_irq( EINT0_INT, (void *)EINT0_Handler );
  install_irq( EINT1_INT, (void *)EINT1_Handler );

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

Autor: roborob (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
kannste noch ne Interruptfunktion zeigen?

Autor: fredy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Achso... Ehm, dies könnte für Verwirrung sorgen, aber bitte:
void EINT0_Handler (void) __irq
{
  VICIntEnClr = 1<<EINT0_INT;
  if(eint0.edge)                //Positive edge
  {
    eint0.edge = FALLING;
    edge_pol(EINT0, FALLING);  //Change Polarity
    eint0.val1 = T1TC;    //Save Counter Value
  }
  else                     //Negative edge
  {
     eint0.edge = RISING;
    edge_pol(EINT0, RISING);  //Change Polarity
    eint0.val2 = T1TC;    //Save Counter Value

    //Calculate Value(Pulsewide)
    if(eint0.val2 > eint0.val1)
    {
      eint0.pw = (eint0.val2 - eint0.val1);
    }
    else
    {
      eint0.pw = (eint0.val2 + (_VarMax - eint0.val1));
    }
  }

   EXTINT = 1<<EINT0;      //Clear interrupt Flag EINT0
  VICVectAddr = 0;      // Acknowledge Interrupt
  VICIntEnable = 1<<EINT0_INT;

}//EINT0_Handler (...



Ich hoffe, es ist verständlich... Wichtig sind eigentlich nur folgende 
Zeilen:
void EINT0_Handler (void) __irq
{
    VICIntEnClr = 1<<EINT0_INT;

    //...

    EXTINT = 1<<EINT0;          // Clear interrupt Flag EINT0
    VICVectAddr = 0;            // Acknowledge Interrupt
    VICIntEnable = 1<<EINT0_INT;

}//EINT0_Handler (...


Gruss, fredy

Autor: A. K. (prx)
Datum:

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

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

Autor: fredy (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: A. K. (prx)
Datum:

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

Autor: fredy (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Also,
ein RC-Signal ist so aufgebaut:
http://api.ning.com/files/WmjViE3faLYy73Ry7eTzn4XM...
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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.