Mikrocontroller 2 Interrupts gleichzeitig aufrufen

Gast #32954
Lesenswert?
• ▲
▼
Wie soll denn das gehen? Mir ist noch kein MC bekannt, der wirklich 
parallel Code ausführen kann. Alles quasiparallel. Wenn , dann durch 
Software.

Den Interrupts sind Prioritäten zugeordnet. Ist der Interrupt höherer 
Priorität abgearbeitet, wird der niedrigere wartende Interupt 
schließlich auch ausgeführt. Das klappt eigentlich immer, es sei denn, 
Deine Interrupts gleicher Priorität überholen sich selbst. Kann es das 
wirklich sein?

Grüße
Oliver
Gast #32955
Lesenswert?
• ▲
▼
ich glaube, der pic hat nur einen teil, der durch interupt aufgerufen 
werden kann.

das ist der, der ab Adresse 4 im speicher steht.
der kann zwar durch viele arten ausgelöst werden, aber wohl nur ein teil 
kann aufgerufen werden.

du kannst aber wenn du den interupt auslöst, z.b. am portb, gleichzeitig 
ein flag setzen, das dann in der interupt-routine abgefragt wird. ist 
das flag H, so wird der interupt-teil ausgeführt, der mit portb in 
zusammenhang steht. ist es L, irgenwas anderes.
Gast #32957
Lesenswert?
• ▲
▼
Ich danke allen für die schnellen Antworten.

Im Nachhinein ist mir eingefallen , dass das gar nicht funktionieren 
kann.

Muss wohl das Programm umstrukturien, dass das Timing der Interrupts 
stimmt.

Danke

Marko
#32958
Lesenswert?
• ▲
▼
In der Praxis muß man immer damit rechnen, daß mehrere Interruptquellen 
gleichzeitig ansprechen.


Da gibt es mehrere Lösungen:


1.
Alle Interrupthandler sind so kurz, daß die Verzögerung durch andere 
Interrupthandler nicht stört.


2.
Lange dauernde Interrupts bekommen eine niedrige Priorität, d.h. sie 
können durch höher priorisierte unterbrochen werden.
Das geht jedoch nicht bei PIC / AVR sondern z.B. beim 8051.


3.
Es wird in Software eine unterschiedliche Interruptpriorität realisiert.
Dazu müssen jedoch alle Interruptquellen eigene Interruptfreigabebits 
und Interrupt-Pending-Bits und möglichst auch eigene Interruptvektoren 
haben.

Daazu müssen in sämtlichen niedrig priorisierten Interrupts alle niedrig 
priorisierten Interrupts gesperrt werden und der globale Interrupt 
wieder freigegeben werden.

Ab dann sind nur noch die höher priorisierten Interrupts freigegeben und 
werden somit vorrangig behandelt.
Aber durch die eigenen Interrupt-Pending-Bits geht trotzdem kein niedrig 
priorisierter Interupt verloren.

Beim Verlassen jedes niedrig priorisierten Interrupts muß das Ganze 
natürlich wieder zurückgestellt werden.

Eine 2. Priorität in Software stellt also einen nicht unerheblichen 
Kodeaufwand dar.


Da die AVRs aber relativ fix sind, habe ich bisher immer Lösung 1 
verwendet.
Floating Point Berechnungen oder lange Wartezeiten (>100µs) macht man ja 
auch niemals innerhalb eines Interupts.



Peter

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