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 ------------------------------------------------







Zitieren
)

Lesezeichen