Subversion Repositories HomeAutomation

Rev

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
    if (OCR_1 != (uint16_t)(pwmValue[0]*act_hwPWM_CH1_FACT)>>8) {
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)(pwmValue[0]*act_hwPWM_CH1_FACT)>>8;
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
    if (OCR_2 != (uint16_t)((uint32_t)pwmValue[1]*act_hwPWM_CH2_FACT)>>8) {
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)(((uint32_t)pwmValue[1]*act_hwPWM_CH2_FACT)>>8);
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
    if (OCR_3 != (uint16_t)(pwmValue[2]*act_hwPWM_CH3_FACT)>>8) {
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)(pwmValue[2]*act_hwPWM_CH3_FACT)>>8;
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
    if (OCR_4 != (uint16_t)(pwmValue[3]*act_hwPWM_CH4_FACT)>>8) {
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)(pwmValue[3]*act_hwPWM_CH4_FACT)>>8;
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