PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : LEDs dimmen



.patrick
03.07.2010, 10:55
Hi!

Ich weiß, dass das hier sicher schon öfter Thema war, aber ich kriegs mit den Beiträgen trotzdem nicht hin.

Ich habe eine Evaluierungsplatine mit einem ATmega16 drauf. An dessen PortC sind 8 LEDs fest angeschlossen (jeweils eine LED pro Pin).
Ich möchte das alle LEDs, wenn ich sie anschalte, gleichzeitig gedimmt sind. Da ich ja mit einem Timer den ich im PWM-Betrieb nutze nur einen Pin steuern kann, muss ich das mit SoftPWM machen. Ist das richtig?

Unten ist mein Code, wie ich das versucht habe mit SoftPWM zu realisieren. Problem ist, dass die LEDs scheinbar überhaupt nicht gedimmt werden, egal welchen Wert ich für OCR0 einstelle. Bei der Code-Version unten leuchten die LEDs noch nicht einmal. Geht das so gar nicht wie ich das versuche?



#include <avr/io.h>
#include <avr/interrupt.h>

int main()
{
//LED-Port als Ausgang
DDRC = 255;
//LEDs an
PORTC = 0;
//Timer0 auf CTC-Betrieb setzen
TCCR0 |= (1 << WGM01) | (0 << WGM00);
//Vorteiler auf 1024 setzen
TCCR0 |= (1 << CS02) | (0 << CS01) | (1 << CS00);
//Vergleichswert für CTC-Betrieb setzen
OCR0 = 200;
//Compare-Match-Interrupt und Overflow-Interrupt für Timer0 aktivieren
TIMSK|= (1 << OCIE0) | (1 << TOIE0);
//Globale Interrupts aktivieren
sei();

while(1)
{

}

return 0;
}

//LEDs sind an von 255 bis OCR0:
//Funktion die aufgerufen wird, wenn TCCR0 = OCR0
ISR(TIMER0_COMP_vect)
{
//LEDs aus
PORTC = 255;
}


//Funktion die aufgerufen wird wenn Timer 0 wieder bei 0 anfängt
ISR(TIMER0_OVF_vect)
{
//LEDs an
PORTC = 0;
}


Vielen Dank!

Gruß
.patrick

Hubert.G
03.07.2010, 11:37
Wenn dir nicht um den einen Pin leid ist, kannst du ja immer noch abfragen wie der OC0 Pin ist und danach den PortC steuern.

.patrick
03.07.2010, 12:03
Du meinst ich soll in main() ungefähr sowas machen?:



while(1)
{
if(PB3)
PORTC = 255;
else
PORTC = 0;
}


Aber ist das nicht ziemlich ineffizient oder so?^^ Vorteil von PWM/ Timern ist doch u.a., dass der CPU so gut wie gar nicht belastet wird. Ich mein wenn ich in main() noch andere Aufgaben zu erledigen hätte könnte das Dimmen ins Stocken geraten?

Danke!
Gruß

Hubert.G
03.07.2010, 12:59
Damit belastest du die CPU sicher nicht. Es müsste schon sehr viele Aufgaben sein damit das Dimmen erkennbar stockt.
Es ist aber sicher noch viel ineffizienter an einem Port acht Led an zuschalten und gleichzeitig zu dimmen.

sternst
03.07.2010, 14:54
Wie soll denn dein Dimmen ganz grundsätzlich funktionieren?
Im CTC-Modus gibt es schließlich gar keinen Overflow-Interrupt.