-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 11

Thema: Interrupt Zeit

  1. #1
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    10.03.2005
    Alter
    28
    Beiträge
    967

    Interrupt Zeit

    Anzeige

    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!

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    20.05.2006
    Ort
    Lippe
    Alter
    48
    Beiträge
    524
    Hallo,

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

    Gruß

    Jens

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    25.11.2003
    Beiträge
    1.111
    ...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ß

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    10.03.2005
    Alter
    28
    Beiträge
    967
    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!

  5. #5
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    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.

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    20.05.2006
    Ort
    Lippe
    Alter
    48
    Beiträge
    524
    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

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    25.11.2003
    Beiträge
    1.111
    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ß

  8. #8
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    10.03.2005
    Alter
    28
    Beiträge
    967
    Zitat Zitat von PicNick
    Also, eine äussert knappe Sache.
    Heißt das machbar oder unmöglich?


    Zitat Zitat von McJenso
    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.
    Ich würde ja gern die Welt verändern..., doch Gott gibt mir den Quellcode nicht!

  9. #9
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    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:
    Code:
     
    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
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  10. #10
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    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.

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •