.patrick
03.07.2010, 11: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
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