Hallo,
ein paar Nanosekunden? Wie lange ist die Periodendauer eines 16Mhz Signals?
Gruß
Jens
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
Ich würde ja gern die Welt verändern..., doch Gott gibt mir den Quellcode nicht!
Hallo,
ein paar Nanosekunden? Wie lange ist die Periodendauer eines 16Mhz Signals?
Gruß
Jens
...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ß
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
Ich würde ja gern die Welt verändern..., doch Gott gibt mir den Quellcode nicht!
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.
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
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
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ß
Heißt das machbar oder unmöglich?Zitat von PicNick
Das würde eine Endlosschleife bedeuten oder? Interruptgesteuert wäre mir das lieber.Zitat von McJenso
Ich würde ja gern die Welt verändern..., doch Gott gibt mir den Quellcode nicht!
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:
Da sind 4 Cyclen MUSS-Code, die restlichen 19 Cyclen hättest du zu freien VerfügungCode: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
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
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
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.
Lesezeichen