Liste der Anhänge anzeigen (Anzahl: 1)
Zielscheibensystem mit Zufall
Moin,
Ich hatte damals etwas Hilfe bekommen von jemandem, der sich mit Bascom auskennt und leider ist er jetzt sehr schwer zu erreichen, oder hat anschein keine Lust mehr ^^ Ich wollte das jetzt mal allein versuchen, aber mit etwas Hilfe von Euch.
Ich habe erst vor kurzem den AVR- Einstieg leicht gemacht durchgearbeitet und ein paar Befehle in Basecom Language Reference angeschaut. Ich will nur damit sagen, dass ich ziehmlich neu bin in solchen Sachen, aber mich schon mal darauf vorbereitet habe.
Mein Projekt ist ein Zielscheibensystem, dass automatisch aufleuchtet und während dessen getroffen werden kann, und danach eine andere Zielscheibe leuchtet. Alles soll mit Punkten bewertet werden. Natürlich soll dann eine Digitale Zahl zu sehen sein in typisch Roter leuchender Schrift.
Anhang 24487
Jetzt steh ich da mit einen Script von jemand anderem, den ich sogar zum Teil verstehe, aber irgendwie nicht so funktioniert wie vorgesehen.
Dieser Script gehört zum ATtiny2313 auf dem ATMEL Evaluations-Board Version 2.0.1
Code:
$regfile = "m8def.dat"
$crystal = 8000000
'***********************************************************************'
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc
Dim Scheibe As Integer
Config Portd.0 = Output
Config Portd.1 = Output
Config Portd.2 = Output
Config Portd.3 = Output
Config Portd.4 = Output
Do
If Scheibe > 204 Then
Portd.0 = 1
Else
Portd.0 = 0
End If
If Scheibe > 408 Then
Portd.1 = 1
Portd.0 = 0
Else
Portd.1 = 0
End If
If Scheibe > 611 Then
Portd.2 = 1
Portd.1 = 0
Portd.0 = 0
Else
Portd.2 = 0
End If
If Scheibe > 615 Then
Portd.3 = 1
Portd.2 = 0
Portd.1 = 0
Portd.0 = 0
Else
Portd.3 = 0
End If
If Scheibe > 819 Then
Portd.4 = 1
Portd.3 = 0
Portd.2 = 0
Portd.1 = 0
Portd.0 = 0
Else
Portd.4 = 0
End If
Loop
End
'*************************************************************************
Config Int0 = Rising
Enable Int0
On Int0 On_int0
On_int0:
Scheibe = Getadc(0)
Return
'
Wir wollten das ADC ausnutzen.
Er sagte da nur, alle Scheiben müssten an den INT0 Pin angelegt werden und die LEDs an die anderen Pins. Nur scheint mir das etwas unlogisch zu sein und wollte euch mal fragen, wie ich das weiter machen könnte.
Ich möchte aber jetzt ein ATmega32 16PU 1218 verwenden und habe den Code umgeschrieben mit erstmal 3 Zielscheiben.
Code:
$regfile = "m8def.dat"
$crystal = 8000000
'***********************************************************************'
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc
Dim Scheibe As Integer
Config Portd.0 = Output
Config Portd.5 = Output
Config Portd.6 = Output
Do
If Scheibe > 204 Then
Portd.0 = 1
Else
Portd.0 = 0
End If
If Scheibe > 408 Then
Portd.5 = 1
Portd.0 = 0
Else
Portd.5 = 0
End If
If Scheibe > 611 Then
Portd.6 = 1
Portd.5 = 0
Portd.0 = 0
Else
Portd.6 = 0
End If
Loop
End
'*************************************************************************
Config Int0 = Rising
Enable Int0
On Int0 On_int0
On_int0:
Scheibe = Getadc(0)
Return
'
Könntet Ihr mir bitte weiter helfen?
Bis jetzt leuchtet keine LED
mfg EKI
2.es Programm mit Simulationstest erfolgreich
Ui, mein erster Code hatte doch viele Fehler. Jetzt habe ich sogar das mit dem Interrupt verbessert und im Simulator funktioniert bisher alles tadellos.
Code:
$regfile = "m32def.dat"
$crystal = 1000000
'***********************************************************************'
Dim Scheibe As Integer
Dim Punkte As Integer
Dim Scheibe_akt As Bit
Dim A As Byte
Dim B As Byte
A = 0
B = 0
Scheibe = 2
Punkte = 0
Config Portd.0 = Output
Config Portd.5 = Output
Config Portd.6 = Output
Config Int0 = Rising
Config Int1 = Rising
Enable Interrupts
Enable Int0
Enable Int1
On Int0 Int0_5punkte
On Int1 Int1_10punkte
Do
'---------------------'
If Scheibe = 1 Then
Portd.0 = 1
Scheibe = 0
Do
Incr Scheibe
Waitms 250
If Scheibe_akt = 1 Then
Goto Anfang
End If
Incr B
If Scheibe = 3 Then
Scheibe = 0
End If
Loop Until B = 8
Scheibe = 2
Goto Anfang
Else
Portd.0 = 0
End If
'---------------------'
If Scheibe = 2 Then
Portd.5 = 0
Scheibe = 0
Do
Incr Scheibe
Waitms 250
If Scheibe_akt = 1 Then
Goto Anfang
End If
Incr B
If Scheibe = 3 Then
Scheibe = 0
End If
Loop Until B = 8
Scheibe = 3
Goto Anfang
Else
Portd.5 = 0
End If
'---------------------'
If Scheibe = 3 Then
Portd.6 = 1
Scheibe = 0
Do
Incr Scheibe
Waitms 250
If Scheibe_akt = 1 Then
Goto Anfang
End If
Incr B
If Scheibe = 3 Then
Scheibe = 0
End If
Loop Until B = 8
Scheibe = 1
Goto Anfang
Else
Portd.6 = 0
End If
Anfang:
Scheibe_akt = 0
B = 0
Waitms 1000
Incr A
Loop Until A = 20
End 'hier erscheint ein Ton und zeigt das Ende mit Ergebnis.
'*************************************************************************'
Int0_5punkte:
Punkte = Punkte + 5
Portd.0 = 0
Portd.5 = 0
Portd.6 = 0
Scheibe_akt = 1
Return
Int1_10punkte:
Punkte = Punkte + 10
Portd.0 = 0
Portd.5 = 0
Portd.6 = 0
Scheibe_akt = 1
Return
3. Programm mit Hardware getestet und Fehler behoben
Moin,
Nun funktioniert alles super. Der Zufall ist sogar viel besser mit 50ms.
Ich wollte dies jetzt nur für mich vollenden, damit ich auch mal eins hin bekomme :) Und nun muss ich mich mal mit den ATmega88 beschäftigen, was der so alles braucht.
Wenn ich das ATmega88 habe, kann ich die einzelnen Trigger deaktiveren, um ein 2. Treffer zu verhinden?
-EDIT-
Ich habe eben bemergt, das ich schon bei 3kb bin und ich werde bestimmt über 8kb kommen, und von daher lohnt sich der atmega88 leider nicht. Kennt jemand noch einen der mindestens 6 Triggers umschalten kann?
mfg EKI
Hier der Code, und sogar noch optimiert:
Code:
$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 1000000
'***********************************************************************'
Dim Scheibe As Integer
Dim Punkte As Integer
Dim Scheibe_akt As Bit
Dim A As Byte
Dim B As Byte
A = 0
B = 0
Scheibe = 1
Punkte = 0
Config Portd.0 = Output
Config Portd.5 = Output
Config Portd.6 = Output
Config Int0 = Rising
Config Int1 = Rising
Enable Interrupts
Enable Int0
Enable Int1
On Int0 Int0_5punkte
On Int1 Int1_10punkte
Do
'---------------------'
If Scheibe = 1 Then
Portd.0 = 1
Scheibe = 0
Do
Incr Scheibe
Waitms 50
If Scheibe_akt = 1 Then
Goto Anfang
End If
Incr B
If Scheibe = 3 Then
Scheibe = 0
End If
Loop Until B = 15
Scheibe = 2
Portd.0 = 0
Goto Anfang
Else
Portd.0 = 0
End If
'---------------------'
If Scheibe = 2 Then
Portd.5 = 1
Scheibe = 0
Do
Incr Scheibe
Waitms 50
If Scheibe_akt = 1 Then
Goto Anfang
End If
Incr B
If Scheibe = 3 Then
Scheibe = 0
End If
Loop Until B = 15
Scheibe = 3
Portd.5 = 0
Goto Anfang
Else
Portd.5 = 0
End If
'---------------------'
If Scheibe = 3 Then
Portd.6 = 1
Scheibe = 0
Do
Incr Scheibe
Waitms 50
If Scheibe_akt = 1 Then
Goto Anfang
End If
Incr B
If Scheibe = 3 Then
Scheibe = 0
End If
Loop Until B = 15
Scheibe = 1
Portd.6 = 0
Goto Anfang
Else
Portd.6 = 0
End If
Anfang:
Scheibe_akt = 0
B = 0
Waitms 2000
Incr A
Loop Until A = 20
Portd.0 = 1
Portd.5 = 1
Portd.6 = 1
End 'hier erscheint ein Ton und zeigt das Ende mit Ergebnis.
'*************************************************************************'
Int0_5punkte:
Punkte = Punkte + 5
Portd.0 = 0
Portd.5 = 0
Portd.6 = 0
Scheibe_akt = 1
Return
Int1_10punkte:
Punkte = Punkte + 10
Portd.0 = 0
Portd.5 = 0
Portd.6 = 0
Scheibe_akt = 1
Return
Liste der Anhänge anzeigen (Anzahl: 1)
Ich hab nochmal darüber nachgedacht, wie man etwas sparsamer mit den I/O-Ports umgehen könnte. Herausgekommen ist eine Lösung, die mit zwei Interrupt-Eingängen auskommt, und weitere 6 Ports die Aktivierung der einzelnen Scheiben übernehmen, und zwar sowohl der Taster als auch der LEDs, die bei der aktiven Scheibe ja leuchten sollen.
Zur Funktion: Die beiden Interrupt-Eingänge sind über die internen PullUp-Widerstände auf 1 gelegt und müssen folglich als "falling" konfiguriert werden. Die Taster jeder einzelnen Scheibe gehen dann auf einen I/O-Port. Liegt an diesem Port ein High, sind die Taster wirkungslos, weil sie den Interrupt-Eingang somit nicht auf Low ziehen können. Einer der 6 I/O-Ports ist also immer auf Low, und nur die daran angeschlossenen Taster können den Interrupt auslösen.
Als "Abfallprodukt" kann man mit diesem Low-Pegel dann über einen PNP-Transistor auch gleich die LEDs einschalten. Für 6 LEDs (so sah ja Deine Zeichnung aus) brauchst Du sowieso pro Scheibe einen Transistor, denn soviel Strom kann ein normaler Port nicht liefern.
Das hieße also, dass Du für die komplette Steuerung und Abfrage der Scheiben lediglich die beiden Interrupts + 6 I/O-Ports bräuchtest. Und somit käme der Mega8 wieder in Frage :-)
Anhang 24506
Liste der Anhänge anzeigen (Anzahl: 1)
Moin, Nu lang ist es her und ich kann wieder weiter machen. Einiges hatte mir noch den Kopf zerbrochen.
Nun würde ich die Scheiben so gestalten.
Anhang 25843
Der Schaumstoff wird als Platzhalter und als Feder genutzt. Praktisch hält der Schaumstoff die Scheibe an der Grundplatte fest. Die Schrauben werden so weit an die Platte geschraubt, dass sie 1mm kurz vor einem Kontakt sind.
Jetzt wollte ich aber gleich weiter denken. Wenn ich darauf schieße, dann muss ich leider damit rechnen, dass die Kugeln zurück geschossen kommen und überall liegen bleiben. Dass ist eher ungünstig. Hätte jemand dafür eine Lösung? Ein Auffangnetz wäre super. Ich wollte schon erst die Platten 45 Grad aufstellen, so dass die Kugel in das unten angeschraubte Netz abprallen. Geil wäre, ein Sensor mit Lichtschranke und dahinter ein Netz. Nur leider ist dies logischerweise nicht möglich.
mfg EKI