PDA

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

AlKI
19.12.2007, 14:06
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 ?

AlKI
19.12.2007, 14:10
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.

Jaecko
19.12.2007, 15:17
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.

AlKI
19.12.2007, 15:51
Ö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.

AlKI
19.12.2007, 16:17
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

AlKI
19.12.2007, 16:37
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.

AlKI
19.12.2007, 16:49
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.

AlKI
19.12.2007, 17:07
??? 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.

AlKI
19.12.2007, 19:49
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 ?

AlKI
19.12.2007, 20:00
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.

AlKI
19.12.2007, 20:04
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