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


von Wolfram (Gast)


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

von leo9 (Gast)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.