1 | #include "C:\Dokumente und Einstellungen\WoifaL\Eigene Dateien\testilein\Balkonbeleuchtung 0.1\test.h"
|
2 |
|
3 |
|
4 | /*
|
5 | H: der Farbton als Farbwinkel H auf dem Farbkreis (z. B. 0° = Rot, 120° = Grün, 240° = Blau)
|
6 | S: die Sättigung S in Prozent (z. B. 0% = keine Farbe, 50% = ungesättigte Farbe, 100% = gesättigte, reine Farbe)
|
7 | V: der Grauwert V als Prozentwert angegeben (z. B. 0% = keine Helligkeit, 100% = volle Helligkeit)
|
8 |
|
9 | Skalierung der HSV Werte:
|
10 | H: 0-255, 0=rot, 42=gelb, 85=grün, 128=türkis, 171=blau, 214=violett
|
11 | S: 0-255, 0=weißtöne, 255=volle Farben
|
12 | V: 0-255, 0=aus, 255=maximale Helligkeit
|
13 |
|
14 | */
|
15 |
|
16 |
|
17 | #define Ledport PORTA // RGB Led Port
|
18 |
|
19 | #define R_PIN 0 // R Ausgang
|
20 | #define G_PIN 1 // G
|
21 | #define B_PIN 2 // B
|
22 | #define INVERT 0 // Ausgang Low aktiv ?
|
23 |
|
24 | #define Time 1 // Statusbit für Farbwechsel
|
25 |
|
26 | // Prototypen
|
27 | void hsv_to_rgb (unsigned char h, unsigned char s, unsigned char v);
|
28 |
|
29 | // Globale Variabeln (Timer ISR)
|
30 | volatile unsigned char Red, Green, Blue; // PWM Register
|
31 | volatile unsigned char Flags;
|
32 |
|
33 |
|
34 | //-------------------------------------------------------------------------------
|
35 | //Hauptprogramm
|
36 | //-------------------------------------------------------------------------------
|
37 | int main(void)
|
38 | {
|
39 | unsigned char H,S,V;
|
40 |
|
41 | set_tris_a (get_tris_a() & 0xF0); // PIN0 - PIN4 = Ausgang
|
42 | // wird verwendet für fast_io (a);
|
43 | set_tris_b (get_tris_b() | 0xF0); // PIN4 - PIN7 = Eingang
|
44 | // wird verwendet für fast_io (b);
|
45 |
|
46 | H=0;
|
47 | S=255;
|
48 | V=255; // HSV Startwerte: rot, volle Helligkeit
|
49 | hsv_to_rgb(H,S,V); // HSV to RGB
|
50 |
|
51 | setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
|
52 |
|
53 | // Interrupts aktivieren
|
54 | enable_interrupts (INT_TIMER0);
|
55 | enable_interrupts (GLOBAL);
|
56 |
|
57 | for(;;)
|
58 | {
|
59 | if (Flags&Time)
|
60 | {
|
61 | Flags&=~Time;
|
62 | H++;
|
63 | hsv_to_rgb(H,S,V);
|
64 | }
|
65 | }
|
66 | return (0);
|
67 | }
|
68 |
|
69 | //-------------------------------------------------------------------------------
|
70 | //HSV nach RGB konvertieren
|
71 | //-------------------------------------------------------------------------------
|
72 | void hsv_to_rgb (unsigned char h, unsigned char s, unsigned char v)
|
73 | {
|
74 | unsigned char r,g,b, i, f;
|
75 | unsigned int p, q, t;
|
76 |
|
77 | if( s == 0 )
|
78 | {
|
79 | r = g = b = v;
|
80 | }
|
81 | else
|
82 | {
|
83 | i=h/43;
|
84 | f=h%43;
|
85 | p = (v * (255 - s))/256;
|
86 | q = (v * ((10710 - (s * f))/42))/256;
|
87 | t = (v * ((10710 - (s * (42 - f)))/42))/256;
|
88 |
|
89 | switch( i )
|
90 | {
|
91 | case 0:
|
92 | r = v; g = t; b = p; break;
|
93 | case 1:
|
94 | r = q; g = v; b = p; break;
|
95 | case 2:
|
96 | r = p; g = v; b = t; break;
|
97 | case 3:
|
98 | r = p; g = q; b = v; break;
|
99 | case 4:
|
100 | r = t; g = p; b = v; break;
|
101 | case 5:
|
102 | r = v; g = p; b = q; break;
|
103 | }
|
104 | }
|
105 |
|
106 | disable_interrupts (GLOBAL); // Kein Interrupt beim übernehmen der neuen Werte!
|
107 | Red=r, Green=g, Blue=b;
|
108 | enable_interrupts (GLOBAL);
|
109 | }
|
110 |
|
111 | //-------------------------------------------------------------------------------
|
112 | //Timer 0 Interrupt, 39us
|
113 | //-------------------------------------------------------------------------------
|
114 | #int_timer0
|
115 | void timer0interrupt()
|
116 | {
|
117 | static unsigned char PWM_cnt;
|
118 |
|
119 | set_timer0 (61); // 39us
|
120 | // entspricht bei der PWM ca. 100Hz
|
121 |
|
122 | #if (INVERT==1)
|
123 | if (PWM_cnt <Red)
|
124 | Ledport &=~(1 << R_PIN);
|
125 | else
|
126 | Ledport |= (1 << R_PIN);
|
127 |
|
128 | if (PWM_cnt <Green)
|
129 | Ledport &=~(1 << G_PIN);
|
130 | else
|
131 | Ledport |= (1 << G_PIN);
|
132 |
|
133 | if (PWM_cnt <Blue)
|
134 | Ledport &=~(1 << B_PIN);
|
135 | else
|
136 | Ledport |= (1 << B_PIN);
|
137 | #else
|
138 | if (PWM_cnt <Red)
|
139 | Ledport |= (1 << R_PIN);
|
140 | else
|
141 | Ledport &=~(1 << R_PIN);
|
142 |
|
143 | if (PWM_cnt <Green)
|
144 | Ledport |= (1 << G_PIN);
|
145 | else
|
146 | Ledport &=~(1 << G_PIN);
|
147 |
|
148 | if (PWM_cnt <Blue)
|
149 | Ledport |= (1 << B_PIN);
|
150 | else
|
151 | Ledport &=~(1 << B_PIN);
|
152 | #endif
|
153 | PWM_cnt++;
|
154 | if (PWM_cnt==0)
|
155 | Flags|=Time;
|
156 | }
|