PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Interrupt Zeit



hacker
22.01.2009, 17:27
Hallo,

wie lange braucht ein AVR für einen INT? Kann ich eine Frequenz von ca. 700kHz auf einen INT schalten, bei der in der INT Routine paar ns später ein Impuls an einem anderen Port ausgegeben werden soll. So eine Art Verzögerung der Frequenzimpulse?

Ist das zeitlich möglich mit einem AVR mit 16MHz?. Er muss sonst nicht so viel weiter machen :-)


Grüße,
hacker

McJenso
22.01.2009, 17:50
Hallo,

ein paar Nanosekunden? Wie lange ist die Periodendauer eines 16Mhz Signals?

Gruß

Jens

Gock
22.01.2009, 19:39
...genau, und ein Vielfaches davon brauchst Du.
1 Takt zum Erkennen des IRQ, Min 1, wahrscheinlich aber eher 2 Takte zum Springen in die ISR, Ausgang des anderen schon voreingestellten Ports ändern nochmal 1 Takt. Macht also 4 Takte als Reaktion und wieder 2 zum Zurückspringen.
Das Ganze nur in Assembler zeitoptimiert geschrieben und sonst macht das Ding nichts anderes.
Gruß

hacker
22.01.2009, 19:41
62,5ns ;-) Ok, ich will ca. 1-2 Takte warten und dann ein Impuls erzeugen. Ca. alle 1,5µs wird ein INT ausgelöst. Das müsste doch eigentlich gut machbar sein...:)

Im Prinzip muss der µC nicht viel bis gar nichts während dieser Zeit machen. Ein zusätzlicher externer Interrupt wird diesen "Frequenzinterrrupt" einschalten und ausschalten können. Die anderen Dinge kann ich davor und danach erledigen. Das passt dann.

Danke vielmals!

Grüße,
hacker

PicNick
22.01.2009, 19:47
Bei 16 MHZ dauert ein Cycle des AVR ~ 60 nS
Bei 700 kHz kommt alle 1400 nS ein schnackler.

Du hast also ~23 Cyclen zu Verfügung.

Also, eine äussert knappe Sache.

McJenso
22.01.2009, 19:48
Hallo,

wenn du das Signal um ein paar Takte verzögern möchtest, erfasst du es mit einem Eingang und gibst es dann sofort auf einem Ausgang wieder aus. Sollte das doch zu schnell sein, noch ein nop einfügen und das war es.
Lass den Interrupt weg. Ich weiß auch nicht genau, wie viele Takte für den Sprung in die ISR benötigt werden, halte aber die 4 Takte für sehr optimistisch.

Gruß

Jens

Gock
23.01.2009, 00:23
Ja, ich weiß es auch nicht genau. Du müsstest mal nachsehen, es könnte auch mehr als 2 Takte dauern, in eine ISR zu springen...
Man kann das im AVRStudioSimulator testen.
Gruß

hacker
23.01.2009, 06:39
Also, eine äussert knappe Sache.

Heißt das machbar oder unmöglich? ;-)



wenn du das Signal um ein paar Takte verzögern möchtest, erfasst du es mit einem Eingang und gibst es dann sofort auf einem Ausgang wieder aus.

Das würde eine Endlosschleife bedeuten oder? Interruptgesteuert wäre mir das lieber.

PicNick
23.01.2009, 09:44
Minimal notwendige Befehle

4 (?) Cycles, bis der Interrupt angesprungen wird.
2 Cyc. PUSH Arbeitsregistert
1 Cyc IN Status->Register
2 Cyc PUSH Register
1 Cycle, LDS um in das Register einen Wert zu laden
1 Cycle, OUT um in diesen Wert als Output zu setzen
2 POP Register
1 OUT Status restore
2 POP Register
4 RETI

~20 Cycles

ev.+1/2 , weil ja der laufende Befehl noch ausgeführt wird

sind wir bei 21 - 22, also reserve null.

Das alles reicht aber nicht, denn um ein Output-Rechteck zu erzeugen, musst du ja den Outout auch wieder auf null zurücksetzen.

Wenn der µC sonst nix zu tun hat ausser das In-Signal verzögert auszugeben, würde ich das ohne INT machen.

Pseudo-code, z.B:


loop:
1 Cyc IN Inpt-Pin
n Cyc NOP Verzögerung, jeder NOP ist 60 nS wert.
1 Cyc OUT Outpin
2 Cyc RJMP Loop


Da sind 4 Cyclen MUSS-Code, die restlichen 19 Cyclen hättest du zu freien Verfügung
Irgendwelche Interrupts (timer etc.) wäre da aber unerwünscht, denn dann fehlen bestimmt ein paar Signale

Noch'n Problem: Je nachdem, WANN während der Schleife der Input-Flankenwechsel auftritt, kann deine Reaktionszeit schwanken.

---> Für mich quietscht das nach einer HW-Lösung

Besserwessi
23.01.2009, 10:48
Wenn es wirklich zeitkritsich ist, kann man sich das schieben auf den Stack sparen. Wenn man nur einen Ausgang ändert mit einem SBI oder CBI verändert man noch nicht mal das Statusregister und braucht das auch nicht sichern. Trotzdem wird man auf wenigstens 4 Zyklen Verzögerungkommen. Für die 2 te flanke am andere Flanke wird dann aber problematisch, denn da muß wahrscheinlich noch ein JMP von den interruptvektoren dazu. Die eine ISR kann man direkt bei den Interruptvektoren reinschreiben.

Trotz allen ist da die hardwarelösung besser: ein Schiberegister und ein Mutiplexer.


Damit der Interrupt immergleichschnell aufgerufen wird solle das haupprogramm den Controller per sleep in den idel mode schalten.

hacker
23.01.2009, 17:05
Hallo zusammen,

danke für die vielen Meinungen/Vorschlägen.

So peinlich es auch ist, ich habe mir nochmal meine gesamte Schaltung angesehen und ein Signal entdeckt, welches zur Verfügung steht und ich direkt als das "Verzögerte Signal" nehmen kann. Ich erkannte nicht, dass ich ein "low aktiven" Impuls brauche und ich diesen ganz einfach abgreifen kann. Zwar ist dieser Impuls immer ein ganzen Takt zu spät, aber das macht nichts.


Trotzdem vielen Danke für eure Beiträge.


Viele Grüße,
hacker