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
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
Eine Abhilfe wenn auch nur schlechte wäre Signal anstelle Interrupt wenn es das im CodeVision gibt.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.