Toon posts:

ATmega88 & TLC59116 willen niet via i2c communiceren

Pagina: 1
Acties:

Acties:
  • 0Henk 'm!

  • DP Kunst
  • Registratie: Juni 2003
  • Laatst online: 13-05 13:56
Op het moment ben ik bezig met een DMX ontvanger die 12 individuele rgb leds aan kan sturen. Hier heb ik een berg PWM kanalen voor nodig, welke ik gevonden heb in de TLC59116 en de TLC59108 van TI. Deze IC's worden aangestuurd door een ATmega88 en de i2c bus, welke met 2 pull-ups van 4k7 aan de vcc hangt.

Nu krijg ik dit niet aan de gang. Ik heb de library van Peter Fleury geprobeerd, maar dit werkte niet. Vervolgens zelf wat gebouwd volgens de datasheet, maar dit wil ook nog niet helemaal werken. De code is als volgt:

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
/*
 * RGB_12_Test.c
 *
 * Created: 7/5/2011 8:46:40 PM
 *  Author: Daniël
 */ 

// Defines
#define F_CPU           8000000 
#define SCL_CLOCK       100000

// Includes
#include <avr\io.h>
#include <avr\interrupt.h>
#include <util\delay.h>
#include <util\twi.h>

//Functions
void setup(){
    DDRD    =   0xFF;                   //PORTD as output
    PORTD   =   0x00;                   //All LEDs on
    DDRB    =   0xFF;                   //PORTB as output
    PORTB   =   0x00;                   //All LEDs on
    _delay_ms(500); 
    PORTD   =   0xFF;                   //All LEDs off
    PORTB   =   0xFF;                   //All LEDs off
}

//Blink red light on error
void error(){
    PORTD = 0xDF;
    _delay_ms(200);
    PORTD = 0xFF;
    _delay_ms(200);
}

//Blink green light on pass
void pass(){
    PORTD = 0xF7;
    _delay_ms(200);
    PORTD = 0xFF;
    _delay_ms(200);
}

//Test inverted register to PORTB
void test(unsigned char reg){
    PORTB = 0xFF - reg;
    _delay_ms(500);                 
}

void twi_init(){
    TWSR    =   0;                                  //Prescaler 1
    TWBR    =   ((F_CPU/SCL_CLOCK)-16)/2;           //Must be > 10 for stable operation 
    DDRC    =   0xCF;                               //PC4,5 inputs
    PORTC   =   0x30;                               //Pull-ups on
    PRR     =   0x00;                               //Power Management all on
    sei();                                          //Global Interrupts Enabled
}

unsigned char twi_start(unsigned char address){
    TWCR = 0xA4;                                                                        //Send START condition
    test(TWSR);                                                                         //Output TWSR to PORTB
    while(!(TWCR & 0x80));                                                              //Wait until transmission completed
    test(TWSR);                                                                         //Output TWSR to PORTB
    if (((TWSR & 0xF8) != TW_START) && ((TWSR & 0xF8) != TW_REP_START)) return 1;       //Check value of TWI Status Register. Mask prescaler bits.
    TWDR = address;                                                                     //Load device address
    TWCR = 0x84;                                                                        //Send device address
    while(!(TWCR & 0x80));                                                              //Wait until transmission completed
    test(TWSR);                                                                         //Output TWSR to PORTB
    if (((TWSR & 0xF8) != TW_MT_SLA_ACK) && ((TWSR & 0xF8) != TW_MR_SLA_ACK)) return 1; //Check value of TWI Status Register. Mask prescaler bits.
    pass();                                                                             //Completed start routine!      
    return 0;

}

unsigned char twi_write(unsigned char data){    
    TWDR = data;                                    //Load data
    TWCR = 0x84;                                    //Send data to the previously addressed device
    while(!(TWCR & 0x80));                          //Wait until transmission completed
    if((TWSR & 0xF8) != TW_MT_DATA_ACK) return 1;   //Check value of TWI Status Register. Mask prescaler bits
    pass();                                         //Completed write routine!
    return 0;
}

void twi_stop(){
    TWCR = 0x94;                                    //Send STOP condition
    while((TWCR & 0x80));                           //Wait until stop condition is executed and bus released
}

int main(void)
{
    setup();
    twi_init();
    
    while(1){
        if(twi_start(0x61|TW_WRITE) == 1){
            error();                                //If start routine fails: error
            twi_stop();
        } else {
            pass();
            if(twi_write(0xA2) == 1) error();       //Auto increment on PWM registers, select PWM0
            if(twi_write(0x80) == 1) error();       //PWM0 value
            twi_stop(); 
        }           
        PORTD = 0xBF;                               //Blue LED on for idle
        _delay_ms(3000);
        PORTD = 0xFF;       
    }       
}


Op het moment heb ik even een DS1882 aan hangen, om er zeker van te zijn dat die TLC niet kapot is. Dit werkt echter ook niet.

Het vreemde is vooral dat ik een 0x20 (MT_SLA_NACK) terug krijg als ik naar het adres van het IC iets probeer te doen. Als ik naar elk willekeurig ander adres iets probeer krijg ik een 0x88 (SR_DATA_NACK).

Heeft iemand een idee wat ik hier fout doe :?

Mijn nieuwe portfolio (Under Construction) | Benieuwd wat Solar Team Twente gaat doen?


Acties:
  • 0Henk 'm!

  • real_FireFly
  • Registratie: April 2003
  • Laatst online: 11-01-2020
code:
1
 if(twi_start(0x61|TW_WRITE) == 1){

0x61 kan geen chip adres zijn, i2c adressen zijn altijd even (omdat de LSB als read/write bit gebruikt wordt). Ik vermoed dat je die 0x61 even een bitje naar links op moet schuiven.

Acties:
  • 0Henk 'm!

  • DP Kunst
  • Registratie: Juni 2003
  • Laatst online: 13-05 13:56
Nee, dat kan wel. 0x61 = 1100001, 7 bits dus. TW_WRITE is gedefinieerd als 0. Het | teken plakt ze aan elkaar, telt ze niet op. Dan krijg je dus 11000010, wat een prima 8 bits getal is met 7 address bits en 1 R/W bit.

Ik krijg ook precies dezelfde fout als ik gewoon naar 11000010 iets probeer te sturen...

Mijn nieuwe portfolio (Under Construction) | Benieuwd wat Solar Team Twente gaat doen?


Acties:
  • 0Henk 'm!

  • peeter123
  • Registratie: Juli 2005
  • Laatst online: 21:57

peeter123

Electrical Engineer

Dat is niet helemaal waar: 1100001|0 = 1100001 ;) Dit is wel goed: ((1100001<<1)|TW_Write)

Dream as if you will live forever, live as if you will die today!


  • DP Kunst
  • Registratie: Juni 2003
  • Laatst online: 13-05 13:56
Hhmm.., ok, my bad. Heb het nu aangepast. Heb ook nog even een nieuw printje in elkaar gesoldeerd. De oude begon een beetje te flippen. Ik krijg nu iig ack's na address en data bytes, dus dat is alweer een vooruitgang! Nu alleen nog zorgen dat het ic ook iets met z'n waardes gaat doen... Tot nu toe blijven de leds aan de TLC59108 nog uit...

Mijn nieuwe portfolio (Under Construction) | Benieuwd wat Solar Team Twente gaat doen?


  • DP Kunst
  • Registratie: Juni 2003
  • Laatst online: 13-05 13:56
Het was even wat gepiel, maar het werkt. Bleek dat dat ding eerst uit de slaapstand gehaald moest worden en er nog een paar registers waren die eerst goed gezet moesten worden. Maar ik heb werkende RGB ledjes 8)

Mijn nieuwe portfolio (Under Construction) | Benieuwd wat Solar Team Twente gaat doen?


  • DP Kunst
  • Registratie: Juni 2003
  • Laatst online: 13-05 13:56
Ok, nu het volgende. Ben inmiddels weer een stukje verder met code schrijven en ik kan nu ook DMX ontvangen. Alleen alle DMX signalen verwerken en naar de TLC59116's sturen gaat nog niet helemaal top.

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
/*
 * RGB_12_Test.c
 *
 * Created: 7/5/2011 8:46:40 PM
 *  Author: Daniël
 */ 

// Defines
#define F_CPU           8000000 
#define SCL_CLOCK       400000
#define BAUD            250000

// Includes
#include <avr\io.h>
#include <avr\interrupt.h>
#include <util\twi.h>
#include <other\stdbool.h>

//Variables
bool DMX_BREAK = false;
bool DMX_MAB = false;
bool DMX_READY = false;

int DMX_START   = 1,                                //Start address
    VERSION     = 2,                                //Aantal TLC59116's
    LED_GROUP   = 5,                                //Aantal leds per TLC59116
    TLC         = 0,                                //TLC nr
    LED         = 0,                                //LED nr
    DMX_STATUS  = 0,
    DMX_DATA    = 0,
    DMX_COUNTER = 0,
    DMX_RED     = 255,
    DMX_GREEN   = 255,
    DMX_BLUE    = 255,
    DMX_MASTER  = 255,
    TMP         = 0;


//Functions
void sys_init(){
    DDRB    =   0xFF;                               //PORTB as output
    DDRD    =   0xFF;                               //PORTD as output
    PORTD   =   0xFF;                               //All LEDs off
    PORTB   =   0xFF;                               //All LEDs off
    sei();                                          //Global Interrupts Enabled
}

//Initialize UART0
void uart_init(){
    UBRR0   =   ((F_CPU/16/BAUD)-1);                //UART Prescaler
    UCSR0B  =   0x98;                               //Enable transmit, recieve and recieve interrupt
    UCSR0C  =   0x0E;                               //8bit frames & 2 stopbits
}

//Initialize TWI
void twi_init(){
    TWSR    =   0;                                  //Prescaler 1
    TWBR    =   ((F_CPU/SCL_CLOCK)-16)/2;           //Must be > 10 for stable operation 
    DDRC    =   0xCF;                               //PC4,5 inputs
    PORTC   =   0x30;                               //Pull-ups on
    PRR     =   0x00;                               //Power Management all on
                                                
}

unsigned char twi_start(unsigned char address){
    TWCR = 0xA4;                                                                        //Send START condition
    while(!(TWCR & 0x80));                                                              //Wait until transmission completed
    if (((TWSR & 0xF8) != TW_START) && ((TWSR & 0xF8) != TW_REP_START)) return 1;       //Check value of TWI Status Register
    TWDR = address;                                                                     //Load device address
    TWCR = 0x84;                                                                        //Send device address
    while(!(TWCR & 0x80));                                                              //Wait until transmission completed
    if (((TWSR & 0xF8) != TW_MT_SLA_ACK) && ((TWSR & 0xF8) != TW_MR_SLA_ACK)) return 1; //Check value of TWI Status Register
    return 0;

}

unsigned char twi_write(unsigned char data){        
    TWDR = data;                                    //Load data
    TWCR = 0x84;                                    //Send data to the previously addressed device
    while(!(TWCR & 0x80));                          //Wait until transmission completed
    if((TWSR & 0xF8) != TW_MT_DATA_ACK) return 1;   //Check value of TWI Status Register. Mask prescaler bits
    return 0;
}

void twi_stop(){                                    
    TWCR = 0x94;                                    //Send STOP condition
    while((TWCR & 0x80));                           //Wait until stop condition is executed and bus released
}

int main(void)
{
    sys_init();                                     //Init system
    twi_init();                                     //Init TWI
    int i;
    for(i = 0; i<VERSION; i++){                     //Setup TLC59116's
        twi_start(((0x60+i)<<1)|TW_WRITE);          //Send start condition 
        twi_write(0b10000000);                      //Auto increment on all registers, start at 00
        twi_write(0b10100000);                      //Mode1
        twi_stop();                                 //Send stop condition
    
        twi_start(((0x60+i)<<1)|TW_WRITE);          //Send start condition
        twi_write(0x94);                            //Auto increment on all registers, start at 14
        twi_write(0xAA);                            //LEDOUT0
        twi_write(0xAA);                            //LEDOUT1
        twi_write(0xAA);                            //LEDOUT2
        twi_write(0xAA);                            //LEDOUT3
        twi_stop();                                 //Send stop condition
    }   
    uart_init();

Initializen gaat allemaal goed. Alles wordt ingesteld zoals het moet

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    while(1){                                       //Main program
        while(!DMX_READY);                          //Wait until RGBM values are present
        DMX_READY = false;                          //Set DMX_Ready False
        twi_start(((0x60+TLC)<<1)|TW_WRITE);        //Send start condition
        twi_write(0x82+(LED*3));                    //Select start register
        twi_write(DMX_RED*(255/DMX_MASTER));        //Write red value
        twi_write(DMX_GREEN*(255/DMX_MASTER));      //Write green value
        twi_write(DMX_BLUE*(255/DMX_MASTER));       //Write blue value
        twi_stop();                                 //Send stop condition
        LED++;                                      //Increase led number
        if(!(LED < LED_GROUP)){                     //If last led reached:
            LED = 0;                                //Reset led nr
            TLC++;                                  //Increase TLC number
            if(!(TLC < VERSION)){                   //If last TLC reached
                TLC = 0;                            //Reset TLC nr
            }
        }                           
    }
}

Hier is het de bedoeling dat de in de interrupt binnengehaalde waardes naar de TLC59116's worden gestuurd

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
ISR(USART_RX_vect){
    DMX_STATUS = UCSR0A;                                                //Copy USART status A to DMX_Status
    DMX_DATA = UDR0;                                                    //Copy data byte to DMX_DATA
    if (DMX_STATUS & (0x10)){                                           //Test for framing error
        DMX_BREAK = true;                                               //Set DMX_BREAK true
        DMX_MAB = false;                                                //Set DMX_MAB false
    } else if(DMX_DATA == 0 && DMX_MAB == false && DMX_BREAK == true) { //Test for MAB
        DMX_MAB = true;                                                 //Set DMX_MAB true
        DMX_COUNTER = 0;                                                //Set DMX_COUNTER to 0
    }
    
    if(DMX_BREAK == true && DMX_MAB == true){                           //If BREAK and MAB are true
        if(DMX_COUNTER >= DMX_START && DMX_COUNTER < DMX_START + (4*LED_GROUP*VERSION)){    
                                                                        // ^^ Check if current channel is in range
            TMP = DMX_COUNTER - 20 * TLC - 4 * LED;                     //TMP is DMX_Counter - 20* TLC nr - 4* led nr
            if (TMP == 1){                                              
                DMX_RED = DMX_DATA;                 //Save Red channel data
            } else if (TMP == 2){
                DMX_GREEN = DMX_DATA;               //Save Green channel data
            } else if (TMP == 3){                       
                DMX_BLUE = DMX_DATA;                //Save Blue channel data
            } else if (TMP == 4){
                DMX_MASTER = DMX_DATA;              //Save Master channel data
                DMX_READY = true;                   //DMX LED ready to sent to TLC
            } else {
                PORTD   = 0xDF;                     //Red led
            }
        } else {
            PORTD   = 0xFF;                         //Reset PORTD
            LED = 0;                                //Reset Led nr
            TLC = 0;                                //Reset TLC nr
        }
        DMX_COUNTER++;                              //DMX_COUNTER increased by 1
    }
                                                                                                                
   
}


En dit is de interrupt. Hier is het de bedoeling dat de binnenkomende waarden opgeslagen worden in variabelen die in de main weer naar de TLC59116's geschreven kunnen worden.

Echter wordt in de main alleen de eerste led aangestuurd, daarna gebeurd er niets. De rode led knippert, wat betekend dat dat hij na het eerste setje RGBM variabelen niet opnieuw begint maar door telt.

Nu gok ik dat het iets met de global / local variabelen te maken heeft en dat de variabele LED in de main en in de interrupt niet hetzelfde zijn. Maar hoe los ik dit op?

Mijn nieuwe portfolio (Under Construction) | Benieuwd wat Solar Team Twente gaat doen?


  • peeter123
  • Registratie: Juli 2005
  • Laatst online: 21:57

peeter123

Electrical Engineer

Dat komt door de optimalisatie, je moet je variabelen die je in je interrupt gebruikt volatile maken, dus zo: volatile int variabele. Dan zeg je tegen de compiler dat ze ook dmv externe invloeden kunnen veranderen(interrupts).

Als je dat niet doet denkt de compiler dat de variabelen alleen veranderen in de main loop. Als er dan niets mee gebeurt vervangt die ze door 0 oid omdat ze toch niet van waarde veranderen.

Dream as if you will live forever, live as if you will die today!


  • DP Kunst
  • Registratie: Juni 2003
  • Laatst online: 13-05 13:56
Ik heb nu de hele avond nog weer lopen proberen, maar het wil maar niet lukken. Heb nu de variabele die ik in de main en in de interrupt gebruik volatile gemaakt, maar het maakt geen verschil.

Heb nog wat meer in de code veranderd. Hier de hele code:
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
/*
 * RGB_12_Test.c
 *
 * Created: 7/5/2011 8:46:40 PM
 *  Author: Daniël
 */ 

// Defines
#define F_CPU           8000000                     //8MHz
#define SCL_CLOCK       400000                      //400kbps
#define BAUD            250000                      //250kbps
#define VERSION         2                           //Aantal TLC59116's
#define LED_GROUP       5                           //Aantal leds per TLC59116
#define LED_CHANNELS    3                           //Aantal kanalen per led (RGB of RGBm)
#define DMX_START       1                           //Start Address
#define DMX_END         DMX_START + VERSION*LED_GROUP*LED_CHANNELS

// Includes
#include <avr\io.h>
#include <avr\interrupt.h>
#include <other\stdbool.h>

//Variables
bool DMX_BREAK = false;
bool DMX_MAB = false;
bool DMX_READY = false;

char DMX_STATUS =   0,
    DMX_DATA    =   0,
    TMP         =   0,
    DMX_COUNTER =   0;
    
volatile char   
    TLC         =   0,                              //TLC nr
    LED         =   0,                              //LED nr
    DMX_RED     =   255,                            //Red value
    DMX_GREEN   =   255,                            //Green value
    DMX_BLUE    =   255,                            //Blue value
    DMX_MASTER  =   255;                            //Master value

//Functions
void sys_init(){
    DDRB    =   0xFF;                               //PORTB as output
    DDRD    =   0xFF;                               //PORTD as output
    PORTD   =   0xFF;                               //All LEDs off
    PORTB   =   0xFF;                               //All LEDs off
    sei();
}

//Initialize UART0
void uart_init(){
    UBRR0   =   ((F_CPU/16/BAUD)-1);                //UART Prescaler
    UCSR0B  =   0x98;                               //Enable transmit, recieve and recieve interrupt
    UCSR0C  =   0x0E;                               //8bit frames & 2 stopbits
}

//Initialize TWI
void twi_init(){
    TWSR    =   0;                                  //Prescaler 1
    TWBR    =   ((F_CPU/SCL_CLOCK)-16)/2;           //Must be > 10 for stable operation 
    DDRC    =   0xCF;                               //PC4,5 inputs
    PORTC   =   0x30;                               //Pull-ups on
    PRR     =   0x00;                               //Power Management all on
                                                
}

unsigned char twi_start(unsigned char address){
    TWCR = 0xA4;                                                                        //Send START condition
    while(!(TWCR & 0x80));                                                              //Wait until transmission completed
    if (((TWSR & 0xF8) != 0x08) && ((TWSR & 0xF8) != 0x10)) return 1;       //Check value of TWI Status Register
    TWDR = address;                                                                     //Load device address
    TWCR = 0x84;                                                                        //Send device address
    while(!(TWCR & 0x80));                                                              //Wait until transmission completed
    if (((TWSR & 0xF8) != 0x18) && ((TWSR & 0xF8) != 0x40)) return 1;   //Check value of TWI Status Register
    return 0;

}

unsigned char twi_write(unsigned char data){        
    TWDR = data;                                    //Load data
    TWCR = 0x84;                                    //Send data to the previously addressed device
    while(!(TWCR & 0x80));                          //Wait until transmission completed
    if((TWSR & 0xF8) != 0x28) return 1; //Check value of TWI Status Register. Mask prescaler bits
    return 0;
}

void twi_stop(){                                    
    TWCR = 0x94;                                    //Send STOP condition
    while((TWCR & 0x80));                           //Wait until stop condition is executed and bus released
}

int main(void)
{
    sys_init();                                     //Init system
    twi_init();                                     //Init TWI
    int i;
    for(i=0;i<VERSION;i++){                         //Setup TLC59116's
        twi_start(((0x60+i)<<1)|0);                 //Send start condition 
        twi_write(0b10000000);                      //Auto increment on all registers, start at 00
        twi_write(0b10100000);                      //Mode1
        twi_stop();                                 //Send stop condition
        twi_start(((0x60+i)<<1)|0);                 //Send start condition
        twi_write(0x94);                            //Auto increment on all registers, start at 14
        twi_write(0xAA);                            //LEDOUT0
        twi_write(0xAA);                            //LEDOUT1
        twi_write(0xAA);                            //LEDOUT2
        twi_write(0xAA);                            //LEDOUT3
        twi_stop();                                 //Send stop condition
    }
    uart_init();                                    //Initialize UART
    
    while(1){                                       //Main program
        while(!DMX_READY);                          //Wait until DMX value is present
        twi_start(((0x60+TLC)<<1)|0);               //Send start condition
        twi_write(0x82+TLC+(3*LED));                //Select start register
        twi_write(DMX_RED);                         //Write red value
        twi_write(DMX_GREEN);                       //Write green value
        twi_write(DMX_BLUE);                        //Write blue value
        twi_stop();                                 //Send stop condition
        LED++;
        if(LED >= LED_GROUP){                       //If last led reached:
            LED = 0;                                //Reset led nr
            TLC++;                                  //Increase TLC number
        }
                                
    }
}

ISR(USART_RX_vect){
    DMX_STATUS  = UCSR0A;                                       //Copy USART status A to DMX_Status
    DMX_DATA    = UDR0;                                         //Copy data byte to DMX_DATA                                
    if (DMX_STATUS & (0x10)){                                   //Test for framing error
        DMX_BREAK = true;                                       //Set DMX_BREAK true
        DMX_MAB = false;                                        //Set DMX_MAB false
    } else if(DMX_DATA == 0 && !DMX_MAB && DMX_BREAK) { 
        DMX_MAB = true;                                         //Set DMX_MAB true
        DMX_COUNTER = 0;                                        //Set DMX_COUNTER to 0
        LED = 0;                                                //Reset Led nr
        TLC = 0;                                                //Reset TLC nr
    } else if(DMX_BREAK && DMX_MAB){                            //If BREAK and MAB are true
        if(DMX_COUNTER>= DMX_START && DMX_COUNTER < DMX_END){   //If channel in range       
            switch(DMX_COUNTER-(LED_CHANNELS*LED_GROUP*TLC)-(LED_CHANNELS*LED)){
                case 1:
                    DMX_RED = DMX_DATA;                         //Save Red channel data
                    break;
                case 2:
                    DMX_GREEN = DMX_DATA;                       //Save Green channel data
                    break;
                case 3:
                    DMX_BLUE = DMX_DATA;                        //Save Blue channel data
                    if(LED_CHANNELS == 3){                      //If RGB values are sent,
                        DMX_READY   = true;                     //LED values are ready
                    }                   
                    break;
                case 4:
                    DMX_MASTER = DMX_DATA;                      //Save Master channel data
                    DMX_READY   = true;                         //If master channel received, LED values are ready
                    break;
                default: 
                    break;  
            }
        }           
    }
    DMX_COUNTER++;                                      //DMX_COUNTER increased by 1
}

Omdat de switch alleen maar met static values werkt ben ik uitgegaan van 1,2,3,(4) voor R,G,B,(M). Om die waarden te bereiken ga ik uit van een aantal constanten. Het aantal LED drivers, aantal leds per driver en aantal kanalen per led. Om de een of andere manier komt ie in de switch toch steeds weer bij de default uit. Er gaat dus nog steeds iets fout met variabelen heen en weer gooien... Iemand?

Mijn nieuwe portfolio (Under Construction) | Benieuwd wat Solar Team Twente gaat doen?

Pagina: 1


Tweakers maakt gebruik van cookies

Tweakers plaatst functionele en analytische cookies voor het functioneren van de website en het verbeteren van de website-ervaring. Deze cookies zijn noodzakelijk. Om op Tweakers relevantere advertenties te tonen en om ingesloten content van derden te tonen (bijvoorbeeld video's), vragen we je toestemming. Via ingesloten content kunnen derde partijen diensten leveren en verbeteren, bezoekersstatistieken bijhouden, gepersonaliseerde content tonen, gerichte advertenties tonen en gebruikersprofielen opbouwen. Hiervoor worden apparaatgegevens, IP-adres, geolocatie en surfgedrag vastgelegd.

Meer informatie vind je in ons cookiebeleid.

Sluiten

Toestemming beheren

Hieronder kun je per doeleinde of partij toestemming geven of intrekken. Meer informatie vind je in ons cookiebeleid.

Functioneel en analytisch

Deze cookies zijn noodzakelijk voor het functioneren van de website en het verbeteren van de website-ervaring. Klik op het informatie-icoon voor meer informatie. Meer details

janee

    Relevantere advertenties

    Dit beperkt het aantal keer dat dezelfde advertentie getoond wordt (frequency capping) en maakt het mogelijk om binnen Tweakers contextuele advertenties te tonen op basis van pagina's die je hebt bezocht. Meer details

    Tweakers genereert een willekeurige unieke code als identifier. Deze data wordt niet gedeeld met adverteerders of andere derde partijen en je kunt niet buiten Tweakers gevolgd worden. Indien je bent ingelogd, wordt deze identifier gekoppeld aan je account. Indien je niet bent ingelogd, wordt deze identifier gekoppeld aan je sessie die maximaal 4 maanden actief blijft. Je kunt deze toestemming te allen tijde intrekken.

    Ingesloten content van derden

    Deze cookies kunnen door derde partijen geplaatst worden via ingesloten content. Klik op het informatie-icoon voor meer informatie over de verwerkingsdoeleinden. Meer details

    janee