Variableüberlauf

Gast #2074606
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
Angehängte Dateien:
Gast #2074624
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;
Gast #2074805
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!!!!!
#2074831
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).

Antwort schreiben

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.

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.