PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Mieser Fehler



fredyxx
30.05.2016, 23:21
Hallo,

ich hoffe, ihr empfindet meine Frage nicht als Zumutung.

Ich habe ein etwas kompliziertes Programm aber schon auf das Wesentliche reduziert , um meine Frage zu stellen.

Das ist der (so nicht lauffähige Code) ; meine Anmerkungen dazu sind fett



#include <CustomStepper.h>

CustomStepper stepper_M2(22, 24, 26, 28); // Anschlusspinne der Motortreiber
CustomStepper stepper_M3(32, 34, 36, 38); //

#include <SimpleTimer.h> // einbinden der Library

SimpleTimer timer1; // Benennung der Timer




boolean M1solldrehen = false; // für UP Justierung
boolean M2solldrehen = true; // für UP Justierung

boolean Zeitaus1 = true; // Wird false, wenn Zeit von SimpleTimer 1 abgelaufen ist

int JustPin = 14; // mit digital Eingang 14 wird die jeweilige Motorbewegung gestoppt
int zeitId; // für den SimpleTimer


void setup() {
Serial.begin (250000); // diese Buadrate muss auch in der Konsole (Serieller Monitor) eingestellt sein
while (!Serial);

pinMode (JustPin, INPUT); // wird nur im UP Justierung benötigt
digitalWrite(JustPin, HIGH); //schaltet den PullUp-Widerstand ein
}


void loop() {

Justierung();

// stepper_M2.run();
// stepper_M3.run();

timer1.run();

} //************* ENDE loop



// ************************************** UP Justierung **************************************

void Justierung() {
static boolean Start_war = false;

if (Zeitaus1 == false) {
M1solldrehen == true; wird nach Ablauf des Timers durchlaufen
M2solldrehen == false;
goto M2_Sprung;
}
// 11111111111111111111111
if (digitalRead (JustPin) == HIGH && M1solldrehen == false) {

hier wird Spindelstepper eingeschaltet

}
// 2222222222222222222222222
else if (digitalRead (JustPin) == LOW && M1solldrehen == false) { // Motor 1 justieren
Serial.print (" 163 "); Die Ausgabe erfolgt im Seriellen Monitor ca. 1 s lang und ist "163 0"
Serial.println (Start_war);

// 2a2a2a2a2a2a2a2a2a2a2a2a
if (Start_war == false) {
zeitId = timer1.setInterval(1000, Zeitablauf1); hier wird der Timer gestartet
}
// 2b2b2b2b2b2b2b2b2b2b2b2b2b
else if (Start_war == true) { // Endposition erreicht

Serial.println (" 170 "); hier kommt das Programm nicht hin
}
}

M2_Sprung:

if (stepper_M2.isDone() && M2solldrehen == false && Zeitaus1 == false) { //Motor 2 justieren

Serial.println (" M2_Sprung ");

}

} //************* ENDE UP Justierung



//**************************** UP Zeitablauf1 **************************************
void Zeitablauf1() { // wird ausgeführt, wenn SimpleTimer timer 1 abgelaufen ist

Zeitaus1 = false; //

Serial.println (" 255 ");


} // *********** ENDE UP






void M2_fahren() {

}





Ohne meine fetten Kommentare tut das Programm, was es soll. Die Konsole zeigt dann:

für 1 s

163
0
Zeitaus1 = 1
163
0
Zeitaus1 = 1
163
0
Zeitaus1 = 1
163

nach der Sekunde

163
0
255
Zeitaus1 = 0
255
255
Zeitaus1 = 0


So weit so gut!

Jetzt mein Problem:

Sobald ich diese Zeilen scharf mache:

// stepper_M2.run();
// stepper_M3.run();

funktioniert das so nicht mehr, obwohl ich sonst nichts ändere und alles was mit den Steppern M2 und M3 zu tun hat, gelöscht habe. Auf der Konsole erscheint nur noch :
Zeitaus1 = 1
163
0
und das nur einmal.

Kann es sein, dass die Librarys sich beeinflussen? Was könnte man denn dagegen tun?

Gruß
fredyxx

Rabenauge
31.05.2016, 02:27
Hm- möglich wärs.
Du hantierst auch recht -ich nenns mal offenherzig- mit diversen Timern da herum.
Denn _irgendwas_ timerähnliches brauchen die Stepper ganz sicher auch....
Da hilft nur, die eine oder andere Funktion mal deaktivieren, und schauen, was passiert.

Eventuell würde ich mal, bei so einem Vorhaben, über eine vernünftige Zeitscheiben-Steuerung nachdenken, das riecht mir stark nach der Notwendigkeit für echtes Multitasking.
Aber dann nimm bitte nen echten Timer-Interrupt für, die funktionieren auch zuverlässig (zeitkritisches kann man da immer noch abfangen).

fredyxx
31.05.2016, 09:23
Hallo,


Da hilft nur, die eine oder andere Funktion mal deaktivieren, und schauen, was passiert.

Was soll ich da noch deaktivieren? In dem kurzen Testprogramm kommt es ja gar nicht dazu, dass ein Steppertreiber einen Auftrag erhält.
Es spielt auch keine Rolle, ob ich nur einen oder beide stepper_....run() - Befehle aktiviere.


Eventuell würde ich mal, bei so einem Vorhaben, über eine vernünftige Zeitscheiben-Steuerung nachdenken

Wie geht das ? Aber was kann das nützen, wenn man nicht weiß, was in der CustomStepper - Library wann passiert?

Gruß und Dank

fredyxx