Archiv verlassen und diese Seite im Standarddesign anzeigen : Programm möchte nicht.
Blamaster
19.12.2007, 13:14
Hi, ich habe folgendes Programm geschriben.
$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.
Blamaster
19.12.2007, 14:08
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.
Blamaster
19.12.2007, 14:43
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
Main2:
Porta.0 = 1
If Pina.2 = 0 Then
Porta.0 = 0
Goto Main3
End If
das hier zu schreiben:
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)
Blamaster
19.12.2007, 16:07
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:
$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.
Blamaster
19.12.2007, 16:32
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
Deswegen müssen die Internen pull ups ja nicht an.
DOCH, wie willst du denn dann den anderen Zustand hinbekommen (1)????
ich hab den code editiert, probiers doch nochmal.
Blamaster
19.12.2007, 16:47
So jetzt hat es den Effekt, das es nur 3 mal piept, dann die Lampe aufleuchtet. Wenn ich den Taster drücke passiert wieder nichts.
hast du den ' vor PORTA.2=1 weggemacht?
ich hab ihn mittlerweile wegeditiert
Blamaster
19.12.2007, 16:59
Also so funktioniert das alles mal garnicht.
Den Pullupwiederstand hab ich erstmal wieder rausgenommen, denn das brachte garnichts.
Ich hab einfach mal den Taster mit dem Minimalcode:
Do
If PINA.2 = 0 Then
PORTA.0 = 1
End if
Loop
angesteuert. Das klappt so alles super. Taster wird gedrückt, lampe leuchtet.
??? ohne pullup???
ok, vlt liegts an den goto- befehlen, mit denen kenn ich mich noch nicht so gut aus.
$regfile = "m16def.dat"
$crystal = 16000000
Config Porta.0 = Output
Config Portd.7 = Output
Config Pina.2 = Input
Porta.2 = 1
Dim Zeit As Byte
Portd.7 = 1
Waitms 300
Portd.7 = 0
Waitms 300
Portd.7 = 1
Waitms 300
Portd.7 = 0
Do
Zeit=0
Porta.0 = 1
If Pina.2 = 0 Then
Porta.0 = 0 ' könnte man auch noch in die While-Schleife schieben, dann braucht man die if-schleife nicht mehr
While Pina.2=0
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
End If
Waitms 3000
Porta.0 = 0
Portd.7 = 0
Wend
End If
Loop
Blamaster
19.12.2007, 19:41
Jo ohne Pull Ups gehts schonmal halbwegs. Hab es jetzt nochmal etwas umgestellt:
$regfile = "m16def.dat"
$crystal = 16000000
Config Porta.0 = Output
Config Portd.7 = Output
Config Pina.2 = Input
Dim Zeit As Byte
Dim A As Byte
Dim Main2 As Long
Dim Main1 As Long
Dim Main3 As Long
Main1:
Do
Portd.7 = 1
Waitms 300
Portd.7 = 0
Waitms 300
Portd.7 = 1
Waitms 300
Portd.7 = 0
Goto Main2
Loop
Main2:
Do
If Pina.2 = 0 Then Goto Main3
Loop
Main3:
Do
Waitms 100
Zeit = Zeit + 1
If Zeit = 5 Then
Porta.0 = 1
Waitms 3000
Porta.0 = 0
End If
Goto Main2
Loop
End
Jetzt tut sich nur das Problem auf das mein timer nicht mehr will. Wenn ich allerdings Zeit = 5 setze funktioniert es. Nur mit dem hochzählen möchte es noch nicht so ganz.
Nur mit dem hochzählen möchte es noch nicht so ganz.
Edit: quark, bin etwas daneben.
du arbeitest ja erst Main1 ab, dann kommt Main2 und dann Main3. dann immer abwechselnd Main2 und Main3. in Main3 incrementierst du Zeit (Zeit+1) nach 100ms, dann kommt wieder Main2 und wieder Main3.
da wird nirgends mit nem "IF Zeit = 5 Then Zeit =0" Zeit zurückgesetzt.
auserdem ist Zeit nirgends ein Wert zugewiesen. du solltest in Main1 "Zeit=0" schreiben.
Die meisten Do-Loops kannst du dir auch spaaren, da das Programm da nie hinkommt (davor wird mit Goto gesprungen)
$regfile = "m16def.dat"
$crystal = 16000000
Config Porta.0 = Output
Config Portd.7 = Output
Config Pina.2 = Input
Dim Zeit As Byte
Dim A As Byte
Dim Main2 As Long
Dim Main1 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:
Do
If Pina.2 = 0 Then
Goto Main3
Else
Zeit=0
End if
Loop
Main3:
Do
Waitms 100
Zeit = Zeit + 1
If Zeit = 5 Then
Porta.0 = 1
Waitms 3000
Porta.0 = 0
End If
Waitms 3000
Goto Main2
Blamaster
19.12.2007, 19:56
Wie würde sich das Problem denn jetzt lösen lassen ?
hrmpf, ich hab heute schon zuviel gedacht /-)
ich hab nochmal was editiert, wenn das nicht geht, bin ich mit meinem Latein am Ende.
Blamaster
19.12.2007, 20:03
Gibt fehler weil Loop fehlt.
ja, da war ein Do zuviel:
$regfile = "m16def.dat"
$crystal = 16000000
Config Porta.0 = Output
Config Portd.7 = Output
Config Pina.2 = Input
Dim Zeit As Byte
Dim A As Byte
Dim Main2 As Long
Dim Main1 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:
Do
If Pina.2 = 0 Then
Goto Main3
Else
Zeit=0
End if
Loop
Main3:
Waitms 100
Zeit = Zeit + 1
If Zeit = 5 Then
Porta.0 = 1
Waitms 3000
Porta.0 = 0
End If
Waitms 3000
Goto Main2
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.