Interrupt Sprungzeit

#1011268
Lesenswert?

Hallo,

mir ist aufgefallen das derselbe Interrupt unterschiedliche Zeiten 
benötigt um ausgeführt zu werden. Kann man das verhindern oder irgendwie 
ausgleichen das immer die exakt selbe oder längste "Sprungzeit" bis zur 
Ausführung eingehalten wird?
#1011283
Lesenswert?

Läubi Mail@laeubi.de wrote:
> [...] Was ist unterschiedlich lange?
Also, definiere "unterschiedliche Zeiten"! Ein bis zwei CPU-Takte 
Unterschied können grundsätzlich auftreten und das lässt sich auch nicht 
vermeiden, da immer erst der gerade laufende Befehl zuende abgearbeitet 
wird. Kollisionen mit anderen Interrupts führen u.U. auch zu verzögerter 
Ausführung und zu anderen Problemen. Ohne Dein Programm zu kennen, kann 
man da nur mutmaßen.
Gast #1011312
Lesenswert?

Schreib dein Programm einfach so, dass es nur 1-Zyklen-Befehle verwendet
;-)

Spaß beiseite:

Es kommt letzendlich nicht nur auf die Interruptlatenzzeit an, sondern
auch darauf, wie lange der Interrupthandler für die Ausführung einer
entsprechende Reaktion  braucht. Ist bei dir die Ausführungszeit des
Interrupthandlers immer konstant? Wenn nein, bringt es auch nichts, die
Interruptlatenzzeit optimieren zu wollen. Wenn ja, dann ist die
ausgeführte Aktion so einfach, dass sie wahrscheinlich leicht auf
anderem Wege zyklengenau realisierbar ist.
#1011326
Lesenswert?

Hallo,

der Interrupt selber ist immer von der Ausführungszeit her gleich lang.
sichert das Serg Register er schaltet einen Portpin an und aus mit ein 
paar nop dazwischen und geht wieder Raus mit reti. Also kommen die 
Unterschiede auch durch das externe Signal zustande was ja zum Prozessor 
nicht synchron ist. Also der Interrupt wird ausgelöst aber der Prozessor 
arbeitet gerade noch einen Befehl ab und reagiert dann erst.
#1011349
Lesenswert?

gibt es eine Möglichkeit immer die gleiche höchste Zeit einzuhalten also 
z.B ca. 10 Taktzyklen?
Zählen der seit dem Interrupt vergangenen Zyklen und die zum PC addieren 
und springen
am Anfang des Interrupts ein paar NOPS und dann die Einsprungadresse 
ändern


                                nop
             ...                nop
bei 3 Zyklen hier reinspringen: nop
bei 4 Zyklen hier reinspringen: nop
             ...                nop

                               serg sichern...
                               ISR

                               Reti

wisst Ihr wie ich meine?
Gast #1011354
Lesenswert?

René Schink wrote:
...
> wisst Ihr wie ich meine?
ja, ich denke schon. aber du weiß ja nicht, welchen befehl die alu 
gerade abarbeitet, wenn der interrupt kommt. er ist ja eine asynchrone 
anforderung. das geht also ohne weiteres nicht.
du kannst ein eigenes os aufsetzen, das weiß, was es gerade tut, aber 
das ist schon extrem aufwendig. lieber einen eigenen controller.
#1011361
Lesenswert?

René Schink wrote:
> Zählen der seit dem Interrupt vergangenen Zyklen und die zum PC addieren
> und springen

Das geht nur mit dem ICP-Interrupt.
Damit kriegst Du den zyklusgenauen Zeitstempel des Interrupts und im 
Interrupthandler kannst Du dann die Zeitdifferenz zum durchlaufenden 
TCNT1 ermitteln und berücksichtigen.
T1 muß dabei mit XTAL/1 laufen.


Peter
Gast #1011387
Lesenswert?

Mal grundsätzlich: Man kann von einem Mikrocontroller, der bei 16MHz 
Befehlsausführungszeiten bis zu 0,25µs hat, dass er auf ein Signal mit 
einer Genauigkeit von 0,0625 µs reagieren kann. Wenn man das will sind 
Klimmzüge zu erwarten!

Mein Vorschlag:

1. schnelleren Controller verwenden

2. diskrete Hardware / Counter IC verwenden

3. per timer0/software zählen und timer1 input capture register
   verwenden um die Abweichung zu kompensieren.
   (nicht empfehlenswert!)

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