www.mikrocontroller.net

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

Autor: Krugman (Gast)
Datum: 15.05.2008 11:55

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: 15.05.2008 15:38

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 Email-Adresse ist freiwillig. Wenn Sie automatisch per Email über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Suchfunktion und Betreffsuche benutzen - vielleicht gibt es schon einen ähnlichen Beitrag
  • Aussagekräftigen Betreff wählen
  • Im Betreff angeben um welchen Controllertyp es geht (AVR, PIC, ...)
  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
  • JPEG-Dateien (.jpg) nur für Fotos und Scans verwenden
  • Schaltpläne, Screenshots usw. als PNG oder GIF anhängen

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [pre]vorformatierter Text (z.B. Code in anderen Sprachen)[/pre]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel






webmaster@mikrocontroller.netImpressumWerbung auf Mikrocontroller.net