mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Problem mit Tastereinlesung


Autor: Marcel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Marcel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hubert (Gast)
Datum:

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

Autor: Marcel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.