ich habe hier einen ganz seltsamen Effekt mit Arduino (ich weiß, den ganzen Sketch zeigen), aber das ist so strange vielleicht kennt das jemand der Codeausschnitt: Serial.print( menue[midx].text ); if ( entry.isDirectory() ) { Serial.println("+"); Serial.println("/"); Serial.println("-"); im Serial-Monitor erfolgt dann bei 3 Aufrufen als Ausgabe: das erste Mal richtig: DCIM+ / - Dann fehlt der / 100MEDIA/ listDir 1 100MEDIA+ - und bei 3.Mal + anstatt / DCIM+ + - und wenn ich anstatt / z.B. ? ausgebe, funktioniert alles wie gewünscht. Warum geht das mit / nicht?
Hä? Wie 3 Mal aufrufen? 3 x Reset? Im loop() 3 x aufrufen? Kannst mal ganz genau schreiben, was zurückkommt, am Besten mit [code]! Danke und Gruss Chregu
das Ganze ist in einem Programm um in einem Verzeichnis einer SD-Card rum zu navigieren. Wenn ich das mache wird der gezeigte Programmteil aufgerufen und macht eben diese Ausgaben. Ich habe jetzt mal statt des Serialmonitors von Arduino ein Terminalprogramm verwendet, es kommt die gleiche Ausgabe. Hier die 2. Ausgabe bei der das / fehlt als Hexcode: 0D 0A 31 30 30 4D 45 44 49 41 2B 0D 0A 0D 0A 2D 0D 0A oder noch Mal als ASCII 100MEDIA+ - Dann habe ich die 3x println zusammengezogen, slso Serial.println("+/-"); Funktioniert! Ich schiebe es jetzt Mal auf einen Fehler in der Lib, dann wird halt kein / verwendet!
es muss was mit Strings zu tun haben: strcat( menue[midx].text, "/"); Funktioniert auch oft nicht (es wird nichts angehängt) strcat( menue[midx].text, "/ "); oder strcat( menue[midx].text, "+"); funktioniert
Und Du bist Dir ganz, ganz sicher, daß das auch der Quelltext ist, den Du verwendest, und nicht etwas, an das Du Dich erinnerst und hier wieder neu eintippst? Lad' mal Dein .ino-File hier hoch. Irgendwie kommt mir das merkwürdig vor.
nee, wirklich kopiert. Den Quelltext im jetzigen Bau-Zustand traue ich mich nicht der Meute vorzuwerfen. Ich versuche es noch etwas einzugrenzen, wird aber heute nichts mehr und morgen nicht gleich :-(
wenn ich darüber nachdenke kann doch nur sein dass irgendwo der String "/" zerschossen wird, und das wäre übel in der Arduino-IDE ohne Debugger da das Programm inzwischen ein bißchen mehr als "Hello world" macht. Werden eigentlich zwei gleiche konstante Strings vom Compiler übereinander gelegt, das Verhalten deutet darauf hin.
Ich bin mir recht sicher, dass du an der falschen Stelle suchst..... Meine Glaskugel sagt: 1. Heap - Stack Kollision 2. Zeiger, welche in die Wiese zeigen 3. Arrayüberschreitung Also: Unbeabsichtigtes Überschreiben von unschuldigen Speicherbereichen.
scheinbar liegt es an der Programmgröße dass es nicht geht mit void loop() { doInput(); //doMenu(); } ist die Programmgröße Binary sketch size 19,270 bytes (of a 30,720 byte maximum) und die Ausgabe im setup ist alles ok mit void loop() { doInput(); if ( lastmillis<0 ) // Bedingung ist nie erfuellt doMenu(); } ist die Programmgröße Binary sketch size 21,754 bytes (of a 30,720 byte maximum) und bei der Ausgabe im setup kommt schon Käse. Ist das Programm schon zu groß? Es ist ein pro Mini mit mega328
Werner schrieb: > Ist das Programm schon zu groß? Nein! Steht doch in der Meldung! Zeige doch mal den RAM Verbrauch, der ist viel interessanter. Werner schrieb: > scheinbar liegt es an der Programmgröße dass es nicht geht Es gilt weiterhin: > Ich bin mir recht sicher, dass du an der falschen Stelle suchst...
funktioniert: text data bss dec hex filename 18764 536 924 20224 4f00 CNC.cpp.elf funktioniert nicht text data bss dec hex filename 21208 536 958 22702 58ae CNC.cpp.elf da ist ja auch noch 1k für Stack frei. Ich selbst brauche bis zum Auftauchen des Fehlers gar keinen Stack. Aufgerufen werden nur Librarys (TFT und SD), siehe setup an dessen Ende printdirectory aus dem arduino Beispiel aufgerufen wird. Das ist zwar recursiv, aber es gibt auf der SD Card nur einen Ordner der einen Ordner enthält und eine Datei, Rekursionstiefe also 3. Und das funktioniert ja auch wenn das Programm nicht zu groß wird. Mein Programm verbraucht relativ wenig Flash und RAM, viel braucht die SD-Library, gibt es da was kleineres? void setup(void) { Serial.begin(9600); lastmillis = millis(); Serial.println("mini is running ..."); tft.initR(INITR_BLACKTAB); // ST7735-Chip initialisieren tft.setFont(font5x7); tft.fillScreen(ST7735_BLACK); tft.setTextSize(2); tft.setTextWrap(false); tft.setTextColor(ST7735_WHITE, ST7735_BLACK); tft.setCursor(0, 4); tft.println("Hallo Welt"); pinMode(blLCD, OUTPUT); digitalWrite(blLCD, HIGH); tft.println("Init. SDC"); Serial.print("Initializing SD card..."); pinMode(csSD, OUTPUT); if ( !SD.begin(csSD) ) { tft.println("failed!"); Serial.println("initialization failed!"); } else { tft.println("done."); Serial.println("initialization done."); dirs[0] = SD.open("/"); printDirectory(dirs[0], 0); } }
ich habe mir noch Mal den größmöglichen Block mit malloc geben lassen, das sind 417 bzw. 383 Byte Wie ist das denn alles angeordnet oder wie finde ich raus wo Variablen und der Stack und Heap liegen
Werner schrieb: > Wie ist das denn alles angeordnet oder wie finde ich raus wo Variablen > und der Stack und Heap liegen Das Stichwort dürfte "map file" lauten. Das sollte auch Dein Compiler ausgeben können.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.