Hallo da,
Ich habe hier eine Schaltung, mit einem Mega 8, an dem RGB LED´s über die PINs B1, B2 und B3 verteilt sind. Schalte ich PB0 HIGH, werden die anderen übersteuert und bleiben LOW.
Ich habe in Assembler schon etwas programmiert, wo ich die beiden Standalone PWM A und B von Timer1 und den einen PWM von Timer2 alle in 8 BIT Auflösung laufen lasse. Vom Timer2 wird ein Overflowinterrupt ausgeführt. In der ISR zählt eine 8 Bit variable hoch. Diese wird mit einem Dimmwert verglichen. Ist sie mind. gleich, geht PB0 HIGH, sonst LOW.
Im Endeffekt habe ich also 255x8Bit PWM hintereinander. Macht dann 16 Bit.
Jetzt versuche ich das in C zu programmieren.
-ADC einlesen geht (8Bit, weil left adjusted) (getestet)
-die PWM´s laufen.(getestet)
Was nicht geht ist die Schachtelung. Die Lampen blinken in einer konstanten Geschwindigkeit. Wie gesagt, hat das in ASM schon geklappt.
Hat jemans eine Idee?
mfg,Code:#include <avr/io.h> #include <avr/interrupt.h> int zyklus; int helligkeit; SIGNAL (SIG_OVERFLOW2){ zyklus++; if (zyklus >= helligkeit) PORTB |= (1<<PB0); else PORTB &= (0<<PB0); } void init(){ DDRB = 0b00001111; TIMSK = 0b01000000; TCNT1 = 254; OCR1A = 43; OCR1B = 90; ICR1 = 255; OCR2 = 139; TCCR1A |= (1<<COM1A1)|(1<<COM1A0)|(1<<COM1B1)|(1<<COM1B0)|(1<<WGM11); TCCR1B |= (1<<WGM13)|(1<<WGM12)|(1<<CS10); TCCR2 |= (1<<WGM20)|(1<<COM21)|(1<<COM20)|(1<<WGM21)|(1<<CS20); zyklus = 0; ADMUX = 0b00100000; ADCSRA = 0b11110101; sei(); } int main(void) { int schleife; init(); main2: for (schleife=0;schleife==250;schleife++){ } helligkeit = ADCH; goto main2; return 0; }
The Man
Lesezeichen