#include #include #include #ifndef F_CPU #warning "F_CPU war noch nicht definiert, wird nun mit 8000000 definiert" #define F_CPU 8000000UL /* Quarz mit 3.6864 Mhz */ #endif #include /* H: der Farbton als Farbwinkel H auf dem Farbkreis (z. B. 0° = Rot, 120° = Grün, 240° = Blau) S: die Sättigung S in Prozent (z. B. 0% = keine Farbe, 50% = ungesättigte Farbe, 100% = gesättigte, reine Farbe) V: der Grauwert V als Prozentwert angegeben (z. B. 0% = keine Helligkeit, 100% = volle Helligkeit) Skalierung der HSV Werte: H: 0-255, 0=rot, 42=gelb, 85=grün, 128=türkis, 171=blau, 214=violett S: 0-255, 0=weißtöne, 255=volle Farben V: 0-255, 0=aus, 255=maximale Helligkeit */ #define Ledport PORTB // RGB Led Port #define DDR_Ledport DDRB #define DDR_Inputport DDRB #define R_PIN 4 // R Ausgang #define G_PIN 3 // G #define B_PIN 0 // B #define INVERT 0 // Ausgang Low aktiv ? #define Time 1 // Statusbit für Farbwechsel // Prototypen void hsv_to_rgb (unsigned char h, unsigned char s, unsigned char v); // Globale Variabeln (Timer ISR) volatile unsigned char Red, Green, Blue; // PWM Register volatile unsigned char Flags; inline uint8_t entprellen(volatile uint8_t *port, uint8_t pin) { if ( ! (*port & (1 << pin)) ) { /* Pin wurde auf Masse gezogen, 100ms warten */ _delay_ms(50); // max. 262.1 ms / F_CPU in MHz _delay_ms(50); if ( *port & (1 << pin) ) { /* Anwender Zeit zum Loslassen des Tasters geben */ _delay_ms(50); _delay_ms(50); return 1; } } return 0; } //------------------------------------------------------------------------------- //Hauptprogramm //------------------------------------------------------------------------------- int main(void) { unsigned char H,S,V; int modi = 0; DDRB &= ~( 1 << DDB1 ); //PORTB |= (1< 2 ) { modi = 0; } } } //------------------------------------------------------------------------------- //HSV nach RGB konvertieren //------------------------------------------------------------------------------- void hsv_to_rgb (unsigned char h, unsigned char s, unsigned char v) { unsigned char r,g,b, i, f; unsigned int p, q, t; if( s == 0 ) { r = g = b = v; } else { i=h/43; f=h%43; p = (v * (255 - s))/256; q = (v * ((10710 - (s * f))/42))/256; t = (v * ((10710 - (s * (42 - f)))/42))/256; switch( i ) { case 0: r = v; g = t; b = p; break; case 1: r = q; g = v; b = p; break; case 2: r = p; g = v; b = t; break; case 3: r = p; g = q; b = v; break; case 4: r = t; g = p; b = v; break; case 5: r = v; g = p; b = q; break; } } cli(); // Kein Interrupt beim übernehmen der neuen Werte! Red=r, Green=g, Blue=b; sei(); } //------------------------------------------------------------------------------- //Timer 0 Interrupt, f/256 //------------------------------------------------------------------------------- ISR (SIG_OVERFLOW0) { static unsigned char PWM_cnt; #if (INVERT==1) if (PWM_cnt