Forum: Mikrocontroller und Digitale Elektronik Atmega328p - Sensorwerte per UART - Absturz


von Niine (Gast)


Lesenswert?

Hallo,
ich versuche verschiedene Sensorwerte in einem String per UART 
(115200kbps) zu senden. Atmega328p läuft auf 16Mhz. Senden des Strings 
alle 10ms.

Ich nutze dazu den folgenden Codeteil:
1
char str[200];
2
  sprintf(str, "S %" PRIu32 " %" PRId16 " %" PRId16 " %" PRId16 " %" PRId16  " %" PRId16 " %" PRId16 " %" PRIu32 " %" PRIu32 " %" PRId16 " \r" , a_trigger, accelX, accelY, accelZ,  rotX, rotY, rotZ, light_ppg1, light_ppg2, temperature);
3
  uart_puts(str);

Es funktioniert eigentlich, aber in unregelmäßigen Abständen stürzt der 
Controller ab. Mal bei Zähler 30, mal bei 190, manchmal 100sek lang 
nicht. Nehm ich den Codeteil raus, funktioniert alles. Also an den 
Sensorwerten, die per I2C gelesen werden, scheint es nicht zu liegen.

Hat jemand eine Idee woran das liegen könnte? Ich verzweifle langsam :-/

Vielen Dank,
Niine

von Jim M. (turboj)


Lesenswert?

Der Fehler ist in Zeile 42.

von Niine (Gast)


Lesenswert?

Jim M. schrieb:
> Der Fehler ist in Zeile 42.

Oh man, ich weiss, viel Information ist es nicht. Aber ich konnte es auf 
diese Routine begrenzen.

Ist es vielleicht möglich, dass der String bei manchen Werten zu groß 
wird und der Speicher quasi überläuft und abstürzt?

von holger (Gast)


Lesenswert?

>Ist es vielleicht möglich, dass der String bei manchen Werten zu groß
>wird und der Speicher quasi überläuft und abstürzt?

Natürlich ist das möglich. Aber woher soll man wissen was du sonst
noch so an Speicher verplemperst? Dein char str[200];
belegt jedenfalls schon mal 10% von den 2k RAM.

von Karl M. (Gast)


Lesenswert?

Hallo,

bitte rechne Dir mal den Uart-Fehler aus:

UBBR: 16MHz /16 /115.200kbps => geht nicht !

Du meinst vielleicht:
UBBR: 16MHz /16 /115.200bps = 8,681
ist nicht ganzzahlig.

mit UBBR = 9 => Baudrate: 111.111bps
mit UBBR = 8 => Baudrate: 125.000bps

Oder
UBBR: 16MHz /8 /115.200bps = 17,361
mit UBBR = 17 => Baudrate: 117.647bps

Sonst liegt vielleicht einfach ein Puffer-Überschreiben vor.

Dein Codebsp. sollte komplett, vollständig und übersetzbar sein.

von Rasputin (Gast)


Lesenswert?

Kennt deine Lib kein snprintf()?

von Niine (Gast)


Lesenswert?

Karl M. schrieb:
> bitte rechne Dir mal den Uart-Fehler aus:
> UBBR: 16MHz /16 /115.200bps = 8,681
> ist nicht ganzzahlig.
> mit UBBR = 8 => Baudrate: 125.000bps

Ich habe es mal auf 125.000bps gestellt und einen Zähler, den ich auch 
am PC berechnen kann, wegrationalisiert. Jetzt scheint es erstmal 
flüssig zu laufen :-)

holger schrieb:
> Natürlich ist das möglich. Aber woher soll man wissen was du sonst
> noch so an Speicher verplemperst?
Karl M. schrieb:
> Dein Codebsp. sollte komplett, vollständig und übersetzbar sein.

Das ist leider an der Masse an Code schwierig, es wird ja an vielen 
Stellen beeinflusst. :-/

Danke, mit der Geschwindigkeitsänderung und dem gesparten Wert läuft es 
wieder besser :-)

Vg Niine

von Peter II (Gast)


Lesenswert?

Rasputin schrieb:
> Kennt deine Lib kein snprintf()?

was soll das bringen? Es sind alles int werte, damit kann man doch recht 
gut abschätzen wie lang das ganze wird.

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.