Forum: Mikrocontroller und Digitale Elektronik Wie viele Taktzyklen benötigt ein Interruptaufruf beim AVR INT0 (Assembler)


von Michael (Gast)


Lesenswert?

Hallo zusammen,

irgendwie werde ich aus dem Atmel-Datenblatt zum ATtiny13A nicht schlau. 
Mir gehen da Informationen ab, bzw. ich finde sie nicht.

Der INT0-Interrupt wird so eingestellt, dass er bei einer fallenden 
Flanke auslöst. Der Interrupt soll dann einen anderen PORT-Pin einlesen. 
Wichtig ist dabei allerdings eine möglichst geringe Verzögerung.
Was mich daher interessiert ist, wann genau der erste Befehl des 
Interrupts nach der fallenden Flanke am INT0-Pin ausgeführt wird.
Das Datenblatt ( http://www.atmel.com/Images/doc8126.pdf ) gibt leider 
nur das Timing an, wann das Flag der PCINTn gesetzt wird. Hier gehe ich 
einfach mal davon aus, dass es beim INT0 nicht anders sein wird. 
Allerdings wann der erste Befehl nach dem Setzten des Interrupts 
ausgeführt wird, kann ich dem Datenblatt leider nicht entnehmen.

Kann mir diesbezüglich jemand helfen?

Vielen Dank
Gruß Michael

von Falk B. (falk)


Lesenswert?

@ Michael (Gast)


>Was mich daher interessiert ist, wann genau der erste Befehl des
>Interrupts nach der fallenden Flanke am INT0-Pin ausgeführt wird.

Nach 4 Takten, nachdem der Interrupt intern aktiv wurde. Die 
Flankenerkennung an sich dauert vielleicht noch 1-2 Takte.

>nur das Timing an, wann das Flag der PCINTn gesetzt wird. Hier gehe ich
>einfach mal davon aus, dass es beim INT0 nicht anders sein wird.

Sehr ähnlich.

>Allerdings wann der erste Befehl nach dem Setzten des Interrupts
>ausgeführt wird, kann ich dem Datenblatt leider nicht entnehmen.

Ich schon.

4.7.1 Interrupt Response Time

The interrupt execution response for all the enabled AVR interrupts is 
four clock cycles minimum. After four clock cycles the Program Vector 
address for the actual interrupt handling routine is executed. During 
this four clock cycle period, the Program Counter is pushed onto the 
Stack. The vector is normally a jump to the interrupt routine, and this 
jump takes three clock cycles. If an interrupt occurs during execution 
of a multi-cycle instruction, this instruction is completed before the 
interrupt is served. If an interrupt occurs when the MCU is in sleep 
mode, the interrupt execution response time is increased by four clock 
cycles.  his increase comes in addition to the start-up time from the 
selected sleep mode. A return from an interrupt handling routine takes 
four clock cycles. During these four clock cycles, the Program Counter 
(two bytes) is popped back from the Stack, the Stack Pointer is 
incremented by two, and the I-bit in SREG is set.

von Peter II (Gast)


Lesenswert?

Michael schrieb:
> Kann mir diesbezüglich jemand helfen?

es wird auf jeden Fall der aktuelle befehlt noch abgearbeitet, im 
schlimmsten fall ist es ein Spruch. gehe mal von 3 Takten aus. Ab dann 
kommt der Sprung in der ISR was auch noch mal 1( oder sogar 2) Takte 
sind.

Und auch nicht vergessen, in der zeit der kein andere ISR aktiv sein, 
sonst wird es viel mehr.

von Michael (Gast)


Lesenswert?

Falk Brunner schrieb:
> Ich schon.
>
> 4.7.1 Interrupt Response Time

So versteckt... Das hab ich nicht gefunden.
Danke.

von amateur (Gast)


Lesenswert?

Ganz genau lässt sich das nicht sagen.

Die Atmels sind aber relativ schnell.

1. Aktueller Befehl beenden
2. Push IP  ca. 2 Tick-Tacks
3. JMP ISR  ca. 2 Tick-Tacks

Vorsicht: Die Atmels sichern noch nicht mal die Flags.

4. IRET     ca. 2 Tick-Tacks

Wenn Du noch was sichern musst: Pro Push/Pop 2 Takte.

Und natürlich Deine Sequenz.

von Oliver (Gast)


Lesenswert?

Zitat:
1
4.7.1 Interrupt Response Time
2
The interrupt execution response for all the enabled AVR interrupts is four clock cycles minimum.
3
After four clock cycles the Program Vector address for the actual interrupt handling routine
4
is executed. During this four clock cycle period, the Program Counter is pushed onto the Stack.
5
The vector is normally a jump to the interrupt routine, and this jump takes three clock cycles.

Das ganze fängt mit dem Beginn des Befehls nach dem Setzen des Flags an. 
Dabei beinhalten die oben genannten minimal 4 Zyklen auch die Ausführung 
des nächsten Befehls mit einem Zyklus. Benötigt der Befehl mehrere 
Zyklen, dauert es halt länger.

Wenn das Flag gesetzt wird, wird also der zur Zeit laufende Befehl 
fertig abgearbeitet, ebenso der darauf folgende. Dann wird der 
ISR-Vector angesprungen. Da einzelne Befehle zwischen einem und drei 
Zyklen benötigen, dauert das ganze also zwischen 4 und 8 Zyklen. Dazu 
kommt dann noch die Ausführung des Sprungbefehls rjmp in der ISR-Tabelle 
mit nochmal 2 Zyklen ( da irrt der Text des Datenblatts...)

Nach 6 bis 10 Zyklen nach setzen des Flags bist du also am Beginn deiner 
ISR-Routine.


Oliver

von Michael (Gast)


Lesenswert?

Danke euch allen,
Damit ist das Thema Interrupt für mich vom Tisch. Das dauert alles viel 
zu lange. Dann muss ich wohl den entsprechenden Pin pollen, was auch 
schon recht langsam für meine Anwendung ist, weil ja immer ein 
Rücksprung mit 2 Takten gemacht werden muss wodurch effektiv nur alle 3 
Takte der Pin gelesen wird und im schlimmsten Falle auch 4 Takte zum 
ersten Befehl vergehen
1
; low-Pegel abwarten
2
low:   SBIS  PINB,1
3
       RJMP  low
4
; high-Pegel abwarten
5
high:  SBIC  PINB,1
6
       RJMP  high
7
; hier war die fallende Fanke
8
       IN    16,PINB
9
    ...

Der zu messende Pegel muss innerhalb von etwa 500ns gemessen sein. Bei 
einer Taktfrequenz von 8MHz ergibt das leider nur 4 Takte...
Vielleicht muss ich ja doch auf 16MHz umsteigen, aber auch dann ist das 
noch zu unsicher mit nem Interrupt...
Trotzdem Danke

von Klaus (Gast)


Lesenswert?

Michael schrieb:
> Der INT0-Interrupt wird so eingestellt, dass er bei einer fallenden
> Flanke auslöst. Der Interrupt soll dann einen anderen PORT-Pin einlesen.

Zusätzlich ein D-Flipflop mit der fallenden Flanke triggern und das 
Signal auf den D-Eingang. Dann kannst du, solange kein weiterer Trigger 
gekommen ist, am Ausgang des Flipflops den Signalzustand auch später 
lesen.

MfG Klaus

von Falk B. (falk)


Lesenswert?

@ Michael (Gast)

>Der zu messende Pegel muss innerhalb von etwa 500ns gemessen sein. Bei
>einer Taktfrequenz von 8MHz ergibt das leider nur 4 Takte...

Beschreibe dein Vorhaben, nicht deine vermeintliche Lösung.

Siehe Netiquette.

von Markus W. (Firma: guloshop.de) (m-w)


Lesenswert?

Michael schrieb:
> Der zu messende Pegel muss innerhalb von etwa 500ns gemessen sein. Bei
> einer Taktfrequenz von 8MHz ergibt das leider nur 4 Takte...
> Vielleicht muss ich ja doch auf 16MHz umsteigen, aber auch dann ist das
> noch zu unsicher mit nem Interrupt...

Warum nicht 20 MHz? Der ATtiny13A ist offiziell dafür ausgelegt.

2 Takte kannst du zusätzlich sparen, wenn die Interrupt-Routine nicht 
irgendwo im Speicher beginnt, sondern genau dort, wo sich der 
Interrupt-Vektor befindet. Voraussetzung dafür ist natürlich, dass die 
in der Tabelle folgenden Vektoren nicht benötigt werden. Mir hat das 
schon oft geholfen.

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

Die unterschiedliche Antwortzeit wird zum Problem, wenn genaues Timing 
für eine Video-Ausgabe nötig ist.
http://www.batsocks.co.uk/readme/art_SerialVideo_3.htm
ein Arduino-Program zur ASCII-Ausgabe auf einem TV.
nur mit einem Trick wird es hier vermieden:
"Normally, AVRs have a slightly jittery interrupt latency...To prevent 
this jitter, the μC is put to sleep. When an interrupt wakes the 
processor from sleep, no instructions are executing, hence there is a 
repeatable, constant latency."

http://www.watterott.com/de/Batsocks-TellyMate-Video-Output-Shield
Es gibt ähnliche Programme, z.B. ein Fertiggerät von Pollin, oder auch 
hier in der Artikelsammlung.
Beitrag "AVR ASCII Video Terminal  - 40 x 25  - BAS Signal"
Beitrag "AVR VGA Terminal"

von Michael (Gast)


Lesenswert?

Falk Brunner schrieb:
> Beschreibe dein Vorhaben, nicht deine vermeintliche Lösung.
>
> Siehe Netiquette.

Sorry, ich wollte nicht zu weit ausholen, damit keiner von einem Roman 
abgeschreckt wird.
Ich hab den Thread gelesen:
Beitrag "Präzisions Monoflop zur Erzeugung von Pulsen im Bereich von 200-800ns"
und da ich auch gerade einen solchen LED-Strip bekommen habe und damit 
spiele fand ich die Idee genial einen kleinen µC als Datenwandler zu 
nehmen.
Das Bedeutet, ich möchte einerseits ein 800kHz SPI-Signal lesen und 
dabei jedes einzelne Datenbit in einen langen (ca. 650ns) oder kurzen 
(ca. 300ns) langen Puls verwandeln. ( die vorliegenden Angaben zu den 
Pulslängen variieren von 250ns bis 350ns je +-150ns für eine logische 
"0", und von 600ns bis 700ns ebenfalls jeweils +-150ns für die logische 
"1". Scheint also nicht sooo genau zu gehen. )
Beim 800kHz Taktisgnal kommen die Taktflanken eben im 625ns takt. Nicht 
viel Zeit wenn ein Prozessortakt schon 125ns benötigt.
Auf 8MHz beschränken wollte ich mich damit ich den internen 
RC-Oszillator verwenden kann und einen Quarz oder dergleichen einsparen 
kann.

von Andre (Gast)


Lesenswert?

schau mal hier: http://www.ledstyles.de/ftopic21707.html

im Verlauf des threads sind noch mehr Loesungen angeboten.

Andre

von amateur (Gast)


Lesenswert?

Wenn Du einen Pin-Status nur durchreichen willst, so geht dass am Besten 
in Hardware.
Willst Du aber irgendwie darauf reagieren, so hast Du nicht nur ein 
Interruptproblem, sondern auch noch dass Problem, das ein µP im 
Allgemeinen auch irgendwas zutun hat und irgendein Statusregister/-bit 
nicht dauernd und in Nullzeit abgefragt werden kann. Also jeder 
Was-Auch-Immer-Befehl blockiert die Hauptschleife und verhindert somit 
eine mögliche Statusabfrage. Zusätzlich kommt am Ende der Hauptschleife 
noch ein Sprungbefehl, der auch seine Zeit haben will.

von Markus W. (Firma: guloshop.de) (m-w)


Lesenswert?

Michael schrieb:
> Auf 8MHz beschränken wollte ich mich damit ich den internen
> RC-Oszillator verwenden kann und einen Quarz oder dergleichen einsparen
> kann.

OK, ich spar auch gern Bauteile ein. :-) Du könntest es mit einem 
ATtiny85 versuchen, der lässt sich auch ohne Quarz mit 16 MHz betreiben.

von Michael (Gast)


Lesenswert?

Markus Weber schrieb:
> OK, ich spar auch gern Bauteile ein. :-) Du könntest es mit einem
> ATtiny85 versuchen, der lässt sich auch ohne Quarz mit 16 MHz betreiben.

Ich frage mich wie das gehen soll... der hat auch nur einen 8MHz 
internen RC-Oszillator. OK er hat ne PLL mit 8x Multiplikator aber der 
geht ausschließlich als Taktquelle für den Timer/Counter1?!
und die Kalibrierung des internen RC-Oszillators auf 200% stellen kann 
man bei jedem mir bekannten AVR nur weiß halt keiner so recht was dabei 
wirklich raus kommt. Hat das schon mal jemand ausprobiert? Wär glatt mal 
ein Versuch wert.

von avr (Gast)


Lesenswert?

Michael schrieb:
> und die Kalibrierung des internen RC-Oszillators auf 200% stellen kann
> man bei jedem mir bekannten AVR nur weiß halt keiner so recht was dabei
> wirklich raus kommt. Hat das schon mal jemand ausprobiert? Wär glatt mal
> ein Versuch wert.

Hat bei mir ohne Probleme funktioniert. Allerdings meine ich ist das 
außerhalb der Spezifikationen.

von Peter D. (peda)


Lesenswert?

Die ATtiny85 und 861 können die PLL auf 16MHz runter geteilt als 
CPU-Takt fusen.

von Markus W. (Firma: guloshop.de) (m-w)


Lesenswert?

Peter Dannegger schrieb:
> Die ATtiny85 und 861 können die PLL auf 16MHz runter geteilt als
> CPU-Takt fusen.

Dass der 861 das auch kann, war mir gar nicht bewusst, danke für den 
Tipp!

Megas gibts aber keine, die offiziell intern mit 16 MHz laufen, oder?

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
Noch kein Account? Hier anmelden.