Hier noch der (Bascom-)Quellcode:
Code:
' Zeitschalter und Punktezähler für Spritzenhaus
' (c) AlKi
'
' ATMega8 + LCD + Lichtschranke + 2 Taster + Poti + Lautsprecher + Relais für Wasserpumpe
'
' Und NOT-AUS-Schalter in VCC!!! ( wenn Stromversorgung durch Trafo: Beide Adern durch NOT-AUS trennbar!!!)
'
'
' Anschlussbelegung:
'
'
' LCD: RS = PC1 ; Ex = PB1 ; DB4 = PC2 ; DB5 = PC3 ; DB6 = PC4 ; DB7 = PC5
'
' Signaleingang: PB6 ( gegen GND da interner Pullup )
'
' Taster:
' Start/Weiter: PD7 ( beide gegen GND da interne Pullups und mit Kondensatoren entprellt )
' Rücksetzen: PD6
'
' Poti: PC0/ADC0 ( als Spannungsteiler zwischen VCC und GND, mindestens 5kOhm )
'
' Lautsprecher(-ansteuerung): PB0 ( über Transistor mit Basis-Vorwiderstand und Freilaufdiode )
'
' Relais(-ansteuerung): PB7 ( über Transistor mit Basis-Vorwiderstand und Freilaufdiode )
'
'
'
' Features:
'
' - Punktestand und Spielerzahl wird am LCD ausgegeben
' - über Poti einstellbare Rundenzeit (bis 2min 30sec)
' - Startsignal über Lautsprecher
' - automatisches Schalten der Pumpe ( bis 230V max 12A, auch Magnetventil möglich)
' - nach jedem Teilnemer Pumpenstopp
' - manuelles Zurücksetzen des Punktestandes und der Teilnehmerzahl
' nach jedem Teilnehmer möglich => egal wieviele Teilnehmer pro Gruppe (einzeln bis 255 pro Gruppe)
'
$regfile = "m8def.dat"
$crystal = 8000000
' Ausgänge einstellen
Config Portb.0 = Output
Beeper Alias Portb.0
Config Portb.7 = Output
Pumpe Alias Portb.7
' Eingänge einstellen
Config Pind.7 = Input ' Start-/Weiter- Taster
Portd.7 = 1 ' Pullup an
Xstart Alias Pind.7
Config Pind.6 = Input ' Resettaster
Xrueck Alias Pind.6
Portd.6 = 1 ' Pullup an
Config Pinb.6 = Input ' Signaleingang von Lichtschranke
Xsig Alias Pinb.6
Portb.6 = 1 ' Pullup an
' LCD einstellen
Config Lcd = 20 * 2 '
Config Lcdbus = 4 '
Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5 , E = Portb.1 , Rs = Portc.1 '
' ADC einstellen
Config Adc = Single , Prescaler = 64 , Reference = Avcc
Start Adc 'und gleich aktivieren
Dim Zaehler As Long ' Variablen
Dim Zeit As Long
Dim Punkte As Long ' wird später nach x Vorpunkten um 1 erhöht
Dim Vorpunkte As Byte ' Vorpunkte, damit nicht jedes Signal einen Punkt ergibt
Dim Spieler As Byte ' Die Variable für Spieler
Dim X As Long
Dim Xsignalalt As Bit ' der letzte Zustand des Eingangs wird hier drauf abgespeichert (zum Vergleichen mit aktuellem)
Dim Dreh As Byte ' Die Variable für die Animation
' ----------------- Programmstart -------------------------------------------------------------
Wait 1 ' damit das LCD genug Zeit zum "Hochfahren" hat
Initlcd
Cursor Off
Xsignalalt = 0
Vorpunkte = 0
Spieler = 0
Punkte = 0
Dreh = 0
Cls ' erstmal alles =0 und leeren
While Xstart = 1
Locate 1 , 1
Lcd " Bereit..."
Wend
' weiter erst, wenn "Start" (Starttaster gedrückt)
Do ' eigentliche Hauptschleife
Zaehler = 0
Zeit = 0
X = 0
Vorpunkte = 0
Dreh = 4 ' =4, da es gleich anderweitig genutzt wird (zum Tröter zählen)
Incr Spieler ' nächster Spieler ist dran
Cls
Locate 1 , 1
Lcd Punkte ; " Punkte"
Locate 2 , 1
Lcd "Spieler " ; Spieler
Zaehler = Getadc(0) ' Wert des Potis als Zeit geladen
While Dreh > 1 ' 4 mal Piepsen, "Dreh" wird hier "missbraucht"
Decr Dreh
Locate 1 , 17
Lcd Dreh
Beeper = 0
While X < 100000 ' vor/zwischen Piepsern warten
Incr X
Wend
X = 0
While X < 150 ' Tröt-Schleife
Toggle Beeper
While Zeit < 100
Incr Zeit
Wend
Zeit = 0
While Zeit < 500
Incr Zeit
Wend
Zeit = 0
Incr X
Wend
X = 0
Wend
Locate 1 , 17
Lcd "GO!"
Zeit = 0
X = 0
Dreh = 0 ' Variablen wieder = 0
Beeper = 0 ' Lautsprecher garantiert aus
Pumpe = 1 'Pumpe an
While Zeit < Zaehler ' Anfang Zählschleife
X = 0
Incr Zeit
While X < 5
If Xsig = Xsignalalt Then ' hat sich der Eingang geändert?
' wenn nicht, dann mach nix
Else ' ansonsten
Xsignalalt = Xsig ' Zustand speichern
Incr Vorpunkte ' und Flanke zählen
Select Case Vorpunkte
Case 4 : Incr Dreh ' Variable für die Animation verändern
Case 8 : Incr Dreh
Case 12 : Incr Dreh
Case 16 : Incr Dreh
End Select
If Dreh = 4 Then ' und wenn sie zu hoch ist => =0
Dreh = 0
End If
If Vorpunkte = 16 Then ' Endgültiges Punktezählen
Incr Punkte
Vorpunkte = 0
End If
End If
Locate 1 , 1
Lcd Punkte ; " Punkte" ' Ausgabe des Punktestands
Locate 1 , 14
Select Case Dreh ' Ausgabe der Animation in der oberen Zeile
Case 0 : Lcd "^"
Case 1 : Lcd "-"
Case 2 : Lcd "_"
Case 3 : Lcd " "
End Select
Locate 2 , 14
Select Case Dreh ' Ausgabe der Animation in der unteren Zeile
Case 0 : Lcd "- _ "
Case 1 : Lcd "_ _ "
Case 2 : Lcd " _ _ "
Case 3 : Lcd "^ _ _"
End Select
Locate 2 , 1
Lcd "Spieler " ; Spieler ' Ausgabe der Spielerzahl
Incr X
Wend
Wend
' *#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#
' Ende der Runde
' *#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#
Pumpe = 0 ' Pumpe aus
Zeit = 0
X = 0
Locate 2 , 14
Lcd "Stopp" 'Ausgabe "Stopp"
While X < 150 ' Endpiepser
Toggle Beeper
While Zeit < 100
Incr Zeit
Wend
Zeit = 0
While Zeit < 500
Incr Zeit
Wend
Zeit = 0
Incr X
Wend
X = 0
Zeit = 0
X = 0
Vorpunkte = 0 ' Variablen wieder = 0
Beeper = 0
Cls
While Xstart = 1 ' Solange Starttaster inaktiv (Warteschleife mit Ausgabe)
If Xrueck = 0 Then ' falls Resettaster aktiv
Spieler = 0 ' Spielernummer und
Punkte = 0 ' Punktestand auf 0 setzen
Cls ' und das Display leeren (zur Siherheit)
End If
Locate 1 , 1
Lcd Punkte ; " Punkte" ' Punkte, Spielernummer, Punktestand und "Stopp" ausgeben
Locate 2 , 1
Lcd "Spieler " ; Spieler
Locate 2 , 12
Lcd "Stopp"
' sonst nix tun
Wend
Zeit = 0
X = 0
Loop
'---------------------------- Ende ------------------------------------------------
Lesezeichen