Timer1.initialize - Zeit dynamisch Ändern

Hallo alle miteinander,
ich möchte einen Timer interrupt in mein Programm einbauen, bei welchem man die Zeit dynamisch ändern kann.

Ich habe an meinem Atmega2560 unter anderem ein Poti mit welchem ich die Zeit des Timer interrupts verändern möchte. Leider funktioniert das nicht so wie ich es gerne hätte. Der Timer interrupt bleibt immer auf 8 Sekunden. Wenn ich ein festen Wert vergebe dann geht der interrupt.

anbei mal ein Auszug aus meinem Code:

#include <Arduino.h>
#include <U8g2lib.h>
#include <DS3231.h>
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include "SdFat.h"
#include "PinChangeInterrupt.h"
#include "TimerOne.h"


int Zykluszeit = 500;


void setup() {
  Serial.begin(115200);
  Wire.begin();

  Pininit();

  DisplayInit();

  //Interrupt:
  Timer1.initialize(Zykluszeit * 1000);         // initialize timer1, and set a 1/2 second period 50000      2000000 = 2 Sekunden
  Timer1.attachInterrupt(MotorrichtungAndern);  //Ruft die Funktion TiefeBerechnung auf.         updateEncoder2

}

void loop()
{ 

  Spannungsmessung(); //Spannung messen und auslesen
 
  DisplayOutput();  //Daten auf dem Display ausgeben

  SerielleAusgabe();  //Ausgabe aller Daten an die Serielle Schnittstelle


  delay(50);
}

void Zeiteinstellung()
{
  Zykluszeit = analogRead(A7);
  //set a 1/2 second period 50000     2 Sekunden = 200000
  Zykluszeit = Zykluszeit * 2;
  Zykluszeit = Zykluszeit + 500;

  if (Zykluszeit != ZykluszeitAlt)
  {
    DisplayZykluszeit();
    ZykluszeitAlt = Zykluszeit;
    Serial.print("Aktuelle Zykluszeit: ");
    Serial.print(Zykluszeit);
    Serial.print('\n');

  }

}

void MotorrichtungAndern()
{
  if (Messungstarten == 1)
  {

    //Lehrdorn Rein und wieder Raus drehen
    if (Programmwahl == 1)
    {
      AnzahlDurchlaufe = AnzahlDurchlaufe + 1;
      if (Motorrichtung == 1)
      {
        digitalWrite(Motor1, LOW);
        digitalWrite(Motor2, HIGH);
        Motorrichtung = 2;
      }
      else
      {
        digitalWrite(Motor1, HIGH);
        digitalWrite(Motor2, LOW);
        Motorrichtung = 1;
      }
    }

    //Lehrdorn Dauerhaft reindrehen
    else
    {
      AnzahlDurchlaufe = AnzahlDurchlaufe + 1;
      digitalWrite(Motor1, LOW);
      digitalWrite(Motor2, HIGH);
    }
    if (digitalRead(LED3) == 1)
    {
      digitalWrite(LED3, LOW);
    }
    else
    {
      digitalWrite(LED3, HIGH);
    }
  }
  else
  {
    digitalWrite(LED3, LOW);
    digitalWrite(Motor1, LOW);
    digitalWrite(Motor2, LOW);
    //delay(500);

  }
}


void Pininit()
{
  pinMode(Motor1, OUTPUT);
  pinMode(Motor2, OUTPUT);
  pinMode(Wahlschalter, INPUT_PULLUP);
  pinMode(Taster2, INPUT_PULLUP);
  pinMode(Taster1, INPUT_PULLUP);
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  pinMode(LED3, OUTPUT);
  pinMode(Buzzer, OUTPUT);
}

Falls das so nicht gehen sollte, gibt es alternativen?

noiasca:
also ich unterstelle aus dem Code-Fragment, dass der Interrupt ohnehin nicht wirklich notwendig ist.
Besonders da du mit Delay im loop arbeitest.

Sieh dir mal das BlinkWithoutDelay Beispiel an, das kann dir deinen 8Sekunden-Motobewegung ersetzen.

warum deine interrupt Zeit nicht verändert wird: du änderst nur die Variable Zyklenzeit - aber nie den Interrupt intervall selber.
Guckst du hier: Arduino Playground - HomePage
findest du
setPeriod(period)
Sets the period in microseconds. The minimum period or highest frequency this library supports is 1 microsecond or 1 MHz.

Vielen Dank für die Antwort. Ja also wenn man nur diesen Ausschnitt betrachtet stimmt das vielleicht. Dann bräuchte ich das nicht. Der Code ist aber noch complexer und umfangreicher als dargestellt^^
Ich muss aber genau zu der eingestellten Zeit den Motor umschalten können. Das bekommt man nur mit Timer sauber gelöst. Wüsste zumindest keine alternative.

zu dem zweiten Hinweis. Das bedeutet, dass ich nicht Timer1.initialize verändern muss sondern setPeriod(period) und anstatt period meine variable Zyklenzeit einfügen muss.
klingt auf jeden Fall plausibel und werde ich dann mal testen. Ich weiß jetzt auf jeden Fall warum ich immer 8,3 Sekunden messe. das ist der max Wert für die Periode. Die wird er dann wohl automatisch setzen weil er sonst nix plausibeleres bekommt.

Mal probieren :slight_smile:

also leider funktioniert das immer noch nicht. habe verschiedene Dinge probiert, aber auch mit setPersiod(Zykluszeit * 1000) ändert sich nichts und der Timer bleibt bei 8 Sekunden.
wenn ich feste Zahlen eintrage klappt funktionieren diese. Nur Variablen irgendwie nicht.

Hat noch jemand eine Idee?