Go Down

Topic: [ATmega2560 mit RAMPS]Programm will nicht wie ich; Finde den Fehler nicht (Read 492 times) previous topic - next topic

ManfredP



Hallo,
bin irgendwie vernagelt ... es ist ein Fehler drin, das ist klar, aber ich entdecke ihn nicht.

Die fehlerhafte Routine:
Code: [Select]
void setup() {
  // put your setup code here, to run once:
  setup_servoFan();
  pinMode(PORTNUMMER, OUTPUT);
}
void changeFan(int nummer)
{
  if(fanOnOff[nummer][0] < 126)
  {
    servoFanOnOff(nummer,true);
    fanOnOff[nummer][0]++;
    LEDOn++;
  }
  else
  {
    if(fanOnOff[nummer][0]>255)
    {
      fanOnOff[nummer][0] = 0;
      servoFanOnOff(nummer,true);
    }
    else
    {
      fanOnOff[nummer][0]++;
      servoFanOnOff(nummer,false);         
    }
  }
}

  void servoFanOnOff(int fan_number, bool OnOff)
  {
    if(OnOff)
    {
      digitalWrite(fan_number, HIGH);
    }
    else
    {
      digitalWrite(fan_number, LOW);
    }
  }

void loop() {
  // put your main code here, to run repeatedly:
    //switchAllFans();
  if(LEDOn > 0)
  {
    //changeFan(0);
    servoFanOnOff(fanOnOff[0][1],true);
    digitalWrite(fanOnOff[1][1], HIGH);
    digitalWrite(fanOnOff[2][1], HIGH);
    digitalWrite(PORTNUMMER, HIGH);
   
    LEDOn++;
  }
  else
  {
    changeFan(0);
    //servoFanOnOff(fanOnOff[0][1],false);
    digitalWrite(SERVO1_PIN, LOW);
    digitalWrite(SERVO2_PIN, LOW);
    digitalWrite(PORTNUMMER, LOW);
   
    LEDOn++;
  }
  if(LEDOn > 2000)
    {
      LEDOn = -2000;
    }
//  delay(400);
}

Zur Erklärung: Das Ding soll den Servo-Ausgang des RAMPS-Boards (für einen 3D-Drucker) ansteuern, um dort eine PWM-Steuerung zu realisieren. Dies ist nur ein Test-Programm, um das ganze eben auszuprobieren.

Was passiert? Die beiden Ausgänge 1 und 2 (also die Mittleren) blinken, wie sie sollen. Der 3-er ist nicht in der Liste, also aus. Der 1-er springt an und bleibt an.

Das Ganze liegt eindeutig an 'changeFan'. die anderen Funktionen arbeiten korrekt. Aber ich finde den Grund nicht.
fanOnOff ist ein globales Array, das sowohl die Zähler als auch die Pinnummer des Ausgangs enthält. Es ist korrekt initialisiert, da man es in 'servoFanOnOff' durchaus benutzen kann. Eigentlich soll unter fanOnOff[<x>][0] der Zähler mit einer Vorgabe verglichen werden, die in einer anderen, globalen Variablen steht Die ist in der Marlin-Software (dem kompletten Steuerprogramm des 3D-Druckers) bereits drin. Ich habe sie hier auch definiert, aber benutze sie nicht, weil es eben nicht klappt. Zuviel drumrum stört dann nur. Wenn ich es an's Laufen kriege, wird die wieder einbezogen.

Wo mache ich den Fehler?

Tschüß und Danke

Manni

ManfredP

Hallo,
manchmalk hilft es schon, wenn man nur versucht, jemandem den Mist zu erklären, den man da verzapft hat.

Hab' den Fehler!! Umstellen von changeFan hat's gebracht.

Danke für das Interesse und an den Mod: Thema kann geschlossen werden.

uwefed

Ja manchmal hilft es ein Problem erklähren zu wollen daß man sich Gedanken darüber macht und die Lösung findet.
Auch mal eine Pause machen und nicht verbissen den Fehler finden wollen hilft.

Der Topic kann bleiben. Hier lösch man eigentlich (fast) keine Topics. Könnte ja jemanden anderen noch hilfreich sein.
Grüße Uwe
Modeator.

Klaus_ww

Quote
manchmalk hilft es schon, wenn man nur versucht, jemandem den Mist zu erklären, den man da verzapft hat.
Das passiert - zum Glück - ganz häufig: Rubber duck debugging genannt.
Freizeit-Programmierer mit moderatem Ehrgeiz besseren Code zu schreiben.

michael_x

Mit schliessen meinte ManfredP auch schliessen, und nicht löschen ;)
So dass ich dies nicht hätte anhängen können, und keiner in einem Jahr mit "ich habe auch ein Problem mit ATmege2560"das Ding wieder aufweckt.

@ManfredP: Das ist unüblich hier, und wäre auch zu viel Arbeit und Verantwortung für die Moderatoren.
Wenn du willst, kannst du selbst nachträglich das Subject deines ersten Beitrags ändern, und [gelöst] oder so dazusetzen. (Wenn deine Lösung hier zu sehen wäre) ;)

Go Up