PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 4-fach Dipschalter 1Led



Malte0815
03.04.2010, 14: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.

Kampi
03.04.2010, 14:45
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?

Del
03.04.2010, 14:57
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!

Kampi
03.04.2010, 15:08
Mmmmh mir wurd immer inner Schule gesagt bei der PHP Programmierung das es If-Else Schleifen sind :D

Malte0815
03.04.2010, 15: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?!

for_ro
03.04.2010, 15:12
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.

Del
03.04.2010, 15:12
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, 15: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

Del
03.04.2010, 15:52
Weiss ich nicht, bin kein Basic Programmierer, aus gutem Grund...
Dann musst dus halt mit IF und ElseIf machen.

peterfido
03.04.2010, 16: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.

Del
03.04.2010, 16:15
@peterfido
Das wird es auch nicht sein was er will.
Und nein, da steht was anderes, mit dem entscheidenden Unterschied.

Malte0815
03.04.2010, 16: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, 16: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...

Del
03.04.2010, 16:31
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, 16: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, 16: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, 17:01
Die 17:51 Uhr Deines Posts passen doch...

Malte0815
03.04.2010, 17:29
Dein letzter post ist bei mir 17:01. Ist ja auch sch... egal;).
Frohe Ostern.

Vitis
03.04.2010, 18:34
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, 20: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.