Forum: Mikrocontroller und Digitale Elektronik Grundlagenfrage zur if-Schleife


von Christoph (Gast)


Angehängte Dateien:

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

von Christoph (Gast)


Angehängte Dateien:

Lesenswert?

hab jetzt ein else funktion eingefügt.

von Hannes L. (hannes)


Lesenswert?

Was ist eine "if-Schleife"?

Ich kenne "if" nicht als Schleifenbefehl (Wiederholung) sondern nur
als Verzweigungsbefehl (bedingte Verzweigung).

...

von Christoph (Gast)


Lesenswert?

Tut mir leid. ich meinte natürlich Verzeigung. Kann man das so machen?

von Hannes L. (hannes)


Lesenswert?

Das weiß ich nicht. Ich kann dein Programm nicht nachvollziehen. Ich
kann kein C. Und ich finde auch keinen Bezug zur Hardware. Oder
arbeitet dein Controller vielleicht mit einem Betriebssystem, das die
Hardware ansteuert?

...

von Rahul (Gast)


Lesenswert?

Auf den ersten Blick würde ich sagen, das es funktionieren sollte.

von Hubert.G (Gast)


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.

von Christoph (Gast)


Angehängte Dateien:

Lesenswert?

Wäre es so besser(sinnvoller) ?

von Jörg B. (joerg_b)


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

von Christoph (Gast)


Lesenswert?

Der Tastereingang ist beim gedrückten Taster low. Der Taster muss 5
Sekunden (Tastercount5) gedrückt werden, damit das System
eingeschaletet wird.

von Unbekannter (Gast)


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.

von Christoph (Gast)


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.

von Christoph (Gast)


Angehängte Dateien:

Lesenswert?

Würde es so funktionieren?

von Unbekannter (Gast)


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

von Dirk Doerr (Gast)


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

von Christoph (Gast)


Angehängte Dateien:

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

von Unbekannter (Gast)


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.

von Dirk Doerr (Gast)


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?

von Christoph (Gast)


Lesenswert?

Könntest du mir das eventuell mal als fertigen Quellcod zeigen, damit
ich mal sehe, wie sowas funktioniert?

von Dirk Doerr (Gast)


Lesenswert?


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.