Forum: Mikrocontroller und Digitale Elektronik dimmen eines LED Cubes


von ms (Gast)


Lesenswert?

Hallo zusammen ich bin gerade dabei meinen RGB-LED Cube zu 
programmieren.
jetzt wollte ich die Funktion programmieren dass er langsam heller wird 
und danach langsam dunkler.
nun ist meine Idee gewesen.
int i;
int Zeit = 0;
for(i=0; i<10;i++)
{Zeit = Zeit +1
   for(i=0;i<50;i++)
         {PORTB=0xFF
          _delay_ms(Zeit)
          PORTB=0x00
          _delay_ms(10)
         }
 }

aber dieses Funktioniert nicht kann es sein dass ich die _delay_(Zeit) 
nicht abhängig machen kann ??
muss diese immer eine Konstante Zahl sein ??


für Lösungsvorschläge wäre ich sehr sehr dankbar

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

der Fehler liegt in Zeile 42 deines nicht gezeigten Codes

von Markus (Gast)


Lesenswert?

Die Grundidee wäre in deinem Fall, dass du einen Wert nimmst und diesen 
auf 0 setzt.

In einer for-Schleife erhöhst du dann den Wert zb um +5.
Wenn du die Höchstzahl erreicht hast, muss du wieder herunterzählen.

Um eine LED zu dimmen brauchst du übrigens auch eine PWM. Am Besten du 
wählst den variablen Wert auch in der gleichen Range der Periode deines 
Timercounters für das PWM Signal, um die Rechnung einfach zu halten.

von ms (Gast)


Lesenswert?

Das Problem ist dass ich mich noch nicht so gut auskenne mit der 
Programmiererei ist dass ein aufwendiges Programm mit der PWM ??

von Mustafa Meyer (Gast)


Lesenswert?

ms schrieb:
> kann es sein dass ich die _delay_(Zeit) nicht abhängig machen kann ??

Delay(Variable) funktioniert nur bei höheren Sprachen wie Arduino.

von Brummbär (Gast)


Lesenswert?

ms schrieb:
> muss diese immer eine Konstante Zahl sein ??
Ja

Verwende aber besser Timer, da der Prozessor in Deinem Beispiel nichts 
mehr nebenher machen kann.

von Brummbär (Gast)


Lesenswert?

Denke auch daran, dass das Auge die Helligkeit logarithmisch wahrnimmt.

von Michael B. (laberkopp)


Lesenswert?

ms schrieb:

machs mal so:

> for(i=0; i<10;i++)
> {
>    Zeit = Zeit +1; // man könnte auch gleich i statt Zeit nehmen
>    for(i=0;i<50;i++)
>    {
>       PORTB=0xFF;
>       _delay_ms(Zeit);
>       PORTB=0x00;
>       _delay_ms(10-Zeit);
>    }
> }

von Basti B. (basti195) Benutzerseite


Lesenswert?

Meines wissens nach (ist schon ne weile her das ich das nachgeschaut 
hab) funktioniert die delay_(us/ms) auf dem AVR nur mit konstanten 
Werten.

Ich empfehle dir, dir die Zeit zu nehmen und dich in PWM oder die Timer 
einzulesen und diese Optimaler weise über Interrupte auszuwerten.

Hierzu gibt es auch auf dieser Seite entsprechende Tutorials:

https://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Die_Timer_und_Z%C3%A4hler_des_AVR

https://www.mikrocontroller.net/articles/AVR_PWM
https://www.mikrocontroller.net/articles/AVR-Tutorial:_PWM


viel Erfolg :)

von Einer K. (Gast)


Lesenswert?

Mustafa Meyer schrieb:
> Delay(Variable) funktioniert nur bei höheren Sprachen wie Arduino.
Interessante Sicht..
Aber leider knapp daneben.

Arduino ist keine Sprache.
Es nutzt C++.
Und C++ kennt erst mal auch kein Delay(Variable).

Es ist also eher keine Spracheigenschaft, sondern ein Feature der 
Umgebung.

Punktum:
Wenn man ein flexibles delay() braucht, dann baut man sich eins.

Und wenn das zu Problemen führt, dann sind die eigentlichen 
Schwierigkeiten ganz woanders

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.