Interrupt und Servo

Moin,
Ich habe folgendes Problem: Ich habe eine ISR nach folgendem Beispiel programmiert: Arduino Playground - HalloWeltMitInterruptUndTimerlibrary
Die LED blinkt auch im 1sec tackt und alles ist soweit gut.
Nun muss ich aber im Loop einen Servo bewegen. Er bewegt sich physisch aber nicht. Am Servo liegt es nicht, in einem anderen Programm wo ich nur den Servo ansteuere funktioniert er. Woran kann das liegen? "Versteht" der sich nicht mit dem Interrupt?

Danke schon mal :slight_smile:

Der nicht funktionierende Code wäre hilfreich....

Alex2509:
Moin,
Ich habe folgendes Problem: Ich habe eine ISR nach folgendem Beispiel programmiert: Arduino Playground - HomePage
Die LED blinkt auch im 1sec tackt und alles ist soweit gut.
Nun muss ich aber im Loop einen Servo bewegen. Er bewegt sich physisch aber nicht. Am Servo liegt es nicht, in einem anderen Programm wo ich nur den Servo ansteuere funktioniert er. Woran kann das liegen? "Versteht" der sich nicht mit dem Interrupt?

Wie sollen wir dir helfen, wenn du deinen Sketch geheim hältst?

#include "TimerOne.h"  
#include <Servo.h>

Servo SERVO1;

int LED1=13;
int Intervall=1;
int pos=0;


void setup()   
{
  pinMode(LED1, OUTPUT); 
  
  SERVO1.attach(5);
  SERVO1.write(20);
  delay(10);
  
  Timer1.initialize(Intervall*1000000);
  Timer1.attachInterrupt(blinken);
}


void blinken() 
{
  digitalWrite(LED1, digitalRead(LED1) ^ 1);
}


void loop()    
{

  {                                
    SERVO1.write(120);           
    delay(1000);                      
  } 
  {
    SERVO1.write(60);
    delay(1000);
  }

}

Ein Ressourcen Konflikt !?!?

Soweit mir bekannt nutzt die Servo Lib den Timer 1.

combie:
Ein Ressourcen Konflikt !?!?

Soweit mir bekannt nutzt die Servo Lib den Timer 1.

Meinst du ich sollte die Timer1 Lib raus nehmen? Dann ist die Variable Timer1 unbekannt, als was kann ich die dann deklarieren?

Ersatzlos streichen.
Für ein bisschen Geblinke brauchst du keinen Timer Interrupt.

Tipp:
"BlinkWithoutDelay" lesen und konsequent anwenden.
Alle delay() eliminieren.

Das wird dann zu:
Kooperatives Multitasking implementieren.

ungetestet

#include <Servo.h>

Servo SERVO1;
const byte LED=13;


//---------------------------
static bool DoINTERVAL = false; // Merker für das Interval Macro

// Start of Interval Macro
#define INTERVAL(interval)                     \
{                                              \
  static unsigned long lastHit = 0;            \
  DoINTERVAL = millis() - lastHit >= interval; \
  if(DoINTERVAL) lastHit = millis();           \
}                                              \
if(DoINTERVAL)
// End of Interval Macro 
// ---------------------------



void setup() 
{
  pinMode(LED, OUTPUT); 
  SERVO1.attach(5);
  SERVO1.write(20);
  delay(10);
}

void loop() 
{
   INTERVAL(1000UL) // blink
   {
     //Tu was alle 1s
      digitalWrite(LED, !digitalRead(LED));
   }

   INTERVAL(2000UL) // Servozucken
   {
     //Tu was alle 2s
     static int stellung = 120;
     stellung = (stellung == 120)?60:120;
     SERVO1.write(stellung);           
   }
}

Funktioniert, super danke :slight_smile:
Ich wollte/ konnte BlinkWithoutDelay erst nicht anwenden weil ich nicht wusste wie ich den Servo ohne delay nutzen kann, aber so ist's einleuchtend