Interrupt Sprungzeit

Gast #1011276
Lesenswert?

Kommt darauf an, welcher Interrupt ausgeglichen werden soll. Beim Timer 
kann ich zum Beispiel den Count aulesen und damit die Verspätung 
ausrechnen und ausgleichen (Timer ohne Vorteiler!). Für einen externen 
Interrupt müßte ich das ICR laden und ebtsprechend berechnen.

Gruß, Klaus
#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.
OP #1011290
Lesenswert?

Hallo,

lach jetzt nicht aber es sind ca. 1-3 Prozessortakte auch im AVR Studio 
zu sehen. Für meine Anwendung ist es wichtig das immer die selbe Zeit 
eingehalten wird mit 10 Takten kann ich auch leben nur müssen die exakt 
gleich lang sein. Bitte stellt das jetzt nicht in Frage es ist einfach 
so.
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.
OP #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.
OP #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!)
#1011554
Lesenswert?

René Schink wrote:
> Leider habe ich Timer 1 schon verbraten. Zu blöd das es nur einen Timer
> mit der Funktion gibt.

Das ist doch die gleiche Sache, für die Du ihn verbraten hast.
Du mußt ihn nur auf ICP umstellen, dann kannst Du im ICP-Interrupt 
zählen.


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