mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Grundlagenfrage zur if-Schleife


Autor: Christoph (Gast)
Datum:
Angehängte Dateien:
  • IF.txt (365 Bytes, 121 Downloads)

Bewertung
0 lesenswert
nicht 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

Autor: Christoph (Gast)
Datum:
Angehängte Dateien:
  • IF.txt (327 Bytes, 94 Downloads)

Bewertung
0 lesenswert
nicht lesenswert
hab jetzt ein else funktion eingefügt.

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was ist eine "if-Schleife"?

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

...

Autor: Christoph (Gast)
Datum:

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

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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?

...

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auf den ersten Blick würde ich sagen, das es funktionieren sollte.

Autor: Hubert.G (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Christoph (Gast)
Datum:
Angehängte Dateien:
  • IF.txt (623 Bytes, 114 Downloads)

Bewertung
0 lesenswert
nicht lesenswert
Wäre es so besser(sinnvoller) ?

Autor: Jörg Bar* (joerg_b)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Christoph (Gast)
Datum:

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

Autor: Unbekannter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Christoph (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Christoph (Gast)
Datum:
Angehängte Dateien:
  • IF.txt (670 Bytes, 104 Downloads)

Bewertung
0 lesenswert
nicht lesenswert
Würde es so funktionieren?

Autor: Unbekannter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Dirk Doerr (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Christoph (Gast)
Datum:
Angehängte Dateien:
  • IF.txt (513 Bytes, 113 Downloads)

Bewertung
0 lesenswert
nicht 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

Autor: Unbekannter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Dirk Doerr (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Christoph (Gast)
Datum:

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

Autor: Dirk Doerr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.