Pages: [1]   Go Down
Author Topic: Arduino "stürzt ab"  (Read 610 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 2
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo Leute =),
bin neu hier im Forum, und habe folgendes Problem.

An meinem Arduino ist ein 16x2 LCD Display angeschlossen, und ich habe eine Funktion, mit der ich die Ausgabe realisiert hab (zeige_an).
Das Arduino soll aus 3 Blöcken zu je 16 verschiedenen Texten einen raussuchen und Anzeigen.
Dabei wird jeweils 1 Block hochgezählt, und dann einer von 16 Texten zufällig ausgewählt - das funktioniert auch alles soweit:


Code:
void loop() {
  // Einen Block weiter
  k++;
  if(k>2) { k = 0; }
  // Dann ein Zufälliger Text
  zaehler = random(16);

  // Jetzt kommt die auswahl
  if(k == 0) {
    switch(zaehler) {
      case 0: anzeigestring = "Text 1";break;
      ...
      case 15:anzeigestring = "Text 16";break;
    };
  }
  if(k == 1) {
    switch(zaehler) {
          
      case  0:anzeigestring = "Text 17";break;        
      ...
      case 15:anzeigestring = "Text 32";break;
      
    };
  } /*
  if(k == 2) {
    switch(zaehler) {
        
      case  0:anzeigestring =  "Text 33";break;
      ...
      case 15:anzeigestring =  "Text 48";break;
      
    };
  }*/
    zeige_an();
    delay(2000);
}

So nun das eigentliche Problem,
Sobald ich den "dritten Block" ( also if(k==2) { ...} ) mit rein nehme, passiert entweder gar nichts mehr (Display bleibt blau), Oder es kommt nur ein Random Text, danach schreibt er sinnlos Buchstaben.
Wenn ich aber nur die ersten beiden Blöcke abfrage (also k dann nur bis 1 gehen lasse, und den dritten abfrage-Block auskommentiere) funktioniert alles so wie es soll, und er zeigt abwechselnd einen zufälligen Text vom ersten oder zweiten Block an.

Der Sketch ist lediglich 10.000 Bytes groß (von 32.000), also kann es doch eigentlich nicht an der Länge des Codes liegen?

Hängt das irgendwie mit dem begrenzten Speicher des Mikrocontrollers zusammen?

Ich bitte um Hilfe smiley-cry Danke =)

« Last Edit: April 18, 2013, 10:45:50 am by uwefed » Logged

Austria
Offline Offline
Full Member
***
Karma: 2
Posts: 107
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo,
in deinem Sketch verwendest du viele Strings, welche sehr/zu viel SRAM brauchen. Wenn du diese Strings im Flash Speicher unterbringst sollte es funktionieren.
Es gibt eine library, mit der das Speichern im Flash ganz einfach ist.

Siehe hier:
http://www.arduino.cc/en/Reference/PROGMEM

Grüße,
J3RE
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 271
Posts: 21871
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

oder hier: http://arduino.cc/forum/index.php/topic,127552.msg965539.html#msg965539
Logged

Germany
Offline Offline
Faraday Member
**
Karma: 59
Posts: 3071
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

... und Code ohne Variablendefinition ist auch nur ein Rate-Schnipsel ...

Ich rate mal, anzeigestring ist leider kein char*. (mit PROGMEM sollte es dann ein prog_char* sein ... )
Leider gibt es nur die Methode
Code:
   print(const __FlashStringHelper *);
um direkt aus dem Flash etwas auszugeben, da musst du dann in deinem weggeschnipselten  zeige_an() noch ein bisschen feilen.

Leider zeigt die IDE nur die Größe des Flash-Speichers an, viel kritischer ist in der Regel aber der RAM. Und die ändert sich auch noch, vor allem wenn du String Objekte verwendet haben solltest.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 2
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi, danke erstmal für die schnellen Antworten =),

ja, die Variablen sind Tatsächlich Strings, weil es bei Strings einfacher ist Länge auszulesen und einzelne Buchstaben an Position x;

Der fehlende Code:

Code:
// String zur Anzeige der einzelnen Buchstaben
String text = "";
// String zur weitergabe an die Zeilen-Umbruchs-Funktion
String anzeigestring = "";
// String mit den Komplimenten

// Funktion zum "tippen" der einzelnen Buchstaben
void tipp(int row){
  Serial.print("tippe...");
  int len = text.length() ;
  for(int i = 0; i<len; i++) {
    lcd.setCursor(i,row);
    lcd.print(text.charAt(i));
    delay(70);
  }  
}

Die funktion zeige_an() ist etwas lang, weil sie den Zeilenumbruch macht, der jetzt erstmal nichts mit dem Problem zu tun hat -> im Grunde ruft sie einfach nur die Funktion "tipp" auf, benötigt aber auch, die funktionen string.charAt(x) und String.length .

Also entweder brauche ich eine Möglichkeit, Strings vernüntig im flash zu speichern;
oder funktionen der Strings (charAt und length) für char*

-> Idee:
Wäre es nicht möglich die Texte in char* Feldern auf dem Flash zu speichern mittels Progmem und dann dynamisch (also während der Schleife) einfach an einen String zu übergeben? und mit diesem String kann ich dann all die tollen sachen machen, die mit Strings so möglich sind?

Danke schonmal =)
« Last Edit: April 19, 2013, 03:47:38 pm by uwefed » Logged

Munich/Germany
Offline Offline
God Member
*****
Karma: 11
Posts: 643
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Lass Strings auf dem Arduino bleiben, dann ersparst Du dir einen Haufen Ärger. Mit C-Strings kannst Du alles genau so machen. Vielleicht nicht ganz so elegant, aber dafür funktioniert es.

Code:
char str[21];             // Char-Array für 20 Zeichen (+ abschließendem Null-Byte) definieren
char *str2 = "Ein Test";  // Zeiger auf Char definieren und auf String setzen
strcpy(str, str2);        // Text kopieren
int len = strlen(str);    // Stringlänge ermitteln
int len2 = strlen(str2);
char zeichen = str[4];    // Das Zeichen an der fünften Stelle auslesen
char zeichen2 = str2[4];
Wo ist das Problem und was ist da mit Strings einfacher?
Logged

_______
Manfred

Pages: [1]   Go Up
Jump to: