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!
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
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
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
Hallo nochmal,
ich habe das Programm nochmal umgeschrieben. Allerdings bleibt die LED
jetzt ganz aus. Weiß jemand woran das liegt?
Danke im voraus
Johannes
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 ....