LEDs unterschiedlich hell funktioniert geht nicht per Methodenaufruf

Gast #1506439
Lesenswert?

Hi,
ich will 3 LEDs unterschiedlich hell leuchten lassen, dazu habe ich eine 
Methode geschrieben, wenn ich jedoch der Methode die Werte übergebe, 
leuchten alle 3 LEDs gleich hell.

Methode:
void setBrightness(uint8_t delay, uint8_t pin)
{
    PORTC &= ~(1<<pin);
    _delay_us(delay);
    PORTC |= (1<<pin);
};


 for(;;){
        // setBrightness(1,0); //diese 3 Aufrufe machen die LEDs 
gleichhell
        // setBrightness(15,1);
        // setBrightness(30,2);

        PORTC &= ~(1<<0); //dieselben Befehle der Methode mit 
eingesetzten Werten --> Funktioniert, LEDs leuchten unterschiedlich 
hell.
        _delay_us(1);
        PORTC |= (1<<0);
        PORTC &= ~(1<<1);
        _delay_us(15);
        PORTC |= (1<<1);
        PORTC &= ~(1<<2);
        _delay_us(30);
        PORTC |= (1<<2);
        // PORTC &= ~(1<<7);
    };


VG, partx
#1506471
Lesenswert?

_delay_us() abeitet mit 'double' als Parameter. Da der Funktion 
setBrightness() ein 'uint8_t' übergeben wird, muss dieser ersmal in 
double umgerechnet werden. Diese Umrechnung dauert viel länger als der 
Delay selbst, sodass alle 3 LEDs ungefähr den gleichen Duty Cycle 
kriegen. Wenn man _delay_us mit konstanten Werten aufruft, rechnet der 
Compiler es selbst in double um, weshalb es dann auch funktioniert.

Normaleweise macht man so etwas entweder mit Hardware-PWM oder mit 
Timern, fall der Controller zu wenig PWM-Kanäle hat. Auf 
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#PWM_.28Pulsweitenmodulation.29 
gibt es eine gute Beschreibung dafür.

MfG Mark

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