Forum: Mikrocontroller und Digitale Elektronik Externe Interrupts


von Can R. (Gast)


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

von Thomas H. (Firma: CIA) (apostel13)


Lesenswert?

Edi R. schrieb:
> ausgelöst wurde

Ja wenn diese Interrupts was taten, was man nun in der aktuellen ISR 
prüfen kann.

von John (Gast)


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?

von Can R. (Gast)


Lesenswert?

Zu der ersten Frage es handelt sich um ein AT90CAN128 uC.

Ich habe noch keine Zeit festgelegt aber ca 2-3 sec.

von Rolf M. (rmagnus)


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.

von Peter D. (peda)


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.

von Can R. (Gast)


Lesenswert?

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.

von Peter D. (peda)


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.

von Eric B. (beric)


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
}

von Thomas H. (Firma: CIA) (apostel13)


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.

von Ulrich F. (Gast)


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)

von Peter D. (peda)


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.

von Ulli (Gast)


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

von Justus S. (jussa)


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

von Thomas H. (Firma: CIA) (apostel13)


Lesenswert?

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.

von Thomas H. (Firma: CIA) (apostel13)


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.

von Can R. (Gast)


Angehängte Dateien:

Lesenswert?

Ich entschuldige mich mal für meine Fragestellung, die ist in einer 
Hinsicht wirklich nicht verständlich. Ich lade eine grobe Darstellung 
von dem Zustandsautomat.

von Ulli (Gast)


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

von Ulli (Gast)


Lesenswert?

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.

Ulli

von Karl H. (kbuchegg)


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.

: Bearbeitet durch User
von John (Gast)


Angehängte Dateien:

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.

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.