hi, zur ansteuerung der LED soll ich die Blinkfrequenz variabel einstellen können. Das Problem: die LED blinkt nicht so wie sie blinken soll, sondern viellllll zu schnell ;) mein code: int blinken(float f) { float T; // Periodendauer (1s) int i; // erste schleife LED an int k; // 2. Schleife LED aus if (f==0) { T=0; } T = (1 / f) *1000 ; // T in ms while(1) { ROT = 255; GRUEN = 215; BLAU = 0; for (i; i<= T / 2 ; i++ ) // halbe Periode an { _delay_ms(1); } ROT = 0; GRUEN = 0; BLAU = 0; for (k; k<= T / 2 ; k++ ) // halbe Periode aus { _delay_ms(1); } } } hoffe jmd. kann mir helfen! THX
Welchen Takt hat dein µC, welcher Takt ist bei dem Compiler eingestellt
> int i; // erste schleife LED an i ist nicht initialisiert. > for (i; i<= T / 2 ; i++ ) // halbe Periode an ^ for (i=0; ... dito für k Der Compiler sollte Warnungen geworfen haben, dass uninitialisierte Variablen verwendet wurden.
1 | if ( f == 0 ) |
2 | {
|
3 | T = 0; |
4 | } else { |
5 | T = (1 / f) *1000 ; // T in ms |
6 | }
|
der compiler meckert nicht. gebe ich zum bsp. das ergebnis für T direkt in die schleife ein funktioniert das ganze komischerweise! hab auch die initialisierung gemacht
argh ne cool es funzt! danke für die Tipps!
Dann überprüfe den Aufruf der Funktion blinken() im vollständigen Programm und überprüfe die Buildregeln, ob die Floating-Point-Bibliotheken eingebunden sind. f sollte eine Frequenz in Hz darstellen, z.B. blinken(1.0); für 1 Hz Blinken (500ms an und 500ms aus).
mazell schrieb: > T = (1 / f) *1000 ; // T in ms An der Stelle kann ein nicht zu unterschätzender Rundungsfehler auftauchen. Ist zwar für das Blinken der LED unerheblich, trotzdem solltest du dir angewöhnen, immer erst zu multiplizieren, bevor du dividierst. In dem Fall wäre T = 1000/f; sinnvoller. Im Übrigen solltest du das lieber über einen Timer machen. Definiere den Frequenzbereich, in dem das funktionieren soll und lade einen Timer mit entsprechenden Werten. Delays über for-Schleifen sind undefiniert und können beim zweiten Aufruf der Funktion schon schneller oder langsamer abgearbeitet werden als beim ersten.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.