C problem beim programmieren der Blinkfrequenz für LED

Gast #2310151
Lesenswert?

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
Gast #2310159
Lesenswert?

>   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.
Gast #2310196
Lesenswert?

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).
#2310207
Lesenswert?

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.

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