[SOLVED] Problems in the Timer interrupt routine
tales von milet Mon Oct 30, 2017 7:27 pm
ich habe da ein kleines Problem. Index wird in der handler_servos nicht 0. sie fängt scheinbar immer bei 1 an.
ich sehe da aber keinen fehler.
I have a little problem there. Index does not get 0 in handler_servos, it always starts at 1.
but I do not see any mistakes.
#define IndexMax 3 // Anzahl der servos
#define ServoMIN 500 // Minimalwert des Servos in usec
#define ServoMAX 2500 // Miaximalwert des Servos in usec
#define ServoHome 1500 // Mittelwert des Servos in usec
#define INTERVAL 20000 // 20ms
unsigned int S[]={PB5,PB6,PB7}; // Pins für die Servos;
volatile int W[IndexMax]; // Impulswerte der Servos in usec
volatile int Index=0; // Zeiger auf Servo/Daten
volatile int Index1=0;
void Servo_init(void)
{
int i;
for (i=0;i<IndexMax;i++)
{
pinMode(S[i], OUTPUT); // Pins als Ausgang definieren
W[i]=ServoHome; // vorbelegung der Servos
sprintf(fbuffer, "Pin %i ist Servo %i",S[i],i);
Serial.println(fbuffer);
}
noInterrupts(); // Alle Inte Timer2.setChannel1Mode(TIMER_OUTPUTCOMPARE);
Timer2.setPeriod(ServoHome*IndexMax); // in microseconds
Timer2.attachCompare1Interrupt(handler_servos);
Timer2.setCompare1(1); // overflow might be small
interrupts(); // alle Interrupts scharf schalten
}
void handler_servos(void)
{
int i,T1wert;
digitalWrite(S[Index1],LOW); // aktuellen Servo abschalten
if (Index < IndexMax)
{
digitalWrite(S[Index],HIGH); // anschalten
T1wert=W[Index]; // in microseconds
Index1=Index; // Servo zum abschalten merken
Index++; // nächsten vorbereiten
}
else
{
Index= 0;
T1wert=INTERVAL;
for (i=0;i<IndexMax;i++) T1wert-=W[i];
}
Timer2.setPeriod(T1wert); // in microseconds
}
