-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 20

Thema: 4-fach Dipschalter 1Led

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    20.01.2008
    Beiträge
    66

    4-fach Dipschalter 1Led

    Anzeige

    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:
    Code:
    $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.

  2. #2
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    27
    Beiträge
    3.517
    Blog-Einträge
    9
    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?

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    15.03.2010
    Beiträge
    94
    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!

  4. #4
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    27
    Beiträge
    3.517
    Blog-Einträge
    9
    Mmmmh mir wurd immer inner Schule gesagt bei der PHP Programmierung das es If-Else Schleifen sind

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    20.01.2008
    Beiträge
    66
    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?!

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.112
    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:
    Code:
    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.

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    15.03.2010
    Beiträge
    94
    Wie wärs so:

    WENN dip1 ODER dip2 ODER dip3 ODER dip4 = 1 DANN led = 1
    SONST led = 0

    So sollte es gehen.

  8. #8
    Benutzer Stammmitglied
    Registriert seit
    20.01.2008
    Beiträge
    66
    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:
    Code:
    $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

  9. #9
    Benutzer Stammmitglied
    Registriert seit
    15.03.2010
    Beiträge
    94
    Weiss ich nicht, bin kein Basic Programmierer, aus gutem Grund...
    Dann musst dus halt mit IF und ElseIf machen.

  10. #10
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    18.05.2007
    Ort
    Berlin
    Alter
    46
    Beiträge
    765
    Wenn die Dip auf GND ziehen und sonst per PullUp High sind:

    Code:
    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.
    Wenn das Herz involviert ist, steht die Logik außen vor! \/

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •