Timer

Hallo,

ich habe ein Problem. Ich will, dass wenn ich einen Taster drücke, eine Methode durch einen Interrupt ausgeführt wird. Diese Methode soll ein Relais HIGH und LOW setzen. Jedoch funktioniert das bei mir nicht.

Daher bitte ich um eure Hilfe. Danke im Voraus.

Lg marco

Hier mein Code:

include "TimerOne.h"

volatile int gatepin =9; int inpin = 2; int reading; int previous = LOW; int count=0; int taster_val=0; int oldval=0;

void setup() { pinMode(inpin, INPUT); pinMode(gatepin,OUTPUT);

Timer1.initialize(); Timer1.setPeriod(8388480); //Timer1.attachInterrupt(ventil); attachInterrupt(digitalPinToInterrupt(inpin), ventil, RISING);

} void loop() { taster_val = digitalRead(inpin); // Wert auslesen if (taster_val != oldval) { // normale Bearbeitung: losgelassen / gedrückt etc... oldval = taster_val; delay(10); // 10 millisekunden warten, eine Änderung danach wird wieder eine echte sein. }

} void ventil() { reading = digitalRead(inpin);

if (reading == HIGH && previous == LOW ) { time = millis(); count++; if(count==2){ digitalWrite(gatepin, HIGH); Timer1.setPeriod(8480); } if(count==3){ digitalWrite(gatepin, LOW); count=0; Timer1.setPeriod(8388480); } } if (reading == LOW && previous == HIGH ) { time = millis(); digitalWrite(gatepin, LOW); } previous = reading; }

Hallo,

warum willst du unbedingt einen Interrupt einsetzen?

Wenn eine Taste gedrückt wird, kann dadurch direkt eine Funktion ausgeführt werden. Dazu ist ein Interrupt nötig.

Und setze deinen Sketch hier bitte in “Code-Tags” (Schaltfläche </>) rein, dann ist dieser besser lesbar.

marco9999: Jedoch funktioniert das bei mir nicht.

Ja, logisch.

Wenn Du ein Programm programmierst, das nix macht, dann macht es eben nix.

Allerdings kann man ein Programm, das nix macht, auch einfacher haben.

Dein Programm macht nix, weil bei Deinem RISING Interrupt die Bedingung "previous == LOW" nur beim allerersten Aufruf zutrifft, danach nie mehr wieder.

Aber beim allerersten Aufruf der Interrupt-Behandlungsroutine machst Du nichts, außer einen Zähler von 0 auf 1 zu erhöhen ("count++;"), aber schalten möchtest Du erst dann, wenn der Zähler einen höheren Wert erreicht, z.B. "if(count==2)".

Ich würde mir Deine Programmunlogik mal genau daraufhin ansehen, ob diese Unlogik tatsächlich so ablaufen soll wie Du sie programmiert hast.

BTW: So schnarchlangsame Aktionen wie das Drücken eines Tasters, werden üblicherweise von Programmierern, die bei klarem Verstand sind, nicht per Interrupt-Behandlungsroutine ausgewertet. Das wird viel zu kompliziert, wenn es richtig funktionieren soll. Und es belegt wichtige und nur begrenzt zur Verfügung stehende Ressourcen (z.B. Hardware-Interrupts), die man sich üblicherweise freihält für Fälle, in denen diese wirklich benötigt werden und sich der Programmieraufwand mit Interrupt-Programmierung lohnt und nicht nur ein Programmiererschwernis zu Übungszwecken darstellt.

So schnarchlangsame Aktionen wie das Drücken eines Tasters, werden üblicherweise von Programmierern, die bei klarem Verstand sind, nicht per Interrupt-Behandlungsroutine ausgewertet. Das wird viel zu kompliziert, wenn es richtig funktionieren soll.

Man muss ihn mögen, den jurs, dann ist es manchmal sogar witzig. Programmierer, die zwar bei einigermassen klarem Verstand, aber nicht an MicroController-Programmierung gewöhnt sind, denken schonmal, dass "Interrupt" und "spontan auf Ereignisse reagieren" etwas miteinander zu tun haben. Ist aber falsch. Ein µC sollte immer spontan auf Ereignisse reagieren, dafür bietet Arduino die loop() Funktion an. Für extreme Ausnahmefälle, wenn es nicht reicht, innerhalb der loop -- also im Millisekunden-Bereich -- zu reagieren, gäbe es dann noch ISRs. Und direkte Hardware-Unterstützung durch Counter/Timer etc.

ich habe ein Problem. Ich will, dass wenn ich einen Taster drücke, eine Methode durch einen Interrupt ausgeführt wird.

Dein Problem ist das Wort "will", ausser es soll eine Demo werden, wie man es nicht machen sollte ;) Taster haben eher das Problem, dass µC viel zu schnell sind und extra Brems-Logik eingebaut werden muss, um das mechanische Prellen in den Griff zu bekommen.