Taster und Schalter entprellen

Im Unterforum Microcontroller - Beschreibung: Hardware - Software - Ideen - Projekte

Elektronik Forum Nicht eingeloggt       Einloggen       Registrieren




[Registrieren]      --     [FAQ]      --     [ Einen Link auf Ihrer Homepage zum Forum]      --     [ Themen kostenlos per RSS in ihre Homepage einbauen]      --     [Einloggen]

Suchen


Serverzeit: 14 7 2026  01:37:15      TV   VCR Aufnahme   TFT   CRT-Monitor   Netzteile   LED-FAQ   Oszilloskop-Schirmbilder            


Elektronik- und Elektroforum Forum Index   >>   Microcontroller        Microcontroller : Hardware - Software - Ideen - Projekte


Autor
Taster und Schalter entprellen
Suche nach: taster (7752) schalter (25972)

    







BID = 503469

P51D

Neu hier



Beiträge: 35
Wohnort: Bern
 

  


Hallo

ich habe heut mal versucht ein kleines Code-Schloss zu bauen, welches mit 6 Tastern funktioniert. in der aufgabenstellung stand, ich solle die Taster entprellen, nur weiss ich nicht genau wie ich das machen soll.

zuerst hatte ich volgende Variante:


Code :


if(PORTD != 0x00){ //Wenn PortD nicht null ist
DelayXms(20); //Entprellen
Zahl1=PORTD; //Zahl1 bekommt PORTD-Wert
}




dann hat mir jemand gesagt, dass ich so nicht entprellen kann und hat mir eine Variante gezeigt:


Code :


#define T0 (PORTD & 0x01)
#define T1 (PORTD & 0x02)
#define T2 (PORTD & 0x04)
#define T3 (PORTD & 0x08)
#define T4 (PORTD & 0x10)
#define T5 (PORTD & 0x20)
#define T6 (PORTD & 0x40)
#define T7 (PORTD & 0x80)

#define L0 (PORTJ & 0x01)
#define L1 (PORTJ & 0x02)
#define L2 (PORTJ & 0x04)
#define L3 (PORTJ & 0x08)
#define L4 (PORTJ & 0x10)
#define L5 (PORTJ & 0x20)
#define L6 (PORTJ & 0x40)
#define L7 (PORTJ & 0x80)

int entprellcount[8];
int code_ist [4];
int code_soll [4];

void SysInit(void){
DDRD = 0x00;
DDRJ = 0xFF;
PORTJ=0x02;
}

void entprellen(void){
if(T0){
if(entprellcount[1] < 200){
entprellcount[1] ++;
}
}else entprellcount[1] = 0;
if((T1) && (entprellcount[2] < 200)){
entprellcount[2] ++;
}else entprellcount[2] = 0;
if((T2) && (entprellcount[3] < 200)){
entprellcount[3] ++;
}else entprellcount[3] = 0;
if((T3) && (entprellcount[4] < 200)){
entprellcount[4] ++;
}else entprellcount[4] = 0;
if((T4) && (entprellcount[5] < 200)){
entprellcount[5] ++;
}else entprellcount[5] = 0;
if((T5) && (entprellcount[6] < 200)){
entprellcount[6] ++;
}else entprellcount[6] = 0;
}

void code(void){
int zustand = 0;
int counter = 0;
PORTJ=0x04;
zustand = 1;

while(zustand == 1){
entprellen();
if(entprellcount[1] == 4){
counter ++;
printf("test");
}
if(entprellcount[2] == 3){
counter ++;
}
if(entprellcount[3] == 3){
counter ++;
}
if(entprellcount[4] == 3){
counter ++;
}
if(counter != 0){
code_soll[counter] = PORTD;
}
if((counter == 4) && (PORTD == 0x10)){
counter = 0;
zustand = 0;
}
}
}

void codeeingabe(void){
int zustand = 0;
int counter = 0;
zustand = 1;
while(zustand == 1){
if(entprellcount[1] == 3){
counter ++;
}
if(entprellcount[2] == 3){
counter ++;
}
if(entprellcount[3] == 3){
counter ++;
}
if(entprellcount[4] == 3){
counter ++;
}
if(counter != 0){
code_ist[counter] = PORTD;
}

if((counter == 4) && (PORTD == 0x10)){
counter = 0;
zustand = 0;
}
}
}


dies ist nun für alle verwendeten PORT's und LED's und noch etwas vom Programm, aber es geht grundsätzlich nur um das entprellen.
Im Internet habe ich dann ein wenig recherchier und nichts schlaues gefunden.

kann mir jemand vielleicht die 2. Variante etwas genauer erklären, oder mir eine andere "richtige" Variante liefern??

mfg
P51D


benutzte hardware und software:
Lemps12 und die dazugehörige software.

BID = 503581

Rambodischien

Schreibmaschine

Beiträge: 1341
Wohnort: Österreich

 

  

Also ich benutze die erste Variante aber ich glaube deine ist falsch.

Ich mache es ungefähr so:

if(PortD !=0x00)
{
DelayXms(20);
if (PortD !=0x00)
{
Zahl1=PortD;
}
}



Mfg
Rambodischien

BID = 503585

DonComi

Inventar



Beiträge: 8604
Wohnort: Amerika

Ist doch egal, wie man entprellt.

Solange eine Bedingung erfüllt ist, ist beispielsweise die Taste nicht gedrückt.
Macht man es ganz einfach, setzt man, nach Erfüllung der Bedingung, einfach ne Variable oder man führt eine Operation aus.
Danach ein paar ms warten, damit sich der Kontakt beruhight oder einfach dafür sorgen, dass die nächsten x ms diese Bedingung nicht erneut erfüllt werden kann.

Ob man nun Timer und ext. Interrupts, Polling oder hardwaremäßige Entprellung macht, ist wurscht.
Da ich deine Schaltung nicht kenne, äußere ich mich zum Kode auch nicht. Nichtmal die Beschaltung ist bekannt.

_________________

BID = 503710

BjörnB

Stammposter

Beiträge: 242
Wohnort: Dortmund

Hallo,

ich mache das meist mit einem Timer mit z.B. 10ms Periodendauer und überprüfe im Timerinterrupt, ob der Taster fünf mal nacheinander (also für 50ms) auf logisch 1 liegt. Dies wird dann als gültiger Tastendruck gewertet. Nachfolgend habe ich mal einen entsprechenden Code-Ausschnitt (der im Timerinterrupt aufgerufen wird) reingekopiert. Darin werden einmal die entprellten Zustände der Taster bestimmt (indata) als auch die Flankenwechsel (Taster wurde gerade gedrückt (indata_pos_edge) bzw. losgelassen (indata_neg_edge)), für manche Anwendungen ist das ganz nützlich.



Code :


static unsigned char in_history[5], indata, indata_old, indata_pos_edge, indata_neg_edge;
/* Ein Eingang muss 5-mal hintereinander auf logisch 1 liegen, um als gültig gewertet zu werden. */
in_history[0] = in_history[1];
in_history[1] = in_history[2];
in_history[2] = in_history[3];
in_history[3] = in_history[4];
in_history[4] = ~PIND; /* Taster invertieren, da sie bei Betätigung auf 0V schalten */
indata_old = indata;
/* Zustand der Eingänge und Flankenwechsel der Eingänge */
indata = in_history[0] & in_history[1] & in_history[2] & in_history[3] & in_history[4];
indata_pos_edge = indata & (~indata_old);
indata_neg_edge = (~indata) & indata_old;



Schöne Grüße,
Björn

BID = 503902

P51D

Neu hier



Beiträge: 35
Wohnort: Bern

danke für eure Antworten.

ich werde aorgen noch ein MCU Lehrer fragen, wie er es macht, und dann die Variante hier auch noch posten.

BID = 504173

P51D

Neu hier



Beiträge: 35
Wohnort: Bern

also er meinte, dass es eigentlich schon geht, mit einem Delay zu entprellen, aber es sei nicht wirklich empfehlenswert, weill dann gerade in dem zustand "nur" gewartet wird, und somit könnte zum Beispiel kein Notstopp einer Maschine erkannt werden.
Profesioneller wäre dann die Variante, bei der Mittels einer Schlaufe die Eingänge abgefragt werden, und dann nur ein ganz kleines Delay verwenden wird. Wenn der Schalter seinen Wert während 3-10 durchgängen(entsprechen etwa 30ms)nicht ändert, ist der Schalter gedrückt worden.
Dies wäre dann wohl die 2. Variante vom Code die ich oben geschrieben habe. Erst nach dem heutigen Gespräch mit ihm habe ich dieses Programm vom Arbeitskollegen kappiert.

danke aber für eure Antworten

mfg
P51D

BID = 504182

Ltof

Inventar



Beiträge: 9386
Wohnort: Hommingberg


Zitat :
P51D hat am 28 Feb 2008 21:55 geschrieben :

also er meinte, dass es eigentlich schon geht, mit einem Delay zu entprellen, aber es sei nicht wirklich empfehlenswert, weill dann gerade in dem zustand "nur" gewartet wird, und somit könnte zum Beispiel kein Notstopp einer Maschine erkannt werden.

Ach Du meine Güte!

Einen Notstopp macht man - wenn schon per Software - dann doch besser per Interrupt. Nebenbei kann man den Notstopp auch in der Warteschleife abfragen. Noch nebenbeier: einen Notstopp macht man am besten überhaupt nicht per Software, sondern per Hardware.

Gruß,
Ltof

_________________
„Schreibe nichts der Böswilligkeit zu, was durch Dummheit hinreichend erklärbar ist.“
(Hanlon’s Razor)


Zurück zur Seite 1 im Unterforum          Vorheriges Thema Nächstes Thema 


Zum Ersatzteileshop


Bezeichnungen von Produkten, Abbildungen und Logos , die in diesem Forum oder im Shop verwendet werden, sind Eigentum des entsprechenden Herstellers oder Besitzers. Diese dienen lediglich zur Identifikation!
Impressum       Datenschutz       Copyright © Baldur Brock Fernsehtechnik und Versand Ersatzteile in Heilbronn Deutschland       

gerechnet auf die letzten 30 Tage haben wir 7 Beiträge im Durchschnitt pro Tag       heute wurden bisher 1 Beiträge verfasst
© x sparkkelsputz        Besucher : 192379874   Heute : 289    Gestern : 4606    Online : 206        14.7.2026    1:37
6 Besucher in den letzten 60 Sekunden        alle 10.00 Sekunden ein neuer Besucher ---- logout ----viewtopic ---- logout ----
xcvb ycvb
0.0610139369965