Problem mit Interruptsteuerung

Hallo Fangemeinde! :wink:

Ich hab folgendes Problem:

Wenn das Interrupt initialisiert werden soll, hängt sich das Programm auf.
Es geht dabei um folgende Zeilen Code:

#include <TimerOne.h>                      //Import der für die Interrupt-Steuerung benötigten Library!

[...]

void startInSek() {
  lcdClear();
  lcd.setCursor(0, 0);
  lcd.print("Neutralposition");
  lcd.setCursor(0, 1);
  lcd.print("best");
  lcd.write(225);               //ä
  lcd.print("tigen!  T1");
  lcd.write(126);
  while(!Taster(T1));
  lcdClear();
  lcd.setCursor(0, 0);
  lcd.print("Neutralposition");
  lcd.setCursor(0, 1);
  lcd.print("beibehalten!");
  delay(1500);
  lcdClear();  
  entfTestSchutz();
  lcd.setCursor(0, 0);
  lcd.print("Start in:       ");
  for(int i=0; i<11; i++) {
    lcd.setCursor(0, 1);
    lcd.print(10-i);
    lcd.print(" Sek.! ");    
    delay(1000);
  }
  WinkelX = 0.00;
  WinkelY = 0.00;
  lcdClear ();
  //Interruptinitialisation
  Timer1.initialize(10000);
  Timer1.attachInterrupt(berechneWinkel);
}

void berechneWinkel() {
  getGyroValues();
  WinkelX += x/114*1.995*0.01;
  WinkelY += y/114*1.995*0.01;
}

Das Interrupt dient in dem Programm dazu ein Gyro alle ~10s auszulesen und in einen Winkel umzurechnen, der dann später zur Korrigierung der Position im Raum für ein Flugzeug verwendet werden soll.

Gruß, Alex

Wieso glauben alle genau zu wissen, wo der Fehler liegt, ohne zu wissen was der Fehler ist, und darum nur einen Ausschnitt des Sketches mitzugeben. :wink: :wink: :wink:

Bitte den gesamten Sketch. Danke

Ich kann mal soviel sagen, daß die Interruptfunktion viel zu lange ist.

void berechneWinkel() {
getGyroValues();
WinkelX += x/1141.9950.01;
WinkelY += y/1141.9950.01;
}

Du darfst keine Fließkommaberechnungen drin haben und bitte rechne alle Konstanten aus. Es hat keinen Sinn daß Arduino 2 Multiplikationen und 1 Division machen muß wenn 1 Multiplikation genügen würde.

WinkelX += x*0,000175;

Viele Grüße Uwe

uwefed:
Wieso glauben alle genau zu wissen, wo der Fehler liegt, ohne zu wissen was der Fehler ist, und darum nur einen Ausschnitt des Sketches mitzugeben. :wink: :wink: :wink:

Bitte den gesamten Sketch. Danke

Ich kann mal soviel sagen, daß die Interruptfunktion viel zu lange ist.

void berechneWinkel() {
getGyroValues();
WinkelX += x/1141.9950.01;
WinkelY += y/1141.9950.01;
}

Du darfst keine Fließkommaberechnungen drin haben und bitte rechne alle Konstanten aus. Es hat keinen Sinn daß Arduino 2 Multiplikationen und 1 Division machen muß wenn 1 Multiplikation genügen würde.

WinkelX += x*0,000175;

Viele Grüße Uwe

Naja, also der original-Sketch ist ungefär 1000 Zeilen lang. Okay ich werds mal ausprobieren :slight_smile: Danke schonmal für deine Hilfe! :slight_smile:

Musste den Sketch anhängen, da er für die Code-Zeile zu groß ist :wink:

Gruß, Alex

EDIT: Funktioniert immernoch nicht :frowning:
Liegt's vielleicht daran, dass in der Interruptschleife noch eine neue Schleife aufgerufen wird?

S_Leichtflieger_v15.ino (24.5 KB)

Ich habe schoneinmal eine Fehlerquelle entdeckt:
Timer1 wird bereits von der Servolibrary verwendet. :wink:
Nur wie kann man Timer2 einschalten? Gibt es dafür auch eine Lib?

Gruß

WinkelX += x/2.2743; // x/1141.9950.01
WinkelY += y/2.2743; // y/1141.9950.01

Die ausführliche Form der Berechnung kannst Du ja als Kommentar hinter die Zeile schreiben, für später !