Forum: Mikrocontroller und Digitale Elektronik Problem mit Tastereinlesung


von Marcel (Gast)


Lesenswert?

Hallo Forumgemeinde!!

Ich habe ein Problem mit dem einlesen eines Tasters. Der Taster wird im
Int0 abgearbeitet.



interrupt [EXT_INT0] void ext_int0_isr(void)
{
 delay_ms(30); // zum entprellen

 if((PIND.5 == 0)&&(modus_hoch == 0))
   {
    modus_hoch = 1;
    PORTC.3 = 1;    // LED als Anzeige
   }

 if((PIND.5 == 1)&&(modus_hoch == 1))
   {
    modus_hoch = 0;
    PORTC.3 = 0;
   }
}

Dabei ist "modus_hoch" eine globale "unsigned char" Variable.
Eigentlich müsste beim drücken der Taste die LED an gehen und beim
zweiten mal losslasen die LED wieder aus gehen. Aber das funktioniert
oft überhaupt nicht richtig!! Mal geht sie beim ersten loslasen wieder
aus oder erst nach dem 3. oder 4. mal drücken!!

Das kommt mir sehr merkwürdig vor!

Hat da eventuell jemand etwas mehr ahnung davon wie ich??

Schönen Sonntag Abend noch!!

Gruß Marcel

von Marcel (Gast)


Lesenswert?

Hoppla, jetzt ist mir aufgefallen dass es schon richtig ist wie es
programmiert wurde, ich muss nur etwas umdenken!! Wenn ich den Taster
ja los lasse dann wird ja wieder ein neuer Interrupt ausgelöst. Und
dann ist ja PIND.5 = 1! Also wieder aus!!! Ich dachte es wäre etwas
leichter einen Taster zu entprellen. Ich weiß,es gibt hier zig
Beispiele im Forum aber die sind alle in ASM oder halt nicht mit
CodeVision. Da tuhe ich mich doch etwas schwer damit. Ich hätte gedacht
man kann einfach nur mit "delay" arbeiten!!

Sorry für die "doppel-postung"

Marcel

von Hubert (Gast)


Lesenswert?

Eine Abhilfe wenn auch nur schlechte wäre Signal anstelle Interrupt wenn
es das im CodeVision gibt.

von Marcel (Gast)


Lesenswert?

Hmmm, ich habe jetzt in der Hilfe nichts gefunden. Ich habe es jetzt
eben auch mal mit "switch" probiert.

interrupt [EXT_INT0] void ext_int0_isr(void)
{


delay_ms(20);

if(PIND.5 == 0)
{
switch (modus_hoch)
   {
    case 0:
          modus_hoch = 1;
          PORTC.3 = 1;
    break;

    case 1:
          modus_hoch = 0;
          PORTC.3 = 0;
    break;
   }

  }
}

Aber auch das klappt nicht :o(

Ich geb für heute auf!! Morgen sieht die Welt "hoffentlich" etwas
klarer aus!!

Schönen Abend noch und trotzdem danke für deinen Vorschlag.....

Marcel

von Peter D. (peda)


Lesenswert?

http://www.mikrocontroller.net/forum/read-4-20549.html#new

Das Beispiel dort ist zwar in C für den 8051 aber wenn Du C kannst,
sollte es überhaupt kein Problem sein, die Interrupt-Syntax anzupassen
und den Timer zu initialisieren.

Deshalb ist ja C so verbreitet, weil die Unterschiede zwischen den
einzelnen Compilern nur sehr gering sind.


So wie Du es machst, 480000 Zyklen lang im Interrupt die CPU zu
blockieren, wirst Du kaum größere Programme erstellen können.


Peter

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.