MoinMoin,
ich hab mir mal so ein ArduinoMega2560 Board bestellt. Eigentlich hab
ich mich grad mehr oder weniger mit C angefreundet, wollt nun aber auch
mal in die ArduinoWelt schauen, muss aber sagen, so richtig zurecht komm
ich nicht.
Ich wollte eine RGB-LED dimmen. Aber irgendwie dimmt sie nur von hell
nach dunkel, und nicht von dunkel nach hell. Auf allen 3 Kanälen das
selbe Trauerspiel. Es sind einfach nur nacheinander weg forschleifen.
Aber es sieht aus, als würd er jede 2te überspringen. Nämlich die zum
raufdimmen.
Ich hab auch schon versucht, mich auf eine einzelne for-schleife zu
beschränken. for(R = 255; R >> 0; R--) klappt. Aber umgedreht halt
nicht.
Hier mal mein Code. Ich benutze die Arduino-Umgebung und diese komische
Arduino-C-Gequasselchose.
1
/*
2
Fade
3
4
This example shows how to fade an LED on pin 9
5
using the analogWrite() function.
6
7
This example code is in the public domain.
8
*/
9
intledR=10;
10
intledG=9;// the pin that the LED is attached to
11
intledB=8;
12
intbrightnessR=0;// how bright the LED is
13
intbrightnessG=0;
14
intbrightnessB=255;
15
intfadeAmountR=3;// how many points to fade the LED by
16
intfadeAmountG=4;
17
intfadeAmountB=5;
18
19
// the setup routine runs once when you press reset:
20
voidsetup(){
21
// declare pin 9 to be an output:
22
pinMode(ledR,OUTPUT);
23
pinMode(ledG,OUTPUT);
24
pinMode(ledB,OUTPUT);
25
}
26
27
// the loop routine runs over and over again forever:
28
voidloop()
29
{
30
analogWrite(ledR,brightnessR);
31
32
for(brightnessR=0;brightnessR<<255;brightnessR++)
33
{
34
analogWrite(ledR,brightnessR);
35
delay(10);
36
}
37
38
for(brightnessB=255;brightnessB>>0;brightnessB--)
39
{
40
analogWrite(ledB,brightnessB);
41
delay(10);
42
}
43
44
for(brightnessG=0;brightnessG<<255;brightnessG++)
45
{
46
analogWrite(ledG,brightnessG);
47
delay(10);
48
}
49
50
for(brightnessR=255;brightnessR>>0;brightnessR--)
51
{
52
analogWrite(ledR,brightnessR);
53
delay(10);
54
}
55
56
for(brightnessB=0;brightnessB<<255;brightnessB++)
57
{
58
analogWrite(ledB,brightnessB);
59
delay(10);
60
}
61
62
for(brightnessG=255;brightnessG>>0;brightnessG--)
63
{
64
analogWrite(ledG,brightnessG);
65
delay(10);
66
}
67
68
69
70
71
72
}
Für hilfreiche Antworten wär ich sehr dankbar.
MfG Chaos =)
Jo läuft. Hatte es auch grad rausgefunden...
Ich hatte es ursprünglich mit while versucht, das klappte aber aus dem
selben Grund auch nicht.
Ich versteh nur nicht ganz, wieso er denn so sauber ausgedimmt hat,
wenns geshiftet war. Dann sollte er doch eigentlich nur in 8Stufen
runterdimmen? 8bits sind numal spätestens nach 8 shifts leer.
So sieht der dimmende Code nun aus, falls es jdm intressiert:
1
/*
2
Fade
3
4
This example shows how to fade an LED on pin 9
5
using the analogWrite() function.
6
7
This example code is in the public domain.
8
*/
9
intledR=10;
10
intledG=9;// the pin that the LED is attached to
11
intledB=8;
12
intbrightnessR=0;// how bright the LED is
13
intbrightnessG=0;
14
intbrightnessB=255;
15
intdimmSpeed=30;
16
17
// the setup routine runs once when you press reset:
18
voidsetup(){
19
// declare pin 9 to be an output:
20
pinMode(ledR,OUTPUT);
21
pinMode(ledG,OUTPUT);
22
pinMode(ledB,OUTPUT);
23
}
24
25
// the loop routine runs over and over again forever:
..eigentlich sollte Dir der Compiler bei dieser..
> for (brightnessR = 0; brightnessR << 255; brightnessR++)
..und allen analogen Zeilen eine Warnung zeigen, in der auch schon des
Problems Lösung steht.
> Ich versteh nur nicht ganz, wieso er denn so sauber ausgedimmt hat,> wenns geshiftet war. Dann sollte er doch eigentlich nur in 8Stufen> runterdimmen? 8bits sind numal spätestens nach 8 shifts leer.
Nein, beim 'ausdimmen' hat er in der Abbruchbedingung um 0 nach rechts
geshiftet, und das ist eine Identität. Diese Schleifen liefen also 'ganz
normal' bis zur 0 runter.
Hat er alles ohne Warnung durchkompiliert. Evtl sind die Warnungen
standardmäßig ausgeschaltet? Ich hab einfach diese Arduino-IDE
installiert und angefangen.
Danke erstmal für deine Erklärung, aber ich denke, ich werd doch einfach
weiter bei C bleiben. Da hat man doch irgendwie mehr "Zugriff" auf den
µC.
Kannst du evtl noch ein paar Worte zur "Identität" verlieren? Was hat
das damit auf sich? Wenn ich in C um null stellen shifte, dann bleibt
doch alles gleich, oder nicht? Aber das hier ist ja Arduino. Oder gilt
das nur für den Fall, das man in einer Schleife ist?
MfG Chaos
Jau vielen Dank für die anschaulichen Erläuterungen. Ich glaub nun hab
ichs begriffen. Also kann man sagen, eine Identität ist alles, was nicht
null ist?
Nuja nun ist erst mal Schlafenszeit, ich werd morgen wieder reinschauen,
bis dann erstmal
> Also kann man sagen, eine Identität ist alles, was nicht null ist?
Nein, eine Identität ist eine Abbildung, die 'nix macht' (genauer,
ausführlicher und korrekter ohne Anführungszeichen: [0])
Ad Warnungen: Ein normaler(gm) gcc liefert sowas:
1
$ cat test.cpp
2
int main()
3
{
4
int brightnessR;
5
for (brightnessR = 0; brightnessR << 255; brightnessR++)
6
{}
7
8
return 0;
9
}
10
11
$ gcc -o test test.cpp
12
test.cpp: In function ‘int main()’:
13
test.cpp:4:39: warning: left shift count >= width of type
14
for (brightnessR = 0; brightnessR << 255; brightnessR++)
15
^
Mein avr-gcc (für C) liefert die gleiche Warnung ohne die Codezeile,
avr-gcc für C++ (der Compiler im Arduino-SDK) hab ich gerade keine zur
Hand, ich würde aber erwarten, dass er das selbe macht.
[0] http://de.wikipedia.org/wiki/Identische_Abbildung
Sehr schön, dann hab ichs nun begriffen! Vielen Dank für eure
Erläuterungen!
Evtl noch eine kleine Zwischenfrage. Kann es sein, das die Arduinos auf
den PWM-Ports, wenn man sie nur als DigitalIO benutzt,dennoch PWM-t?
Ich hatte meine RGB-LED erst mal nur an und auschalten wollen, und war
denn ziemlich entäuscht, über das lasche funzeln. (Vorwiderstand 100
Ohm).
Als ich dann aber mal dimmen lies, hat mir das leuchten fast die Augen
aus dem Kopf gedrückt (ein bischen übertrieben), und meine anfängliche
Entäuschung schnell zurückgetrieben.
MfG Chaos
Das wäre möglich, meine aber, ich hatte erst ein Beispiel benutzt, in
dem digitalWrite verwendet wurde. Werd ich nochmal nachprüfen, wenn ich
zuhaus bin.
MfG Chaos
@KarlHeinz
genau das ist es gewesen =)
Wie groß sind eigentlich die PullUps wenn man bei DDRx = 0; den PORTx
schaltet? Mir schwirrt was von von 10k-100k im Kopf rum, kann das sein?
Dann sind die RGBs wohl doch nicht so schlecht. Für nen 10k
Vorwiderstand waren sie dann noch anständig hell, und sollte ich nen µC
erwischt haben, der die 100k hat, waren sie sogar brutal hell :D
j. t. schrieb:> Wie groß sind eigentlich die PullUps wenn man bei DDRx = 0; den PORTx> schaltet?
Soweit ich mit erinnere ist das irgendwo im Datenblatt gestanden…
Nun da der Code bei mir alle drei Kanäle ordentlich dimmt, kann man den
Code vermutlich schonmal als Fehlerquelle ausschließen.
Evtl hast du einen Kanal falsch angeschlossen? Ich hab rot auf die 10,
grün auf die 9, und blau auf die 8 vom Arduino geklemmt.
P.S. Falls du es warst, der mir ne PN geschickt hat, ich hatte versucht
dir zu antworten, aber der GMX-Dämon meinte, deine Adresse gibs nicht.
P.P.S.
Deine Aussage weist gewisse Parallelen auf zu "Ich hab das mal
ausprobiert, Vollgas gegeben, dann sind mir aber die Ventile
entgegengeflogen, woran liegt das?".
Wären wir in nem Motorforum, könnte dir dennoch niemand weiterhelfen.
Man weis nicht, was du wie angeschlossen hast, noch um was für einen
Motor es geht.
Aber spontan würd ich tippen, blau falsch angeschlossen. Wie gesagt, bei
mir tut der Code was er soll.