Taster als Schalter programmieren

#6996006
Lesenswert?

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)
{


}
Gast #6996051
Lesenswert?

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.
Gast #6996278
Lesenswert?

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.
#6996362
Lesenswert?

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.
#6996677
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren