Na ja, hier wirst Du auch geholfenIch glaube, daher hab ich keine Antwort mehr von dem jenigen gehört, der diesen Script geschrieben hat
Ein Interrupt ist ein Ereignis, das den normalen Ablauf des Programmes unterbricht, damit eine bestimmte, verknüpfte Aktion ausgeführt werden kann. Dieses Ereignis kann z.B. eine fallende Flanke an einem Interrupt-Eingang sein.
Wenn Du also z.B. möchtest, dass beim Schließen eines Tasters eine bestimmte Punktzahl addiert werden soll, könntest Du natürlich permanent die Taster abfragen. Da der Kontakt ja aber wahrscheinlich nur ziemlich kurz von der Kugel geschlossen wird könnte es passieren, dass der Abfrage ein kurzer Kontaktschluss quasi entgeht.
Mit einem Interrupt geht´s aber einfacher und zuverlässiger: Sobald der Eingang einen Übergang von High auf Low detektiert (d.h. der Taster geschlossen wurde) wird das Hauptprogramm unterbrochen, und die dazugehörige Interrupt-Routine (auch ISR genannt) ausfgeführt. Ist sie abgearbeitet, geht´s an der Stelle im Hauptprogramm weiter, wo es kurz vorher unterbrochen wurde.
Man muss dem Controller also erstmal sagen, was das auslösende Ereignis sein soll:
Config INT0 = Risisng
Der Taster muss also auf den Anschluss des Interrupts INT0 gelegt werden (beim Mega32 wäre das Pin Nr. 16 bzw. PD2), und ausgelöst wird der Interrupt bei einer steigenden Flanke (rising). Alternativ könnte man auch falling oder change nehmen - dann würde eine fallende Flanke bzw. jede Flanke den Interrupt auslösen.
Dann muss man der auszuführenden Interrupt-Routine einen Namen geben (beliebig, müssen keiner Syntax entsprechen):
On Int0 on_int0
Im Klartext: Wenn das Interrupt-Ereignis eintritt, gehe nach on_int0. Etwas verwirrend ist hier, dass der Codeschreiber den Bascom-Befehl gleichzeitig auch als Namen für die ISR verwendet hat. Man könnte genausogut schreiben
On Int0 5Punkte oder On Int0 10Punkte
Dann muss der Interrupt aktiviert werden:
Enable INT0
Beim Einschalten des Controllers sind nämlich alle Interrupts erstmal deaktiviert - mit enable aktiviert man den einzelnen Interrupt.
Und die "globale" Freigabe ist auch notwendig:
Enable Interrupts
Damit hat es folgendes auf sich: manchmal kann es ja sehr wichtig sein, dass das Hauptprogramm mal für eine Zeit NICHT von Interrupts unterbrochen wird. Damit man in diesem Fall nicht alle Interrupts einzeln deaktivieren muss (bei größeren Controllern können das schon mal 20 Stück sein), gibt es sozusagen eine Art "Hauptschalter" für alle Interrupts - die globale Aktivierung bzw. Deaktivierung.
Und auch dieser "Schalter" steht erstmal auf aus, wenn der Controller hochfährt. Deshalb muss man die globale Interrupt-Freigabe auch noch ausführen.
Das mit den Zufallszahlen ist nicht so ganz einfach - darüber wurde hier kürzlich schon eine Menge gepostet. Man könnte aber z.B. aus der Zeit zwischen zwei Schüssen eine Art Zufallszahl ableiten, denn da reichen schon Unterschiede von ein paar Millionstel Sekunden aus, um komplett andere Zahlen zu produzieren.
Lesezeichen