LEDs unterschiedlich hell funktioniert geht nicht per Methodenaufruf

Gast #1506439
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
_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

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.