Guten Abend, Ich möchte eine LED mit einem Taster ein- und wieder ausschalten. Dazu habe ich mir schon einige Varianten angeschaut und auch ein kleines Programm erstellt. Das Problem ist aber, dass die LED nur manchmal an- und wieder ausgeht ich kann wild auf dem Taster rumdrücken doch der Microcontroller reagiert nur manchmal. Für Hilfen wäre ich sehr dankbar!
Wahrscheinlich prellt Dein Taster. Du müsstest Ihn entprellen, dann wirds auch funktionieren. Entprellung Gruß
Ich benutze das Evaluationboard von Pollin da sind die Taster soviel ich weiß entprellt daran kanns auch nicht liegen.
Hast du eine Vorstellung davon, wie oft dein µC die Haupt-while Schleife in der Sekunde so ungefähr durchackert? Das dürfte so ca bei 100_tausend mal in der Sekunde sein. Du hast 2 völlig gleiche Fälle in deinem while
1 | if (TASTER_GEDRUECKT() && (alter_tastenzustand == TASTE_AUF)) |
2 | {
|
3 | // Wechsel von OFFEN nach GESCHLOSSEN
|
4 | LED_AN(LED1); |
5 | alter_tastenzustand = TASTE_ZU; |
6 | }
|
7 | |
8 | if (!TASTER_GEDRUECKT()) |
9 | alter_tastenzustand = TASTE_AUF; |
und
1 | if (TASTER_GEDRUECKT() && (alter_tastenzustand == TASTE_AUF)) |
2 | {
|
3 | // Wechsel von OFFEN nach GESCHLOSSEN
|
4 | LED_AUS(LED1); |
5 | alter_tastenzustand = TASTE_ZU; |
6 | }
|
7 | |
8 | if (!TASTER_GEDRUECKT()) |
9 | alter_tastenzustand = TASTE_AUF; |
10 | }
|
in welchem der beiden jeweils ersten if's du landest wenn du eine Taste drückst ist damit mehr oder weniger zufällig und hängt von der genauen Mykro (nicht Milli!) - Sekunde ab, zu der du die Taste drückst. Du darfst in deiner Schleife nur EINEN Fall haben, der feststellt, dass die Taste gedrückt wurde und dann je nachdem, ob die LED brennt oder nicht, in den jeweils anderen Zustand schalten. (Allerdings ist das nur die halbe Miete. Deine Tasten werden ein wenig prellen und dir das Programm dadurch immer noch versauen. Wenn auch noch nicht perfekt, wird die 1-Abfrage Lösung aber schon mal besser funktionieren als das was du hast)
Ok danke ich dachte ich hätte das Problem gelöst indem ich den Tastenzustand abfrage. Gibt es ein funktionierendes Programm nicht vielleicht bereits? Ich habe schon viel auf dieser Seite und in Google gesucht aber nichts richtiges gefunden.
moin !!! wenns nur eine led sein soll ist n controller garnicht nötig . ein cd4013 beinhaltet zwei d-ff . damit kann man das einfach realisieren . ist sogar entprellt. wenn ich mehrere stoßströmer benötige nehm ich aber ne µsps mit nem atmega32. ist so ähnlich wie ne logo nur im eigenbau . "programmiert" wird graphisch mit eagle + µsps erweiterung. mfg
Johannes schrieb: > Gibt es ein funktionierendes Programm nicht vielleicht bereits? Mit Sicherheit...nur wo. Vorallem bist Du schneller es zu schreiben als es zu suchen. Mach doch einfach mal nur ein if (TASTER_GEDRUECKT() ) und werfe alles andere aus der Main raus. In der IF Abfrage machst Du einfach nur ein Toggeln der LED und ein Delay von ein paar 100ms. Ist zwar nicht schön, aber für den ersten Versuch ok. Gruß
Johannes schrieb: > Ok danke > ich dachte ich hätte das Problem gelöst indem ich den Tastenzustand > abfrage. Das ist ja grundsätzlich auch ok. Nur beackert dein µC im Grundzustand (alter_tastenzustand gleich TASTE_AUF) dieses hier
1 | while(1) |
2 | {
|
3 | |
4 | if (TASTER_GEDRUECKT() && (alter_tastenzustand == TASTE_AUF)) |
5 | {
|
6 | ...
|
7 | }
|
8 | |
9 | ...
|
10 | |
11 | |
12 | if (TASTER_GEDRUECKT() && (alter_tastenzustand == TASTE_AUF)) |
13 | {
|
14 | ...
|
15 | }
|
16 | |
17 | ...
|
18 | }
|
viel zu schnell, als das du mittels Tastendruck auswählen kannst ob jetzt das obere IF wahr wird, oder das untere. Beide IF haben aber exakt die gleiche Abfragebedingung! Und das ist das Dilemma in dem du steckst. Bildlich gesprochen hast du ein Rad mit 2 Speichen, welches sich mit 10000 U/Min dreht und du versuchst mit einer Stange genau eine ganz bestimmte Speiche der beiden zu treffen, weil das das Licht einschaltet während das Treffen der anderen das Licht ausschalten würde. Das wird dir nicht gelingen, damit gezielt dein Licht ein/auszuschalten. du brauchst while( 1 ) { if( Taste gedrückt ) { if( Led an ) schalte LEd aus else schalte Led an alter_tastenzustand = TASTE_ZU } if( Taste losgelassen ) mach deinen Mambo Zambo mit alter_tastenzustand }
dolf schrieb: > wenns nur eine led sein soll ist n controller garnicht nötig . > ein cd4013 beinhaltet zwei d-ff . > damit kann man das einfach realisieren . Oder mit 4 NANDs oder mit einem bistabilen Relais...
@dolf und @Der Neue Können wir uns darauf einigen, dass da jemand seine ersten Schritte in der Programmierung macht und es daher nicht zielführend ist, ihm anstelle seines Programms diskrete Hardware vorzuschlagen?
Karl Heinz Buchegger schrieb: > Können wir uns darauf einigen, dass da jemand seine ersten Schritte in > der Programmierung macht und es daher nicht zielführend ist, ihm > anstelle seines Programms diskrete Hardware vorzuschlagen? Direkt gesagt hat er dass nicht, aber wahrscheinlich ist es so gedacht. Deshalb gebe ich Dir Recht.
Vielen Dank erstmal für die schnellen Antworten, Es soll schon ein Microcontroller sein, da ich mich, wie Karl Heinz sagte, in die C-Programmierung reinfinden will und ich später das Programm noch erweitern möchte. Sonst gehn ja auch analoge Schaltungen. ;) Ich werde die Vorschläge jetzt (oder morgen) erstmal ausprobieren und mein Programm dementsprechend umschreiben. danke nochmals Johannes
Johannes schrieb: > Es soll schon ein Microcontroller sein, da ich mich, wie Karl Heinz > sagte, in die C-Programmierung reinfinden will und ich später das > Programm noch erweitern möchte. Dann hast Du in meinen Augen hier eine gute Anlaufstelle gefunden wenn Du Fragen stellen musst. Bedenke aber dass viele Fragen schon oft gestellt wurden und es deshalb schon viele Beiträge dazu gibt (Stichwort Forensuche). Gerade am Anfang ist es empfehlenswert das AVR-GCC-Tutorial durchzuarbeiten. Da wird so ziemlich alles behandelt. Grüße und viel Erfolg/Ausdauer.
@Der Neue Ich geister schon lange auf dieser Seite rum und bin auch echt dankbar, dass es sie gibt. Das Tutorial habe ich zum größten Teil auch schon durchgearbeitet nur in der Praxis fehlts mir dann doch noch ;) Gruß Johannes
Johannes schrieb: > Ich benutze das Evaluationboard von Pollin da sind die Taster soviel ich > weiß entprellt daran kanns auch nicht liegen. Wenn die Schaltung nicht inzwischen berichtigt wurde, hast Du damit generell ein Problem. Der CPU wird bei jedem Tastendruck kurz mal die VCC geklaut, das mag sie garnicht. Die Kondensatoren an den Tasten müssen unbedingt raus. Beitrag "Pollin AVR Board Fehler beim drücken der Taster / Qualität der Bauteile" Ansonsten würde ich erstmal eine gut funktionierende Entprellung benutzen: http://www.mikrocontroller.net/articles/Entprellung#Komfortroutine_.28C_f.C3.BCr_AVR.29 Du kannst dann immer noch eigene Experimente machen. Bessere Lösungen wirst Du allerdings nicht finden. Peter
Hallo nochmal, ich habe das Programm nochmal umgeschrieben. Allerdings bleibt die LED jetzt ganz aus. Weiß jemand woran das liegt? Danke im voraus Johannes
1 | if(LED_AN(LED1)) |
2 | LED_AUS(LED1); |
So wie du LED_AN formuliert hast, nämlich so
1 | #define LED_AN(LED) (PORTD |= (1<<(LED)))
|
ist das das Kommando, um eine LED einzuschalten. Das ist also ein Befehl, etwas zu tun. Du willst es aber als Abfrage verwenden, ob ein LED eingeschaltet ist, was natürlich nicht geht. Du hast doch noch so einen schönen 2.ten Befehl LED_TOGGLE, mit dem du eine LED jeweils in den anderen Zustand schalten kannst. Das wäre eine Möglichkeit. Oder du fragst wirklich den PORT ab, ob das entsprechende Bit gesetzt ist für eine entsprechende Abfrage (in diesem Fall musst dann tatsächlich das PORTD Register auslesen und nicht wie bei den Tastern das PIND Register. Den du befragst ja dann einen Ausgangspin, in welchem Zustand er gerade ist) Oder du benutzt eine Hilfsvariable, deren Wert dir mitteilt, ob die LED eingeschaltet ist oder nicht.
Ok ich habe jetzt LED_TOGGLE benutzt und es funktioniert einwandfrei. Ich hatte die Funktion von LED_TOGGLE nie so richtig verstanden, deshalb hab ich es nicht benutzt. Danke für den Tipp Gruß
Hinweis: Um solche Interpretationsfehler in Zukunft nach Möglichkeit zu vermeiden, benutzt man zb gerne so eine Systematik: Befehle etwas zu tun, schreibt man so wie du das hast LED_AN schalte eine LED ein! LED_AUS schalte eine LED aus! Aber: Wenn man etwas macht, was eine Aussage über einen tatsächlichen Zustand treffen soll, dann beginnt das mit IS_ IS_TASTER_GEDRUECKT Ist die Taste gedrückt? IS_LED_AN Ist die Led eingeschaltet? Dadurch ergibt sich beim Lesen automatisch die Frageform. Man frägt also das System, ob eine LED eingeschaltet ist. Und das passt dann wieder gedanklich nahtlos in ein IF hinein if( IS_LED_AN( LED1 ) ) Wenn es wahr ist, dass die LED1 eingeschaltet ist, dann ....
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.