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
Was ist eine "if-Schleife"? Ich kenne "if" nicht als Schleifenbefehl (Wiederholung) sondern nur als Verzweigungsbefehl (bedingte Verzweigung). ...
Tut mir leid. ich meinte natürlich Verzeigung. Kann man das so machen?
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? ...
Auf den ersten Blick würde ich sagen, das es funktionieren sollte.
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.
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
Der Tastereingang ist beim gedrückten Taster low. Der Taster muss 5 Sekunden (Tastercount5) gedrückt werden, damit das System eingeschaletet wird.
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.
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.
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
> 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
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
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.
>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?
Könntest du mir das eventuell mal als fertigen Quellcod zeigen, damit ich mal sehe, wie sowas funktioniert?
So in etwa: http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Datenaustausch_mit_Interrupt-Routinen
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.