Edit: !!!Gelöst!!! War ein RAM Problem . Mit dem Workaround durch F-Macro und Malloc.c Datei wurde das Problem behoben!
Hallo zusammen,
ich bin dabei eine Schrittmotorensteuerung zu entwerfen bei der außerdem Ausgaben über ein LCD Display erfolgen (das ganze läuft über ein Leonardo) und habe folgendes kurioses Problem:
Die einzelnen Prozeduren funktionieren einwandfrei, auch die Messung() funktioniert als externe Prozedur (also in einer eigenen Datei) ohne Probleme, füge ich aber den Code aus dieser Datei in die Hauptdatei ein, so bleibt das Programm immer an einem Punkt stehen (unten durch rot markiert). Ich habe keine Ahnung woran das liegt und noch seltsamer macht es der Fakt, dass das Programm alle x Versuche mal funktioniert und dann wieder ewig nicht. Mal geh ich in die Pause, komme zurück, stecke die Stecker ein und aus, dann funktioniert es, mal funktioniert es nach einem neuem Upload. Allerdings ist die Erfolgsquote auch nur bei ca. 1%.
Es würde mich freuen, wenn ihr mir weiterhelfen könntet.
Messung() als eigenes Programm:
#include <Stepper.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x20,16,2); // set the LCD address to 0x20 for a 16 chars and 2 line display
const int stepsPerRevolution = 400;
// initialize the stepper library on pins 8 through 11:
Stepper myStepperX(stepsPerRevolution, 8,9,10,11);
Stepper myStepperY(stepsPerRevolution, 4,5,6,7);
//Messfeldgrößen
int MessfeldX=4;
int MessfeldY=5;
String Messfeldausgabe="";
//LCD Variablen
String LCDText="";
String LCDNotaus="";
String LCDZwZeile="";
//Messung
String Messausgabe="";
int Messwert=0;
int Messreihe=1;
int Schrittweite=800;
int Messpkt=0;
void setup()
{
myStepperX.setSpeed(60);
myStepperY.setSpeed(60);
Serial.begin(9600);
lcd.init(); // initialize the lcd
lcd.backlight();
}
void loop()
{
Messung();
}
void Messung()
{
LCDText="Messung startet";
LCDWrite(LCDText);
for (int p=1; p <= MessfeldX; p++)
{
Serial.println("Messreihe");
myStepperX.step(800);
//Serial.println(m);
delay(1000);
Serial.println("nach m");
for (int i=1; i<=MessfeldY; i++)
{
Serial.println("i");
myStepperY.step(800);
//Serial.println(n);
Serial.println("nach n");
delay(1000);
Serial.println("nach delay");
Messausgabe="Messpunkt ";
Serial.println(Messausgabe);
Messpkt=(p-1)*MessfeldY +i;
LCDText=Messausgabe + Messpkt;
Serial.println(LCDText);
LCDZwZeile="Messung laeuft";
Serial.println(LCDZwZeile);
Serial.println("nach Stringerstellung");
LCDWriteZw(LCDText, LCDZwZeile);
delay(5000);
Messwert=random(10);
delay(2);
Serial.println("nach Random");
LCDText="Mpkt erfasst";
Messausgabe="Messwert: ";
LCDZwZeile=Messausgabe + Messwert;
LCDWriteZw(LCDText, LCDZwZeile);
delay(1000);
}
delay(100);
}
LCDText="Messung beendet";
LCDWrite(LCDText);
delay(10000);
}
void LCDWrite(String Eingabestring)
{
lcd.clear();
lcd.print(Eingabestring);
}
void LCDWriteZw(String Eingabestring, String EingabeZweiteZeile)
{
lcd.clear();
lcd.print(Eingabestring);
lcd.setCursor(0,1);
lcd.print(EingabeZweiteZeile);
}
Das komplette Programm
// Verschmelzung von Notaus_Procedure und Anfangsposition_mit_Wait_Monitor_Abfrage
//Stepper-Motoren-Lib+Variablen
#include <Stepper.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x20,16,2); // set the LCD address to 0x20 for a 16 chars and 2 line display
const int stepsPerRevolution = 400;
// initialize the stepper library on pins 8 through 11:
Stepper myStepperX(stepsPerRevolution, 8,9,10,11);
Stepper myStepperY(stepsPerRevolution, 4,5,6,7);
int stepCount = 0; // number of steps the motor has taken
//Pinbelegung
const int StopTester = A1;
const int WaitSchalter = 13;
const int Sicherheitstest = A3;
//Spannungsfühler
int AnschlagSchalter = 0;
int NotAusSchalter = 0;
int SicherheitAbwarten = 0;
//Schleifen-Unterbrecher
int Startposi = 0;
int Anfangsposi = 0;
int Eingabe = 0;
//Eingabe-Auslese Variablen
String Inhalt = "";
char EingabeZeichen;
int EingabeZahl=0;
int RueckgabeZahl=0;
boolean EingabeTrue=false;
//Messfeldgrößen
int MessfeldX=0;
int MessfeldY=0;
String Messfeldausgabe="";
//LCD Variablen
String LCDText="";
String LCDNotaus="";
String LCDZwZeile="";
//Messung
String Messausgabe="";
int Messwert=0;
int Messreihe=1;
int Schrittweite=800;
int Messpkt=0;
void setup()
{
Serial.begin(9600);
myStepperX.setSpeed(60);
myStepperY.setSpeed(60);
pinMode(Sicherheitstest, INPUT);
pinMode(StopTester, INPUT);
lcd.init(); // initialize the lcd
lcd.backlight();
}
void loop()
{
NotausAbfrage();
Ausgangsposition();
StartpunktAnfahren();
MessrasterAngabe();
Messung();
}
void NotausAbfrage()
{
NotAusSchalter = digitalRead(Sicherheitstest);
if (NotAusSchalter == HIGH)
{
LCDNotaus="Notaus AKTIV";
LCDWrite(LCDNotaus);
SicherheitAbwarten = 1;
while (SicherheitAbwarten == 1)
{
if (Serial.available() <=0 )
{
Serial.println("Notaus AKTIV");
Serial.println("Bitte mit '1' bestaetigen, sobald Notaus deaktiviert wurde");
delay(1000);
}
if (Serial.available() > 0 ) // auf Daten am serielle-Port warten
{
delay(10); // kann man, muss nicht
Eingabe = Serial.read(); // Daten Byte in die Variable comand schreiben
if (Eingabe == 49)
{
Serial.println("Notaus Deaktivierung bestaetigt");
SicherheitAbwarten = 0;
lcd.clear();
lcd.print("Notaus");
lcd.setCursor(0,1),
lcd.print("deaktiviert");
delay(2000);
LCDWrite(LCDText);
}
}
}
delay(1000);
}
else
{
//Serial.println("Notaus nicht aktiv");
SicherheitAbwarten = 0;
//delay(1000);
}
}