Archiv verlassen und diese Seite im Standarddesign anzeigen : 4-fach Dipschalter 1Led
Malte0815
03.04.2010, 15:28
Hallo,
ich versuche gerade ein eigentlich einfaches Programm zu schreiben doch es gelingt mir nicht;).
Eine Led soll eingeschaltet werden sobald einer der Dip-Schalter eingeschaltet wird. Danach soll die Led einfach nur an bleiben egal wie die Schalter hin und her geschaltet werden solange nur ein Dip auf on steht. Sobald dann alle Schalter Off sind soll die Led aus gehen.
Ich habe es bereits mit dem Debounce-Befehl versucht aber irgendwas ist nicht korrekt da bei verschiedenen Schalterkombinationen die Led unterschiedlich schnell an und aus geht. Ich denke es hat was mit den 25ms zu tun die gewartet werden.
Ich weiß für diese Aufgabe bräuchte man eigentlich keinen µC aber jeder Schalter soll später auf einem LCD mit "ON" "OFF" angezeigt werden.
Hier mal mein Versuch:
$regfile = "M8def.dat"
$crystal = 1000000
Config Portc = Input
Dip1 Alias Pinc.0
Dip2 Alias Pinc.1
Dip3 Alias Pinc.2
Dip4 Alias Pinc.3
Portc = 1
Config Portd.0 = Output
Led Alias Portd.0
Do
Debounce Dip1 , 0 , Led_on , Sub
Debounce Dip1 , 1 , Led_off , Sub
Debounce Dip2 , 0 , Led_on , Sub
Debounce Dip2 , 1 , Led_off , Sub
Debounce Dip3 , 0 , Led_on , Sub
Debounce Dip3 , 1 , Led_off , Sub
Debounce Dip4 , 0 , Led_on , Sub
Debounce Dip4 , 1 , Led_off , Sub
Loop
End
Led_on:
Led = 0
Return
Led_off:
Led = 1
Return
Mit if-then Schleifen hab ich es auch schon probiert aber ich denke das ist zu umständlich und funktioniert hat es nicht richtig da die Led beim Schalten in der Helligkeit variiert hat.
Kannste das nicht mit einer IF schleife machen?
Also das du eigentlich 5 IF schleifen machst z.B. so:
If Dip1 = 1 then LED = 1 else LED = 0
If Dip2 = 1 then LED = 1 else LED = 0
If Dip3 = 1 then LED = 1 else LED = 0
If Dip3 = 1 then LED = 1 else LED = 0
If Dip1 and Dip2 and Dip3 and Dip4 = 1 then LED = 1 else LED = 0
Also die LED legst du dann an 5V und schaltest per Controller dann gegen Ground.
Würde sowas nicht gehen? Wieso verändert sich den da die Helligkeit?
Ist doch klar das die LED flackert/gedimmt ist, weil sie ständig an und wieder aus geschaltet wird! Das selbe Problem wird es bei der Version von "Kampi" auch geben.
Und es gibt keine If-Schleifen!
Mmmmh mir wurd immer inner Schule gesagt bei der PHP Programmierung das es If-Else Schleifen sind :D
Malte0815
03.04.2010, 16:09
Ja genau das ist das Problem. Aber wie könnte ich es nun machen?
Die Eingänge die als nächstes nach dem 1. Einschalten der LED geschaltet werden müssten ja irgendwie ignoriert werden. Vielleicht könnt ihr mir einen Denkanstoß geben?!
Hallo Malte0815,
hiermit
PortC = 1
schaltest du nur den PullUp von PortC.0 ein. Mach es mal so:
PortC = 15
das schaltet die PullUps von PortC.0 - PortC.3 ein.
Ich würde die Abfrage so machen:
Dim Dips As Byte
Do
Dips = PinC And &b0000_1111 'du willst ja nur die unteren 4 Pins
If Dips = 15 Then
LED = 1
Else
LED = 0
End If
Loop
Edit: Ich hatte übersehen, dass die Dip-Schalter gegen GND schalten. Ist ja klar, mit PullUps.
Wie wärs so:
WENN dip1 ODER dip2 ODER dip3 ODER dip4 = 1 DANN led = 1
SONST led = 0
So sollte es gehen.
Malte0815
03.04.2010, 16:46
MMhhh...
hab beides probiert.
Die "OR"-Funktion wird gar nicht als solche im Bascom erkannt? Gibt es da eine besondere Programmierweise? Diese Idee hatte ich auch schon aber ich konnte sie nicht umsetzten. Ich habs so probiert:
If Dip1 = 1
or
Dip2 = 1
or
Dip3 = 1
or
Dip4 = 1 Then
Led = 0
Else
Led = 1
End If
@ for_ro
Ist hier noch irgendwo ein Fehler versteckt......die Led reagiert hier gar nicht:
$regfile = "M8def.dat"
$crystal = 1000000
Dips Alias Portc
Dips = Portc And &B0000_1111 'du willst ja nur die unteren 4 Pins
Portc = 15
Config Portd = Output
Led Alias Portd.0
Do
If Dips > 0 Then
Led = 1
Else
Led = 0
End If
Loop
Weiss ich nicht, bin kein Basic Programmierer, aus gutem Grund...
Dann musst dus halt mit IF und ElseIf machen.
peterfido
03.04.2010, 17:13
Wenn die Dip auf GND ziehen und sonst per PullUp High sind:
dim b as byte
b=PINC
b=b AND &b00001111
if b = 15 then
reset led
else
set led
end if
Sollte so laufen. Ist nur aus dem Kopf und ungetestet...
edit: hm bin wohl eben blind gewesen. So ähnlich steht es schon weiter oben, wo der Unterstrich zuviel ist.
@peterfido
Das wird es auch nicht sein was er will.
Und nein, da steht was anderes, mit dem entscheidenden Unterschied.
Malte0815
03.04.2010, 17:22
Vielen Dank für eure Tipps.
Ich hab es nun hinbekommen obwohl ich eigentlich mit einem anderen Ergebnis bei diesem Versuch gerechnet habe. Ich hab wohl den "AND" Befehl noch nicht richtig verstanden???? Eigentlich dachte ich das die LED erst an geht wenn alle Schalter auf ON sind aber es funktioniert so wie ich es brauche.
Do
If Dip1 = 1 And Dip2 = 1 And Dip3 = 1 And Dip4 = 1 Then
Led = 1
Else
Led = 0
End If
Loop
End
Ich werd es aber auch nochmal mit den anderen Versionen von euch probieren um noch ein bisschen Übung mit den Variablen zu bekommen:).
peterfido
03.04.2010, 17:30
Naja, viele Wege führen nach Rom...
Schlecht , aber funktional:
dim b as byte
b=4
b=b-dip1
b=b-dip2
b=b-dip3
b=b-dip4
if b>0 then
set led
else
reset led
endif
Wenn es nur um logische Verknüpfungen geht:
Ob Bascom ohne Zwischenschritte
if dip1 = 1 and dip2 = 1 and dip3 =1 and dip4 = 1 then
reset led
else
set led
endif
macht, weiß ich grad nicht. Sitze nicht am ArbeitsPC, sondern im Wohnzimmer mit dem Lappi...
Anders ausgedrückt müsste auch
if dip1=0 or dip2=0 or dip3=0 or dip4=4 then
set led
else
reset led
endif
laufen.
edit: Zu lange mit dem Tippen gebraucht...
Versuch mal:
Do
If Dip1 And Dip2 And Dip3 And Dip4 = 1 Then
Led = 1
Else
Led = 0
End If
Loop
End
Gehen sie so auch noch alle an wenn nciht alle Schalter On sind?
peterfido
03.04.2010, 17:35
Bascom braucht meine ich die ausgeschriebene Weise.
If Dip =1 And...
Habe ich Anfangs auch so versucht gehabt, weil ich es bei VB auch immer so mache...
Malte0815
03.04.2010, 17:51
Ist euch eigentlich aufgefallen das die 'Forumuhr' noch auf Winterzeit steht. Zumindest lassen das die Zeiten der Beiträge vermuten (oder ist das nur bei mir aufm Apfel-phone so?) :))
@Del
den Code hatte ich ja auch schon gepostet und er funktioniert. Sobald ein Schalter on ist, ist die LED an...egal welchen ich betätige und sie geht erst wieder aus wenn alle dips auf off sind.
peterfido
03.04.2010, 18:01
Die 17:51 Uhr Deines Posts passen doch...
Malte0815
03.04.2010, 18:29
Dein letzter post ist bei mir 17:01. Ist ja auch sch... egal;).
Frohe Ostern.
man man man ... if-schleifen, wo gibts denn sowas ... argh.
Das sind Programmverzweigungen.
Schleifen sind For - Next, Do Loop, while wend
zum Thema:
dim hifsvar as byte
do
hilfsvar = pinc and &b00001111
if hilfsvar > 0 then
reset led
else
set led
endif
loop
peterfido
03.04.2010, 21:49
So ähnlich wie mein Vorschlag von 17:13 Uhr aber deins wäre richtig, wenn die PullUps nicht genutzt werden und meins, bei genutzen Pullups so wie es im ersten Post vermuten lässt.
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.