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.
Vorsicht: Integer-Division
Gast
#2115679
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.
Machs mal so: unsigned long tmp = PWM_PERIOD - ((intensity*PWM_PERIOD) / 100); Stimmt zwar auch nicht ganz, sollte aber besser treffen ...
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!!!
Gast
#2115853
Besser du castest intensity als unsigned long.
1 | |
Gast
#2115968
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.
Florian Müller schrieb: > unsigned char intensity = 100; // Change 0 - 100 Tip: nimm 0-128
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.