-         

+ Antworten
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 13

Thema: Atmega32 Interrupt Timing

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    17.01.2004
    Ort
    Erlangen, Bayern
    Alter
    34
    Beiträge
    253

    Atmega32 Interrupt Timing

    Anzeige

    Hi,
    kann mir jemand sagen, wie lange es dauert, wenn eine Flanke auf Int0 gelegt wird, bis mein Interrupthandler angesprungen wird?

    Gibt es hierzu irgendwelche Dokumente? Habe leider weder im Datenblatt, noch bei Google was gefunden.

    Device: ATMega32
    Oszillatorfrequenz: 16MHz
    Compiler: Avr-Gcc

    Muss ein 100K Signal sampeln, aber irgendwie gehen mir Daten/Interrupts verloren. Die Interruptroutinen sind natürlich as fast as possible, sprich Ein-, bzw. Vierzeiler. Gesamplet wird auf Int0 und Int1, fallende Flanke.

    Gruss
    Michael

  2. #2
    RN-Premium User Begeisterter Techniker
    Registriert seit
    30.04.2004
    Alter
    39
    Beiträge
    245
    Wieviele Zeilen hat deine Interrupt Routine im hexcode? Eine Zeile in C <> 1 Zeile in Assembler. Und ein Assemblerbefehl <> 1 Takt, manche brauchen 2-3 Takte. Mach mal einen debug deines C Files im AVR Studio dann siehst du wieviele Assemblerbefehle da kommen. Was für ein Signal sampelst du da? Ein 100kHz Signal sollte normalerweise möglich sein. Wie werden die Daten weiterverarbeitet?

    lg

    Alex

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    17.01.2004
    Ort
    Erlangen, Bayern
    Alter
    34
    Beiträge
    253
    Daten werden in einen Ringpuffer geschrieben, und von der Hauptroutine, wenn Zeit ist, in eine MMC Karte geschrieben.
    Das Problem ist nicht die Interruptroutine, sondern, dass ich nicht weiss wie lange die Totzeit ist zwischen Signal tritt auf, und Interruptroutine wird angesprungen.

    Gruss
    Michael

  4. #4
    RN-Premium User Begeisterter Techniker
    Registriert seit
    30.04.2004
    Alter
    39
    Beiträge
    245
    Das bringt uns jetzt aber nicht weiter.
    Aber mal aus der Doku des Mega8 gilt sicher auch für Mega32

    If edge or toggle interrupt is selected, pulses that last
    longer than one clock period will generate an interrupt. Shorter pulses are not guaranteed
    to generate an interrupt. If low level interrupt is selected, the low level must be held
    until the completion of the currently executing instruction to generate an interrupt.

    Also, wenn dein Systemtakt 16Mhz ist sollte bei einem 100khz Signal kein Problem auftreten, wenn das nicht nur sehr kurze Impulse sind, die halt nur im 100kHz Rythmus auftreten.

    Was sein kann ist, dass du mit einer anderen Interruptroutine in die Quere kommst. Ich habe mich noch nicth so viel mit c beschäftigt und schreibe alles im assembler, aber ich könnte mir vorstellen, das zu z.B. eine Timerroutine hast. Vielleicht macht der Compiler in die Interruptbehandlungsroutinen ein Cli und Sei? Das könnte deine Verluste erklären. Anders kann ich mir das kaum vorstellen.

    lg

    Alex

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    10.12.2004
    Ort
    LEV
    Beiträge
    505
    Wenn das INT-Ereignis auftritt, wird der gerade laufende
    Befehl zu Ende abgearbeitet. (Kann max. drei Taktzyklen dauern)
    Dann dauert es noch vier weitere Taktzyklen bis der Befehl ausgeführt
    wird, der auf der Addresse des INT-Vectors steht.
    Dies ist in der Regel ein JMP-Befehl, der auch drei Takte benötigt.

    Es dauert also mindestens 7 und maximal 10 Taktzyklen
    bis der erste Befehl der Int-Routine zur Ausführung kommt.

    Es müssen natürlich alle Vorraussetzungen für den
    Interrupt erfüllt sein. (int-Enable usw)



    Ist übrigens alles im Datenblatt unter "Interrupt-response time" genau beschrieben.

    Gruß Jan

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    17.01.2004
    Ort
    Erlangen, Bayern
    Alter
    34
    Beiträge
    253
    Das Ganze ist angeschlossen an den Parallelport.
    Beim Strope Signal Werden die 8Bit der Datenleitungen einerseits gelatcht, und andererseits der Interrupt 0 ausgelösst. Hier hole ich die Daten an Port D aus dem Latch in eine Globale Variable.

    Die Ack Leitung wird auf Interrupt 1 geführt. Tritt dieser Interrupt auf, so hat der Drucker die Daten verstanden, und Akzeptiert. Das gemerkte Byte wird in einen Ringpuffer geschrieben, der wiederrum vor und nach vom Hauptprogramm abgearbeitet wird.

    Es treten also zwei Interrupts kurz hintereinander ausgelösst, wobei ich die erste Interruptroutiene gerade versuch auf das notwendigste zu kürzen, siehe:
    http://www.roboternetz.de/phpBB2/zei...879&highlight=

    Durch die beiden Interrupts ist gewährleistet, dass immer nur, vom Drucker als gültig erkannte Daten, in den Ringpuffer geschrieben werden.

    Ich hoffe das hilft zum Verständnis meines Problems.

    Gruss
    Michael

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    30.10.2005
    Ort
    Mönchengladbach
    Alter
    46
    Beiträge
    114
    Wenn Du die Interrupthandler mit SIGNAL() definiert hast, werden während des Abarbeitens der ISR (Interrupt Service Soutine) alle Interrupts abgeschaltet.

    Eine Alternative ist da eventuell INTERRUPT(), bei der bleiben die Interrupts eingeschaltet.

    Vielleicht hilft dieser Ansatz weiter, einfach mal ausprobieren

  8. #8
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    17.01.2004
    Ort
    Erlangen, Bayern
    Alter
    34
    Beiträge
    253
    Habs gerade ausprobiert, kein Unterschied..

  9. #9
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.801
    Also: ISQ-Latenz: 4
    Sprung in die ISR: 2
    Und los geht's.
    Valls andere IRQs aktiv sind, kommt die Zeit hinzu, die zum Verlassen gebraucht wird. Plus ein Schritt "normales Progremm". ISRs zu schachteln ist bei der IRQ-Rate nicht unbedingt ratsam (Absturz).
    Disclaimer: none. Sue me.

  10. #10
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    30.10.2005
    Ort
    Mönchengladbach
    Alter
    46
    Beiträge
    114
    Wenn ich das richtig verstehe belauschst Du den Datenverkehr zwischen einem PC und einem Drucker?

    Interessant fände ich, wie schnell die IRQs hintereinander ausgelöst werden und wie lange sie jeweils anstehen (insbesonders das ACK).

    Mir kommt spontan eine Idee: warum nicht einfach die Kommunikation ausbremsen, indem du dich in die STROBE und ACK Leitungen einschleifst und sie jeweils erst dann weiterreichst, wenn du alles nötige erledigt hast=

+ Antworten
Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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