Forum: Mikrocontroller und Digitale Elektronik RGB LED ansteuern (SoftPWM)


von SlvrStrko4 (Gast)


Angehängte Dateien:

Lesenswert?

Hallo alle zusammen,

ich hab nun schon so einiges probiert zu programmieren und hat bis jetzt 
auch alles ganz gut geklappt (das normale Tutorial und das avr-gcc 
Tutorial).
Jetzt hab ich bei mir noch ne RGB LED gefunden gehabt und wollte die 
auch ansteuern.
Klappt eigentlich auch, aber irgendwie funzt das Umschalten mit den 
Tastern nicht bzw nur sporadisch wie es lustig ist.
Ich habe an PB0 und PB1 jeweils einen Taster auf GND (nutze die internen 
PullUps; so wie im Tutorial).
An PB2, PB3, PB4 hängen dann jeweils das rote, grüne, blaue Beinchen der 
LED (mit 330 Ohm Widerständen), das 4te Beinchen der LED geht an VCC.
Stelle ich oben im Programm andere Startwerte ein (zB red = 255 anstatt 
red = 0), so bekomme ich auch ne leuchtende LED in der richtigen Farbe.
Nur wenn ich die Taster drücke tut sich nix und so vielleicht beim 10ten 
Druck (variiert) wird die LED lila. Mehr tut sich leider nicht.
Sollte vielleicht noch dazu sagen: Ich hab nen Atmega8 mit nem 16Mhz 
Quarz dranhängen.
Möglicherweise stehe ich auch einfach nur aufm Schlauch beim Programm 
(geh ich mal von aus ;-)).
Wäre super lieb wenn ihr mir helfen könntet.

Grüße

von MaWin (Gast)


Lesenswert?

Ich seh keinen Fehler.
Natürlich wäre es sinnvoll, den
static unsigned char zustand;
in den int tasterPBx(void)
explizit auf 0 zu initialisieren,
aber das sind sie auch implizit.
Ich sehe auch nicht, daß du aus Versehen
an PORTB die PullUps wieder abschaltest,
dennnoch würde ich mal externe 10k PullUps
probieren.

von SlvrStrko4 (Gast)


Lesenswert?

Hey,

danke schonmal für deine Antwort.
Was ich allerdings festgestellt habe:
Wenn ich TCNT0 bei jedem Interrupt auf 0 anstatt auf 250 setze oder 
einen Vorteiler von 1024 wähle, so klappt das umschalten mit den Tastern 
super.
Allerdings flackert dann die LED bzw man sieht die Mischfarben 
aufleuchten.
Wenn ich doch ein 16Mhz Quarz habe und Timer0 ein 8-bit Timer ist, so 
sollte ich doch auch mit TCNT0 = 0 und einem Vorteiler von 0 insgesamt 
62500 Interrupts pro Sekunde haben?
Wieso flackert dann die LED?
(Sollte doch eigentlich ~244 mal pro Sekunde komplett durchmischen)
Es wirkt einfach so, als wäre der AVR so mit seinen Timer-Interrupts 
beschäftigt, dass er die Taster gar nicht mehr abfragt?

von SlvrStrko4 (Gast)


Lesenswert?

Mhm,

jetzt habe ich das "_delay_ms(20)" in der while-Schleife rausgenommen 
und jetzt läuft das ganze auch gut mit TCNT0 = 250 und einem Vorteiler 
von 0 (also die Taster reagieren).
Ist zwar schön und gut.
Aber da ich das Ganze ja nur gebaut und programmiert habe um dabei was 
zu lernen wäre es super, wenn mir da jemand mal ne Erklärung für geben 
könnte.
Auch warum die LED flackert obwohl sie eigentlich super oft aktualisiert 
wird.
Oder ist das ganze schon zu oft oder der Code zu "schwer" (im Bezug auf 
Rechenzeit) ?

Grüße
Cyrill

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
Noch kein Account? Hier anmelden.