-         

Ergebnis 1 bis 5 von 5

Thema: LEDs dimmen

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    27.04.2006
    Ort
    Aachen
    Beiträge
    31

    LEDs dimmen

    Anzeige

    SMARTPHONES & TABLETS-bis zu 77% RABATT-Kostenlose Lieferung-Aktuell | Cool | Unentbehrlich
    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?

    Code:
    #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

  2. #2
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.183
    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.
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    27.04.2006
    Ort
    Aachen
    Beiträge
    31
    Du meinst ich soll in main() ungefähr sowas machen?:

    Code:
    	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ß

  4. #4
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.183
    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.
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

  5. #5
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Wie soll denn dein Dimmen ganz grundsätzlich funktionieren?
    Im CTC-Modus gibt es schließlich gar keinen Overflow-Interrupt.
    MfG
    Stefan

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •