www.mikrocontroller.net

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


Autor: Paul (Gast)
Datum:
Angehängte Dateien:

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

Autor: Markus C. (ljmarkus)
Datum:

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

Autor: Frank K. (fchk)
Datum:

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

Autor: Paul (Gast)
Datum:

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

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

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

Mach einfach das '1<<RXCIE0' weg.

MfG Spess

Autor: Paul (Gast)
Datum:

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

Autor: Frank K. (fchk)
Datum:

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

Autor: Paul (Gast)
Datum:

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

Autor: Andreas K. (derandi)
Datum:

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

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]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [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.