Moin, vorab bitte keine Kritik an der Schaltung selbst (außer sie hilft bei meinem Problem). (funktioniert btw hervorragend) Die Schaltung habe ich mit Absicht so gewählt, weil ich mit den Bauelementen und den Programmiercode so üben möchte. (Wenn ichs schnell und leicht haben wollte, würde ich auch andere Komponenten wählen). So zu meinem Problem. Das was die Schaltung aktuell kann ist das alle 5 RGB LEDs den selben Farbwechsel haben. Was ich aber noch zusätzlich möchte ist das jede RGB LED einen eigenen Farbwechsel hat. Quasi LED1 geht grad von blau zu lila, LED 2 von rot zu gelb usw. Allerdings wie kann ich denn sowas am besten "maskieren"? Sowie ich es aktuell habe, habe ich es ja sehr leicht, da die Maske dazu einfach ist, da sich alle ändern und somit ich alle Pins gleichzeitig lösche oder setze. Wie stelle ich es denn am schlauesten an, das jede LED ihr eigenes PWM mit Farbwechsel über die Schieberegister bekommt? Ich suche btw keine fertige Lösung sondern nur den Ansatz dazu. Der Groschen fällt aktuell noch nicht. Ich hoffe ich habe es verständlich erklärt. Vielen Dank schonmal! Gruß T. Edit: Am Atmega ist ein 20MHz Quarz
Betrachte die beiden SRs einfach als 16-Bit-Port. Als Portregister legst du eine unsigned int Variable an. Schreib dir eine ISR, die im Hintergrund diese Variable auf die SRs schiebt. Erst das Highbyte, dann das Lowbyte sendet und dann den Latch Up macht. Die Übertragung mußt du nach der Initialisierung nur einmal anschubsen. Die SPI-Geschwindigkeit setzt du soweit runter, daß noch genug Rechenzeit übrig bleibt für die anderen Sachen. Bei Fullspeed kommt er praktisch gar mehr raus aus dem Interrupt. Deine Leds sind jetzt Bitpositionen in deinem Portregister. Das benutzt du genau so, wie du jeden anderen Port auch benutzt. Abgesehen davon, daß der jetzt 16 Bit breit ist. Ob da SRs hinterhängen oder kleine grüne Männchen Kerzen anzünden, interessiert dich ab jetzt überhaupt nicht mehr.
Gast
#4804046
Du hast 5 LEDs. Behandle alle 5 LEDs parallel in eigenem Code, mit einer 3-Bit-Struktur (oder auch bytes, wenn RAM egal;
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
Ja, man könnte hier optimieren und ganze Strukturen kopieren... Aber bei
16 Zeilen ("Leds.L1_rot = L1.rot") ist der Nutzen gering.
Bleibt noch sehr viel kopierter Code fuer die einzelnen LEDs ...
a) Spendiere der TLed-Struktur noch einen "Zustand", z.B int State.
b) Mache eine Funktion "void LedState(TLed *Led, int change);", die
abhängig von "change" z.B. die nächste Farbe einträgt, oder bleibt (wenn
change = 0).
c) Rufe LedState für jede Led mit verschiedenen "change" auf. Oder mache
"change" von Taster 1 bis 5 abhängig, oder oder oder
Moin, Danke euch zwei schonmal! ich habe ungefähr glaub ich verstanden was ihr meint! Ich glaube aber ich mache es ein wenig umständlicher... Musste mir grad erstmal typedef struct angucken was dies genau ist....^^ Habe nun folgendes erstmal erstellt:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
und dann erst mal so eingefügt:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
44 | |
Funktioniert sogar! Ich denke aber ich werde es versuchen nach dem Prinzip von Achim machen. Ich habe nämlich noch nie etwas mit typedef struct gemacht und es ist ja auch "nur" ein Übungsprojekt. Wenn ich nochmal mal Hilfe, meld ich mich nochmal! Vielen dank :)
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.



