 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
sv_t
Anmeldungsdatum: 23.05.2006 Beiträge: 6
|
Verfasst am: 23.05.2006, 17:30 Titel: Ampelsteuerung funktioniert nicht |
|
|
Hallo,
ich habe eine Relaiskarte, die ich über den LPT1-Port ansteuern möchte.
Als funktion soll etwas ähnliches wie eine Ampelsteuerung herauskommen.
Ich verwende qbasic 4.5 (bin absoluter Anfänger in qbasic)
Nun soll folgendes ablaufen:
Bei einem Schießwettkampf habe ich bestimmte aktive und passive Phasen, d.h. bei rot darf ich nicht schießen, bei gelb kann ich mich vorbereiten, bei grün darf ich schießen,
bei gelb muss ich ablegen und sichern, bei rot ist Schluss.
So läuft mein Programm ab:
- Programm starten
- alle Ausgänge an LPT1 auf 0 setzen
- setzen von Ausgang 1 (Lampe rot)
- warten auf Eingabe (z.B. Leertaste)
- starten des Timers (10 sec)
- rücksetzen von Ausgang 1 (Lampe rot)
- setzen von Ausgang 2 (Lampe gelb)
- starten des Timers (10 sec)
- rücksetzen von Ausgang 2 (Lampe gelb)
- setzen von Ausgang 3 (Lampe grün)
- starten des Timers (10 sec)
- rücksetzen von Ausgang 3 (Lampe grün)
- setzen von Ausgang 2 (Lampe gelb)
- starten des Timers (10 sec)
- rücksetzen von Ausgang 2 (Lampe gelb)
- setzen von Ausgang 1 (Lampe rot)
- springe zum Anfang um mit Leertaste neu zu starten
So habe ich programmiert:
Code: |
CLS
OUT 888,0
PRINT "Ampelsteuerung"
PRINT " "
OUT 888,1
PRINT "ROT"
PRINT "Start mit Leertaste"
DO
LOOP UNTIL TIME$ = "00:00:10"
OUT 888,2
PRINT "GELB"
DO
LOOP UNTIL TIME$ = "00:00:10"
OUT 888,3
PRINT "GRÜN"
DO
LOOP UNTIL TIME$ = "00:00:10"
OUT 888,2
PRINT "GELB"
DO
LOOP UNTIL TIME$ = "00:00:10"
OUT 888,1
PRINT "ROT"
|
Nun habe ich folgende Fragen:
- Wie baue ich die Funktion INKEY$=CHR$( ) ein und welcher ASCII-Code steht für das Leerzeichen?
- Warum geht mein Programm nur bis PRINT "Start mit Leertaste", also warum wird nicht gezählt?
- Wie springe ich vom Ende wieder zum Anfang?
Vielen Dank für Eure Hilfe,
freundliche GRüße,
Sven. |
|
Nach oben |
|
 |
jb

Anmeldungsdatum: 14.01.2005 Beiträge: 2010
|
Verfasst am: 23.05.2006, 17:34 Titel: |
|
|
Zitat: |
- Wie baue ich die Funktion INKEY$=CHR$( ) ein und welcher ASCII-Code steht für das Leerzeichen? |
Leerzeichen = chr$(32)
Code: |
E$ = INKEY$
IF E$ = CHR$(32) THEN ...
|
Zitat: | - Warum geht mein Programm nur bis PRINT "Start mit Leertaste", also warum wird nicht gezählt? |
TIME$ gibt die Uhrzeit zurück, nicht die verstrichenen Sekunden. Verwende lieber TIMER:
Code: |
T = TIMER
DO
LOOP UNTIL TIMER > T + 10
|
Das wartet auch 10 Sekunden.
Zitat: | - Wie springe ich vom Ende wieder zum Anfang? |
Mach um dein ganzes Programm ein
Das wäre dann eine Endlosschleife. Wenn es sich bei Escape beenden lassen soll, dann mache Folgenes:
Code: |
DO
E$ = INKEY$
' Hier kommt dein Programm
LOOP UNTIL E$ = CHR$(27)
' ASCII 27 = Escape
|
Viel Spaß damit
jb _________________ Elektronik und Programmieren |
|
Nach oben |
|
 |
MisterD

Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 23.05.2006, 18:41 Titel: |
|
|
du kannst ein leerzeichen auch einfach als " " angeben.. _________________ "It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra |
|
Nach oben |
|
 |
sv_t
Anmeldungsdatum: 23.05.2006 Beiträge: 6
|
Verfasst am: 23.05.2006, 19:33 Titel: |
|
|
Hallo,
vielen Dank für die schnellen Antworten.
Habe das Programm mal wie folgt umgeändert:
Code: |
DO
E$ = INKEY$
CLS
OUT 888,0
PRINT "Ampelsteuerung"
PRINT " "
OUT 888,1
PRINT "ROT"
PRINT " "
PRINT "Start mit Leertaste, Abbruch mit ESC"
E$ = INKEY$
IF E$ = CHR$(32) THEN
CLS
OUT 888,1
PRINT "ROT"
T = TIMER
DO
LOOP UNTIL TIMER > T + 10
OUT 888,2
PRINT "GELB"
T = TIMER
DO
LOOP UNTIL TIMER > T + 10
OUT 888,3
PRINT "GRÜN"
T = TIMER
DO
LOOP UNTIL TIMER > T + 10
OUT 888,2
PRINT "GELB"
T = TIMER
DO
LOOP UNTIL TIMER > T + 10
OUT 888,1
PRINT "ROT"
END IF
LOOP UNTIL E$ = CHR$(27)
|
Das Durchzählen funktioniert ganz gut.
Allerdings habe ich noch ein kleines Problem gleich nach dem Start des Programmes.
Da flackert die Anzeige solange, bis ich 1x Leertaste oder ESC drücke.
Dann kommt die Frage nach der Taste und nach nochmaligem Drücken der Leertaste wird gezählt.
Die ESC-Taste funktioniert nur direkt bei der ersten Tastenabfrage,
wärend des Programmes oder danach nicht.
Ist das Zählen 1x durchgelaufen, beginnt das flackern der Anzeige erneut.
Was habe ich da noch falsch gemacht? Da stimmt doch noch etwas mit der IF - THEN - Anweisung nicht, oder ?
Vielen Dank, Gruß Sven. |
|
Nach oben |
|
 |
sv_t
Anmeldungsdatum: 23.05.2006 Beiträge: 6
|
Verfasst am: 23.05.2006, 20:40 Titel: |
|
|
Habe das Problem doch noch lösen können.
Die IF-THEN Anweisung war ja noch nicht vollständig.
Habe Sprungmarken gesetzt und mit GOTO dahin verwiesen.
Jetzt läuft es so wie es soll.
Nochmals vielen Dank an alle.
Freundliche Grüße,
Sven. |
|
Nach oben |
|
 |
jb

Anmeldungsdatum: 14.01.2005 Beiträge: 2010
|
Verfasst am: 24.05.2006, 17:57 Titel: |
|
|
Von GOTO sollte man in der Regel aber nicht so oft Gebrauch machen...
Aber wenn's funktioniert, dann ist noch immer das die Hauptsache
jb _________________ Elektronik und Programmieren |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|