Als erstes solltest Du das Projekt mal so beschreiben, dass man wenigstens ansatzweise eine grobe Idee davon bekommen kann, worum es geht.
Von was wird es denn getroffen? Kugeln, Farbbeutel, Laserstrahlen? Was für Sensoren registrieren den Treffer? Was für Signale müssen ausgewertet werden?Mein Projekt ist ein Zielscheibensystem, dass automatisch aufleuchtet und während dessen getroffen werden kann
Und dann sehe ich auf den ersten Blick drei Bugs in Deinem Code:
Erstens muss die Konfiguration des Interrupts VOR die Do-Loop-Schleife! Wenn sie dahinter steht, wird sie niemals ausgeführt - und somit gibt´s auch keinen Interrupt!
Zweitens müssen die Interrupts auch global freigegeben werden, damit der einzelne Interrupt auch tatsächlich ausgeführt werden kann. D.h. als letzter Befehl der Interrupt-Konfiguration muss noch ein "Enable Interrupts" dazu.
Drittens kann die Abfrage der Variablen Scheibe so wohl nicht funktionieren (auch wenn ich nicht verstehe, welche Bedeutung dieser Parameter hat).
Stell Dir mal vor, der Wert wäre z.B. 820. Dann wären doch alle Bedingungen der einzelnen IF-Abfrage erfüllt:
Scheibe > 204 ist wahr, d.h. PORTD.0 wird auf 1 gesetzt.
Scheibe > 408 ist auch wahr, d.h. PORTD.1 wird auf 1 gesetzt, PORTD.0 wieder auf 0.
Scheibe > 611 ist auch wahr, d.h. PORTD.2 wird auf 1 gesetzt, PORTD.1 wieder auf 0
(usw)
Du musst also schon den Bereich definieren, in dem der Wert liegen soll. Z.B. so:
Oder Du nimmst den schönen Select Case-Befehl:Code:If Scheibe > 204 AND Scheibe <= 408 then ... Else ... End if
Im Übrigen gibt´s auch ein paar Methoden, um beliebig viele Bits eines Bytes (also z.B. PORTD-Ausgänge) mit wenigen Befehlen auf den gewünschten Wert zu setzen. Wenn Du jeden einzelnen Ausgang einzeln auf 1 oder 0 setzt, verbraucht das ´ne Menge Code.Code:Select Case Scheibe Case 205 to 408: PORTD.2=0 PORTD.1=0 PORTD.0=1 Case 409 to 610: PORTD.2=0 PORTD.1=1 PORTD.0=0 Case is > 611: PORTD.2=1 PORTD.1=0 PORTD.0=0 End select
Die einfachste Lösung ist die, gleich das ganze PORTD-Byte zu setzen. Soll z.B. NUR D.4 1 sein, ginge das so:
PORTD = &B00010000
(&B signalisiert an Bascom, dass jetzt ´ne Binär-Zahl kommt. Das höchstwertige Bit (also PORTD.7) steht hierbei links, PORTD.0 ganz rechts)
Damit beeinflusst Du natürlich aber auch diejenigen Bits vom PORTD-Byte, die nicht direkt mit den Zielscheiben zu tun haben, also PORTD.7 und D.6. Wenn diese Ausgänge keine Funktion haben, wäre das kein Problem, ansonsten könnte man das elegant mit AND- und OR-Funktionen lösen .
Aber das vielleicht später??
Lesezeichen