Forum: Mikrocontroller und Digitale Elektronik C problem beim programmieren der Blinkfrequenz für LED


von mazell (Gast)


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

von Michael Dierken (Gast)


Lesenswert?

Welchen Takt hat dein µC, welcher Takt ist bei dem Compiler eingestellt

von Helfer (Gast)


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.

von Helfer (Gast)


Lesenswert?

1
  if ( f == 0 )
2
  { 
3
    T = 0;
4
  } else {
5
    T = (1 / f) *1000 ; // T in ms
6
  }

von mazell (Gast)


Lesenswert?

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

von mazell (Gast)


Lesenswert?

#define F_CPU 16000000UL

von mazell (Gast)


Lesenswert?

argh ne cool es funzt!

danke für die Tipps!

von Helfer (Gast)


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).

von Frank B. (f-baer)


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.

von mazell (Gast)


Lesenswert?

ja mit Timer ist noch so ne sache ;)

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.