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
Edi R. schrieb: > ausgelöst wurde Ja wenn diese Interrupts was taten, was man nun in der aktuellen ISR prüfen kann.
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?
Zu der ersten Frage es handelt sich um ein AT90CAN128 uC. Ich habe noch keine Zeit festgelegt aber ca 2-3 sec.
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.
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.
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.
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.
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 | }
|
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.
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)
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.
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
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..
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.
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.
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.
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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.