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
@ 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.
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.
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.
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
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
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
@ 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.
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.
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.
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.
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.
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.
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.
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?