Rev 52 | Rev 54 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
28 | walter | 1 | //############################################################################ |
51 | walter | 2 | // - PWM CTRL |
3 | // - Main |
||
28 | walter | 4 | // - ATMEGA8 mit 8MHz |
5 | // - Nur für den privaten Gebrauch |
||
6 | // - Keine Garantie auf Fehlerfreiheit |
||
7 | // - Kommerzielle Nutzung nur mit meiner Zustimmung |
||
8 | // - walter Meyer @ www.freakware.de |
||
9 | // - 11.12.2007 |
||
10 | // - Make sure Fuses are programmed for internal 8 MHz RC Oscilator |
||
11 | //############################################################################*/ |
||
12 | |||
13 | #include "main.h" |
||
14 | #include "uart.h" |
||
15 | #include "twislave.h" |
||
16 | |||
17 | volatile unsigned int ppm_signal = 1500; |
||
18 | volatile unsigned char ppm_new = 0; |
||
19 | volatile unsigned char TMR1OvF = 0; |
||
51 | walter | 20 | volatile unsigned int TMR1MS; |
28 | walter | 21 | volatile unsigned char ch0; |
22 | volatile unsigned char ch1; |
||
23 | volatile unsigned char ch2; |
||
24 | volatile unsigned char ch3; |
||
25 | volatile unsigned char ch4; |
||
26 | volatile unsigned char ch5; |
||
52 | walter | 27 | volatile unsigned char ch0_tmp; |
28 | volatile unsigned char ch1_tmp; |
||
29 | volatile unsigned char ch2_tmp; |
||
30 | volatile unsigned char ch3_tmp; |
||
31 | volatile unsigned char ch4_tmp; |
||
32 | volatile unsigned char ch5_tmp; |
||
33 | |||
34 | |||
51 | walter | 35 | unsigned int timer; |
28 | walter | 36 | |
37 | SIGNAL(SIG_OVERFLOW1) |
||
38 | { |
||
39 | TMR1OvF++; |
||
40 | } |
||
41 | |||
42 | |||
43 | SIGNAL(SIG_INPUT_CAPTURE1) |
||
44 | { |
||
45 | static unsigned int pos_ICR; |
||
46 | static unsigned int ppm; |
||
47 | |||
48 | if ((TCCR1B & (1<<ICES1)) != 0) //rising edge |
||
49 | { |
||
50 | TCCR1B &= ~(1<<ICES1); //set falling egde |
||
51 | TMR1OvF = 0; |
||
52 | pos_ICR = ICR1; |
||
53 | } |
||
54 | else //falling edge |
||
55 | { |
||
56 | TCCR1B |= (1<<ICES1); //set rising egde |
||
57 | ppm = (ICR1 - pos_ICR + (int) TMR1OvF * 65536); |
||
58 | if ((ppm > 600) && (ppm < 2400)) |
||
59 | { |
||
60 | if (ppm > 2100) ppm = 2100; |
||
61 | if (ppm < 900) ppm = 900; |
||
62 | ppm = (ppm_signal * 7 + ppm) / 8; |
||
63 | ppm_signal = ppm; |
||
64 | ppm_new = 1; |
||
65 | } |
||
66 | |||
67 | } |
||
68 | |||
69 | } |
||
70 | |||
71 | |||
72 | |||
73 | |||
74 | |||
75 | SIGNAL(SIG_OVERFLOW0) |
||
76 | { |
||
52 | walter | 77 | // this function is called every 32us, |
78 | // it is very important that it's execution time is as short as possible |
||
79 | // currently it's about 20us |
||
80 | |||
81 | static unsigned char counter = 254; |
||
82 | static unsigned char ms1 = 0; |
||
28 | walter | 83 | unsigned char PORTB_BAK; |
84 | unsigned char PORTD_BAK; |
||
85 | |||
86 | PORTB_BAK = PORTB; |
||
87 | PORTD_BAK = PORTD; |
||
88 | |||
51 | walter | 89 | if (counter++ == 254) |
28 | walter | 90 | { |
51 | walter | 91 | PORTB_BAK LEDON (CH0_B | CH1_B | CH2_B); |
92 | PORTD_BAK LEDON (CH3_D | CH4_D | CH5_D); |
||
52 | walter | 93 | ch0_tmp = ch0; |
94 | ch1_tmp = ch1; |
||
95 | ch2_tmp = ch2; |
||
96 | ch3_tmp = ch3; |
||
97 | ch4_tmp = ch4; |
||
98 | ch5_tmp = ch5; |
||
51 | walter | 99 | counter = 0; |
28 | walter | 100 | } |
101 | |||
52 | walter | 102 | if (ch0_tmp == counter) PORTB_BAK LEDOFF CH0_B; |
103 | if (ch1_tmp == counter) PORTB_BAK LEDOFF CH1_B; |
||
104 | if (ch2_tmp == counter) PORTB_BAK LEDOFF CH2_B; |
||
105 | if (ch3_tmp == counter) PORTD_BAK LEDOFF CH3_D; |
||
106 | if (ch4_tmp == counter) PORTD_BAK LEDOFF CH4_D; |
||
107 | if (ch5_tmp == counter) PORTD_BAK LEDOFF CH5_D; |
||
51 | walter | 108 | |
109 | PORTB = PORTB_BAK; |
||
110 | PORTD = PORTD_BAK; |
||
28 | walter | 111 | |
51 | walter | 112 | if (ms1++ == 32) |
28 | walter | 113 | { |
51 | walter | 114 | ms1=0; |
115 | TMR1MS++; |
||
28 | walter | 116 | } |
51 | walter | 117 | |
28 | walter | 118 | |
119 | |||
120 | |||
51 | walter | 121 | } |
28 | walter | 122 | |
123 | |||
124 | |||
51 | walter | 125 | unsigned int SetDelay (unsigned int t) |
126 | { |
||
127 | unsigned char temp_hi; |
||
128 | unsigned char temp_lo; |
||
28 | walter | 129 | |
51 | walter | 130 | temp_hi = (TMR1MS >> 8); |
131 | temp_lo = (TMR1MS & 0xff); |
||
132 | if (temp_hi != (TMR1MS >> 8)) temp_hi = (TMR1MS >> 8); |
||
28 | walter | 133 | |
51 | walter | 134 | return(((temp_hi << 8) | temp_lo) + t + 1); |
28 | walter | 135 | |
51 | walter | 136 | } |
28 | walter | 137 | |
138 | |||
51 | walter | 139 | char CheckDelay(unsigned int t) |
140 | { |
||
141 | unsigned char temp_hi; |
||
142 | unsigned char temp_lo; |
||
143 | |||
144 | temp_hi = (TMR1MS >> 8); |
||
145 | temp_lo = (TMR1MS & 0xff); |
||
146 | if (temp_hi != (TMR1MS >> 8)) temp_hi = (TMR1MS >> 8); |
||
147 | |||
148 | return(((t - ((temp_hi << 8) | temp_lo)) & 0x8000) >> 9); |
||
149 | |||
28 | walter | 150 | } |
151 | |||
152 | |||
153 | |||
154 | |||
155 | /*##############################################################################*/ |
||
51 | walter | 156 | void StartPWM(void) |
28 | walter | 157 | { |
158 | //Timer 0 Config for getting right timing for IR Pattern |
||
159 | TCCR0 = (0<<CS02)|(0<<CS01)|(1<<CS00); // (@8MHz) = 1/8us Clk = 256/8 = 32us overflow |
||
160 | TIMSK setbit (1<<TOIE0); // enable Int |
||
161 | |||
162 | } |
||
163 | |||
164 | |||
165 | |||
166 | /*##############################################################################*/ |
||
167 | void StartPPM(void) |
||
168 | { |
||
169 | |||
170 | //global timer1 Config |
||
171 | TCCR1A = (0<<COM1A1)|(0<<COM1A0)|(0<<COM1B1)|(0<<COM1B0)| |
||
172 | (0<<FOC1A) |(0<<FOC1B) |(0<<WGM10) |(0<<WGM11); |
||
173 | TCCR1B = (1<<ICNC1)|(1<<ICES1)|(0<<WGM13)| |
||
174 | (0<<WGM12)|(0<<CS12)|(1<<CS11)|(0<<CS10); //ICP_POS_FLANKE |
||
175 | |||
176 | // interrupts |
||
177 | TIMSK |= (1<<TICIE1)|(1<<TOIE1); //ICP_INT_ENABLE and TIMER1_INT_ENABLE |
||
178 | |||
179 | } |
||
180 | |||
181 | |||
182 | |||
52 | walter | 183 | /*##############################################################################*/ |
28 | walter | 184 | int GetPPM(void) |
185 | { |
||
186 | //this routines seems to be nesseccary, as reading a 16 bit value |
||
187 | //on a 8 bit machine is not atomic, so if an interrupt apears between reading |
||
188 | //low and high byte of the 16 bit value a wrong result is possible |
||
189 | |||
190 | unsigned char intmask; |
||
191 | unsigned int ppm_temp; |
||
192 | |||
193 | intmask = TIMSK; //backup interupt enable bits |
||
194 | TIMSK &= ~(1<<TICIE1); //disable ppm interrupt |
||
195 | ppm_temp = ppm_signal; |
||
196 | TIMSK = intmask; //restore interupt enable bits |
||
197 | return(ppm_temp); //return ppm_signal |
||
198 | |||
199 | } |
||
200 | |||
201 | |||
202 | /*##############################################################################*/ |
||
203 | // MAIN |
||
204 | /*##############################################################################*/ |
||
205 | int main (void) |
||
206 | { |
||
51 | walter | 207 | unsigned int i; |
53 | walter | 208 | unsigned int ppm; |
51 | walter | 209 | unsigned char colorState; |
52 | walter | 210 | unsigned char nextcolorState=0; |
28 | walter | 211 | |
51 | walter | 212 | DDRB = (CH0_B|CH1_B|CH2_B); |
213 | PORTB = 0x00; |
||
214 | |||
215 | DDRC = (ledred); |
||
28 | walter | 216 | PORTC = 0x00; |
51 | walter | 217 | |
218 | DDRD = (ledgreen|CH3_D|CH4_D|CH5_D); |
||
28 | walter | 219 | PORTD = 0x00; |
220 | |||
221 | ch0 = 0; |
||
222 | ch1 = 0; |
||
223 | ch2 = 0; |
||
224 | ch3 = 0; |
||
225 | ch4 = 0; |
||
226 | ch5 = 0; |
||
227 | |||
228 | //StartUART(); |
||
229 | StartPPM(); |
||
51 | walter | 230 | //StartI2C(); |
28 | walter | 231 | StartPWM(); |
232 | sei(); |
||
233 | |||
51 | walter | 234 | |
52 | walter | 235 | // Farbablauf: rot > Violett > blau > tuerkis > gruen > gelb > |
51 | walter | 236 | |
237 | |||
238 | colorState = 0; |
||
28 | walter | 239 | |
240 | while (1) |
||
241 | { |
||
51 | walter | 242 | |
53 | walter | 243 | /* |
244 | #define step 128 |
||
245 | #define mul 2 |
||
28 | walter | 246 | |
53 | walter | 247 | if ((ppm >= (step * 0) && (ppm < (step * 1))) ch0 = mul * ((ppm - (step * 0))); |
248 | if ((ppm >= (step * 1)) && (ppm < (step * 2))) ch1 = mul * ((ppm - (step * 1))); |
||
249 | if ((ppm >= (step * 2)) && (ppm < (step * 3))) ch0 = mul * ((step - 1) - (ppm - (step * 2))); |
||
250 | if ((ppm >= (step * 3)) && (ppm < (step * 4))) ch2 = mul * ((ppm - (step * 3))); |
||
251 | if ((ppm >= (step * 4)) && (ppm < (step * 5))) ch1 = mul * ((step - 1) - (ppm - (step * 4))); |
||
252 | if ((ppm >= (step * 5)) && (ppm < (step * 6))) ch0 = mul * ((ppm - (step * 5))); |
||
253 | if ((ppm >= (step * 6)) && (ppm < (step * 7))) ch2 = mul * ((step - 1) - (ppm - (step * 6))); |
||
254 | |||
255 | //printf("%d ",ppm); |
||
256 | */ |
||
257 | |||
51 | walter | 258 | for (i=0; i<=255; i++) |
259 | { |
||
260 | switch(colorState) |
||
261 | { |
||
262 | case 0: |
||
52 | walter | 263 | ch0 = i; //fade in (ch0) red |
51 | walter | 264 | nextcolorState = 2; |
265 | break; |
||
28 | walter | 266 | |
51 | walter | 267 | case 2: |
52 | walter | 268 | ch1 = i; //fade in (ch1) blue to get pure purple (red + blue) |
51 | walter | 269 | nextcolorState = 4; |
270 | break; |
||
271 | |||
272 | case 4: |
||
273 | ch0 = 255 - i; //fade out (ch0) red to get pure blue |
||
274 | nextcolorState = 6; |
||
275 | break; |
||
276 | |||
277 | case 6: |
||
52 | walter | 278 | ch2 = i; //fade in (ch2) green to get pure cyan (blue + green) |
51 | walter | 279 | nextcolorState = 8; |
280 | break; |
||
281 | |||
282 | case 8: |
||
283 | ch1 = 255 - i; //fade out (ch1) blue to get pure green |
||
284 | nextcolorState = 10; |
||
285 | break; |
||
286 | |||
287 | case 10: |
||
52 | walter | 288 | ch0 = i; //fade in (ch0) red to get yellow pure (green + red) |
51 | walter | 289 | nextcolorState = 12; |
290 | break; |
||
291 | |||
292 | case 12: |
||
293 | ch2 = 255 - i; //fade out (ch2) green to get pure red |
||
294 | nextcolorState = 0; |
||
295 | break; |
||
296 | } |
||
297 | |||
298 | |||
52 | walter | 299 | timer = SetDelay(5); //wait 10ms |
51 | walter | 300 | while (!CheckDelay(timer)); |
301 | } |
||
302 | |||
303 | colorState = nextcolorState; |
||
52 | walter | 304 | |
305 | timer = SetDelay(3); //hold pure colors for additional 3ms |
||
51 | walter | 306 | while (!CheckDelay(timer)); |
307 | |||
308 | |||
28 | walter | 309 | } |
310 | |||
311 | |||
312 | } |
||
52 | walter | 313 |