Rev 2012 | Rev 2100 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | SVN | RSS feed
| Rev 2012 | Rev 2064 | ||
|---|---|---|---|
| Line 1... | Line 1... | ||
| 1 | 1 | ||
| 2 | #include "act_hwPWM.h" |
2 | #include "act_hwPWM.h" |
| - | 3 | #include <avr/pgmspace.h> |
|
| 3 | 4 | ||
| 4 | uint16_t pwmValue[4]; |
5 | uint16_t pwmValue[4]; |
| 5 | uint8_t sendInfo[4] = {0,0,0,0}; |
6 | uint8_t sendInfo[4] = {0,0,0,0}; |
| 6 | 7 | ||
| 7 | int8_t fadeSpeed[4] = {0,0,0,0}; |
8 | int8_t fadeSpeed[4] = {0,0,0,0}; |
| Line 10... | Line 11... | ||
| 10 | uint8_t fadeSpeedCnt[4] = {0,0,0,0}; |
11 | uint8_t fadeSpeedCnt[4] = {0,0,0,0}; |
| 11 | 12 | ||
| 12 | uint16_t demoEndValue[4] = {0,0,0,0}; |
13 | uint16_t demoEndValue[4] = {0,0,0,0}; |
| 13 | uint16_t demoHighValue[4] = {0,0,0,0}; |
14 | uint16_t demoHighValue[4] = {0,0,0,0}; |
| 14 | uint8_t demoState[4] = {ACT_HWPWM_DEMO_STATE_NOT_RUNNING, ACT_HWPWM_DEMO_STATE_NOT_RUNNING, ACT_HWPWM_DEMO_STATE_NOT_RUNNING, ACT_HWPWM_DEMO_STATE_NOT_RUNNING}; |
15 | uint8_t demoState[4] = {ACT_HWPWM_DEMO_STATE_NOT_RUNNING, ACT_HWPWM_DEMO_STATE_NOT_RUNNING, ACT_HWPWM_DEMO_STATE_NOT_RUNNING, ACT_HWPWM_DEMO_STATE_NOT_RUNNING}; |
| - | 16 | ||
| - | 17 | static uint16_t lookuptable[256] PROGMEM = |
|
| - | 18 | { |
|
| - | 19 | 0,4, 8,12, 17, 21 , 25 , 30 , 34 , 39 , 43 , 48 , 52 , 57 , 62 , 67 , 72 , 77 , 82 , 87 , 93 , 98 , 104 , 109 , 115 , 120 , 126 , 132 , 138 , 144 , 150 , 156 , 162 , 169 , 175 , 182 , 188 , 195 , 202 , 209 , 216 , 223 , 230 , 237 , 245 , 252 , 260 , 267 , 275 , 283 , 291 , 299 , 308 , 316 , 325 , 333 , 342 , 351 , 360 , 369 , 378 , 388 , 397 , 407 , 417 , 427 , 437 , 447 , 457 , 468 , 478 , 489 , 500 , 511 , 523 , 534 , 546 , 557 , 569 , 581 , 594 , 606 , 619 , 632 , 645 , 658 , 671 , 685 , 698 , 712 , 726 , 741 , 755 , 770 , 785 , 800 , 815 , 831 , 847 , 863 , 879 , 896 , 912 , 929 , 946 , 964 , 982 , 999 , 1018 , 1036 , 1055 , 1074 , 1093 , 1113 , 1132 , 1152 , 1173 , 1193 , 1214 , 1236 , 1257 , 1279 , 1301 , 1324 , 1346 , 1369 , 1393 , 1417 , 1441 , 1465 , 1490 , 1515 , 1540 , 1566 , 1593 , 1619 , 1646 , 1673 , 1701 , 1729 , 1758 , 1787 , 1816 , 1846 , 1876 , 1907 , 1938 , 1969 , 2001 , 2033 , 2066 , 2099 , 2133 , 2167 , 2202 , 2237 , 2273 , 2309 , 2346 , 2383 , 2421 , 2459 , 2498 , 2538 , 2577 , 2618 , 2659 , 2701 , 2743 , 2786 , 2829 , 2873 , 2918 , 2963 , 3009 , 3056 , 3103 , 3151 , 3200 , 3249 , 3299 , 3350 , 3402 , 3454 , 3507 , 3560 , 3615 , 3670 , 3726 , 3783 , 3840 , 3899 , 3958 , 4018 , 4079 , 4141 , 4203 , 4267 , 4331 , 4397 , 4463 , 4530 , 4598 , 4667 , 4737 , 4808 , 4881 , 4954 , 5028 , 5103 , 5179 , 5257 , 5335 , 5415 , 5495 , 5577 , 5660 , 5744 , 5830 , 5916 , 6004 , 6093 , 6183 , 6275 , 6368 , 6462 , 6557 , 6654 , 6752 , 6852 , 6953 , 7055 , 7159 , 7265 , 7371 , 7480 , 7590 , 7701 , 7814 , 7929 , 8045 , 8163 , 8283 , 8404 , 8527 , 8652 , 8778 , 8906 , 9036 , 9168 , 9302 , 9438 , 9575 , 9715 , 9856 , |
|
| - | 20 | 10000 , |
|
| - | 21 | }; |
|
| - | 22 | ||
| 15 | 23 | ||
| 16 | #if act_hwPWM_USEEEPROM==1 |
24 | #if act_hwPWM_USEEEPROM==1 |
| 17 | #include "act_hwPWM_eeprom.h" |
25 | #include "act_hwPWM_eeprom.h" |
| 18 | struct eeprom_act_hwPWM EEMEM eeprom_act_hwPWM = |
26 | struct eeprom_act_hwPWM EEMEM eeprom_act_hwPWM = |
| 19 | { |
27 | { |
| Line 36... | Line 44... | ||
| 36 | /* Check demo states */ |
44 | /* Check demo states */ |
| 37 | if (pwmValue[channel] == fadeTarget[channel]) { |
45 | if (pwmValue[channel] == fadeTarget[channel]) { |
| 38 | switch (demoState[channel]) |
46 | switch (demoState[channel]) |
| 39 | { |
47 | { |
| 40 | case ACT_HWPWM_DEMO_STATE_NOT_RUNNING: |
48 | case ACT_HWPWM_DEMO_STATE_NOT_RUNNING: |
| 41 | break; |
49 | break; |
| 42 | case ACT_HWPWM_DEMO_STATE_DECREASE: |
50 | case ACT_HWPWM_DEMO_STATE_DECREASE: |
| 43 | demoState[channel] = ACT_HWPWM_DEMO_STATE_INCREASE; |
51 | demoState[channel] = ACT_HWPWM_DEMO_STATE_INCREASE; |
| 44 | fadeTarget[channel] = demoHighValue[channel]; |
52 | fadeTarget[channel] = demoHighValue[channel]; |
| 45 | fadeSpeed[channel] = -fadeSpeed[channel]; |
53 | fadeSpeed[channel] = -fadeSpeed[channel]; |
| 46 | break; |
54 | break; |
| 47 | case ACT_HWPWM_DEMO_STATE_INCREASE: |
55 | case ACT_HWPWM_DEMO_STATE_INCREASE: |
| 48 | demoState[channel] = ACT_HWPWM_DEMO_STATE_GOBACK; |
56 | demoState[channel] = ACT_HWPWM_DEMO_STATE_GOBACK; |
| 49 | fadeTarget[channel] = demoEndValue[channel]; |
57 | fadeTarget[channel] = demoEndValue[channel]; |
| 50 | fadeSpeed[channel] = -fadeSpeed[channel]; |
58 | fadeSpeed[channel] = -fadeSpeed[channel]; |
| 51 | break; |
59 | break; |
| 52 | case ACT_HWPWM_DEMO_STATE_GOBACK: |
60 | case ACT_HWPWM_DEMO_STATE_GOBACK: |
| 53 | demoState[channel] = ACT_HWPWM_DEMO_STATE_NOT_RUNNING; |
61 | demoState[channel] = ACT_HWPWM_DEMO_STATE_NOT_RUNNING; |
| 54 | break; |
62 | break; |
| 55 | } |
63 | } |
| 56 | } |
64 | } |
| 57 | 65 | ||
| 58 | /* Change the dimmerValue according to the current fading */ |
66 | /* Change the dimmerValue according to the current fading */ |
| 59 | fadeSpeedCnt[channel]++; |
67 | fadeSpeedCnt[channel]++; |
| 60 | if (fadeSpeedCnt[channel] == fadeSpeedFrac[channel] && pwmValue[channel] != (fadeTarget[channel])) |
68 | if (fadeSpeedCnt[channel] == fadeSpeedFrac[channel] && pwmValue[channel] != (fadeTarget[channel])) |
| 61 | { |
69 | { |
| Line 132... | Line 140... | ||
| 132 | #endif |
140 | #endif |
| 133 | 141 | ||
| 134 | /* enable outputs for timer 1 */ |
142 | /* enable outputs for timer 1 */ |
| 135 | #if act_hwPWM_CH1_COM>0 |
143 | #if act_hwPWM_CH1_COM>0 |
| 136 | gpio_set_out(EXP_B); |
144 | gpio_set_out(EXP_B); |
| 137 | #endif |
145 | #endif |
| 138 | #if act_hwPWM_CH2_COM>0 |
146 | #if act_hwPWM_CH2_COM>0 |
| 139 | gpio_set_out(EXP_C); |
147 | gpio_set_out(EXP_C); |
| 140 | #endif |
148 | #endif |
| 141 | 149 | ||
| 142 | /* set up counter mode for timer 1 */ |
150 | /* set up counter mode for timer 1 */ |
| 143 | #if act_hwPWM_CH1_COM>0 || act_hwPWM_CH2_COM>0 |
151 | #if act_hwPWM_CH1_COM>0 || act_hwPWM_CH2_COM>0 |
| Line 148... | Line 156... | ||
| 148 | if (pwmValue[1]>0) |
156 | if (pwmValue[1]>0) |
| 149 | { |
157 | { |
| 150 | TCCR1A|=(act_hwPWM_CH2_COM<<COM1A0); |
158 | TCCR1A|=(act_hwPWM_CH2_COM<<COM1A0); |
| 151 | } |
159 | } |
| 152 | ICR1 = 0xffff; |
160 | ICR1 = 0xffff; |
| 153 | #endif |
161 | #endif |
| 154 | 162 | ||
| 155 | /* enable timer 1 */ |
163 | /* enable timer 1 */ |
| 156 | #if act_hwPWM_CH1_COM>0 |
164 | #if act_hwPWM_CH1_COM>0 |
| 157 | TCCR1B|=(act_hwPWM_CH1_CS<<CS10); |
165 | TCCR1B|=(act_hwPWM_CH1_CS<<CS10); |
| 158 | #elif act_hwPWM_CH2_COM>0 |
166 | #elif act_hwPWM_CH2_COM>0 |
| 159 | TCCR1B|=(act_hwPWM_CH2_CS<<CS10); |
167 | TCCR1B|=(act_hwPWM_CH2_CS<<CS10); |
| 160 | #endif |
168 | #endif |
| 161 | 169 | ||
| 162 | 170 | ||
| 163 | /* set up waveform generation mode for timer 0 */ |
171 | /* set up waveform generation mode for timer 0 */ |
| 164 | #if act_hwPWM_CH3_COM>0 |
172 | #if act_hwPWM_CH3_COM>0 |
| 165 | TCCR0A=((act_hwPWM_CH3_WGM&0x03)<<WGM00); |
173 | TCCR0A=((act_hwPWM_CH3_WGM&0x03)<<WGM00); |
| 166 | TCCR0B=(((act_hwPWM_CH3_WGM>>2)&0x01)<<WGM02); |
174 | TCCR0B=(((act_hwPWM_CH3_WGM>>2)&0x01)<<WGM02); |
| 167 | #elif act_hwPWM_CH4_COM>0 |
175 | #elif act_hwPWM_CH4_COM>0 |
| 168 | TCCR0A=((act_hwPWM_CH4_WGM&0x03)<<WGM00); |
176 | TCCR0A=((act_hwPWM_CH4_WGM&0x03)<<WGM00); |
| 169 | TCCR0B=(((act_hwPWM_CH4_WGM>>2)&0x01)<<WGM02); |
177 | TCCR0B=(((act_hwPWM_CH4_WGM>>2)&0x01)<<WGM02); |
| Line 173... | Line 181... | ||
| 173 | #if act_hwPWM_CH3_COM>0 |
181 | #if act_hwPWM_CH3_COM>0 |
| 174 | gpio_set_out(EXP_F); |
182 | gpio_set_out(EXP_F); |
| 175 | #endif |
183 | #endif |
| 176 | #if act_hwPWM_CH4_COM>0 |
184 | #if act_hwPWM_CH4_COM>0 |
| 177 | gpio_set_out(EXP_G); |
185 | gpio_set_out(EXP_G); |
| 178 | #endif |
186 | #endif |
| 179 | 187 | ||
| 180 | /* set up counter mode for timer 0 */ |
188 | /* set up counter mode for timer 0 */ |
| 181 | #if act_hwPWM_CH3_COM>0 || act_hwPWM_CH4_COM>0 |
189 | #if act_hwPWM_CH3_COM>0 || act_hwPWM_CH4_COM>0 |
| 182 | if (pwmValue[2]>0) |
190 | if (pwmValue[2]>0) |
| 183 | { |
191 | { |
| 184 | TCCR0A|=(act_hwPWM_CH3_COM<<COM0A0); |
192 | TCCR0A|=(act_hwPWM_CH3_COM<<COM0A0); |
| 185 | } |
193 | } |
| 186 | if (pwmValue[3]>0) |
194 | if (pwmValue[3]>0) |
| 187 | { |
195 | { |
| 188 | TCCR0A|=(act_hwPWM_CH4_COM<<COM0B0); |
196 | TCCR0A|=(act_hwPWM_CH4_COM<<COM0B0); |
| 189 | } |
197 | } |
| 190 | #endif |
198 | #endif |
| 191 | 199 | ||
| 192 | /* enable timer 0 */ |
200 | /* enable timer 0 */ |
| 193 | #if act_hwPWM_CH3_COM>0 |
201 | #if act_hwPWM_CH3_COM>0 |
| 194 | TCCR0B|=(act_hwPWM_CH3_CS<<CS00); |
202 | TCCR0B|=(act_hwPWM_CH3_CS<<CS00); |
| 195 | #elif act_hwPWM_CH4_COM>0 |
203 | #elif act_hwPWM_CH4_COM>0 |
| Line 205... | Line 213... | ||
| 205 | Timer_SetTimeout(act_hwPWM_SEND_STATUS_TIMEOUT, act_hwPWM_SEND_STATUS_INTERVAL_S*1000, TimerTypeFreeRunning, 0); |
213 | Timer_SetTimeout(act_hwPWM_SEND_STATUS_TIMEOUT, act_hwPWM_SEND_STATUS_INTERVAL_S*1000, TimerTypeFreeRunning, 0); |
| 206 | //printf("Hello world!\n"); |
214 | //printf("Hello world!\n"); |
| 207 | } |
215 | } |
| 208 | uint8_t channel_to_send = 1; |
216 | uint8_t channel_to_send = 1; |
| 209 | void act_hwPWM_Process(void) |
217 | void act_hwPWM_Process(void) |
| 210 | { |
218 | { |
| 211 | if (Timer_Expired(act_hwPWM_SEND_STATUS_TIMEOUT)) |
219 | if (Timer_Expired(act_hwPWM_SEND_STATUS_TIMEOUT)) |
| 212 | { |
220 | { |
| 213 | if (channel_to_send >4) { |
221 | if (channel_to_send >4) { |
| 214 | #if act_hwPWM_CH1_COM==0 |
222 | #if act_hwPWM_CH1_COM==0 |
| 215 | channel_to_send = 2; |
223 | channel_to_send = 2; |
| 216 | #if act_hwPWM_CH2_COM==0 |
224 | #if act_hwPWM_CH2_COM==0 |
| 217 | channel_to_send = 3; |
225 | channel_to_send = 3; |
| 218 | #if act_hwPWM_CH3_COM==0 |
226 | #if act_hwPWM_CH3_COM==0 |
| 219 | channel_to_send = 4; |
227 | channel_to_send = 4; |
| 220 | #else |
228 | #else |
| 221 | channel_to_send=3; |
229 | channel_to_send=3; |
| 222 | #endif |
230 | #endif |
| 223 | #else |
231 | #else |
| 224 | channel_to_send=2; |
232 | channel_to_send=2; |
| 225 | #endif |
233 | #endif |
| Line 292... | Line 300... | ||
| 292 | eeprom_write_word_crc(EEDATA16.ch4, pwmValue[3], WITH_CRC); |
300 | eeprom_write_word_crc(EEDATA16.ch4, pwmValue[3], WITH_CRC); |
| 293 | } |
301 | } |
| 294 | } |
302 | } |
| 295 | 303 | ||
| 296 | #if act_hwPWM_CH1_COM>0 |
304 | #if act_hwPWM_CH1_COM>0 |
| - | 305 | # if act_hwPWM_CH1_LED>0 |
|
| - | 306 | # define CH1_calculation ((lookuptable[pwmValue[0]/39-1]*act_hwPWM_CH1_FACT)>>8) |
|
| - | 307 | # else |
|
| 297 |
|
308 | # define CH1_calculation ((pwmValue[0]*act_hwPWM_CH1_FACT)>>8) |
| - | 309 | # endif |
|
| - | 310 | if (OCR_1 != (uint16_t)CH1_calculation) { |
|
| 298 | cli(); |
311 | cli(); |
| 299 | OCR_1=(uint16_t) |
312 | OCR_1=(uint16_t)CH1_calculation; |
| 300 | if (OCR_1==0) |
313 | if (OCR_1==0) |
| 301 | { |
314 | { |
| 302 | TCCR1A&=~((1<<COM1B0)|(1<<COM1B1)); |
315 | TCCR1A&=~((1<<COM1B0)|(1<<COM1B1)); |
| 303 | } |
316 | } |
| 304 | else |
317 | else |
| 305 | { |
318 | { |
| 306 | TCCR1A|=(act_hwPWM_CH1_COM<<COM1B0); |
319 | TCCR1A|=(act_hwPWM_CH1_COM<<COM1B0); |
| 307 | } |
320 | } |
| 308 | sei(); |
321 | sei(); |
| 309 | Timer_SetTimeout(act_hwPWM_STORE_VALUE_TIMEOUT, act_hwPWM_STORE_VALUE_TIMEOUT_TIME*1000, TimerTypeOneShot, 0); |
322 | Timer_SetTimeout(act_hwPWM_STORE_VALUE_TIMEOUT, act_hwPWM_STORE_VALUE_TIMEOUT_TIME*1000, TimerTypeOneShot, 0); |
| 310 | } |
323 | } |
| 311 | #endif |
324 | #endif |
| 312 | #if act_hwPWM_CH2_COM>0 |
325 | #if act_hwPWM_CH2_COM>0 |
| - | 326 | # if act_hwPWM_CH2_LED>0 |
|
| - | 327 | # define CH2_calculation ((uint32_t)((lookuptable[pwmValue[1]/39-1]*act_hwPWM_CH2_FACT)>>8)) |
|
| - | 328 | # else |
|
| 313 |
|
329 | # define CH2_calculation ((uint32_t)((pwmValue[1]*act_hwPWM_CH2_FACT)>>8)) |
| - | 330 | # endif |
|
| - | 331 | if (OCR_2 != (uint16_t)CH2_calculation) { |
|
| 314 | cli(); |
332 | cli(); |
| 315 | OCR_2=(uint16_t) |
333 | OCR_2=(uint16_t)CH2_calculation; |
| 316 | if (OCR_2==0) |
334 | if (OCR_2==0) |
| 317 | { |
335 | { |
| 318 | TCCR1A&=~((1<<COM1A0)|(1<<COM1A1)); |
336 | TCCR1A&=~((1<<COM1A0)|(1<<COM1A1)); |
| 319 | } |
- | |
| 320 | else |
- | |
| 321 | { |
- | |
| 322 | TCCR1A|=(act_hwPWM_CH2_COM<<COM1A0); |
- | |
| 323 | } |
337 | } |
| - | 338 | else |
|
| - | 339 | { |
|
| - | 340 | TCCR1A|=(act_hwPWM_CH2_COM<<COM1A0); |
|
| - | 341 | } |
|
| 324 | sei(); |
342 | sei(); |
| 325 | Timer_SetTimeout(act_hwPWM_STORE_VALUE_TIMEOUT, act_hwPWM_STORE_VALUE_TIMEOUT_TIME*1000, TimerTypeOneShot, 0); |
343 | Timer_SetTimeout(act_hwPWM_STORE_VALUE_TIMEOUT, act_hwPWM_STORE_VALUE_TIMEOUT_TIME*1000, TimerTypeOneShot, 0); |
| 326 | } |
344 | } |
| 327 | #endif |
345 | #endif |
| 328 | #if act_hwPWM_CH3_COM>0 |
346 | #if act_hwPWM_CH3_COM>0 |
| - | 347 | # if act_hwPWM_CH3_LED>0 |
|
| - | 348 | # define CH3_calculation ((lookuptable[pwmValue[2]/39-1]*act_hwPWM_CH3_FACT)>>8) |
|
| - | 349 | # else |
|
| 329 |
|
350 | # define CH3_calculation ((pwmValue[2]*act_hwPWM_CH3_FACT)>>8) |
| - | 351 | # endif |
|
| - | 352 | if (OCR_3 != (uint16_t)CH3_calculation) { |
|
| 330 | cli(); |
353 | cli(); |
| 331 | OCR_3=(uint16_t) |
354 | OCR_3=(uint16_t)CH3_calculation; |
| 332 | if (OCR_3==0) |
355 | if (OCR_3==0) |
| 333 | { |
356 | { |
| 334 | TCCR0A &= ~((1<<COM0A0)|(1<<COM0A1)); |
357 | TCCR0A &= ~((1<<COM0A0)|(1<<COM0A1)); |
| 335 | } |
358 | } |
| 336 | else |
359 | else |
| Line 340... | Line 363... | ||
| 340 | sei(); |
363 | sei(); |
| 341 | Timer_SetTimeout(act_hwPWM_STORE_VALUE_TIMEOUT, act_hwPWM_STORE_VALUE_TIMEOUT_TIME*1000, TimerTypeOneShot, 0); |
364 | Timer_SetTimeout(act_hwPWM_STORE_VALUE_TIMEOUT, act_hwPWM_STORE_VALUE_TIMEOUT_TIME*1000, TimerTypeOneShot, 0); |
| 342 | } |
365 | } |
| 343 | #endif |
366 | #endif |
| 344 | #if act_hwPWM_CH4_COM>0 |
367 | #if act_hwPWM_CH4_COM>0 |
| - | 368 | # if act_hwPWM_CH4_LED>0 |
|
| - | 369 | # define CH4_calculation ((lookuptable[pwmValue[3]/39-1]*act_hwPWM_CH4_FACT)>>8) |
|
| - | 370 | # else |
|
| 345 |
|
371 | # define CH4_calculation ((pwmValue[3]*act_hwPWM_CH4_FACT)>>8) |
| - | 372 | # endif |
|
| - | 373 | if (OCR_4 != (uint16_t)CH4_calculation) { |
|
| 346 | cli(); |
374 | cli(); |
| 347 | OCR_4=(uint16_t) |
375 | OCR_4=(uint16_t)CH4_calculation; |
| 348 | if (OCR_4==0) |
376 | if (OCR_4==0) |
| 349 | { |
377 | { |
| 350 | TCCR0A &= ~((1<<COM0B0)|(1<<COM0B1)); |
378 | TCCR0A &= ~((1<<COM0B0)|(1<<COM0B1)); |
| 351 | } |
379 | } |
| 352 | else |
380 | else |