LPC2148 - EXT INT - Optionen - Möglichkeiten

Gast #867673
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
Gast #867909
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 ..

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.