www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Variableüberlauf


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

Bewertung
0 lesenswert
nicht lesenswert
hallo Leute

ich habe das Programm für die Berechnung einer Frequenz mit dem Timer 
aus dem Forum entnommen  und für meine Zwecke angepasst.nun habe ich 
festgestellt wenn die Variable Ergebnis (als Double deklariert)über 
65536 ist dann habe ich nur noch falsche Ergebnisse,besonderes wenn der 
Motor sehr langsam sich dreht.kann mir jemand das erklären bzw. eine 
Lösung  vorschlagen?hiermal eine Abschnitt der zum PCS Gesendeten 
Frequenzen;
682.00
672.00
674.00
683.00
688.00
682.00
683.00
702.00
688.00
682.00
683.00
682.00
04.00  // 4 Hz entspricht F_CPU/64*4= 20000000/64*4=78125
666.00
666.00
660.00
649.00
651.00
649.00
639.00
636.00

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Ergebnis = (double)(Nrueberlaufe * 65536 ) ;
das schein ein problem zu sein. Denn (Nrueberlaufe * 65536) wird als int 
berechnet und da ist bei einem 16bit system bei 65536 schluss.

Bist du sicher das du double verwenden willst? Das ganze ist kann etwas 
langsam werden.

Teste erstmal mit:

> Ergebnis = (double)Nrueberlaufe * 65536.0;

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter schrieb:
> Bist du sicher das du double verwenden willst? Das ganze ist kann etwas
> langsam werden.
Es kann auch sein, dass es einfach als single precision float 
realisiert wird...  :-o

Autor: sebastian_83 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke Peter
ja ich möchte gern die Frequenz in nachkommastellen darstellen.
mit deinem Vorschlag tauchen die ausreißer weiter..sollte ich die 
anderen Variablen auch als Double deklarieren?

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sebastian_83 schrieb:

> mit deinem Vorschlag tauchen die ausreißer weiter..sollte ich die
> anderen Variablen auch als Double deklarieren?

Nein, du solltest gar kein double verwenden, und dich statt dessen über 
Festkomma-Arithmetik informieren.

Autor: sebastian_83 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also an double liegt bestimmt nicht.
ich habe die variablen als uint32_t definiert(stdint.h ist included)und 
mit ultoa() ausgegeben ,trotsdem bei 65536 ist schluss das kann doch 
nicht wahr sein!!!!!

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sebastian_83 schrieb:
> also an double liegt bestimmt nicht.

Das war jetzt nicht unbedingt auf dein konkretes Problem bezogen, 
sondern allgemein auf das, was du da machst.

> ich habe die variablen als uint32_t definiert(stdint.h ist included)und
> mit ultoa() ausgegeben ,trotsdem bei 65536 ist schluss das kann doch
> nicht wahr sein!!!!!

Und der Code zu diesem Problem sieht konkret wie aus?

Was sollen eigentlich die cli() und sei() in der Interrupt-Routine? Das 
cli() ist ohne Funktion und das sei() ist sogar gefährlich. Das Testen 
des TOV1-Flags ist z.B. völlig sinnlos, wenn direkt davor ein sei() 
steht. Was denkst du denn, was beim sei() passiert, wenn das Flag da 
gerade gesetzt ist?

Und diese Zeile ist auch äußerst fragwürdig:
>    Ergebnis += (double)(Endezeit)  - (double)(anfangszeit);
Ich bezweifle, dass da der Fall Endezeit<anfangszeit korrekt gehandhabt 
wird (wie es bei Unsigned-Integer-Arithmetik der Fall wäre).

Autor: Lehrmann Michael (ubimbo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sebastian_83 schrieb:
> 04.00

nur so ein Tipp für einen vielleicht zukünftigen Fehler: das müsste 
eigentlich einen Fehler ergeben. Eine vorausgestellte Null ergibt in C 
die oktale Darstellung (0868 ist ungleich 868)!

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lehrmann Michael schrieb:
> sebastian_83 schrieb:
>> 04.00
>
> nur so ein Tipp für einen vielleicht zukünftigen Fehler: das müsste
> eigentlich einen Fehler ergeben.

Warum soll es einen Fehler ergeben, wenn eine Zahl mit einer führenden 
Null ausgegeben 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]
  • [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.