Grundlagenfrage zur if-Schleife

Gast #314993
Lesenswert?
• ▲
▼
Hallo zusammen,

ich bräuchte mal eure Hilfe.
Ich möchte mit einen Taster eine Schaltung einschalten. Der Taster muss
dazu 5 Sekunden lang gedrückt werden und die Variabel PW_hold muss low
sein. Der Taster ist im gedrücktem Zustand low.
Wenn das alles erfüllt ist soll die Variabel auf high gesetzt werden
und einige LEDs sollen an und ausgehen. ein Buzzer soll auch an und
ausgeschaltet werden. Der muss allerdings low sein, damit eingeschaltet
ist.
Ich kann es leider nicht ausprobieren, da ein Bauteil meiner Schaltung
defekt ist.
Ich hänge die Datei an.
Vielen Dank für eure Hilfe.
Gruß
Christoph
Angehängte Dateien:
Gast #314999
Lesenswert?
• ▲
▼
Ich weiss nicht wofür du einen µC brauchst wenn du 20sec warten kannst
und der µC nichts tut.
Woher nimmst du "Tastercount5"
Du brauchst doch für die 5sec auch einen Timer, warum verwendest du ihn
nicht auch anstelle des delay.
Aber ansonst, warum soll es nicht funktionieren, die Sinnhaftigkeit ist
eine andere Sache.
#315001
Lesenswert?
• ▲
▼
if (Tasterstatus == 0)
{
 if (Tasterstatus == Tastercount5)
 {
 code();
 }
}

kann so nicht funktionieren, ausser die Variable Tasterstatus ändert
sich zwischen der äusseren und inneren IF Abfrage. In die äussere gehts
nur wenn Tasterstatus NULL ist und in die Funktionen der inneren nur
wenn Tasterstatus 100 ist.

Vermutlich meinst du eher was wie "if (Tasterstatus != 0) {}" (!=
entspricht ungleich). Abgekürzt geht auch "if (Tasterstatus)" -->
wahr, sobald Tasterstatus nicht NULL ist
Gast #315003
Lesenswert?
• ▲
▼
Christoph, ein "if" ist keine Schleife. Deine Funktion
"einschalten" wartet keine 5 Sekunden, sodern braucht nur wenige
Taktzyklen um festzustellen, dass "Tasterstatus" ungleich 0 ist und
somit sofort beendet wird. Und falls "Tasterstatus" doch mal Null
sein sollte, wird die Funktion sofort nach dem zweiten "if", bei dem
Du auf "Tastercount5" überprüfst beendet.

Du willst erstmal den Unterschied zwischen einer Schleife und einer
Bedingung lernen.
Gast #315004
Lesenswert?
• ▲
▼
Die Funktion soll ja nicht warten!!!! Man muss den Taster 5 Sekunden
lang gedrückt halten und PW_hold muss null sein, damit man die
schaltung  die Haltefunktion aktiviert und dauerhaft mit strom versorgt
wird. sonst ist sie nur an,wenn der taster gedrückt ist. im gedrückten
zustand ist der Taster null.
Aber anscheind kann mir hier keiner sagen wie sowas funktioniert.
Außerdem habe ich schon gemerkt das if keine schleife ist.
Gast #315006
Lesenswert?
• ▲
▼
Nicht persönlich nehmen, wenn das die Programmiersprach "C" sein soll,
fehlt Dir leider ganz elementares Wissen über die Sprache.

Beispiel:

  #define LEDaus 400

  while (LEDaus)
  {
    /* mach irgendwas */
  }

Das ist eine Endlosschleife. Wenn Du "#define name inhalt" machst,
wird überall wo "name" steht, "inhalt" ins Programm eingesetzt. So
werden die Zeilen da oben zu:

  while (400)
  {
    /* mach irgendwas */
  }

In den Klammern von "while" steht normalerweise eine Bedingung. So
lange diese Bedinung wahr ist, wird die Schleife wiederholt. Du hast
als Bedingung "400" stehen. Auch das ist in C erlaubt, allerdings ist
"400" immer wahr. Also hast Du eine Endlosschleife gebaut.

So geht es durch und durch in Deinem Programm. Ein Fehler am nächsten.
Bitte erstmal C lernen:

    http://de.wikibooks.org/wiki/C-Programmierung
Gast #315007
Lesenswert?
• ▲
▼
> Man muss den Taster 5 Sekunden
> lang gedrückt halten und PW_hold muss null sein, damit man die
> schaltung  die Haltefunktion aktiviert und dauerhaft mit strom
> versorgt wird.

Welche Schaltung?

> Würde es so funktionieren?
Nein


Wer ruft "einschalten" auf?

> while (LEDaus)
Das ist eine Endlosschleife

> while (BUZZERaus)

Das auch
Gast #315008
Lesenswert?
• ▲
▼
Wie schreibt man denn, das der Taster 5 sekunden low sein muss, also
gedrückt sein muss, damit etwas passiert. Ich versteh nur nicht, wie
man eine Zeit in die If-Ausdruck einbaut, damit die Anweisung
ausgeführt wird.
hab mal noch was angehängt. der controller muss wärend dieser zeit
nichts berechnen.
die funktion einschalten wird nacher in der main aufgerufen.

>Welche Schaltung?
am Taster ist ein port vom controller angeschlossen, mit dem man den
status abfragen kann. ein weiterer Port ist an einem transistor
angeschlossen, damit dieser dauerhaft durchgeschaltet ist. der
transistor wird druch drücken des tasters auch druch geschaltet, so
dass der controller mit spannungversorgt wird.
der taster soll aber noch weitere funktionen ausüben.

gruß
christoph
Angehängte Dateien:
Gast #315009
Lesenswert?
• ▲
▼
Erst gehen lernen, bevor Du laufen willst...

Nun, zu Deiner Frage:

> Wie schreibt man denn, das der Taster 5 sekunden low sein muss,
> also gedrückt sein muss, damit etwas passiert.

Die Sprache "C" weiß überhaupt nichts von Zeit. Wie in den meisten
Programmiersprachen werden Befehle einfach hintereinander abgearbeitet.
Ob das, und wieviel, Zeit benötigt, ist der Sprache egal.

Zeit misst man mit der Hardware.

Die komfortable Art ist es, den Timer eines Mikrocontrollers zu
verwenden. Der Timer erzeugt Impulse und diese Impulse werden irgendwo
gezählt.

Eine einfachere und viel ungenauere Methode ist es, zu zählen wie oft
ein bestimmter Programmteil (z.B. eine Endlosschleife) ausgeführt
wird.


> Ich versteh nur nicht, wie man eine Zeit in die If-Ausdruck
> einbaut, damit die Anweisung ausgeführt wird.

In dem man überprüft, wie weit ein Zähler gekommen ist.
Gast #315010
Lesenswert?
• ▲
▼
>Wie schreibt man denn, das der Taster 5 sekunden low sein muss, also
> gedrückt sein muss, damit etwas passiert. Ich versteh nur nicht,
> wie man eine Zeit in die If-Ausdruck einbaut, damit die Anweisung
> ausgeführt wird.

Dazu könnte man z. B. einen Timer verwenden, der nach 5 Sekunden
abläuft. Wenn der Tastendruck erkannt wird Timer Starten. Wenn der
Timer-Interrupt ausgelöst wird Flag setzen und dies abfragen. Wird
während dieser Zeit erkannt, daß die Taste losgelassen wurde muß der
Timer angehalten werden und der Zähler zurückgestellt werden.

Du kannst das auch einfach in einem Timer machen. So einstellen, daß
alle paar ms ausgelöst wird. Im Interrupt den Status der Taste
ermitteln. Wenn Taste gedrückt inkrementierst Du einen Zähler. Wenn
dieser einen Wert angenommen hat der 5 Sekunden entspricht setzt Du ein
Flag, daß in der Hauptschleife abgefragt wird. Wird vorher die Taste
losgelasen, Zähler zurückstellen.

Du solltest Dir vielleicht auch mal den Artikel zum Thema prellende
Tasten ansehen: http://www.mikrocontroller.net/articles/Entprellung

>  der transistor wird druch drücken des tasters auch druch
> geschaltet, so dass der controller mit spannungversorgt wird.

Wird der Controller nur mit Strom versorgt solange die Taste gedrückt
ist? Kannst Du das vielleicht mal skizzieren?

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.