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.
Hi, ich habe folgendes Programm geschriben.
Wobei Pina.2 einem Taster (Öffner) entspricht.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
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.
Gruß, AlKi
Jeder Mensch lebt wie ein Uhrwerk, wie ein Computer programmiert...
==> UMPROGRAMMIEREN!
Kubuntu
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.
Gruß, AlKi
Jeder Mensch lebt wie ein Uhrwerk, wie ein Computer programmiert...
==> UMPROGRAMMIEREN!
Kubuntu
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, stattdas hier zu schreiben:Code:Main2: Porta.0 = 1 If Pina.2 = 0 Then Porta.0 = 0 Goto Main3 End IfCode: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)
Gruß, AlKi
Jeder Mensch lebt wie ein Uhrwerk, wie ein Computer programmiert...
==> UMPROGRAMMIEREN!
Kubuntu
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:EDIT: gnaah, ich überseh immer wieder kleine fehler im prog.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
Gruß, AlKi
Jeder Mensch lebt wie ein Uhrwerk, wie ein Computer programmiert...
==> UMPROGRAMMIEREN!
Kubuntu
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
Lesezeichen