/* 3x PWM auf Atmega8-PDIP mit 8MHz internem Takt 1 x LED (rot) an PB1 für (OCR1A) 1 x LED (grün) an PB2 für (OCR1B) 1 x LED (blau) an PB3 für (OCR2) Compiliert mit AVR Studio 4.14 und AVR-GCC */ #define RAND_MAX 0xFF #define F_CPU 8000000UL #include #include #include uint8_t mux, result_ADC; uint16_t rt, gn, bl, rt_neu, gn_neu, bl_neu, result_tmp, t, g; void init_Device (void) { DDRB =0b00001110; //PB1, PB2, PB3 als Ausgang (PWM OCRxx) PORTB =0b11001110; //PullUp-Widerstand an PB1, PB2, PB3, PB6, PB7 ein PORTC =0b00000000; DDRC =0b00000000; PORTD =0b11111111; DDRD =0b00000000; TCCR0 =0b00000001; //Einstellung der Timer für 3 Kanal - 8Bit-PWM TCCR1A=0b11110001; TCCR1B=0b00000001; TCCR2 =0b01110001; } void long_delay(uint16_t ms) { for (; ms>0; ms--) { _delay_ms(1); } } void Poti (uint8_t mux) { ADCSRA |= (1<> 2); } void Geschwindigkeit (void) { mux = 0; Poti (mux); t = (result_tmp * g); long_delay (t); } void Geschwindigkeit2 (void) { mux = 1; Poti (mux); t = (result_tmp * g); long_delay (t); } void Zufallsfarbe (void) { rt_neu = rand() % 255; gn_neu = rand() % 255; bl_neu = rand() % 255; } void Farbe_Soft (void) { Farbe: g = 1; while (rt_neu > rt) { rt++; OCR1AL = rt; Geschwindigkeit2(); } while (rt_neu < rt) { rt--; OCR1AL = rt; Geschwindigkeit2(); } Geschwindigkeit(); while (gn_neu > gn) { gn++; OCR1BL = gn; Geschwindigkeit2(); } while (gn_neu < gn) { gn--; OCR1BL = gn; Geschwindigkeit2(); } Geschwindigkeit(); while (bl_neu > bl) { bl++; OCR2=bl; Geschwindigkeit2(); } while (bl_neu < bl) { bl--; OCR2=bl; Geschwindigkeit2(); } Geschwindigkeit(); if ((rt_neu == rt) && (gn_neu == gn) && (bl_neu == bl)) { Zufallsfarbe(); } goto Farbe; } void Farbe_Hart (void) { OCR1AL = rt_neu; OCR1BL = gn_neu; OCR2 = bl_neu; } int main (void) { init_Device(); Modi: //Timer und Ports initialisieren if (!(PIND & (1<