mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Interrupt Sprungzeit


Autor: R--- S--- (rene66)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Controller, Entwicklungsumgebeung, Was ist unterschiedlich lange?

Autor: Klaus2m5 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: R--- S--- (rene66)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry ATMega16 und Timer1

Der Timer ist so eingestellt:

ldi   tempL, (1<<CS12)|(1<<CS11)|(0<<CS10)|(0<<WGM12)
....
an Port B1 liegt ein externer Takt der den Interrupt nach 
Übereinstimmung auslöst.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: R--- S--- (rene66)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
René Schink wrote:
> lach jetzt nicht aber es sind ca. 1-3 Prozessortakte auch im AVR Studio
> zu sehen.
Siehe oben! Lachen tu ich sicher nicht...

Autor: Klaus2m5 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
... 1-3 Takte sind durch die unterschiedliche Ausführungszeit der 
Instruktionen bedingt (1-4 clocks). Ein Interrupt Vektor wird erst am 
Ende der Instruktion ausgeführt.

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Maria (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Problem sind doch meist die anderen, gerade aktiven, Interrups. Da 
muss man schnell EI() machen.

Autor: R--- S--- (rene66)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: R--- S--- (rene66)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Michael H* (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
dann musst du wohl den interrupt von einem anderen controller ausführen 
lassen, der nichts anderes macht, als auf darauf zu warten

Autor: Michael H* (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: R--- S--- (rene66)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
was meinst Du mit OS?

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: R--- S--- (rene66)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ICP-Interrupt welcher ist das?

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Input Capture. Dafür gibt es einen eigenen Pin.

Autor: Michael H* (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
icp: input capture bei 16 bit timern

Autor: Klaus2m5 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!)

Autor: R--- S--- (rene66)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Leider habe ich Timer 1 schon verbraten. Zu blöd das es nur einen Timer 
mit der Funktion gibt.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wär aber doch mal interessant zu erfahren, für welches Problem eine 
Forderung nach taktzyklen-identischer Interrupt-Sprungzeit relevant sein 
soll.

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zum Beispiel bei zeitlich kritischer Anlieferung / Abholung von Daten an 
einem Bus - das Problem hatte ich auch schon. Es ließ sich nur durch 
entsprechend breite Zeitfenster der Datenvalidität in den Griff 
bekommen.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: R--- S--- (rene66)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
Ich Zähle aber eien externen Takt an Pin B 1 der auch im Interrupt 
weiterzählt wird.
   Takt1
___|--|_________*PIN AN-AUS*_______
      |         |
.      Die Zeit muß immer gleich sein (20xnop)
.9xnix
.
. Takt10
___|--|_________*PIN AN-AUS*_______


usw.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.