Taster und Schalter entprellen Im Unterforum Microcontroller - Beschreibung: 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)
|
|
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
|