Hallo zusammen. Vorab: Ich bin absoluter Neuling. Ich habe einen Atmega8 und möchte damit gerne RGB LEDs beschalten. Angefangen hab ich damit, ein Programm (Anhang) für einen Regenbogenlauf der LED zu schreiben. Leider habe ich damit ein kleines Problem. Zum testen habe ich noc heinzelne LEDs angeschlossen. Und zwar funktionieren die Stufen 3 und 4 nicht sauber. Die grüne LED spinnt rum. Um dem Problem auf den Grund zu gehen, habe ich mir den Ausgang für grün mit nem Oszilloskop angeguckt. Bei den anderen Stufen sieht es so aus: ______->___...___-> ......->...___...->_______ Bei der grünen so: ......->__..___..___->__________ ______->____________->__________ Leider werden die Leerzeichen automatisch entfernt. Da wo Punkte sind ist nichts. Ich hoffe das ist irgendwie verständlich. Irgendwas stimmt da nicht. Habe schon die LED sowie den Port getauscht. es liegt am Programm. Findet jemand den Fehler und kann mir helfen? Danke im voraus. Gruß Sebastian
@ Sebastian (Gast) > * Code.txt (1,9 KB, 1 Downloads) Das nächste mal einfach als .c Datei posten, siehe netiquette. >Irgendwas stimmt da nicht. Habe schon die LED sowie den Port getauscht. >es liegt am Programm. Findet jemand den Fehler und kann mir helfen? Das Konzept deiner hangestrickten PWM durchschaue ich auf die Schnelle nicht. Mein Tipp. Dimme erstmal nur eine Farbe. MFG Falk
Man kann PWM höllisch kompliziert machen und dann wegschmeißen, weil es nicht geht. Oder man nimmt gleich einen Timerinterrupt für die PWM und läßt das Main nur die Ablaufsteuerung machen. Peter
Danke für die schnellen Antworten. @ Falk: eine Farbe dimmen funktioniert. alle anderen Stufen gehen auch. rot an, blau fährt hoch. alles kein problem. nur der grüne spinnt beim hochfahren und bei dauer an. beim rutnerfahren des grünen ist alles ok. @Peter: Verstehe ich leider nicht. Wie gesagt ich hab da gerade erst mit angefangen und bin froh dass ich das was ich bisher habe hinbekommen hab. Also noch mal zur Erklärung was ich da versucht habe. Ich hab für einen Regenbogendurchlauf die Schleife mit k benutzt. Dadurch wird wird die Farbzusammensetzung geändert. Bei Stufe 1 läuft der von 0 bis 255. Dabei ist rot dauerhaft an und blau wird hochgedimmt. dies übernimmt die schleife mit i. wenn k klein ist, sprich die gemischte farbe ziemlich nah bei rot ist, wird blau weniger häufig zugeschaltet als bei k bei 255. Die i Schleife pulst die zu dimmende LED. Dadurch wird die LED hoch bzw rutner gedimmt. Gruß Sebastian
Mir schwahnt schlimmes. Deine If Schachtelungen stimmen wahrscheinlich nicht, Kein Wunder bei DER Formatierung. Mach es mal hübsch und schau es dir an und poste noch einmal. http://www.mikrocontroller.net/articles/Strukturierte_Programmierung_auf_Mikrocontrollern#Formatierung_des_Quelltextes
Habs mal lesbar gemacht. Jetzt kann man erahnen, was du vorhast:
1 | /*
|
2 | * AVRGCC1.c
|
3 | *
|
4 | * Created: 22.03.2012 21:17:34
|
5 | * Author: Besitzer
|
6 | */
|
7 | |
8 | #define F_CPU 1000000UL
|
9 | #define RED PC5
|
10 | #define GREEN PC4
|
11 | #define BLUE PC3
|
12 | #define RGB_PORT PORTC
|
13 | #define RGB_DDR DDRC
|
14 | |
15 | #include <stdint.h> |
16 | #include <avr/io.h> |
17 | #include <util/delay.h> |
18 | |
19 | |
20 | int main(void) |
21 | {
|
22 | uint16_t i=0; |
23 | uint16_t k=0; |
24 | |
25 | RGB_DDR = 255; |
26 | |
27 | while(1) { |
28 | RGB_PORT &= ~_BV(RED) & ~_BV(GREEN) & ~_BV(BLUE); //alle aus |
29 | _delay_ms(1000); //pause |
30 | RGB_PORT |= _BV(RED) | _BV(GREEN) | _BV(BLUE); //alle an |
31 | _delay_ms(1000); //pause |
32 | RGB_PORT &= ~_BV(RED) & ~_BV(GREEN) & ~_BV(BLUE); //alle aus |
33 | _delay_ms(1000); //alle an |
34 | |
35 | for (k=0; k<=1530; k++) { //Zählschleife, eine Regebogendurchlauf |
36 | for (i=0; i<=255; i++) { //Zählschleife, hoch, runter dimmen |
37 | if (0<k && k<=255) { //Stufe 1: rot an, blau hochdimmen |
38 | RGB_PORT |= _BV(RED); |
39 | if (i<=k) RGB_PORT |= _BV(BLUE); |
40 | else RGB_PORT &= ~_BV(BLUE); |
41 | }
|
42 | else if (255<k && k<=510) { //Stufe 2: blau an, rot runter |
43 | RGB_PORT |= _BV(BLUE); |
44 | if (!(i<=(k-255))) RGB_PORT |= _BV(RED); //! |
45 | else RGB_PORT &= ~_BV(RED); |
46 | }
|
47 | else if (510<k && k<=765) { //Stufe 3: blau an, grün hoch |
48 | RGB_PORT |= _BV(BLUE); |
49 | if (i<=(k-510)) RGB_PORT |= _BV(GREEN); |
50 | else RGB_PORT &= ~_BV(GREEN); |
51 | }
|
52 | else if (765<k && k<=1020) { //Stufe 4: grün an, blau runter |
53 | RGB_PORT |= _BV(GREEN); |
54 | if (!(i<=(k-765))) RGB_PORT |= _BV(BLUE); //! |
55 | else RGB_PORT &= ~_BV(BLUE); |
56 | }
|
57 | else if (1020<k && k<=1275) { //Stufe 5: grün an, rot hoch |
58 | RGB_PORT |= _BV(GREEN); |
59 | if (i<=(k-1020)) RGB_PORT |= _BV(RED); |
60 | else RGB_PORT &= ~_BV(RED); |
61 | }
|
62 | else if (1275<k && k<=1530) { //Stufe 6: rot an, grün runter |
63 | RGB_PORT |= _BV(RED); |
64 | if (!(i<=(k-1275))) RGB_PORT |= _BV(GREEN); //! |
65 | else RGB_PORT &= ~_BV(GREEN); |
66 | }
|
67 | }
|
68 | }
|
69 | }
|
70 | }
|
1 | /*
|
2 | * AVRGCC1.c
|
3 | *
|
4 | * Created: 22.03.2012 21:17:34
|
5 | * Author: Besitzer
|
6 | */
|
7 | #define F_CPU 1000000UL
|
8 | #define RED PC5
|
9 | #define GREEN PC4
|
10 | #define BLUE PC3
|
11 | #define RGB_PORT PORTC
|
12 | #define RGB_DDR DDRC
|
13 | #include <stdint.h> |
14 | #include <avr/io.h> |
15 | #include <util/delay.h> |
16 | int main(void) |
17 | {
|
18 | uint16_t i=0; |
19 | uint16_t k=0; |
20 | |
21 | RGB_DDR=255; |
22 | |
23 | while(1) |
24 | {
|
25 | RGB_PORT &= ~_BV(RED) & ~_BV(GREEN) & ~_BV(BLUE); //alle aus |
26 | _delay_ms(1000); //pause |
27 | RGB_PORT |= _BV(RED) | _BV(GREEN) | _BV(BLUE); //alle an |
28 | _delay_ms(1000); //pause |
29 | RGB_PORT &= ~_BV(RED) & ~_BV(GREEN) & ~_BV(BLUE); //alle aus |
30 | _delay_ms(1000); //alle an |
31 | |
32 | for (k=0;k<=1530;++k) //Zählschleife, eine Regebogendurchlauf |
33 | {
|
34 | for (i=0;i<=255;++i) //Zählschleife, hoch, runter dimmen |
35 | {
|
36 | if (0<k && k<=255) //Stufe 1: rot an, blau hochdimmen |
37 | {
|
38 | RGB_PORT |= _BV(RED); |
39 | if (i<=k) |
40 | RGB_PORT |= _BV(BLUE); |
41 | else
|
42 | RGB_PORT &= ~_BV(BLUE); |
43 | }
|
44 | else if (255<k && k<=510) //Stufe 2: blau an, rot runter |
45 | {
|
46 | RGB_PORT |= _BV(BLUE); |
47 | if (!(i<=(k-255))) |
48 | RGB_PORT |= _BV(RED); //! |
49 | else
|
50 | RGB_PORT &= ~_BV(RED); |
51 | }
|
52 | else if (510<k && k<=765) //Stufe 3: blau an, grün hoch |
53 | {
|
54 | RGB_PORT |= _BV(BLUE); |
55 | if (i<=(k-510)) |
56 | RGB_PORT |=_BV(GREEN); |
57 | else
|
58 | RGB_PORT &=~_BV(GREEN); |
59 | }
|
60 | else if (765<k && k<=1020) //Stufe 4: grün an, blau runter |
61 | {
|
62 | RGB_PORT |= _BV(GREEN); |
63 | if (!(i<=(k-765))) |
64 | RGB_PORT |= _BV(BLUE); //! |
65 | else
|
66 | RGB_PORT &= ~_BV(BLUE); |
67 | }
|
68 | else if (1020<k && k<=1275) //Stufe 5: grün an, rot hoch |
69 | {
|
70 | RGB_PORT |= _BV(GREEN); |
71 | if (i<=(k-1020)) |
72 | RGB_PORT |= _BV(RED); |
73 | else
|
74 | RGB_PORT &= ~_BV(RED); |
75 | }
|
76 | else if (1275<k && k<=1530) //Stufe 6: rot an, grün runter |
77 | {
|
78 | RGB_PORT |= _BV(RED); |
79 | if (!(i<=(k-1275))) |
80 | RGB_PORT |= _BV(GREEN); //! |
81 | else
|
82 | RGB_PORT &= ~_BV(GREEN); |
83 | }
|
84 | }
|
85 | }
|
86 | }
|
87 | }
|
so wäre noch besser, dann hättest du auch selbst deinen { } Klammern Fehler gefunden.
ich glaube hinter
1 | else if (1275<k && k<=1530) |
fehlte ein {
Hätte da nicht der Compiler meckern müssen, weil eine Klammer auf fehlt?
Falk Brunner schrieb: > Hätte da nicht der Compiler meckern müssen, weil eine Klammer auf fehlt? er hat unten ja genug drangezimmert :-)
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.