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:
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
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?