www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LPC2148 - EXT INT - Optionen - Möglichkeiten


Autor: Krugman (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!


Folgendes Problem. Ich habe einen PIN der EXTERN auf HIGH geht. Wenn 
dieser PIN mehrere Sekunden auf HIGH ist, dann soll alle z.B. 4ms Daten 
durch die EXT_INT_FUNC ausglesen werden.

Ich möchte allerdings nicht in der Funktion drinbleiben solange der PIN 
auf HIGH ist. Ich möchte den EXT per Hand resetten (durch z.B. einen 
Timer) und wenn der PIN dann noch auf HIGH ist, dann soll er gleich 
wieder in meine Interruptfunktion reinspringen. Ist das verständlich??
/* deaktivierte Timerfunktion
void Timer0(void)
{
 if(FIO0PIN & PIN0_30)
 {
  EXTINT = 0x03; // clearen, damit der Interrupt wieder ausgelöst wird
 }
}*/
void EXT3_INT_Func(void) //__irq
{

 // clear EXTINT; muss gemacht werden laut Handbuch
 EXTINT = 0x03;

 // some code
 ...;

 // clear Interrupt

 VICAdress = 0x0;

}


der ExtInt geht, habe ihn getestet.
die TimerInt geht auch. Also an den Funktionen liegt es nicht. Es ist 
ein programmierlogisches Problem.


Wäre nett, wenn es Ratschläge gibt!


Gruss
Krugman

Autor: Krugman (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry Leute,

war recht einfach meine Frage selber zu loesen ..

Fuer alle Neueinsteiger:
void Timer0(void)
{

EXTINT = 0x03; 
// damit wird der Externe Interrupt gecleart (03 steht für einen bestimmten PIN). 
// Wenn wir das nicht machen, würden wir keine Interrupts (Extern) mehr mitbekommen.

}


void Ext_Int_Func(void)
{

if( !(FIO0PIN & P0_30) ) // wenn nicht PIN30
{ EXTINT = 0x03; 
// falls am Anfang irgendetwas versehentlich den PIN auf high setzt,
// muessen wir das abfangen, sonst kriegen wir gewollte Interrupts nicht 
// mehr mit! Ne bessere Lösung ist mir nicht eingefallen.
}else if( (FIO0PIN & P0_30) ) // wenn PIN30
{
...; // do something
}

VICAdresse = 0x0; // Vectored Adresse auf 0 setzen. Ist wichtig wenn man den VIC verwendet!
}

Anmerkung: Ich hab hier nicht die Init fuer den Timer und die 
Ext_Int_Func hinterlegt. Dies kann man recht einfach aus dem Manual 
rausbekommen.

Zur Erklärung:
Wenn der PIN30 extern (andere Hardware) auf High geht, springen wir in 
die EXT_INT_Func hinein und führen den Code aus. Wir setzen aber nicht 
das Clearflag für den Ext-Interrupt, was man normalerweise direkt nach 
dem Funktionsaufruf machen sollte.
Wir setzen das Flag erst in der Timerfunktion. Dadurch erreicht man ein 
"Abtasten" des PINs, weil nur alle X ms (je nach Timerconfig) den 
Clearflag setzt.


Gruss
Krugman


PS: Wer mir erlären kann warum ich mir mit der if-Abfrage aushelfen 
musste, dem bin ich dankbar. Ich weis nicht warum es ohne bei mir nicht 
ging. Hat bestimmt was mit dem Reset zu tun ..

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.