Externe Interrupts

Gast #4326355
Lesenswert?

Liebe Community,

Ich habe 4 Sensoren die mit meinen uC verbunden sind und jeder der 
Sensoren ist in einem Interrupt PIN verbunden. Wenn einer der Interrupts 
schaltet so wie ich das verstanden habe stoppt die while loop und 
springt in den ISR (interrupt Service Routine). Ist es dann möglich 
innerhalb dieses ISR nochmal zu prüfen ob einer der anderen Interrupts 
ausgelöst wurde.

Die Idee dahinter ist ein Muster zu Erkennen z.b wenn zu erst Sensor1 
und dann Sensor 3 anschaltet eine bestimmte LED leuchtet z.B die rote, 
und umgekehrt leuchtet die grüne LED.

Vielen Dank

Grüße

Edo
Gast #4326378
Lesenswert?

Edi R. schrieb:
> mit meinen uC

Was ist das für einer?

Edi R. schrieb:
> innerhalb dieses ISR nochmal zu prüfen ob einer der anderen Interrupts
> ausgelöst wurde

Wenn sich das Programm in der ISR befindet, dann werden von den anderen 
auftretenden Interrupts die Interrupt-Flags gesetzt. Und die kann man 
abfragen.

Wie kurz hintereinander treten die verschiedenen Interrupts auf bzw. wie 
lange dauert deine ISR?
#4326429
Lesenswert?

Edi R. schrieb:
> Zu der ersten Frage es handelt sich um ein AT90CAN128 uC.
>
> Ich habe noch keine Zeit festgelegt aber ca 2-3 sec.

Ist das die Dauer der ISR? Dann hast du was falsch gemacht. Wenn nicht, 
ergibt deine Frage keinen Sinn, denn dann kommen diese Ereignisse nicht, 
während die ISR läuft, und du kannst sie damit dort nicht prüfen.
#4326517
Lesenswert?

Edi R. schrieb:
> Die Idee dahinter ist ein Muster zu Erkennen z.b wenn zu erst Sensor1
> und dann Sensor 3 anschaltet eine bestimmte LED leuchtet z.B die rote,
> und umgekehrt leuchtet die grüne LED.

Dann zeichne Dir dazu einen Programmablaufplan, wie der MC welche 
Zustände und Übergänge eindeutig erkennen kann.

Und erst, wenn der PAP logisch richtig ist, dann kannst Du z.B. 
Interrupts oder sonstwas dazu nehmen, den PAP in Code umzusetzen.
#4326530
Lesenswert?

Edi R. schrieb:
> Ich will das jeder Sensor nachdem er ausgelöst wird ein paar Sekunden
> wartet um zu prüfen ob einer von den anderen Sensoren angesprochen hat,
> wenn nicht dann fängt alles von vorne an.

Wie gesagt, erstelle einen Programmablaufplan, wie wann was erfolgen 
soll.
Erst damit kann ein anderer erkennen, was Du eigentlich willst.

Programmabläufe lassen sich nur sehr schlecht in Prosa einem anderen 
vermitteln.
#4326538
Lesenswert?

Als Denkanstoss:
1
volatile uint8_t int1_flag = 0;
2

3
ISR1()
4
{
5
  /* Nur Flag setzen, alles andere passiert im Hauptprogramm */
6
  int1_flag = 1;
7
}
8

9
int main()
10
{
11
  /* Hier alles mögliche initialisieren */
12
  /* ISR aufsetzen usw */
13

14
  /* Hauptschleife */
15
  for(;;)
16
  {
17
    if (int1_flag)
18
    {
19
      /* INT1 wurde ausgelöst, tue was! */
20
      /* zB schauen ob INT2 schon ausgelöst wurde ;-)*/
21

22
      /* Flag zurücksetzen */
23
      int1_flag = 0;
24
    }
25
  }
26
}
(Firma: CIA) #4326619
Lesenswert?

Der Fragesteller schrieb in seiner ursprünglichen Frage doch eindeutig 
dass er in einer ISR prüfen möchte  ob ein anderer interrupt ausgelöst 
wurde. Das ist eindeutig in der Vergangenheit. Dafür benutzt man das 
Wort wurde.  So gut wie alle Antworten gehen davon aus das die Frage 
sich darauf bezieht dass in einer ISR geprüft werden solle ob sich 
während diese ISR abgearbeitet wird ein anderes Interruptereignis 
stattfindet. Das zwei verschiedene Dinge.
Gast #4326629
Lesenswert?

Thomas H. schrieb:
> wurde
Naja...
Ich habe da auch so meine Probleme mit der Frage....

Soweit wie ich es bisher verstanden habe:
Ich würde alle auftretenden Ereignisse in einem Ringbuffer sammeln und 
ganz in Ruhe im Hauptprogramm auswerten.

Edi R. schrieb:
> ein paar Sekunden
Zeitnot scheint nicht zu herrschen.....

Edi R. schrieb:
> Ich will das jeder Sensor .... wartet
Sensoren, welche warten?
Das dürfte ein Blickwinkel Problem sein.

Überhaupt: Warten?
Warum?
Prozessoren warten eher nicht.
Die laufen immer auf Volldampf!
(wenn sie nicht gerade schlafen)
#4326635
Lesenswert?

Thomas H. schrieb:
> Der Fragesteller schrieb in seiner ursprünglichen Frage doch eindeutig ...

Was ist daran denn eindeutig?
Ich sehe bisher nur Wischiwaschi.

Man muß zuerst eine eindeutige Regel erstellen, z.B. wann der MC die 
rote LED anschaltet bzw. wann nicht und wann er sie wieder ausschaltet.
Dann erst kann man coden.
Festzulegen, ob dabei Interrupts benötigt werden, dazu ist noch viel zu 
früh.
Gast #4326641
Lesenswert?

Thomas H. schrieb:
> Der Fragesteller schrieb in seiner ursprünglichen Frage doch
> eindeutig
> ... Das ist eindeutig in der Vergangenheit. ... So gut wie alle
> Antworten gehen davon aus  bla bla bla

Da hat wohl jemand Textverständnisprobleme.
Wenn der TO zugegebenermaßen auch nicht das schreibt was er meint.

Zur eigentlichen Frage:

Edi R. schrieb:
> Ist es dann möglich
> innerhalb dieses ISR nochmal zu prüfen ob einer der anderen Interrupts
> ausgelöst wurde.

Ja, es ist möglich. Und zwar auf vielen, vielen verschiedenen Wegen.
Aber wie war ja nicht die Frage.

Ulli
#4326668
Lesenswert?

Thomas H. schrieb:
> doch eindeutig
> dass er in einer ISR prüfen möchte  ob ein anderer interrupt ausgelöst
> wurde. Das ist eindeutig in der Vergangenheit.

nicht wirklich. Der TE spricht von

Edi R. schrieb:
> wenn zu erst Sensor1
> und dann Sensor 3 anschaltet

d.h. der Interrupt für Sensor 1 wird zuerst ausgelöst, dann fragt man 
sich, ob danach auch noch der Interrupt für Sensor 3 kommt..
(Firma: CIA) #4326694
Lesenswert?

Peter D. schrieb:
> Was ist daran denn eindeutig?
> Ich sehe bisher nur Wischiwaschi.

Eindeutig ist, sofern man davon ausgeht, dass der TO das meint was er 
schreibt, die Formulierung:

"zu prüfen ob einer der anderen Interrupts
ausgelöst wurde."

Er schrieb nicht ausgelöst sind, oder ausgelöst werden, sondern wurden. 
Das ist nun mal die Formulierung die man wählt, wenn man sich auf die 
Vergangenheit bezieht. Wobei zugegebener Maßen der Begriff Vergangenheit 
in der digitalen Welt durchaus differenzierter betrachtet werden muss. 
Der Rest ist in der Tat Wischiwaschi, deshalb bekam er auch als erste 
Antwort von mir jene wie geschrieben.
Gast #4326721
Lesenswert?

Thomas H. schrieb:
> Ulli schrieb:
>> Wenn der TO zugegebenermaßen auch nicht das schreibt was er meint.
>
> Da hat wohl einer die Fähigkeit zu wissen, was andere meinen, ohne dass
> jene es ihm mitteilen.

Also so schwer ist es ja wohl nicht zu begreifen!
Sobald ein Sensor ausgelöst hat möchte er eine Zeit x lange warten ob 
noch ein zweiter Sensor auslöst. Ist die Zeit x abgelaufen, wird 
rückgesetzt.

Man kann sich aber auch anstellen .....

Ulli
#4326840
Lesenswert?

Ulli schrieb:
> Ulli schrieb:
>> Man kann sich aber auch anstellen .....
>
> Oh, er hat ja inzwischen ein Bildchen gepostet, hatte ich nicht gesehen
> als ich das oben schrieb.

Ja.
Ändert aber nichts am eigentlichen Problem, welches a priori 'einen 
Eingang überwachen' mit externem Interrupt gleichsetzt. Man kann das so 
machen, man muss aber nicht (zumindest wurde noch nichts darüber 
ausgesagt, dass die Sensorpulse so kurz wären, dass man sie nur mit 
einem externen Interrupt noch erfassen kann)
Fatal wird es allerdings, wenn dann überlegt wird, die zu 
implementierende Logik (das Bildchen) in die ISR zu quetschen. Denn 
damit manövriert er sich dann selbst ins Abseits und die Dinge werden 
komplizierter als notwendig. Vor allen Dingen dann, wenn der gedankliche 
Schritt von 'warten' auf 'ist ein Ereignis innerhalb einer bestimmten 
Zeitspanne aufgetreten' noch nicht vollzogen wurde.
Gast #4326927
Lesenswert?

Karl H. schrieb:
> Fatal wird es allerdings, wenn dann überlegt wird, die zu
> implementierende Logik (das Bildchen) in die ISR zu quetschen.

Wenn man zwei ISRs verwendet und die Auswertung ins Hauptprogramm 
verschiebt, dann wird das ganze doch recht übersichtlich.

-> Programmablaufplan: ISR_Timer und ISR_Sensoren

Im Hauptprogramm muss man dann nur noch prüfen, ob die Variable 
[Sensorfolge] einem dieser Werte entspricht:

[0x12, 0x13, 0x14, 0x21, 0x23, 0x24, 0x31, 0x32, 0x34, 0x41, 0x42, 0x43]

Und wenn ja: die entsprechende Aktion ausführen und dann Sensorfolge und 
Timeout wieder auf 0 setzen.
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren