Hallo , wie kann ich einen Taster als Schalter mit C programmieren einmal nach loslassen wird dann den Taster False , von daher wollte ich halt dass das LED nachdem loslassen trotzdem leuchtet wird mein Code sieht momentan so aus ST1,ST2,ST3 sind Schalter L1,L2 sind LED L3,L4 sind LEDs für Zustände #include <bur/plctypes.h> #ifdef _DEFAULT_INCLUDES #include <AsDefault.h> #endif void _INIT ProgramInit(void) { Z =1000; } void _CYCLIC ProgramCyclic(void) { counter++; counter2++; counter3++; counter4++; if(ST1 == 1 && counter < Z ){ ST1 = !ST1 L1 = 1 ; L2 = 0; L4=0; } else if ( counter3 > Z+1){ L3 =1; L4 =0; } else { L1 = 0; L3= 0; } if(ST1 == 0 && counter > Z){ L1=0; counter=0; counter3=0; } /*********************************************************************** ************************************************************************ **********/ if(ST2 == 1 && counter2 < Z ){ L2 = 1 ; L1 = 0 ; L3=0; } else if ( counter4 > Z+1 ){ L4 =1; L3=0; } else { L2 = 0 ; L4=0; } if(ST2 == 0 && counter2 > Z){ L2=0; counter2=0; counter4=0; } /*********************************************************************** ************************************************************************ **********/ if(ST3 == 1 ){ counter2 = Z+1; counter = Z+1; L3 = 0; L4=0; } } void _EXIT ProgramExit(void) { }
:
Bearbeitet durch User
Geil, welche Programmierumgebung soll das sein ? Und warum nicht einfach mal Z auf 999 setzen ? Taster heisst entprellen, das geht so: https://www.mikrocontroller.net/articles/Entprellung Dann hätte man erst mal eine Grundlage.
Michael B. schrieb: > Geil, welche Programmierumgebung soll das sein ? Ist irgendwas mit SPS. Da müsste man erst mal wissen ob es da ein OS gibt oder ob das eine Freestanding-Umgebung ist. Dann noch welche Bibliotheken es gibt.
Wenn ich etwas nicht verstehe, versuche ich das Problem zu reduzieren. Also statt 3 Schalter nur einen. Und statt 4 LEDs nur eine. Dann wird der Code übersichtlicher, und man kann evtl verstehen, was da passiert (bzw nicht). Erst wenn das läuft wird der Schritt von 1 auf N gemacht. Das könnte man dann auch in Funktionen abstrahieren, so mit Parametern und so.
Mehdi S. schrieb: > wie kann ich einen Taster als Schalter mit C programmieren Das Zauberwort heiß "Merker" oder "Flag". Wenn Merker = 0 und Taster = 1 dann setze Merker auf 1 mache LED an Wenn Merker = 1 und Taster = 1 dann setze Merker auf 0 mache LED aus Und das im Dauerlauf immer im Kreis. Damit der µC nicht unnötig glüht, noch 100 oder 200 ms Pause dazwischen. Und, natürlich, wie Michael B. schrieb, die Tasterabfrage entprellen, sonst gibt das Zufallsergebnisse.
Manfred schrieb: > Wenn Merker = 0 und Taster = 1 dann > setze Merker auf 1 > mache LED an > > Wenn Merker = 1 und Taster = 1 dann > setze Merker auf 0 > mache LED aus > > Und das im Dauerlauf immer im Kreis. Dann wechselt die LED ständig zwischen an und aus, solange man auf dem Taster ist. So etwas hat man früher als Zufallsgenerator genutzt. Man muss beim Taster auf die Flanke reagieren, also den Wechsel von 0 nach 1. Das macht man, indem man sich den vorherigen Stand des Tasters merkt und nur reagiert, wenn der 0 und der neue Zustand 1 ist.
Hi Rolf M. schrieb: > Dann wechselt die LED ständig zwischen an und aus, solange man auf dem > Taster ist. So etwas hat man früher als Zufallsgenerator genutzt. > Man muss beim Taster auf die Flanke reagieren, also den Wechsel von 0 > nach 1. Das macht man, indem man sich den vorherigen Stand des Tasters > merkt und nur reagiert, wenn der 0 und der neue Zustand 1 ist. Richtig. Allerdings kann ich das nicht in C erklären, aber mal versuchen, zu beschreiben. Da ich mit Assembler arbeite, kann das etwas Assembler lastig sein. Zuerst entprellen. Dazu brauchst du einen Zähler, der von X nach Null zählt, eine Variable "Alt-In" und eine "Neu-In". "Alt-In" setzt du auf 0, in "Neu-In" schreibst du den eingelesen Port. Danach ein Exclusiv-Oder auf die beiden Variablen. Bekommst du als Ergebnis eine 1, dann sind beide unterschiedlich und du setzt den Zähler wieder auf einen Startwert, z.B. auf 15 und überträgst den neuen Zustand in die Variable "Alt-In". Bekommst du eine 0, also beide Variablen sind gleich, decrementierst du den Zähler und wenn du bei 0 bist, erklärst du den Eingangszustand für gültig. Dazu brauchst du wieder eine Variable, z.B. "Status-Neu". Für die Flankenerfassung brauchst du auch einen alten Zustand und dafür eine Variable, z.B. "Status-Alt". "Status-Alt" wird am Anfang ebenfalls mit 0 initialisiert. Die Flankenauswertung wird nun auch mit einer Exclusiv-Oder Verknüpfung der beiden Variablen durchgeführt. Erhälst du eine 1 hat sich der Zustand geändert. Eine Und-Verknüpfung von Ergebnis und "Status-Neu" ergibt eine steigende Flanke, von Ergebnis und "Status-Alt" eine fallende Flanke. Das Ergebnis schreibst du in entsprechende Flankenmerker, z. B. "Flanke_0" oder "Flanke_1". Anschließend überträgt du "Status-Neu" nach "Status-Alt". Nun kannst du in deinem Programm auf die Flankenmerker zugreifen und wenn einer gesetzt ist, die Bearbeitung ausführen und den Merker löschen. Ich hoffe, das ist verständlich. Gruß oldmax
:
Bearbeitet durch User
Manfred schrieb: > Und, natürlich, wie Michael B. schrieb, die Tasterabfrage entprellen, > sonst gibt das Zufallsergebnisse. Woher willst du wissen ob nicht schon die Hardware oder die Laufzeitumgebung (OS oder Bibliothek) dieser SPS das erledigt? Ohne Details was es bereits auf dem Hobel gibt ist das alles Spekulation.
Im AutomationStudio kann man ds Entprwllen in der Hw config einstellen. Flankenmerker und Xor verwenden.
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.