- fchao-Sinus-Wechselrichter AliExpress         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 62

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

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  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

    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 15: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 17: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
    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
    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.
    Könntest Du nochmal erklären, wie Dein Programm arbeiten soll. Aus Deiner Beschreibung und Deinem Code hab ich mal Folgendes interpretiert:

    Wenn die Schaltung mit µC und LEDs eingeschaltet wird, leuchtet keine LED !?
    Wenn Taster kürzer zwei Sekunden (nach Einschalten) gedrückt wird, wird LED1 eingeschaltet. Nochmal kurz gedrückt schaltet sie wieder aus und so fort.

    Wird der Taster zwei Sekunden und kürzer als vier Sekunden gedrückt wird, wird LED2 eingeschaltet und alles andere ausgeschaltet. Wird danach immer nur kürzer als zwei Sekunden gedrückt, wird LED2 aus-, eingeschaltet, also getoggelt.

    Wird Taster vier Sekunden und kürzer als sechs Sekunden lang gedrückt, wird LED3 eingeschaltet und alles andere ausgeschaltet. Mit kurzen Tastendrücken wird die LED3 nun immer aus- und eingeschaltet.

    Wird Taster sechs Sekunden und länger gedrückt, wird alles ausgeschaltet. Folgende kurze Tastendrücke schalten LED1 an und aus.


    In Deinem zuletzt geposteten Programm kann ich nicht erkennen, wie Du die Sekunden mißt. Die Kommentare im Code sind nichtssagend und wiederholen eigentlich nur die Kommandos. Da sollten eigenlich kurze Erläuterungen stehen, warum etwas an der Stelle so gemacht wird.

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

  8. #8
    Benutzer Stammmitglied Avatar von p@ty
    Registriert seit
    05.06.2011
    Ort
    Bottrop
    Beiträge
    51
    Hi Searcher,

    wird der µC bestromt passiert nix, richtig.
    Wird der Taster kurz gedrückt auch nichts. Erst wenn er >=200ms gehalten wird , wird in die Unterprozedur gesprungen.
    Da wird dann als erstes Led1 eingeschaltet und die Variable A = 1 eingestellt. Lasse ich den Taster jetzt los gehts wieder zurück in die Hauptschleife. Dort wird mit dem IF- Befehl abgefragt welchen Wert A und der Taster hat. In diesem Beispiel wäre bei A = 1 + Taster = 0 die
    Led1 = 1. Sonst wenn A = 1 + Taster = 1 wird Led1 = 0
    Die Led1 leuchtet also nur so lange wie der Taster gedrückt wird.

    Wird nach dem Sprung in die Unterprozedur der Taster weiterhin gedrückt gehalten, werden die 3 Led´s erst einzeln und dann als Szenarien durchgeschaltet. Also erst Led1 dann Led2 dann Led3.
    Wird der Taster jetzt noch weiter gehalten dann Led1 + Led2 dann Led1 + Led3 dann Led2 + Led3 dann als letztes Led1 + Led2 + Led3. Bei jeder Änderung des Schaltzustandes ändert sich auch die Variable A. Beim los lassen des Tasters wird zurück in´s Hauptprogramm gesprungen und der Wert der Variablen A mit übergeben und wieder mit IF abgefragt welcher Zustand vorliegt und entsprechend die Led´s geschaltet.

    Hintergrund ist dieser:
    In meinem langen Flur habe ich 18 Deckenspots verbaut. Jeweils 6 hängen zusammen an einem Trafo! Sprich 3 Trafos. (Led1, Led2, Led3)
    Ich möchte mit nur einem Flurtaster alle 3 Tarfos unabhängig von einander aber auch gleichzeitig schalten können. Ich drücke also den Taster, Suche mir gewünschtes Szenario aus, lasse den Taster los und kann mit erneutem kurzem betätigen des Tasters das ausgewählte Lichtszenario schalten. Die Trafos werden über Stromstoßschalter bestromt. Deshalb leuchten die Led´s auch nur wenn der Taster gedrückt ist.

    Hoffe jetzt sind alle Klarheiten beseitigt!

    Vielen dank für Dein Interesse!
    Viele Grüße,
    p@

  9. #9
    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
    Hoffe jetzt sind alle Klarheiten beseitigt!
    Wahrscheinlich . Hab mal was versucht . Was hältst Du davon (Anhang) oder ist das Thema schon abgeschlossen?

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

  10. #10
    Benutzer Stammmitglied Avatar von p@ty
    Registriert seit
    05.06.2011
    Ort
    Bottrop
    Beiträge
    51
    Hey Searcher!

    WOW!
    Vielen Dank für Deine Mühe!!!

    Genau so hatte ich mir das vorgestellet!!!
    Funktioniert großartig!!!
    Macht eigentlich genau das was auch mein ellenlanger Code macht nur sehr viel kompakter!
    Echt klasse das Du das mal so hin gezaubert hast!!

    Werde mir den Code morgen abend genauer anschauen und hoffe das wenn Fragen auftauchen (und das werden sie bestimmt )
    ich Dich noch mal ansprechen darf?

    Viele Dank nochmal und schönen Abend,
    p@



    Viele Grüße,
    P@

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. Roboter mit einem Taster an und aus schalten!?
    Von Bammel im Forum Elektronik
    Antworten: 56
    Letzter Beitrag: 10.02.2010, 19:53
  2. Antworten: 11
    Letzter Beitrag: 31.01.2010, 17: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, 10:08
  4. LED mit Taster ein/aus schalten
    Von sampe im Forum Elektronik
    Antworten: 8
    Letzter Beitrag: 16.09.2006, 11: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, 19:13

Berechtigungen

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

fchao-Sinus-Wechselrichter AliExpress