- 3D-Druck Einstieg und Tipps         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 19

Thema: Interruptverarbeitung auf 3 Eingängen ohne Verlust möglich?

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    19.05.2005
    Beiträge
    11

    Interruptverarbeitung auf 3 Eingängen ohne Verlust möglich?

    Hallo,

    ich muß an 3 möglichen Eingängen (X/Y/Z) auf einen Impuls reagieren, der ca. 5us lang ist. Der nächste Impuls kann aber schon 20us später kommen.
    Leider kann es passieren, daß die Impulse eben nicht absolut zeitgleich an 1-3 Eingängen auftreten, sondern mit leichter zeitlicher Verzögerung, also etwas 1-2 us später. (wieder 5us lang, 20us später der nächste).

    Hat das schon mal jemand gemacht?
    Geht das überhaupt mit Bascom oder sollte ich das gleich in ASM probieren?
    Als Prozessor habe ich mir den ATmega 88 ausgesucht, wegen der möglichen IR-Ports.
    Aber eine Idee wäre doch auch, alle 3 Kanäle zu odern, um dort einen globalen Interrupt an INT0 auszulösen und dann nachzusehen, wie der Status auf den 3 Leitungen ist?
    Diesen einlesen, speichern, Flag setzen und raus aus der IR-Routine.
    Dann könnte der nächste kommen...

    Soweit meine Theorie, denn was passiert in der IR-Routine, wenn der nächste Impuls auftritt, während ich den noch nicht verarbeitet habe?

    Hat jemand schon mal mit nem 88 an 3 Eingängen sowas verarbeitet?

    Danke für einen Gedankenaustausch und Hinweise,

    Gruß Wolfram

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    22.03.2005
    Beiträge
    91
    Hi!
    Ich würde dir vorschlagen mache einen Sammelinterrupt, der von allen 3 Signalen ausgelöst wird und frage dann gleich in der Routine die 3 Leitungen ab, wenn sie nur kurz nacheinander kommen müsste das so klappen. Wenn die Signale aber weiter auseinander sind kann es sein, daß eines verloren geht.
    Bei einzelnen Int Eingängen ist immer der mit der höchsten Prio vorrangig. Ob nun auch die Routine abgebrochen wird und in die mit höherer Priorität gewechselt wird weiß ich nicht.

    Gruß

    Sven

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    Hast du den Analog-Komparator frei? Dann vergleich doch einfach den AIN1-Eingang gegen die interne Bandgap von 1.23V und lasse nen Interrupt triggern (die Polarität ist dann umgedreht, sollte aber egal sein).
    Disclaimer: none. Sue me.

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    19.05.2005
    Beiträge
    11
    Das mit dem AIN1 verstehe ich nicht?!
    OK, damit könnte ich den 3ten IR freimachen?
    Aber die Idee mit dem Sammelinterrupt wäre doch machbar. Allerdings geht mir dann jedoch ein Signal verloren, wenn ich z.B. in der IR-Serviceroutine bin und dann am Y-Eingang 1 us später ein Puls auftaucht, oder wird der gelatched?
    Ich habe darüber im Datenblatt nix gefunden, dort heißt es nur, daß beim Verlassen der Serviceroutine das IRFlag im GIFR-Register dann wieder gecleart wird...
    Oder wird die Routine dann nochmals aufgerufen?

    Bin etwas verwirrt....

    Wolfram

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    Größere AVRs haben einen Analog-Comparator (AC). Den AIN1 hängst du an das 3. Signal. AIN1 geht zum invertierenden Eingang des AC.

    Den nicht-invertierenden Eingang des AC legst du an die interne Bandgab-Spannung V_BG von 1.23V. Die braucht nach Aktivierung 40µs, bis sie stabil ist, also einmal am Programmstart nach ihrer Aktivierung. Der AIN0-Pin wird dadurch nicht verbraucht, weil der nicht-invertierende Eingang ja nach V_BG verdrahtet ist.

    Auf Polaritätswechsel (evtl. auch fallende/steigende Flanke, musst eben nachlesen) kann man eine IRQ triggern lassen. Weil das Signal an den invertierenden Eingang geht, bekommst du bei fallender Signal-Flanke einen IRQ, wenn dieser auf "steigen" eingestellt ist (der n.i. Eingang des AC wird ja dadurch größer als der i. Eingang).
    Disclaimer: none. Sue me.

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    02.09.2004
    Beiträge
    124
    Hallo Wolfram,

    PCINT 0...3 sind veroderte Interrupts für die Pins...
    PCINT0: PCINT0...7-Pins
    PCINT1: PCINT8...15-Pins
    PCINT2: PCINT16...23-Pins

    ich würde es trotzdem lassen. Während ein Interrupt ausgeführt wird, wird ein erneutes auftreten den gerade ausgeführten Interupts übersehen.
    Während das Programm also einen Sammel-Interrupt abarbeitet wird ein erneutes auftreten des Sammelinterrupts nicht ausgewertet.

    Tritt während der Ausführung eines Interrupts jedoch ein anderer Interupt auf, so geht dieser NICHT verloren. Er wird nach Beendigung des aktuell laufenden Interupts abgearbeitet.
    Wenn also Int1 ausgelöst wurde und kurz nachher Int0, arbeitet der Atmel erst die Int1-Routine ab und danach die Int0-Routine.
    Werden beide Interrupts gleichzeitig ausgelöst, entscheidet die Interupt-Priorität welcher zuerst abgearbeitet wird.

    Da Du 3 externe Interrupts benötigst, musst Du schauen welchen Du außer Int0&1 noch nimmst. Hier bietet sich der Analogkomparator, wie schon von Georg-Johann geschrieben, an.


    Ciao,
    Werner

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    19.05.2005
    Beiträge
    11
    Hallo Georg - Johann,

    danke für die kurze und präzise Info, werde mich mal einlesen.

    hallo Werner,

    danke, ich denke, ich habe verstanden.
    Aber wenn doch eben keiner verloren geht, welchen Nachteil hätte ich denn dann, wenn ich wie folgt verdrahte:

    X-Achse: INT0
    Y-Achse: INT1
    Z-Achse: PCINT0

    Wenn ich in der IR-Routine nur kurz den Port einlese, ein Flag setze und wieder abhaue, um den Rest in der Vordergrundschleife zu machen, hätte ich doch die kürzestmögliche Verarbeitungs- und Verzögerungszeit, oder übersehe ich was?

    Gruß Wolfram

  8. #8
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    02.09.2004
    Beiträge
    124
    Hallo Wolfram,

    PCINT reagiert auf jede Zustandsänderung. Afaik ist hier eine Unterscheidung ob LH oder HL-Flanke nicht möglich.

    > Wenn ich in der IR-Routine nur kurz den Port einlese, ein Flag setze und
    > wieder abhaue [...]
    Beim PCINT musst Du den PIN einlesen um LH, HL unterscheiden zu können. Bei INT0, INT1 kannst Du Dir das sparen. Hier kannst Du die Interrupt-Auslösung flankenabhängig konfigurieren.

    Das Signalisieren mit Flag und Abarbeiten in der Hauptschleife erzeugt längere Verarbeitungs- und Verzögerungszeiten, da auf den Interrupt erst nach der Rückkehr und beim erreichen der Auswerteroutine reagiert wird. Dafür ist die Verzögerung Deines Hauptprogramms minimal.

    Weches Vorgehen sinnvoller ist, hängt vom Umfang und der Häufigkeit der auszulösenden Aktionen ab.

    Ciao,
    Werner

  9. #9
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    02.09.2004
    Beiträge
    124
    Hallo Wolfram,

    mir sind gerade erst Deine Angaben zum Timing aufgefallen.

    IMO kannst Du das ganze Vergessen, sowohl in Bascom, wie auch in Assembler.

    Bei 20µs Impulsabstand hast Du gerademal 400 Takte zeit überhaupt etwas zu tun. (Bei 20MHz Takt des 88er) Mit Bascom ist da nix zu machen und auch in Assembler ist höchstens ein Minimalprogrämmchen möglich.

    Bei 1-2 µs (20-40 Takte) Verzögerung zwischen den verschiedenen Interrupts wirst Du Dich aber auch in Assembler verhaspeln, wenn mehr als das Toggeln eines Portpins als reaktion nötig ist.

    Ciao,
    Werner

  10. #10
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    Also in 400 Zyklen geht ne ganze Menge (jedenfalls in Assembler oder C). In der ISR kann man die Ereignisse merken, in einem Puffer oder einer FIFO und im Hauptteil auswerten, oder in eine Interrupt-sichere Variable hochzählen (dann kann man aber die Reihenfolge nicht mehr zuodnen).

    Das sollte selbst mit Bascom gehen, oder ist das wiklich so übel? In 400 Takten sind schon Weltreiche erblüht und wieder versunken...

    Interrupts gehen ja keine verloren, falls nicht ein IRQ noch während der "eigenen" ISR auftritt.
    Disclaimer: none. Sue me.

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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

12V Akku bauen