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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Niine (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Der Fehler ist in Zeile 42.

von Niine (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Kennt deine Lib kein snprintf()?

von Niine (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.