Forum: Mikrocontroller und Digitale Elektronik kontaktprellung


von Rumpelstilzchen 1. (billson)


Lesenswert?

hallo!
ich bin dabei ein programm zu schreiben welches über einen interrupt ein 
und ausgeschaltet wird. es lässt sich zwar einschalten aber dann leider 
nicht mehr aus! ich denke dass es an der prellung des tasters liegt, nur 
weiß ich nicht wie ich das um gehen kann.
hier das wesentliche:

IT0=0;
EX0=1;
ES=1;

unsigned char einaus;

void main()
{
while(1)
{
einaus=0;
    while(einaus)
    {
    //programm...
    }
}

}

void ISRstarten ()
{
if(einaus==0)
{einaus=1;}
else
{einaus=0;}

IE0=0;

}

}

ich wäre euch wirklich dankbar wenn ihr mir dabei weiterhelfen 
könntet...
emefge

von Helmut L. (helmi1)


Lesenswert?

So was macht man auch nicht im Interrupt.

Stichwort Tastenenprellung

Uberigens du brauchst fuer das gleiche Thema keine 2 Threads 
aufzumachen.

Gruss Helmi

von Rumpelstilzchen 1. (billson)


Lesenswert?

sorry, dass mit den 2 threads war nicht beabsichtigt...
ich muss es leider mit dem interrupt machen weil es leider so vorgegeben 
ist.
würde es einen unterschied machen wenn ich den interrupt über 
pegeltriggerung starte anstatt per flanke?!?
mfg

von Helmut L. (helmi1)


Lesenswert?

Was fuer einen Prozessor hast du eigentlich ?
Sieht nach 8051 Serie aus.


Wenn es den so sein muss.

Was du tuen koenntes ist folgendes. Im Interrupt must du testen ob da 
noch weitere Impulse kommen.  Also den Pin abfragen, kurzes Delay , noch 
mal fragen und erst wenn gleich den Interrupt verlassen. So verhinderst 
du die mehrfach triggerung.

Das ist zwar nicht schoen aber probiers mal aus.

Gruss Helmi

von Rumpelstilzchen 1. (billson)


Lesenswert?

genaugenommen um einen 89S53.

also du meinst jetzt einfach eine kurze verzögerung einbauen?
zb eine for-schleife durchlaufen lassen um etwas zeit abzuwarten?
mfg

von Teplotaxl X. (t3plot4x1)


Lesenswert?

Delays in Interrupts?
Sowas kommt garnicht in die Tüde :P

von Helmut L. (helmi1)


Lesenswert?

Jein.

In etwa so. Also einlesen , warten ,nochmal einlesen und dann auf 
ungleichheit testen. Erst wenn gleich dann hat sich die Taste beruhigt.
(Ich nehme an es ist ein 8051 Derivat)


void ISRstarten ()
{

bit  Flag;

do {
  Flag = INT0;
  for(i=0;i<200;i++);  // Little Delay
} while (Flag != INT0);

if(einaus==0)
{einaus=1;}
else
{einaus=0;}

IE0=0;

}



Gruss Helmi

von Helmut L. (helmi1)


Lesenswert?

>Delays in Interrupts?
>Sowas kommt garnicht in die Tüde :P

Weiss ich auch. Aber um Rumpelstilzchen 123 mal auf die schnelle zu 
helfen.

Gruss Helmi

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
Noch kein Account? Hier anmelden.