AVR "verhakt" sich

Gast #2357202
Lesenswert?

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
Angehängte Dateien:
#2357216
Lesenswert?

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
Gast #2357325
Lesenswert?

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...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren