Commit 9ce6804b70a183f79ff67843c49809f824070bd6
1 parent
6a806062
ledDriver test a tester
Showing
3 changed files
with
80 additions
and
17 deletions
Show diff stats
tests/atmega2560/ledControl/ledControl.c
1 | 1 | #include <avr/io.h> |
2 | 2 | #include <util/delay.h> |
3 | +#include <math.h> | |
4 | + | |
5 | +#define NB_DRIVERS 3 | |
6 | +#define MAX_VALUE 85 //TODO tbd ! | |
7 | +#define DELAY 100 | |
3 | 8 | |
4 | 9 | int main(void){ |
5 | - // SCLK PIN 37 | |
6 | - // SIN PIN 35 | |
7 | - DDRC = 0x03; | |
8 | - uint8_t LEDs = {10, 20, 30, 40, 50, 60, 70, 80, 90, | |
9 | - 100, 110, 120, 130, 140, 150, 160, 170, 180, 190 | |
10 | - 200, 210, 220, 230, 240}; | |
11 | - uint8_t ANDs = {0x001, 0x002, 0x004, 0x008, 0x010, 0x020, 0x040, 0x080, | |
12 | - 0x100, 0x200, 0x400, 0x800}; | |
10 | + // Initialisation | |
11 | + unsigned int ledValues[NB_DRIVERS * DLED_CHANNELS]; | |
12 | + init_LED_Drivers(NB_DRIVERS); | |
13 | 13 | |
14 | + // Animation | |
15 | + unsigned int animTick = 0; | |
14 | 16 | while(1){ |
15 | - for(int i=0; i<24; i++){ | |
16 | - uint16_t n = LEDs[i] << 4; | |
17 | - int clkStatus = 0; | |
18 | - for(int j=0; j<12; j++){ | |
19 | - if(j == 6) | |
20 | - clkStatus = 1; | |
21 | - PORTC = (n & ANDs[j]) << 1 | clkStatus; | |
22 | - _delay_ms(1); | |
23 | - } | |
17 | + // Build animation | |
18 | + for(int i=0; i<NB_DRIVERS * DLED_CHANNELS; i++){ | |
19 | + double sinIn = (double) animTick / 8; | |
20 | + unsigned int val = (unsigned int) (0.5 + (sin(sinIn) * 0.5)); | |
21 | + ledValues[i] = val * MAX_VALUE; | |
24 | 22 | } |
23 | + animTick++; | |
24 | + if(animTick >= 10000) | |
25 | + animTick = 0; | |
26 | + | |
27 | + set_LED_Drivers(groupes, NB_DRIVERS); | |
28 | + _delay_ms(100); | |
25 | 29 | } |
26 | 30 | return 0; |
27 | 31 | } | ... | ... |
... | ... | @@ -0,0 +1,52 @@ |
1 | +#include <avr/io.h> | |
2 | +#include "tlc5947.h" | |
3 | + | |
4 | +#define DLED_CHANNELS 24 | |
5 | + | |
6 | +#define DDR_DLED DDRD | |
7 | +#define PORT_DLED PORTD | |
8 | + | |
9 | +#define PIN_DLED_CLOCK 5 | |
10 | +#define PIN_DLED_DATA 4 | |
11 | +#define PIN_DLED_LATCH 6 | |
12 | + | |
13 | +void init_LED_Drivers(int nb){ | |
14 | + // LED drivers I/O as outputs | |
15 | + DDR_DLED |= (1<<PIN_DLED_CLOCK) | (1<<PIN_DLED_DATA) | (1<<PIN_DLED_LATCH); | |
16 | + // Set LATCH output low | |
17 | + PORT_DLED &= ~(1<<PIN_DLED_LATCH); | |
18 | +} | |
19 | + | |
20 | + | |
21 | +void set_LED_Drivers(unsigned int pwm[], int nb){ | |
22 | + // Set LATCH output low | |
23 | + PORT_DLED &= ~(1<<PIN_DLED_LATCH); | |
24 | + // 24 channels per TLC5947 | |
25 | + int i; | |
26 | + for(i=DLED_CHANNELS*nb-1; i>=0; i--){ | |
27 | + // 12 bits per channel, send MSB first | |
28 | + int v=pwm[i]; | |
29 | + int j; | |
30 | + for(j=0; j<12; j++){ | |
31 | + // Set CLOCK output low | |
32 | + PORT_DLED &= ~(1<<PIN_DLED_CLOCK); | |
33 | + | |
34 | + // Set DATA as stated by bit #j of i | |
35 | + if(v & 0x0800) | |
36 | + PORT_DLED |= (1<<PIN_DLED_DATA); | |
37 | + else | |
38 | + PORT_DLED &= ~(1<<PIN_DLED_DATA); | |
39 | + | |
40 | + // Set CLOCK output HIGH | |
41 | + PORT_DLED |= (1<<PIN_DLED_CLOCK); | |
42 | + v <<= 1; | |
43 | + } | |
44 | + } | |
45 | + // Set CLOCK output low | |
46 | + PORT_DLED &= ~(1<<PIN_DLED_CLOCK); | |
47 | + | |
48 | + // Set LATCH output high | |
49 | + PORT_DLED |= (1<<PIN_DLED_LATCH); | |
50 | + // Set LATCH output low | |
51 | + PORT_DLED &= ~(1<<PIN_DLED_LATCH); | |
52 | +} | ... | ... |