www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 3 externe Eingänge per Interrupt verarbeiten.


Autor: Wolfram (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich muß an 3 möglichen Eingängen (X/Y/Z-Achse) 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. Dort würden die Interrupts doch dann so
abgearbeitet, wie sie aufgetreten sind,oder?
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...
Damit könnte ich dann den Mega8 nehmen, der ist leichter zu
beschaffen.

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?
Wie verhält sich der Mega8, wenn ich in der INT0 Routine einen Counter
  hochzähle und dann aber ein neuer IR auftritt?
Geht der nicht verloren?

Danke für einen Gedankenaustausch und Hinweise,

Gruß Wolfram

Autor: leo9 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich würde gleich auf Assembler setzen.
Annahme: Bascom sichert (dem Hören nach) sehr viel beim Int-Aufruf.
Geschätzt 40 Taktzyklen zum Sichern und nochmals 40 zum Restoren und
Zurückkehren. Der Impuls soll sicher irgendwo dazugezählt werden -
gestehen wir Bascom nochmals 20 Taktzyklen fürs Rechnen.
Das macht dann 100 Takte für jeden Interrupt, bei 16Mhz -> 6,25us. Bei
drei Interrupts und 20us Periodendauer geht sich das ganze noch aus,
aber in den verbleibenden 1,25us kann das restliche Programm wohl kaum
etwas vernümftiges erledigen.

In assembler wird das Verhältnis besser (10 Takte hin, 10 zurück und 20
Rechnen), aber mit 7,5us zu 20us werkelt der up immer noch zu ~40% in
den Interruptroutinen.

Grüße leo9

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.