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
Welcher Controller? Welcher Compiler? Vermutlich siehst du dank logarithmischer Wahrnehmung keinen Unterschied...
_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
> _delay_us(delay);
Das geht so nicht.
Lies mal die Doku in delay.h dazu.
Das funktioniert nur mit Konstanten.
gut danke, dass mit dem PWM hab ich auch grade entdeckt, da entfällt mein Lösungsansatz^^.
Dein Lösungansatz ist doch schon eine PWM ;-)
Ich sehe da nichtmal eine Methode. Ich denke mal du meintest Funktion...
abgesehen davon, dass der Thread-Titel auf fortgeschrittene sprachliche Verwirrung schließen lässt...
Ja sry, meinte Funktion, war ich Gedanken noch auf Arbeit.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.