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


von Krugman (Gast)


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??
1
/* deaktivierte Timerfunktion
2
void Timer0(void)
3
{
4
 if(FIO0PIN & PIN0_30)
5
 {
6
  EXTINT = 0x03; // clearen, damit der Interrupt wieder ausgelöst wird
7
 }
8
}*/
1
void EXT3_INT_Func(void) //__irq
2
{
3
4
 // clear EXTINT; muss gemacht werden laut Handbuch
5
 EXTINT = 0x03;
6
7
 // some code
8
 ...;
9
10
 // clear Interrupt
11
12
 VICAdress = 0x0;
13
14
}


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

von Krugman (Gast)


Lesenswert?

Sorry Leute,

war recht einfach meine Frage selber zu loesen ..

Fuer alle Neueinsteiger:
1
void Timer0(void)
2
{
3
4
EXTINT = 0x03; 
5
// damit wird der Externe Interrupt gecleart (03 steht für einen bestimmten PIN). 
6
// Wenn wir das nicht machen, würden wir keine Interrupts (Extern) mehr mitbekommen.
7
8
}
9
10
11
void Ext_Int_Func(void)
12
{
13
14
if( !(FIO0PIN & P0_30) ) // wenn nicht PIN30
15
{ EXTINT = 0x03; 
16
// falls am Anfang irgendetwas versehentlich den PIN auf high setzt,
17
// muessen wir das abfangen, sonst kriegen wir gewollte Interrupts nicht 
18
// mehr mit! Ne bessere Lösung ist mir nicht eingefallen.
19
}else if( (FIO0PIN & P0_30) ) // wenn PIN30
20
{
21
...; // do something
22
}
23
24
VICAdresse = 0x0; // Vectored Adresse auf 0 setzen. Ist wichtig wenn man den VIC verwendet!
25
}

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

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.