Atmega328p - Sensorwerte per UART - Absturz

Gast #4826264
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
Gast #4826330
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?
Gast #4826353
>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.
Gast #4826355
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.
Gast #4826410
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.