Asteroid - Das ultimative Ballerspiel

von Johannes Schmitz, ELO-Contest 2010

Elektronik-Labor  Labortagebuch  Notizen  Mikrocontroller


 


 

Es geht um alles, um die ganze Welt! Ein Asteroid bedroht die Erde, nur du kannst sie retten! Du sitzt am Zielpult einer gigantischen Laserkanone und kannst den Asteroiden abschießen, sodass die Bruchstücke die Erde verfehlen. Aber du musst rechtzeitig reagieren und genau treffen! Sobald sich der Asteroid bis auf sieben Millionen Kilometer der Erde genähert hat musst du den Laser abfeuern. Und du musst den Strahl über längere Zeit im Ziel halten. Nur so erreicht der Fremdkörper schließlich die Temperatur, die ihn zerreißt.

 

Für das Spiel brauchst du einen grünen Laser, nur er hat genügend Energie. Mit einem roten Laser brauchst du es gar nicht erst versuchen. Sobald der Asteroid im Bildschirm sichtbar wird musst du genau in die obere LED-Reihe zielen und den Strahl ruhig halten. Du darfst den Laser auf keinen Fall zu früh einschalten, denn dann reicht die Energie nicht! Aber spätestens eine Sekunde nachdem der Asteroid am Schirm erscheint musst du treffen. Das Zielobjekt kommt immer näher. Lass dich nicht von der Angst lähmen und halte weiter genau drauf. Die obere LED-Reihe liegt scheinbar über dem Ziel. Aber genaue Berechnungen der von Einstein gefundenen Krümmung des Raums weisen genau auf diesen Zielpunkt. Solange keine Gravitationswellen auftauchen wirst du das Ziel zerstören. Der Asteroid zerplatzt kurz vor dem Einschlag. Die Menschheit wird dir zu Füßen liegen. Aber wenn du versagst, dann gute Nacht!

 



 

Das Spiel wird mit einem Euro gestartet und automatisch so oft wiederholt wie es dir gelingt die Menschheit zu retten. Du musst aber einen Abstand von mindestens zwei Metern einhalten, sonst kann es ja jeder. Lade deine Freunde ein, jeder darf mal die Welt retten. Aber wer daneben ballert muss den nächsten Euro einwerfen.

 

Technische Details

Die obere LED-Reihe liegt am Pin C0 des Mega8. Er ist normalerweise als Ausgang geschaltet. Schaltet man jedoch den Port als Eingang um, kann jede der LEDs als Fotodiode dienen. ADC(0) liest die Spannung nach einer Millisekunde. Je größer die Helligkeit desto größer die gemessene Spannung. Ein Messwert von 300 entspricht einer Spannung von ca. 1,2 V, die bei direktem Laserbeschuss erreicht wird. Die Sub Laser führt die Messung aus, das Ergebnis erscheint in der Variablen Licht. Das Messverfahren wurde bereits im ELO-Labortagebuch beschrieben.

 Download: 1003Asteroid.zip

'Asteroid für die Pingpong-Platine

$crystal = 8000000
$regfile = "m8def.dat"
$hwstack = 64
$swstack = 64
$framesize = 64

Dim Leds(12) As Word
Dim X As Byte
Dim Y As Byte
Dim N As Word
Dim U As Word
Dim Licht As Word
Dim Fehler As Byte

Declare Sub Standby
Declare Sub Test
Declare Sub Initialisierung

Open "comb.4:9600,8,n,1,inverted" For Output As #1
Open "comb.5:9600,8,n,1,inverted" For Input As #2


Declare Sub Led1(byval X As Byte , Byval Y As Byte)
Declare Sub Led0(byval X As Byte , Byval Y As Byte)
Declare Sub Laser
Baud = 9600

Initialisierung


Do
Do
Fehler = 0
For N = 1 To 12
Leds(n) = 0
Next N
Waitms 1000
Laser : If Licht > 300 Then Fehler = 1 'zu früh geschossen!

Leds(6) = &B0000100000
Waitms 1000
Laser : If Licht < 300 Then Fehler = 1 'nicht getroffen ...
Waitms 1000
Leds(5) = &B0000100000
Leds(6) = &B0001110000
Leds(7) = &B0000100000
Laser : If Licht < 300 Then Fehler = 1
Waitms 1000
Leds(3) = &B0000100000
Leds(4) = &B0001110000
Leds(5) = &B0011111000
Leds(6) = &B0111111100
Leds(7) = &B0011111000
Leds(8) = &B0001110000
Leds(9) = &B0000100000
Laser : If Licht < 300 Then Fehler = 1
Waitms 500
Leds(3) = &B0001110000
Leds(4) = &B0011111000
Leds(5) = &B0111111100
Leds(6) = &B0111111100
Leds(7) = &B0111111100
Leds(8) = &B0011111000
Leds(9) = &B0001110000
Laser : If Licht < 300 Then Fehler = 1
Waitms 200

Leds(2) = &B0001110000
Leds(3) = &B0011111000
Leds(4) = &B0111111100
Leds(5) = &B1111111110
Leds(6) = &B1111111110
Leds(7) = &B1111111110
Leds(8) = &B0111111100
Leds(9) = &B0011111000
Leds(10) = &B0001110000
Laser : If Licht < 300 Then Fehler = 1
Waitms 400

If Fehler = 1 Then
For N = 1 To 12
Leds(n) = &B1111111111
Next N
Waitms 3000
End If

If Fehler = 0 Then

Leds(1) = &B0000000000
Leds(2) = &B0001110000
Leds(3) = &B0011111000
Leds(4) = &B0111111100
Leds(5) = &B1111011110
Leds(6) = &B1110001110
Leds(7) = &B1111011110
Leds(8) = &B0111111100
Leds(9) = &B0011111000
Leds(10) = &B0001110000
Leds(11) = &B0000000000
Leds(12) = &B0000000000
Waitms 100
Leds(1) = &B0000000000
Leds(2) = &B0001110000
Leds(3) = &B0011111000
Leds(4) = &B0111011100
Leds(5) = &B1110001110
Leds(6) = &B1100000110
Leds(7) = &B1110001110
Leds(8) = &B0111011100
Leds(9) = &B0011111000
Leds(10) = &B0001110000
Leds(11) = &B0000000000
Leds(12) = &B0000000000
Leds(3) = &B0011111000
Leds(4) = &B0111011100
Leds(5) = &B1110001110
Leds(6) = &B1100000110
Leds(7) = &B1110001110
Leds(8) = &B0111011100
Leds(9) = &B0011111000
Leds(10) = &B0101111000
Leds(11) = &B0000000000
Leds(12) = &B0000000000
Waitms 100
Leds(1) = &B1000000001
Leds(2) = &B0101110100
Leds(3) = &B0010011000
Leds(4) = &B0101010100
Leds(5) = &B0010001000
Leds(6) = &B1100000110
Leds(7) = &B1010001010
Leds(8) = &B0001010000
Leds(9) = &B0001110000
Leds(10) = &B0100001000
Leds(11) = &B1000000010
Leds(12) = &B0000000000
Waitms 100
Leds(1) = &B1000000001
Leds(2) = &B0100000100
Leds(3) = &B0010011000
Leds(4) = &B0100000100
Leds(5) = &B0010001000
Leds(6) = &B1100000001
Leds(7) = &B1010001010
Leds(8) = &B0000000000
Leds(9) = &B0000000000
Leds(10) = &B0100001000
Leds(11) = &B1000000100
Leds(12) = &B1000000001
Waitms 100
For N = 1 To 12
Leds(n) = 0
Next N
Waitms 2000
End If

Loop Until Fehler = 1

Standby

Loop
'Obere Led-reihe Frei Als Sensor
Do
Laser
Licht = Licht / 50
Y = Low(licht)
X = 6
Led1 X , Y
Waitms 500
Loop



Sub Laser
Do
Loop Until Timer2 > 100
Portc.0 = 0
Ddrc.0 = 0
Waitms 1
Licht = Getadc(0)
'Print #1 , U
Ddrc.0 = 1
Portc.0 = 0
End Sub

For X = 1 To 12
For Y = 1 To 10
Led1 X , Y
Waitms 50
Next Y
Next X
For X = 1 To 12
For Y = 1 To 10
Led0 X , Y
Waitms 50
Next Y
Next X




Sub Led1(byval X As Byte , Byval Y As Byte)
If X < 13 Then
Select Case Y
Case 1 : Leds(x).9 = 1
Case 2 : Leds(x).8 = 1
Case 3 : Leds(x).7 = 1
Case 4 : Leds(x).6 = 1
Case 5 : Leds(x).5 = 1
Case 6 : Leds(x).4 = 1
Case 7 : Leds(x).3 = 1
Case 8 : Leds(x).2 = 1
Case 9 : Leds(x).1 = 1
Case 10 : Leds(x).0 = 1
End Select
End If
End Sub

Sub Led0(byval X As Byte , Byval Y As Byte)
If X < 13 Then
Select Case Y
Case 1 : Leds(x).9 = 0
Case 2 : Leds(x).8 = 0
Case 3 : Leds(x).7 = 0
Case 4 : Leds(x).6 = 0
Case 5 : Leds(x).5 = 0
Case 6 : Leds(x).4 = 0
Case 7 : Leds(x).3 = 0
Case 8 : Leds(x).2 = 0
Case 9 : Leds(x).1 = 0
Case 10 : Leds(x).0 = 0
End Select
End If
End Sub


'****************** Service-Unterprogramme *********************


Sub Initialisierung
Config Portc = 15 'PORTC als AD-Eingang
Config Portb = Output
Config Portd = 255
Config Timer2 = Timer , Prescale = 8
On Ovf2 Tim2_isr
Enable Timer2
Enable Interrupts
Start Timer2
Config Adc = Single , Prescaler = 64 , Reference = Off
Start Adc
Config Int0 = Low Level 'Falling
On Int0 Int_isr
End Sub


Sub Standby
Stop Timer2
Portc = 0
Portd = 0
Portb = 0
Stop Adc
Ddrd.2 = 0
Portd.2 = 1
Enable Int0
Powerdown
Ddrd.2 = 1
Portd.2 = 0
Start Adc
Start Timer2
End Sub


Dim Vhelp As Word

Sub Test
For X = 1 To 12
Leds(x) = 1023
Next X
Waitms 1000
For X = 1 To 12
For Y = 1 To 12
Leds(y) = 0
Next Y
Leds(x) = 1023
Waitms 100
Next X
For Y = 1 To 10
For X = 1 To 12
Vhelp = Y - 1
Vhelp = 2 ^ Vhelp
Leds(x) = Vhelp
Next X
Waitms 100
Next Y
For X = 1 To 12
Leds(x) = 0
Next X
End Sub

Int_isr:
Disable Int0
Return


'******************************* Interrupt - Display ****************************

Dim Vy As Byte
Dim Col As Byte
Dim Portdout As Byte
Dim Portcout As Byte


Tim2_isr:
'800 µs
'Timer2 = 56
Col = Col + 1
If Col = 13 Then Col = 1
Vy = Col + 0
Portd = 0
Portb = 0
Portc = 0
If Col = 1 Then Portb.4 = 0 Else Portb.4 = 1
Portb.3 = 1 'cl
Portb.3 = 0
Portb.2 = 1 'Str
Portb.2 = 0
Portdout = Low(leds(vy))
Portcout = Portdout And 15
Portdout = Portdout And 240
Portd = Portdout
Portc = Portcout
Portb = High(leds(vy))
'Waitms 500
Return
End

 


Elektronik-Labor  Labortagebuch  Notizen  Mikrocontroller