mikrocontroller.net

Forum: Compiler & IDEs LEDs unterschiedlich hell funktioniert geht nicht per Methodenaufruf


Autor: partx (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Micha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welcher Controller?
Welcher Compiler?

Vermutlich siehst du dank logarithmischer Wahrnehmung keinen 
Unterschied...

Autor: Mark .. (mork)
Datum:

Bewertung
0 lesenswert
nicht 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-Tu... 
gibt es eine gute Beschreibung dafür.

MfG Mark

Autor: doc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>    _delay_us(delay);

Das geht so nicht.
Lies mal die Doku in delay.h dazu.

Das funktioniert nur mit Konstanten.

Autor: partx (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
gut danke, dass mit dem PWM hab ich auch grade entdeckt, da entfällt 
mein Lösungsansatz^^.

Autor: doc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dein Lösungansatz ist doch schon eine PWM ;-)

Autor: Spiesser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich sehe da nichtmal eine Methode. Ich denke mal du meintest Funktion...

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
abgesehen davon, dass der Thread-Titel auf fortgeschrittene sprachliche 
Verwirrung schließen lässt...

Autor: partx (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja sry, meinte Funktion, war ich Gedanken noch auf Arbeit.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.