-
Programm möchte nicht.
Hi, ich habe folgendes Programm geschriben.
Code:
$regfile = "m16def.dat"
$crystal = 16000000
Config Porta.0 = Output
Config Portd.7 = Output
Config Pina.2 = Input
Dim Zeit As Byte
Dim Main1 As Long
Dim Main2 As Long
Dim Main3 As Long
Main1:
Zeit = 0
Portd.7 = 1
Waitms 300
Portd.7 = 0
Waitms 300
Portd.7 = 1
Waitms 300
Portd.7 = 0
Goto Main2
Main2:
Porta.0 = 1
If Pina.2 = 0 Then
Porta.0 = 0
Goto Main3
End If
Main3:
Zeit = Zeit + 1
If Zeit = 10 Then
Porta.0 = 1
Portd.7 = 1
Waitms 3000
Porta.0 = 0
Portd.7 = 0
End If
If Zeit = 15 Then
Porta.0 = 1
Portd.7 = 1
Waitms 3000
Porta.0 = 0
Portd.7 = 0
End If
End
Wobei Pina.2 einem Taster (Öffner) entspricht.
Wenn ich das Programm nun compilieren lasse, gibt es keine Fehlermeldungen von Basecom. Das Programm scheint aber nicht richtig zu laufen. An PORTD.7 hängt ein pieper. Der piept auch 2 mal wenn das Programm abläuft. Allerdings geht das programm danach nicht mehr weiter. Sprich wenn ich den Taster drücke passiert nichts mehr.
Woran kann das liegen ?
mfg Blamaster
-
du solltest vielleicht eine Do-Loop-Schleife einbauen, weil so geht das Programm einmal durch und ist dann (bis zum nächsten Reset) fertig.
mit dem Do-Loop machst du ne endlosschleife.
-
Also praktisch ein Do vor dem Main1: und ein Loop vor END ?
-
Ja, so sollte es gehen.
Das END kannst du dir übrigens dann auch sparen, da es ja nie ein ende gibt.
-
Hat leider auch keinen positiven effekt und der pieper piepst jetzt die ganze Zeit.
-
Wenn der Piepser IN der Do-Loop-Schleife ständig geschaltet wird, ist das normal. Einfach mal den Teil, der piepen soll, nach aussen, vor DO verfrachten.
-
Öhm, was soll denn das Ziel von dem Ganzen sein?
auserdem sehe ich, dass du deine Zeit zwar in Main3 dauernd incrementierst, aber nie wieder auf 0 zurücksetzt. Was ist der Zweck davon?
vlt hilft es, statt
Code:
Main2:
Porta.0 = 1
If Pina.2 = 0 Then
Porta.0 = 0
Goto Main3
End If
das hier zu schreiben:
Code:
Main2:
Porta.0 = 1
If Pina.2 = 0 Then
Porta.0 = 0
Goto Main3
Else
Goto Main1
End If
versuche doch mal, die Mains wegzulassen, also statt "Goto Main2" einfach die Main2-Funktionen hinschreiben.
das wäre evtl etwas einfacher, und du brauchst nicht so viel speicherplatz.
Du könntest übrigens auch statt der Do-Loop-Schleife einfach am ende deines Programmms "Goto Main1" schreiben. das hätte hier den selben effekt. (voher hattest du ja das problem, dass dein programm im Leeren endet, was damit genauso gelöst wäre)
-
Das Programm hat Folgende Funktionen:
1. Wenn das Programm gestartet wird, soll der Piepser 2 mal piepsen.
Danach soll erstmal nichts weiter passieren als das der Kanal PORTA.0 = 1 geschaltet wird.
Wenn dann der Taster PINA.2 = 0 gezogen wird, soll die "Timer" bzw. "Zeit" Variabele anfangen im Sekundentakt zu zählen, und halt beim erreichen von bestimmten Zeiten für ein paar sekunden den PORTA.0 schalten.
Das problem ist halt nur das wenn ich den Taster momentan drücke rein garnichts passiert, sondern die Lampe die an PORTA.0 hängt durchgehend leuchtet.
-
dann setz die Beep-Befehlsfolge vor die Do-Loop-Schleife, dann hat sich das schonmal.
Goto Main2 und Main2 kannst du dir im übrigen sparen, das brauchst du nicht. (da springst du ja eh über nix drüber)
Hast du nen externen Pullup-Widerstand am Taster? Und geht der Taster nach GND?
vlt geht das:
Code:
$regfile = "m16def.dat"
$crystal = 16000000
Config Porta.0 = Output
Config Portd.7 = Output
Config Pina.2 = Input
Porta.2 = 1 ' (edit:) !!!Weil du da keine externen pullups hast!!!!!
Dim Zeit As Byte
Dim Main1 As Long
Dim Main3 As Long
Portd.7 = 1
Waitms 300
Portd.7 = 0
Waitms 300
Portd.7 = 1
Waitms 300
Portd.7 = 0
Main1:
Zeit = 0
Porta.0 = 1
If Pina.2 = 0 Then
Porta.0 = 0
Goto Main3
Else
Goto Main1
End If
Main3:
While Pina.2=0 'es muss ja solange sein, bis der Taster wieder geschlossen wird
Zeit = Zeit + 1
If Zeit = 10 Then
Porta.0 = 1
Portd.7 = 1
End If
If Zeit = 15 Then
Porta.0 = 1
Portd.7 = 1
Zeit = 0 ' so würde die lampe nach 30 Sekunden und nach 45 sekunden für je 3 sec angehen, der Beeper auch
End If
Waitms 3000 'weil sonst deine "Zeit" nicht wartet zwischen dem Zählen
Porta.0 = 0 'wenn die eh aus sind, dann juckts keinen, wenn nicht, dann passts
Portd.7 = 0 'weil dann eine der If-Schleifen dran war, und du das nicht in der If-Schleife brauchst.
Wend
Goto Main1
EDIT: gnaah, ich überseh immer wieder kleine fehler im prog.
-
Der Taster ist ein Öffner kein Schließer ;)
Deswegen müssen die Internen pull ups ja nicht an.
Mit dem Code funkts auch nicht wieder viel gepiepe, aber den Taster interessiert es nicht ob man ihn drückt oder nicht.
Und jo Taster geht auf GND