Forum: Mikrocontroller und Digitale Elektronik µC startet immer wieder neu


von Paul (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe heute morgen ein kleines Problem für meinen Dimmer geschrieben. 
Dieses Programm soll empfangene Daten in das int Format umwandeln und 
danach in das Timer Register schreiben, um einen Phasenanschnitt zu 
bewirken.

Wenn ich dort eine Konstante verwende, klappt auch alles super und ohne 
Probleme. Nur bei dem Empfangen harpert es noch.

Wenn der Controller gestartet wird, setzt er zunächst testweise eine 
konstanten Wert in die Variable, um erstmal zu schauen, o, die Glühbirne 
für die Testzwecke noch funktioniert.

Danach versuche ich, einen Wert zu senden (ca so: "090\n").

Sobald ich das jedoch gemacht habe, startet der Controller immer wieder 
neu.

Eigentlich sollte er ja in seiner WHILE-Schleife bleiben.

Macht er jedoch nicht. Ich habe jetzt schon mehrere Stunden rumprobiert 
und immer mit dem gleichen Ergebnis.

Hat jemand vielleicht eine Lösung für diesen seltsamen Fehler?



Viele Grüße

von Markus C. (ljmarkus)


Lesenswert?

Hallo..

nunja, wenn er ein Zeichen über UART empfängt springt er irgendwo hin 
weil du die ISR für UART RX nigends hast.

bye

von Frank K. (fchk)


Lesenswert?

Paul schrieb:

> Hat jemand vielleicht eine Lösung für diesen seltsamen Fehler?

Schau Dir mal Dein sprintf in der while-Schleife ganz genau an:

Prototyp:
int sprintf ( char * str, const char * format, ... );

Zaunpfahl 1: Zeigt der erste Parameter auf einen String mit 
hinreichender Länge?

Zaunpfahl 2: Was passiert, wenn die Ausgabe von sprintf nicht mehr in 
den String, in den sie rein soll, reinpasst? Gibt es andere 
Bibliotheksfunktionen, die vielleicht sicherer sind?

fchk

von Paul (Gast)


Lesenswert?

Vielen Dank für deine Antwort ;)
Wie würde man dem Problem denn am besten entgegenwirken?
Reicht es, die ISR einfach nur leer zu ergänzen?
Gruß

von Spess53 (Gast)


Lesenswert?

Hi

>Reicht es, die ISR einfach nur leer zu ergänzen?

Mach einfach das '1<<RXCIE0' weg.

MfG Spess

von Paul (Gast)


Lesenswert?

Hallo Frank,
ich habe deine Antwort ganz übersehen.

1. Nein, der erste Parameter zeigt auf gar keinen String. Aber jetzt wo 
du's sagst, fällt es mir auch auf.

2. Ich wüsste keine andere Funktion, die besser geeignet wäre. Sosnt 
hätte ich die ja wahrscheinlich auch nicht genommen. ;)
Hättest du vielleicht eine für mich?

Liebe Grüße

von Frank K. (fchk)


Lesenswert?

Paul schrieb:
> Hallo Frank,
> ich habe deine Antwort ganz übersehen.
>
> 1. Nein, der erste Parameter zeigt auf gar keinen String. Aber jetzt wo
> du's sagst, fällt es mir auch auf.

Und damit überschreibst Du irgendwelche Variablen. Dass das dann zum 
Absturz führt, ist klar.

> 2. Ich wüsste keine andere Funktion, die besser geeignet wäre. Sosnt
> hätte ich die ja wahrscheinlich auch nicht genommen. ;)
> Hättest du vielleicht eine für mich?

Hast Du ein C-Buch? Wenn nein, solltest Du Dir mal eines kaufen. Der 
Trend geht zum Zweitbuch. Ansonsten schau in Deine stdio.h rein. Da 
könnte auch so etwas stehen:

int snprintf(char *str, size_t size, const char *format, ...);

Dort kannst Du noch die Länge des Strings mit übergeben, in den Du 
sprinten willst. Wird der String zu lang, wird abgeschnitten. Damit 
kommst Du nicht in Gefahr, dass irgend etwas überschrieben wird.

Aus dem gleichen Grund sind strcpy, strcat und gets igitt und zu 
vermeiden.

So, jetzt noch mal zu Deinem Programm: Wolltest Du an der Stelle 
wirklich etwas ausgeben, oder nicht doch etwas aus einem String 
einlesen? In diesem Fall wären sscanf, atoi, atol, strtol oder strtoul 
passende Kandidaten.

fchk

von Paul (Gast)


Lesenswert?

Alles klar Frank, werde ich so machen.
Nochmal zum C-Buch, kannst du mir ein gutes Nachschlagewerk empfehlen?
Viele Grüße
Paul

von Andreas K. (derandi)


Lesenswert?

Wie wärs damit?
http://openbook.galileocomputing.de/c_von_a_bis_z/

Is ein Open-Book, kann man auch Online lesen oder sich als dicken Wälzer 
ins Haus holen.
Ich persönlich mag letzteres lieber, das unterstützt Offline-Betrachtung 
und man kann es aufgeschlagen liegen lassen ohne einen zweiten Monitor 
zu benötigen.

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.