Hallo, ich habe mir ein Batteriepack-Modul gebastelt, welches einen Akku mittels Step-Down-Regler laden kann. In einer Schleife werden ständig Ist- und Sollwerte gelesen und verglichen, und entsprechend nachgeregelt. Alle paar Sekunden werden außerdem über die serielle Schnittstelle (57k6) zwecks Debugging alle Werte ausgegeben. Nun tritt immer in unbestimmter Zeit nach dem Start folgender Effekt auf: Die Textausgaben sind auf einmal zerstümmelt, man kann nur noch erkennen dass weiterhin regelmäßig ein Textblock gesendet wird. Nach einem Reset ist erst mal wieder alles in ordnung und das Spiel geht von vorne los. Hat jemand vielleicht eine Idee in welcher Richtung man anfangen könnte zu suchen? Viele Grüße Werner
Wie wird der Textblock übertragen? Wie groß ist die Variable? Wird irgendwas nicht zurückgesetzt oder läuft über? Code würd helfen
Werner schrieb: > Nun tritt immer in unbestimmter Zeit nach dem Start > folgender Effekt auf: Die Textausgaben sind auf einmal zerstümmelt Hallo Werner, da Du den Source-Code nicht gepostet hast, muss wohl wieder die Glaskugel poliert werden. Für mich klingt Deine Beschreibung sehr stark nach einem Memory-Leak - Du könntest testweise (oder generell) Deine Debug-Meldungen mal ins PROGMEM legen (falls nicht ohnehin schon geschehen) und/oder die Ausgaben auf die serielle Schnittstelle minimieren (unnötige Text raus, nur die nackten Werte ausgeben etc.) um so Speicher zu sparen und dann schauen, ob der Fehler nicht mehr bzw. erst deutlich später auftritt ... Benutzt Du für Deine serielle Ausgabe einen Buffer-String? Wird dieser evtl. durch irgendwas anderes überschrieben? Kannst Du ne Zusatzfunktion einbauen und z.B. die Stack-Größe überwachen? ... nur so'n paar Ideen ... - Karl
Es läuft alle Sekunden folgendes ab:
1 | if (!(ok = smbatt.Read(SMC_VOLTAGE, &u_ist))) |
2 | continue; |
3 | sprintf_P(str, PSTR("%-12s: %i mV\r\n"), "U Ist", u_ist); |
4 | uart_puts(str); |
Dieser Block steht öfters (ca. 13 mal) nacheinander, nur eben mit anderen Registern (SMC_VOLTAGE...). Am Ende dieses Blocks wird geregelt:
1 | if ((i_ist < (i_soll - i_soll / 50)) && (u_ist < u_soll) && (OCR1A < 0xFF)) |
2 | {
|
3 | OCR1A++; |
4 | }
|
5 | |
6 | if (((i_ist > (i_soll + i_soll / 50)) || (u_ist > u_soll)) && (OCR1A > 0)) |
7 | {
|
8 | OCR1A--; |
9 | }
|
Nach ca. 2 s geht das ganze wieder von vorne los...
Werner schrieb: > sprintf_P(str, PSTR("%-12s: %i mV\r\n"), "U Ist", u_ist); > uart_puts(str); Wie ist "str" definiert?
Ist das Problem noch akut? Vielleicht wird die Baudrate im Betrieb versehentlich verstellt?
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.