Problem mit Tastereinlesung

Gast #162556
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
Gast #162557
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
Gast #162559
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
#162560
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.