hallo miteinander,
habe seit neusten ein UNO
wenn ich dort meine Firmware für die Tropfenbox aufspiele
bekomme ich entweder keine Rückmeldung oder Falsche Rückmeldungen vom UNO.
Kann das an einem Speicher Problem Ligen?
wenn ich die ziele:
hardware_t hardware[60]=
von 60 auf 70 erhöhe habe ich die Probleme.
mit 60 habe ich die Probleme nicht.
wie kann ich raus finden ob ich ein Speicher Problem habe auf dem UNO oder nicht?
Firmware aufspielen, Seriellen Monitor Starten und den Befehl eingeben "print_config" dann müsste eine Liste aller Daten in dem Array kommen, wie gesagt wenn ich die Zahl auf 70 erhöhe bekomme ich Falsche antworten oder es reagiert nicht mehr.
aus dem Grund dachte ich an ein Speicherproblem.
das ist die vollständige Firmware:
// *****************************************************************
// *****************************************************************
// *****************************************************************
// Befehl Ausgabe
// get_name = Es antwortet mit seinem Namen
// get_firmware = Es Antwortet mit der Versionsnummer
// configure = Format: configure,pin,vorlaufzeit,dauer
// print_config = Es antwortet mit einer Tabelle aller Hardware Zeiten
// *print_steps* = Es antwortet mit einer Tabelle aller Schaltzeiten
// reset = Es setzt alle Hardware Schaltzeiten wider auf 0 zurück
// * nicht inplementirt
// *****************************************************************
// *****************************************************************
// *****************************************************************
#define ZEILENTRENNZEICHEN 10
int startPin = A4;
char Firmware_Nr[] = "2.0-MG";
char Name[] = "Tropfen Box";
int Baudrate = 9600;
int Lauf = 0;
int Zeile = 4;
struct hardware_t{int pin;long vorlaufzeit; long dauer;}; // Struktur einer einzelnen Schaltzeit
struct schaltzeit_t{int pin;long zeit; boolean geschaltet;}; // Struktur einer einzelnen Schaltzeit
hardware_t hardware[60]=
{ // Vorlaufzeit und Dauer für die Hardware
// {2, 0000, 500000}, // Musterdaten
// {3, 500000, 500000}, // Musterdaten
// {4, 1000000, 500000}, // Musterdaten
// {5, 1500000, 500000}, // Musterdaten
// {6, 0, 2000000}, // Musterdaten
};
#define schritte sizeof(hardware)/sizeof(hardware[0])
schaltzeit_t schaltzeiten[2*schritte];
int anzahlSchaltzeiten;
long geschalteteZeit[2*schritte];
void sortSchaltzeiten(int n)
{
schaltzeit_t temp;
for(int x=0; x<n; x++)
{
for(int y=0; y<n-1; y++)
{
if (schaltzeiten[y].zeit>schaltzeiten[y+1].zeit)
{
temp=schaltzeiten[y+1];
schaltzeiten[y+1]=schaltzeiten[y];
schaltzeiten[y]=temp;
}
}
}
}
// Funktion - Serielle Schnittstelle auslesen -
char* receiveBuffer() {
static char lineBuffer[100];
static byte counter=0;
char c;
if (Serial.available()==0) return NULL;
if (counter==0) memset(lineBuffer,0,sizeof(lineBuffer));
c=Serial.read();
if (c==ZEILENTRENNZEICHEN){
counter=0;
return lineBuffer; }
else if (c>=32) {
lineBuffer[counter]=c;
if (counter<sizeof(lineBuffer)-2) counter++; }
return NULL; }
// Funktion - Serielle Schnittstelle auslesen -
void setup()
{
pinMode(startPin, INPUT);
Serial.begin(Baudrate);
}
void loop() {
unsigned long starttime;
unsigned long looptime;
char* text=receiveBuffer();
if(text != NULL)
{
if (strcmp(text,"get_name")==0) {Serial.print("OK,"); Serial.println(Name); Serial.println("\n");}
else if (strcmp(text,"get_firmware")==0) {Serial.print("OK,"); Serial.println(Firmware_Nr); Serial.println("\n");}
else if (strcmp(text,"reset")==0) {memset(hardware, 0, sizeof(hardware)); Zeile = -1; Serial.println("OK\n");}
else if (strcmp(text,"print_config")==0)
{
Serial.print("Zeile");
Serial.print("\t");
Serial.print("PIN");
Serial.print("\t");
Serial.print("Start");
Serial.print("\t");
Serial.println("Dauer");
for (int i=0;i<schritte;i++)
{
Serial.print(i);
Serial.print("\t");
Serial.print(hardware[i].pin);
Serial.print("\t");
Serial.print(hardware[i].vorlaufzeit/1000);
Serial.print("\t");
Serial.println(hardware[i].dauer/1000);
}
Serial.print("OK");
} // Print
else if (strncmp(text,"configure",9)==0)
{
text = text + strlen_P(PSTR("configure")) + 1;
int pin;
strtok(text, ",");
if(text[0] == 'A')
{
#if defined (__AVR_ATmega328P__)
pin = atoi(text + 1) + 14; // Arduino UNO
#elif defined (__AVR_ATmega2560__)
pin = atoi(text + 1) + 54; // Arduino Mega
#endif
}
else
{
pin = atoi(text);
}
int vorlaufzeit = atoi(strtok(NULL, ","));
int dauer = atoi(strtok(NULL, ","));
Zeile = Zeile + 1;
if (Zeile > -1 && Zeile < 11) // Hier muss noch die Neue Pin abfrage hinein
{
hardware[Zeile].pin = pin;
hardware[Zeile].vorlaufzeit = vorlaufzeit;
hardware[Zeile].dauer = dauer;
hardware[Zeile].vorlaufzeit*=1000;
hardware[Zeile].dauer*=1000;
// ***************** muss wider auskommentirt werden *****************
// Serial.print(pin); Serial.print(","); // muss wider raus genommen werden
// Serial.print(vorlaufzeit); Serial.print(","); // muss wider raus genommen werden
// Serial.println(dauer); // muss wider raus genommen werden
// ***************** muss wider auskommentirt werden *****************
Serial.println("OK\n");
}
else
{ Serial.print("Pin");
Serial.print("\t");
Serial.println("Zeile");
Serial.print(pin);
Serial.print("\t");
Serial.print(Zeile);
Serial.print("\t");
Serial.println("Fehler: Werte komnten nicht eingetragen werden.\n"); }
} // Config
else { Serial.println("NOK, Unknown command:\n");}
} // if(text != NULL)
if(digitalRead(startPin)== HIGH && Lauf == 0)
{
Lauf = 1;
anzahlSchaltzeiten=0;
for (int i=0;i<schritte;i++)
{
pinMode(hardware[i].pin,OUTPUT);
if (hardware[i].dauer>0)
{
schaltzeiten[anzahlSchaltzeiten].pin=hardware[i].pin;
schaltzeiten[anzahlSchaltzeiten].zeit=hardware[i].vorlaufzeit;
schaltzeiten[anzahlSchaltzeiten].geschaltet=true;
anzahlSchaltzeiten++;
schaltzeiten[anzahlSchaltzeiten].pin=hardware[i].pin;
schaltzeiten[anzahlSchaltzeiten].zeit=hardware[i].vorlaufzeit+hardware[i].dauer;
schaltzeiten[anzahlSchaltzeiten].geschaltet=false;
anzahlSchaltzeiten++;
}
}
sortSchaltzeiten(anzahlSchaltzeiten);
starttime=micros();
for (int i=0;i<anzahlSchaltzeiten;i++)
{
while ((looptime=micros()-starttime)<schaltzeiten[i].zeit);
digitalWrite(schaltzeiten[i].pin,schaltzeiten[i].geschaltet);
}
}
else if (digitalRead(startPin)== LOW) {Lauf = 0; delay(10);}
}
Gruß Mücke