www.mikrocontroller.net

Forum: Compiler & IDEs Falsches Ergebnis!


Autor: Florian Müller (flomll)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Yalu X. (yalu) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vorsicht: Integer-Division

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andreas H. (andreas_h16)
Datum:

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

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

Autor: Florian Müller (flomll)
Datum:

Bewertung
0 lesenswert
nicht 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!!!

Autor: DirkB (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Besser du castest intensity als unsigned long.
unsigned long tmp = PWM_PERIOD - ((unsigned long)intensity*PWM_PERIOD) / 100);

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Vlad Tepesch (vlad_tepesch)
Datum:

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

Tip: nimm 0-128

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.