Forum: Compiler & IDEs LED mit Taster ein-/ausschalten


von Johannes (Gast)


Angehängte Dateien:

Lesenswert?

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!

von Der Neue (Gast)


Lesenswert?

Wahrscheinlich prellt Dein Taster.
Du müsstest Ihn entprellen, dann wirds auch funktionieren.

Entprellung

Gruß

von Johannes (Gast)


Lesenswert?

Ich benutze das Evaluationboard von Pollin da sind die Taster soviel ich 
weiß entprellt daran kanns auch nicht liegen.

von Karl H. (kbuchegg)


Lesenswert?

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)

von Johannes (Gast)


Lesenswert?

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.

von dolf (Gast)


Lesenswert?

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

von Der Neue (Gast)


Lesenswert?

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ß

von Karl H. (kbuchegg)


Lesenswert?

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
  }

von Der Neue (Gast)


Lesenswert?

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...

von Karl H. (kbuchegg)


Lesenswert?

@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?

von Der Neue (Gast)


Lesenswert?

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.

von Johannes (Gast)


Lesenswert?

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

von Der Neue (Gast)


Lesenswert?

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.

von Johannes (Gast)


Lesenswert?

@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

von Peter D. (peda)


Lesenswert?

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

von Johannes (Gast)


Angehängte Dateien:

Lesenswert?

Hallo nochmal,
ich habe das Programm nochmal umgeschrieben. Allerdings bleibt die LED 
jetzt ganz aus. Weiß jemand woran das liegt?
Danke im voraus

Johannes

von Karl H. (kbuchegg)


Lesenswert?

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.

von Johannes (Gast)


Angehängte Dateien:

Lesenswert?

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ß

von Karl H. (kbuchegg)


Lesenswert?

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
Noch kein Account? Hier anmelden.