Forum: Mikrocontroller und Digitale Elektronik AVR "verhakt" sich


von Werner (Gast)


Angehängte Dateien:

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

von Phil J. (sunflower_seed)


Lesenswert?

Wie wird der Textblock übertragen?
Wie groß ist die Variable?
Wird irgendwas nicht zurückgesetzt oder läuft über?
Code würd helfen

von Karl F. (kafido)


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

von Werner (Gast)


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

von Volkmar D. (volkmar)


Lesenswert?

Werner schrieb:
> sprintf_P(str, PSTR("%-12s: %i mV\r\n"), "U Ist", u_ist);
> uart_puts(str);

Wie ist "str" definiert?

von Werner (Gast)


Lesenswert?

Achsojasicher:

char str[60];

Die Meßwerte (z.B. u_ist) sind alle int16_t

von Volkmar D. (volkmar)


Lesenswert?

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
Noch kein Account? Hier anmelden.