- Akku Tests und Balkonkraftwerk Speicher         
Seite 1 von 7 123 ... LetzteLetzte
Ergebnis 1 bis 10 von 62

Thema: Drei Led´s mit einem Taster unabhängig von einander schalten

  1. #1
    Benutzer Stammmitglied Avatar von p@ty
    Registriert seit
    05.06.2011
    Ort
    Bottrop
    Beiträge
    51

    Drei Led´s mit einem Taster unabhängig von einander schalten

    Anzeige

    Praxistest und DIY Projekte
    Hallo zusammen,

    habe da mal einige Fragen zu unten stehendem Code.
    Kurz vor weg:

    Es geht, wie schon im Titel beschrieben, darum drei Led´s unabhängig von einander mit einem Taster zu schalten.

    Wird der Taster kurz betätigt soll eine von den 3 Led´s leuchten.
    Wird der Taster länger betätigt (>=2sek) soll in eine Subroutine gesprungen werden in der je
    nach dem wie lange der Taster betätigt wird (>=2 , >=4 , >=6sek) eine von den 3 Led´s ausgewählt wird.
    Danach soll wieder in´s Hauptprogramm gesprungen werden in dem ich die ausgewählte Led 1 oder 2 oder 3
    mit dem Taster an und ausschalten kann.

    Ich bin noch ein ziemlicher Anfänger im Programmieren und würde mich über jede Hilfe freuen!
    weiterhin habe ich mit der Timerkonfiguration auch noch Probleme und benötige da eure Unterstützung.

    Vielen Dank schon mal für eure Hilfe!
    Viele Grüße,
    Patrick

    Hier meine Bastellei...:

    $regfile = "m168def.dat"
    $crystal = 16000000
    $hwstack = 100
    $swstack = 100
    $framesize = 100

    'Pin- Portkonfiguration Outputs
    Config Portd.2 As Output
    Led1 Alias Portd.2
    Led1 = 0

    Config Portd.3 As Output
    Led2 Alias Portd.3
    Led2 = 0

    Config Portd.4 As Output
    Led3 Alias Portd.4
    Led3 = 0

    'Pin- Portkonfiguration Inputs
    Config Pind.5 As Input
    Taster Alias Pind.5
    Taster = 1

    Config Timer0 As Timer , Prescale? , sonstige Einstellungen für einen Sekundentimer???

    Enable Timer0
    Enable Interrupts

    Dim A As Byte 'Lichtszenario
    Dim B As Byte 'Lichtszenario- Auswahl
    Dim C As Byte 'Timervariable

    Timer0 = C
    Stop C

    Declare Sub Lichtszenen (byval B As Byte)


    'Hauptprogramm
    Do

    C = 0 'Timer0 = 0

    If Taster = 0 Then 'Wenn Taster gedrückt wird dann...
    Start C 'soll Timer0 starten...
    A = B 'und das Szenario ausgewählt werden.
    Else 'Sonst ist...
    A = 0 'A = 0 und...
    Stop C 'der Timer0 wird gestoppt...
    C = 0 'und auf null zurück gesetzt.
    End IF

    If C >= 2 Then 'wenn Timer0 >= 2sek ist dann...
    Call Lichtszenen 'sprung in die Subroutine.
    End IF

    Loop
    End

    'Unterprozedur
    Sub Lichtszenen

    If Taster = 0 Then start C 'wenn Taster gedrückt wird start Timer0.
    If C >= 2 Then B = 0 'wenn Timer0 >= 2sek dann ist B = 0
    If B = 0 Then 'wenn B = 0 dann...
    Led1 = 1
    Led2 = 0
    Led3 = 0
    End If

    If C >= 4 Then B = 1 'wenn Timer0 >= 4sek dann ist B = 1
    If B = 1 Then 'wenn B = 1 dann...
    Led1 = 0
    Led2 = 1
    Led3 = 0
    End If

    If C >= 6 Then B = 2 'wenn Timer0 >= 6sek dann ist B = 2
    If B = 2 Then 'wenn B = 2 dann...
    Led1 = 0
    Led2 = 0
    Led3 = 0
    End IF

    End Sub
    Geändert von p@ty (11.03.2013 um 14:06 Uhr)

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    706
    Wieviele Bildschirme voller Fehlermeldungen spuckt Bascom denn aus, wenn Du versuchst diesen Code zu kompiliern?

    Fangen wir mal oben an:

    Config PORTD.2 AS Output dürfte Bascom nicht verstehen. Es muss heißen Config PORTD.2 = Output.

    Gleiches gilt für Config Pind.5 As Input - Config PIND.5 = Input wäre korrekt. Ist aber überflüssig, weil alle I/O-Ports nach dem Einschalt-Reset ohnehin als Eingänge konfiguriert sind.

    Enable Timer0
    Enable Interrupts
    Ist zwar von der Syntax her richtig, aber ebenfalls unnötig, da Du ja nicht mit Timer-Interrupts arbeitest.

    Timer0 = C
    führt nur dazu, dass Timer0 den Wert der Variablen C annimmt (hier also 0). Sowas wie die Alias-Funktion ist das aber nicht!
    Stop C funktioniert daher nicht, und müsste die nächste Fehlermeldung produzieren. Hier musst Du start timer0 bzw. stop timer0 verwenden.

    Die Hauptschleife versteh´ ich zwar nicht so ganz, aber eines ist klar: Auch wenn Du das "C" durch timer0 ersetzen würdest, würde der Timer immer wieder am Anfang der Hauptschleife auf 0 gesetzt werden. Das heißt, er kann gar nicht hochzählen!

    Und in der Subroutine hast Du oft eine Reihe von IFs, die nur mit einem End if abgeschlossen werden. Das geht auch nicht - für jedes If muss ein End if kommen!

    Wie wär´s denn, wenn Du vielleicht erstmal mit einem etwas einfacheren Projekt erste Gehversuche unternimmst? Ich weiß - ich war am Anfang auch schrecklich ungeduldig und wollte gleich alles auf einmal machen - aber so ganz ohne minimale Kenntnisse was die Syntax und den Aufbau von Bascom anbetrifft, kommt man halt meistens überhaupt zu nix...
    Und Du wirst sehen - wenn Dir die "Basics" erstmal geläufig sind (z.B. wie ein Interrupt funktioniert, wie man Timer konfiguriert etc., etc) geht der Rest wie von alleine! Und: Hier wirst Du immer geholfen

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.703
    Blog-Einträge
    133
    Zitat Zitat von p@ty Beitrag anzeigen
    weiterhin habe ich mit der Timerkonfiguration auch noch Probleme und benötige da eure Unterstützung.
    Zur Timerkonfiguration in Bascom nehme ich immer das Datenblatt und den Simulator zur Hilfe. Im Simulator kann man sehen, welche Register mit welchen Werten bei dem CONFIG TIMER Kommando belegt werden und dann mit dem Datenblatt vergleichen.

    COMPARE1A = 15624
    beschreibt OCR1A (OCR1AH, OCR1AL) mit 15624

    CONFIG TIMER1 = TIMER , PRESCALE = 1024 , CLEAR TIMER = 1
    Versetzt den Timer in den CTC Modus und startet ihn auch. Bei Erreichen von Timerstand 15624 wird der Timerstand wieder auf 0 gesetzt und zählt wieder hoch.

    Wenn der Timerstand 15624 erreicht, wird das COMPARE1A Flag gesetzt.

    Zitat Zitat von p@ty
    Code:
    'Pin- Portkonfiguration Inputs
    Config Pind.5 As Input
    Taster Alias Pind.5
    Taster = 1
    Damit möchtest du vermutlich den Pullup Widerstand einschalten?
    Da Taster aber den PIND.5 darstellt funktioniert das nicht. Für Einschalten des Pullup muß bei einem als Input konfigurierten Pin das Bit im PORT Register mit 1 beschrieben werden. Also: Statt "Taster = 1" muß es "PORTD.5 = 1" sein.
    (Daß das Config Pind.5 Kommando einen Syntaxerror hat, hat Sauerbruch schon drauf hingewiesen)

    Gruß
    Searcher
    Geändert von Searcher (11.03.2013 um 16:59 Uhr)
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  4. #4
    Neuer Benutzer Öfters hier Avatar von Spitfire
    Registriert seit
    09.07.2012
    Ort
    Niederösterreich
    Beiträge
    28
    Hallo P@ty !!!

    In Sachen Bascom kann ich dir leider nicht viel helfen, aber vieleicht in der grundlegenden Herangehensweise.
    Zur Abfrage des Pin`s, wie lange er High, bzw. low ist würde ich eine Schleife Prgrammieren. Solange der Pin den gewünschten zustand hat, durchläft das Programm immer wieder die Schleife. Bei jedem Schleifendurchlauf wird ein Zähler um eins erhöht. Dadurch bekommst du in dem Zähler einen Wert der von der Dauer des Tastendrucks abhängig ist. Diesen Zählerstand kannst du dann Abfragen, und je nach Höhe, die jeweilige LED ein, oder ausschalten. Ich habe dieses Prinzip zur Abfrage eines PWM-Signales eines Empfängers für Modellflugzeuge angewannt. Funktioniert Tadellos. Was vieleicht noch zu beachten währe, ist, dass bei eienem Zeitraum von mehreren Sekunden ein Register als Zäler nicht ausreicht, weil mehr als 254 durchläufe stattfinden. Eventuell bei einem Überlauf des Zählers, ein zweites Register mitzählen lassen, wieviele Überläufe stattgefunden haben. Nur das mit dem Zweiten Zähler (Register) war bei der PWM Abfrage nicht notwendig, da das Signal nur ungefähr 20ms Sekunden lange ist. Es entstehen aber immer noch Werte von 8oo bis 1ooo bei einer Taktfrequenz von 4Mhz.

    Gruß
    Spitfire

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.703
    Blog-Einträge
    133
    Mir fällt noch was ein: Zum Taster Abfragen eignet sich das DEBOUNCE Kommando gut.
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  6. #6
    Benutzer Stammmitglied Avatar von p@ty
    Registriert seit
    05.06.2011
    Ort
    Bottrop
    Beiträge
    51
    Hallo zusammen!!
    Vielen Dank für eure schnellen Anworten und Infos!

    @ Sauerbruch: Waren ne´ ganze Menge Fehlermeldungen!
    Aber auch der Ansatz das ich mich mit der Grundlegenden Struktur zur Konfiguration von Timern ect mehr befassen sollte war richtig!!!
    Warum ich allerdings die Ports noch falsch konfigurierte ist mir ein Rätsel...
    Sicher weil ich den Code oben im Win Texteditor, heute auf der Arbeit aus´m Kopp eingehackt habe...
    Habe den Timer dann kurzerhand weg gelassen und es auf anderem Wege probiert.
    Das aber für jedes If ein End If kommen muss ist nicht ganz richtig...
    Wenn man die gesamte Befehlsfolge in eine Reihe schreibt tut´s trozdem!

    Habe mir auch schon etwas Lektüre angelesen und etliche Schaltungen aufgebaut und den passenden Code dazu abgetippt.
    -Aber halt nur abgetippt, was nicht immer viel Aufschluss über die Herangehensweise brachte...
    Denke da muss man wie so oft im Leben einfach ausdauernd am Ball bleiben und viel ausprobieren.

    Unten noch ein anderer Code der zum Erfolg geführt hat...(warum auch immer)
    Kann mir da manche Sachen einfach nicht erklären....zB das byval B... in der Unterprozedur nutze ich die Variable A....
    Wenn ich aber Declare Sub Lichtszenen(byval A As Byte) schreibe dann funzt es nicht mehr...
    Naja, muss ich noch en´ paar Versuche starten! Macht ja richtig Laune!!

    Vielen Dank nochmal an euch alle und auch an Kampi für seine tollen Tipps!
    Bin für Verbesserungen / Vereinfachungen und weitern Tipps sehr dankbar!
    Viele Grüße,
    P@ty


    Hier der Anfängercode der wohl für ein geübtes Auge schlimmer nicht sein könnte...

    $regfile = "M168def.dat"
    $crystal = 16000000
    $hwstack = 100
    $swstack = 100
    $framesize = 100
    $baud = 9600


    'Pin- Portkonfiguration Outputs
    Config Portc.0 = Output
    Led1 Alias Portc.0
    Portc.0 = 0

    Config Portc.1 = Output
    Led2 Alias Portc.1
    Portc.1 = 0

    Config Portb.1 = Output
    Led3 Alias Portb.1
    Portb.1 = 0

    'Pin- Portkonfiguration Inputs
    Config Pind.4 = Input
    Taster Alias Pind.4
    Portd.4 = 1

    Dim A As Byte
    Dim X As Word

    Declare Sub Lichtszenen(byval B As Byte)


    'Hauptprogramm
    Do


    If Taster = 0 Then 'Wenn Taster = 0 dann...
    Incr X 'X incrementieren...
    Print X 'sonst X = 0
    Else
    X = 0
    End If

    If X >= 200 Then 'Wenn X >= 200ms dann...
    Gosub Lichtszenen 'Sprung in Unterprozedur Lichtszene
    End If

    If A = 1 And Taster = 0 Then 'Wenn Variable A = 1 und Taster = 0 dann...
    Led1 = 1 'Led1 an
    Led2 = 0
    Led3 = 0
    Elseif Taster = 1 And A = 1 Then 'Led1 aus
    Led1 = 0
    Led2 = 0
    Led3 = 0
    End If

    If A = 2 And Taster = 0 Then 'Wenn Variable A = 2 und Taster = 0 dann...
    Led1 = 0 'Led2 an
    Led2 = 1
    Led3 = 0
    Elseif Taster = 1 And A = 2 Then 'Led2 aus
    Led1 = 0
    Led2 = 0
    Led3 = 0
    End If

    If A = 3 And Taster = 0 Then 'Wenn Variable A = 3 und Taster = 0 dann...
    Led1 = 0 'Led3 an
    Led2 = 0
    Led3 = 1
    Elseif Taster = 1 And A = 3 Then 'Led3 aus
    Led1 = 0
    Led2 = 0
    Led3 = 0
    End If

    Loop

    End

    'Unterprozedur
    Sub Lichtszenen

    If Taster = 0 Then Incr X 'Wenn Tatser = 0 dann Incrementiere X
    If X >= 200 Then A = 1 'Wenn X >= 200ms dann Variable A = 1
    If A = 1 Then 'Wenn A = 1 dann...
    Led1 = 1
    Led2 = 0
    Led3 = 0
    End If


    If X >= 750 Then A = 2
    If A = 2 Then 'Wenn X >= 750ms dann Variable A = 2
    Led1 = 0 'Wenn A = 2 dann...
    Led2 = 1
    Led3 = 0
    End If


    If X >= 1250 Then A = 3 'Wenn X >= 1250ms dann Variable A = 3
    If A = 3 Then 'Wenn A = 3 dann...
    Led1 = 0
    Led2 = 0
    Led3 = 1
    End If


    If Taster = 1 Then 'Wenn Taster losgelassen wird dann...
    Led1 = 0
    Led2 = 0
    Led3 = 0

    End Sub
    End If

  7. #7
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    34
    Beiträge
    3.501
    Blog-Einträge
    9
    Hey,

    setzt den Code im Forum bitte zwischen

    ["code"]["/code"]

    Tags (ohne die ""). Das macht die Sache etwas kürzer etc.

    - - - Aktualisiert - - -

    Hey,

    so ich habe deinen Code mal etwas gekürzt und optimiert.....

    Code:
    $regfile = "M168def.dat"
    $crystal = 16000000
    $hwstack = 100
    $swstack = 100
    $framesize = 100
    
    
    'Pin- Portkonfiguration Outputs
    Config Portc.0 = Output
    Led1 Alias Portc.0
    Portc.0 = 0
    
    
    Config Portc.1 = Output
    Led2 Alias Portc.1
    Portc.1 = 0
    
    
    Config Portb.1 = Output
    Led3 Alias Portb.1
    Portb.1 = 0
    
    
    'Pin- Portkonfiguration Inputs
    Config Pind.4 = Input
    Taster Alias Pind.4
    Portd.4 = 1
    
    
    Dim A As Byte
    Dim X As Word
    
    
    Declare Sub Lichtszenen(byval B As Byte)
    Declare Sub Muster_zeigen()
    
    
    'Hauptprogramm
    Do
    
    
    If Taster = 0 Then                                          'Wenn Taster = 0 dann...
       Incr X                                                   'X incrementieren...
       Waitms 10                                                ' -> neu, da du 2s warten willst ist vlt ein Delay für 10ms ganz gut
    Else
       X = 0
    End If
    
    
    If X >= 200 Then                                            'Wenn X >= 2s dann...
       X = 0                                                    'X vor dem Sprung reseten, damit wieder von 0 angefangen wird zu zählen
       Gosub Lichtszenen                                        'Sprung in Unterprozedur Lichtszene (200ms einen Taster drücken ist bischen kurz ;) )
    End If
    
    
    If Taster = 0 Then                                          'Taster gedrückt?
       Select Case A:                                           'Auf welchen Wert steht A
          Case 1 : Led1 = 1                                     'LED 1 an
                   Led2 = 0
                   Led3 = 0
          Case 2 : Led1 = 0                                     'LED 2 an
                   Led2 = 1
                   Led3 = 0
          Case 3 : Led1 = 0                                     'LED 3 an
                   Led2 = 0
                   Led3 = 1
       End Select
    Else                                                        'Taster nicht gedrückt
       Led1 = 0
       Led2 = 0
       Led3 = 0
    End If
    
    
    Loop
    End
    
    
    
    
    
    
    
    
    'Unterprozedur
    Sub Lichtszenen
    
    
       While Taster = 1                                         'Warten bis der Taster gedrückt wird
          Waitms 1
       Wend
    
    
       If Taster = 0 Then                                       'Wenn Taster = 0 dann Incrementiere X
          Incr X
          Waitms 10
       Else
          Led1 = 0
          Led2 = 0
          Led3 = 0
          Return
       End If
    
    
       If X >= 200 Then                                         'X überprüfen und A setzen
          A = 1
       Elseif X >= 750 Then
          A = 2
       Elseif X >= 1250 Then
          A = 3
       End If
    
    
       Select Case A:                                           'A überprüfen
          Case 1: Led1 = 1
                   Led2 = 0
                   Led3 = 0
          Case 2 : Led1 = 0
                   Led2 = 1
                   Led3 = 0
          Case 3 : Led1 = 0
                   Led2 = 0
                   Led3 = 1
       End Select
    
    
    End Sub
    Schaut ruhig mal auf meiner Homepage vorbei :
    http://kampis-elektroecke.de

    Oder folge mir auf Google+:
    Daniel Kampert

    Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.

    Gruß
    Daniel

  8. #8
    Benutzer Stammmitglied Avatar von p@ty
    Registriert seit
    05.06.2011
    Ort
    Bottrop
    Beiträge
    51
    Hey Kampi!
    Schläfst du auch mal??

    Okay, Danke! Bin gespannt wie dieser Code läuft!

    Viele Grüße,
    P@ty

  9. #9
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    34
    Beiträge
    3.501
    Blog-Einträge
    9
    Konnte gestern nicht schlafen
    Von daher habe ich noch bisl gesurft und schon mal angefangen deinen Code bisschen zu sortieren und ein paar gefundene Fehler auszubessern.
    Getestet isser noch nicht.....muss auch erst mal schauen wie ich das auf meine Hardware übertragen kann
    Schaut ruhig mal auf meiner Homepage vorbei :
    http://kampis-elektroecke.de

    Oder folge mir auf Google+:
    Daniel Kampert

    Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.

    Gruß
    Daniel

  10. #10
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.703
    Blog-Einträge
    133
    Hallo,
    ich würde in der Hauptschleife nur feststellen (mit DEBOUNCE) ob der Taster gedrückt wurde.
    In der Subroutine dann feststellen wie lange er gedrückt wird und in der gleichen Routine danach die LEDs
    entsprechend schalten. Etwa so:

    Code:
    Hauptschleife
      Taste gedrückt, dann Subroutine aufrufen
    Ende Haupschleife
    
    Subroutine:
      Solange die Taste gedrückt ist, wird eine WORD-Variablen in 10ms Schritten hochgezählt.
      Taste nicht mehr gedrückt, dann "WORD-Variable = WORD-Variable / 100" - ergibt ganzahlige Sekunden
      Mit SELECT CASE je nach Drückdauer die LEDs schalten und in einem Flag die eingeschaltete LED Nummer speichern
      In dem CASE für kurze Drückdauer eine weitere SELECT CASE Anweisung in der das Flag abgefragt wird und die entsprechende LED getoggelt wird.
    RETURN (Subroutine Ende, Rücksprung in Hauptschleife)
    Schönheitsfehler: Solange die Taste gedrückt ist, wird übriges Programm aufgehalten. Sollte hier aber keine Rolle spielen.

    Gruß
    Searcher
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

Seite 1 von 7 123 ... LetzteLetzte

Ähnliche Themen

  1. Roboter mit einem Taster an und aus schalten!?
    Von Bammel im Forum Elektronik
    Antworten: 56
    Letzter Beitrag: 10.02.2010, 18:53
  2. Antworten: 11
    Letzter Beitrag: 31.01.2010, 16:25
  3. Einfach nur mit Taster eine LED ein und aus schalten ?
    Von Ferdinand im Forum Assembler-Programmierung
    Antworten: 2
    Letzter Beitrag: 13.06.2008, 09:08
  4. LED mit Taster ein/aus schalten
    Von sampe im Forum Elektronik
    Antworten: 8
    Letzter Beitrag: 16.09.2006, 10:55
  5. Problem mit LED´s an Output Matrix und einem Taster
    Von MrQu im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 6
    Letzter Beitrag: 16.10.2005, 18:13

Berechtigungen

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

Solar Speicher und Akkus Tests