Forum: Compiler & IDEs Falsches Ergebnis!


von Florian M. (flomll)


Lesenswert?

Hallo Leute,

ich komme hier nicht ganz drauf warum das nicht funktioniert!!!

#define PWM_PERIOD 100
unsigned char intensity = 100; // Change 0 - 100

unsigned long tmp = PWM_PERIOD - ((intensity / 100)*PWM_PERIOD);


Warum kommt bei mir immer 0 oder 100 als Ergebnis raus? So wie ich die 
variable intensity auf 99 stelle liefert er mir das Ergebnis 100!


Anwendung findet das ganze bei der PWM Berechnung für das Dimmen einer 
LED. Schreibe ich die Werte 0-100 in das entsprechende register 
funktioniert das ganze toll. Jedoch nicht mit der oben gezeigten 
berechnung.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Vorsicht: Integer-Division

von Rolf Magnus (Gast)


Lesenswert?

Florian Müller schrieb:
> Hallo Leute,
>
> ich komme hier nicht ganz drauf warum das nicht funktioniert!!!
>
> #define PWM_PERIOD 100
> unsigned char intensity = 100; // Change 0 - 100
>
> unsigned long tmp = PWM_PERIOD - ((intensity / 100)*PWM_PERIOD);
>
>
> Warum kommt bei mir immer 0 oder 100 als Ergebnis raus?

Was erwartest du denn für ein Ergebnis, wenn intensity z.B. 50 ist? Was 
ist 50/100? Beachte: Das Ergebnis muß eine ganze Zahl sein.

von Andreas H. (andreas_h16)


Lesenswert?

Machs mal so:
unsigned long tmp = PWM_PERIOD - ((intensity*PWM_PERIOD) / 100);

Stimmt zwar auch nicht ganz, sollte aber besser treffen ...

von Florian M. (flomll)


Lesenswert?

Hihih ja stimmt! Da würde er ja nie etwas anderes raus bekommen! Ich war 
zwar auf der richtigen Spur, jedoch habe ich den Fehler einfach nicht 
gesehen!!!

Danke für eure Hilfe!!!

von DirkB (Gast)


Lesenswert?

Besser du castest intensity als unsigned long.
1
unsigned long tmp = PWM_PERIOD - ((unsigned long)intensity*PWM_PERIOD) / 100);

von Rolf Magnus (Gast)


Lesenswert?

Solange intensity immer im Bereich 0 bis 100 bleibt und PWM_PERIOD nicht 
signifikant größer wird, ist das schon ok. Man muß nur bedenken, daß die 
Berechnung mit int durchgeführt wird, also je nach Prozessortyp evtl. 
nur mit 16 Bit.

von Vlad T. (vlad_tepesch)


Lesenswert?

Florian Müller schrieb:
> unsigned char intensity = 100; // Change 0 - 100

Tip: nimm 0-128

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.