LPT Qbasic Projekt

.:$n!p3r:.

Cadet 3rd Year
Registriert
Dez. 2005
Beiträge
51
Hallo,

Ich hab da mal eine Frage und zwar zum Thema LPT (Qbasic/Register).

Ich arbeite gerade an ein Projekt "Ampelschaltung per Modul über QBasic steuern".
Es ist eine Ampelschaltung für eine Kreuzung also mit 4 Ampeln. Ich habe jeweils 2 Ampeln paralell geschaltet. Das Modul ist eigentlich nur ein schalter mit Relais,Optokoplern und LED's.
Es gibt auch ein Eingangsmodul also welches Signale zum PC senden kann, dies wollt ich für eine Fussgängerampel benutzen.

Nur wie soll ich das mit den Schaltern für die Fussgänger lösen?
Geht es denn wenn ich ein High zustand sende und ein zusätztlichen empfange? oder gibt es dan einen Kurtzen? also senden und empfangen gleichzeitig?

Wenns funktioniert kann ich ein Ausgang dazu verwenden einen Eingang mit +5V zu treiben?
\\edit: Hab gemerkt das man die Eingänge nur auf Masse legt -.-

Ich bin dankbar für jede Anmerkung....

auch wenn es hier nicht unbedingt reingehört hier mal mein Quellcode, vllt könnt ihr Fehler finden oder etwas vereinfachen? THX
p.s Er ist noch nich fertig, ich muss noch die Optionen vervollständigen für die zeit der einzelnen Phasen...

Code:
'Sub und Function Deklaration
DECLARE SUB Abfrage (NowPhase!)
DECLARE SUB TimerP (Zeit!, NowPhase!)
DECLARE FUNCTION Fussgaengerampel (Schalter!, NowPhase!)
DECLARE SUB Warnleuchten ()
DECLARE SUB Phase1 ()
DECLARE SUB Phase2 (Opt2!)
DECLARE SUB Phase3 ()
DECLARE SUB Phase4 (Opt4!)
DECLARE SUB Phase5 ()
DECLARE SUB Anfang ()

'Deklaration
DIM Opt!
DIM Opt1!
DIM Opt2!
DIM Opt3!
DIM Opt4!

DIM OptwAn!
DIM OptwAus!
DIM OptPhase!

DIM WarnOpt!

DIM NowPhase!
DIM Phase!

DIM Zeit!
DIM sek!
DIM t!


' Globale Deklaration
DIM SHARED Gedrueckt!
DIM SHARED Schalter!

DIM SHARED Adresse%
DIM SHARED DatAdresse%
DIM SHARED StatAdresse%
DIM SHARED SteuAdresse%

DIM SHARED A1Rot!
DIM SHARED A2Rot!
DIM SHARED FA1Rot!
DIM SHARED FA2Rot!

DIM SHARED A1Gelb!
DIM SHARED A2Gelb!

DIM SHARED A1Gruen!
DIM SHARED A2Gruen!
DIM SHARED FA1Gruen!
DIM SHARED FA2Gruen!


	DEF SEG = 0
	Adresse% = PEEK(&H408) + PEEK(&H409) * 256

	OUT (Adresse%), 0
	OUT (Adresse% + 2), 11

'Aufruf des HauptProgramms
	CALL Anfang

SUB Abfrage (NowPhase!)

	SELECT CASE INP(StatAdresse%)
		CASE IS = 63 '63 S56

			Gedrueckt = 1
			Schalter! = 1
			LOCATE 10, 30
			PRINT "Achtung Fussg„nger auf Ampel1!"

			GOTO callFuss
   
		CASE IS = 88 '95 S88

			Gedrueckt = 1
			Schalter! = 2
			LOCATE 10, 30
			PRINT "Achtung Fussg„nger auf Ampel2!"

			GOTO callFuss
	
		CASE IS = 104 '111 S104

			Gedrueckt = 1
			Schalter! = 1
			LOCATE 10, 30
			PRINT "Achtung Fussg„nger auf Ampel1!"

			GOTO callFuss
	    
		CASE IS = 112 '119 S112

			Gedrueckt = 1
			Schalter! = 2
			LOCATE 10, 30
			PRINT "Achtung Fussg„nger auf Ampel2!"

			GOTO callFuss

	END SELECT

	IF Gedrueckt! = 1 THEN

		GOTO callFuss

	END IF


	GOTO ENDE

	'Auswahl welche Phase war, um zu entscheiden was gemacht werden soll.
callFuss:

		IF NowPhase = 1 OR NowPhase = 3 OR NowPhase = 5 THEN
			IF Gedrueckt = 1 THEN

				Gedrueckt = Fussgaengerampel(Schalter!, NowPhase!)

			END IF
		END IF

ENDE:
	NowPhase = 0

END SUB

SUB Anfang
'****************************WERTZUORDNUNG*VARIABLEN****************************
'Gedrueckt auf 0 setzten
	Gedrueckt! = 0

'Ampelfarben der Pinadressen zuorden
	A1Rot! = 1
	A2Rot! = 8
	FA1Rot! = 64
	FA2Rot! = 10

	A1Gelb! = 2
	A2Gelb! = 16

	A1Gruen! = 4
	A2Gruen! = 32
	FA1Gruen! = 128
	FA2Gruen! = 9

'Wertzuordnung der Option pausen von "Phasen 1-5" (Wartezeit in sec.)
	Opt1! = 3
	Opt2! = 3
	Opt3! = 3
	Opt4! = 3
	opt5! = 3
	opt6! = 3

'Wertzuordnung der Option pausen "Warnleuchten" (Wartezeit in sec.)
	OptwAn! = 15
	OptwAus! = 15

'Adressen zuordnen des LPT-Port
	DatAdresse% = Adresse%  'Daten-Register
	StatAdresse% = Adresse% + 1  'Status-Register
	SteuAdresse% = Adresse% + 2  'Steuer-Register
'****************************WERTZUORDNUNG*VARIABLEN*ENDE***********************

Menu:
	'Anzeige des ersten Men
	CLS
       
	PRINT "Projekt: Ampel mit QBasic ber den LPT-Port steuern."
	LOCATE 2, 10
	PRINT "Von Daniel Mller und Markus Trame"
	LOCATE 3, 10
	PRINT "Vom 10.07.07 bis 21.09.07"

	COLOR 2
	LOCATE 9, 23
	PRINT "Ampelschaltung fr Kreuzung"
       
	LOCATE 10, 23
	PRINT "________________________________"
       
	LOCATE 11, 23
	PRINT "Menu"
       
	'Optionen vom ersten Men
	LOCATE 12, 27
	PRINT "1 -Alle Ampelphasen durchlaufen"
	LOCATE 13, 27
	PRINT "2 -Alle Ampeln auf Gelb blinkend schalten"
	LOCATE 14, 27
	PRINT "3 -Programm beenden"
	LOCATE 15, 27
	PRINT "4 -Optionen"
	LOCATE 17, 23
	INPUT "Nr. der Option:", Phase!
	CLS

	'Auswahl der Eingabe von ersten Men
	SELECT CASE Phase!
	CASE IS = 1
		GOTO AllePhasen
	CASE IS = 2
		GOTO Warnleuchten
	CASE IS = 3
		END
	CASE IS = 4
		GOTO Optionen
	END SELECT
	CLS
	GOTO Menu

END
Optionen:
	
	'Menu von Optionen
	LOCATE 10, 27
	PRINT "1 -Optionen der Phasen"
	LOCATE 11, 27
	PRINT "2 -Optionen der Warnbeleuchtung"
	LOCATE 12, 27
	PRINT "3 -Zurck zum Menu"
	LOCATE 14, 23
	INPUT "Nr. der Option:", Opt!
	CLS

	'Auswahl von Eingabe der Option
	SELECT CASE Opt!
	CASE IS = 1
		GOTO Phasen
	CASE IS = 2
		GOTO WarnL
	CASE IS = 3
		GOTO Menu
	END SELECT
	CLS
	GOTO Optionen
	
END
WarnL:

	'Menu vom Warnleuchten
	LOCATE 10, 27
	PRINT "1 -Leuchtphase der GelbenLampen"
	LOCATE 11, 27
	PRINT "2 -Dunkelphase der GelbenLampen"
	LOCATE 12, 27
	PRINT "3 -Zurck"
	LOCATE 13, 23
	INPUT "Nr. der Option:", WarnOpt!
	CLS
	
	SELECT CASE WarnOpt!
	CASE IS = 1
		INPUT "Leuchtphase:", OptwAn!
	CASE IS = 2
		INPUT "Dunkelphase:", OptwAus!
	CASE IS = 3
		GOTO Optionen
	END SELECT
	CLS
	GOTO WarnL
	
END
Phasen:
	'Menu von den PhasenOptionen
	LOCATE 10, 27
	PRINT "1 -Phasendauer(1) Ampel1(Grn) Ampel2(Rot)"
	LOCATE 11, 27
	PRINT "2 -Phasendauer(2) Ampel1(Gelb)-Ampel1(Rot) Ampel2(Rot)-Ampel2(Rot/Gelb)"
	LOCATE 12, 27
	PRINT "3 -Phasendauer(3) Ampel1(Rot) Ampel2(Grn)"
	LOCATE 13, 27
	PRINT "4 -Phasendauer(4) Ampel1(Rot)-Ampel1(Rot/Gelb) Ampel2(Gelb)-Ampel2(Rot)"
	LOCATE 14, 27
	PRINT "5 -Phasendauer(5) Ampel1(Grn) Ampel2(Rot)"
	LOCATE 15, 27
	PRINT "6 -Zurck"

	INPUT "Nr. der Option:", OptPhase!
	CLS
	
	LOCATE 5, 5
	SELECT CASE OptPhase!
	CASE IS = 1
		INPUT "Phasendauer(1) in sec.", Opt1!
	CASE IS = 2
		INPUT "Phasendauer(1) in sec.", Opt2!
	CASE IS = 3
		INPUT "Phasendauer(1) in sec.", Opt3!
	CASE IS = 4
		INPUT "Phasendauer(1) in sec.", Opt4!
	CASE IS = 5
		INPUT "Phasendauer(1) in sec.", opt5!
	CASE IS = 6
		GOTO Optionen
	END SELECT
	CLS
	GOTO Phasen
	
END
	'Option: alle Phasen durchlaufen
AllePhasen:

	'Fussgesteuerte schleife abbruch bei ESC-Tase
	DO

		CALL Phase1
		NowPhase! = 1
		CALL Abfrage(NowPhase!)
		CALL TimerP(Opt1!, NowPhase!)

		CALL Phase2(Opt2!)
		NowPhase! = 2
		CALL TimerP(Opt2!, NowPhase!)

		CALL Phase3
		NowPhase! = 3
		CALL Abfrage(NowPhase!)
		CALL TimerP(Opt3!, NowPhase!)

		CALL Phase4(Opt4!)
		NowPhase! = 4
		CALL TimerP(Opt4!, NowPhase!)
		
		CALL Phase5
		NowPhase! = 5
		CALL Abfrage(NowPhase!)
		CALL TimerP(opt5!, NowPhase!)

	LOOP UNTIL INKEY$ = CHR$(27)

END

	'Option: Es werden alle Ampeln auf Gelb blinkend geschaltet
Warnleuchten:

	'Fussgesteuerte schleife abbruch bei ESC-Taste
	DO

		LOCATE 12, 30
		PRINT "Warnleuchten"
		LOCATE 13, 30
		PRINT "An in sec. :";
		PRINT OptwAn
		LOCATE 14, 30
		PRINT "Aus in sec. :";
		PRINT OptwAus
		
		OUT (DatAdresse%), A1Gelb! + A2Gelb!
		SOUND 32000, OptwAn!

		IF INKEY$ = "+" THEN
		   OptwAn! = OptwAn! + 1
		   IF OptwAn! > 70 THEN
			OptwAn! = 15
		   END IF
		   OptwAus! = OptwAn!
		END IF

		IF INKEY$ = "-" THEN
		   OptwAn! = OptwAn! - 1
		   IF OptwAn! <= 0 THEN
			OptwAn! = 1
		   END IF
		   OptwAus! = OptwAn!
		END IF

		OUT (DatAdresse%), 0
		CLS
		SOUND 32000, OptwAus!

	LOOP UNTIL INKEY$ = CHR$(27)

END
END SUB

FUNCTION Fussgaengerampel (s!, NowPhase!)

	IF s! = 1 THEN

		SELECT CASE NowPhase!
			CASE IS = 1

				OUT (SteuAdresse%), FA2Rot
				Fussgaengerampel = 1

			CASE IS = 3

				OUT (DatAdresse%), A1Rot + A2Gruen + FA1Gruen
				OUT (SteuAdresse%), FA2Rot
				SLEEP 5
				Fussgaengerampel = 0

			CASE IS = 5

				OUT (SteuAdresse%), FA2Rot
				Fussgaengerampel = 1

		END SELECT

	ELSEIF s! = 2 THEN
		SELECT CASE NowPhase
			CASE IS = 1

				OUT (SteuAdresse%), FA2Gruen
				SLEEP 5
				Fussgaengerampel = 0

			CASE IS = 3

				OUT (DatAdresse%), A1Rot + A2Gruen + FA1Rot
				OUT (SteuAdresse%), FA2Rot
				Fussgaengerampel = 1

			CASE IS = 5

				OUT (SteuAdresse%), FA2Rot
				Fussgaengerampel = 1

		END SELECT
	END IF

END FUNCTION

SUB Phase1
	
	'Setzt Ampel1 auf Grn und Ampel2 auf Rot. FA1 Rot FA2 Rot
	CLS
	LOCATE 10, 23
	PRINT "Ampel1 [Grn]"
	LOCATE 11, 23
	PRINT "Ampel2 [Rot]"

	OUT (DatAdresse%), A1Gruen! + A2Rot! + FA1Rot
	'Fussg„ngerampel2 auf Rot
	OUT (SteuAdresse%), FA2Rot!

END SUB

SUB Phase2 (Opt2!)

	'Setzt Ampel1 auf Gelb und Ampel2 auf Rot
	CLS
	LOCATE 10, 23
	PRINT "Ampel1 [Gelb]"
	LOCATE 11, 23
	PRINT "Ampel2 [Rot]"

	OUT (DatAdresse%), A1Gelb + A2Rot + FA1Rot
	OUT (SteuAdresse%), FA2Rot

	NowPhase! = 2
	CALL TimerP(Opt2!, NowPhase!)

	'Setzt Ampel1 auf Rot und setzt Ampel2 auf Rot/Gelb
	CLS
	LOCATE 10, 23
	PRINT "Ampel1 [Rot]"
	LOCATE 11, 23
	PRINT "Ampel2 [Rot/Gelb]"

	OUT (DatAdresse%), A1Rot + A2Rot + A2Gelb + FA1Rot
	OUT (SteuAdresse%), FA2Rot

END SUB

SUB Phase3
	      
	'Setzt Ampel1 auf Rot und Ampel2 auf Grn
	CLS
	LOCATE 10, 23
	PRINT "Ampel1 [Rot]"
	LOCATE 11, 23
	PRINT "Ampel2 [Grn]"

	OUT (DatAdresse%), A1Rot + A2Gruen + FA1Rot
	OUT (SteuAdresse%), FA2Rot

END SUB

SUB Phase4 (Opt4!)

	'Setzt Ampel1 auf Rot und l„sst Ampel2 auf Gelb
	CLS
	LOCATE 10, 23
	PRINT "Ampel1 [Rot]"
	LOCATE 11, 23
	PRINT "Ampel2 [Gelb]"

	OUT (DatAdresse%), A1Rot + A2Gelb + FA1Rot
	OUT (SteuAdresse%), FA2Rot

	NowPhase! = 4
	CALL TimerP(Opt4!, NowPhase!)

	'Setzt Ampel1 auf Rot/Gelb und Ampel2 auf Rot
	CLS
	LOCATE 10, 23
	PRINT "Ampel1 [Rot/Gelb]"
	LOCATE 11, 23
	PRINT "Ampel2 [Rot]"

	OUT (DatAdresse%), A1Rot + A1Gelb + A2Rot + FA1Rot
	OUT (SteuAdresse%), FA2Rot

END SUB

SUB Phase5

	'Setzt Ampel1 auf Grn und Ampel2 auf Rot
	CLS
	LOCATE 10, 23
	PRINT "Ampel1 [Grn]"
	LOCATE 11, 23
	PRINT "Ampel2 [Rot]"

	OUT (DatAdresse%), A1Gruen + A2Rot + FA1Rot
	OUT (SteuAdresse%), FA2Rot

END SUB

SUB TimerP (Zeit!, NowPhase!)

	sek! = Zeit!
	t! = TIMER
	WHILE t! + sek! > TIMER

		IF INKEY$ = CHR$(27) THEN END

		CALL Abfrage(NowPhase!)

	WEND
	
END SUB
 
Zuletzt bearbeitet:
Zurück
Oben