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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren