Hallo zusammen,
um per Mikrocontroller mehrere RGB-LEDs gezielt ansteuern zu können habe
ich mir einige NXP PCA9685 beschafft. In einem ersten Versuch will ich
nun die Kommunikation zwischen einem ATmega16 und einem der
PCA9685-Chips testen, leider bislang erfolglos. Mit TWI/I2C habe ich
noch nie gearbeitet, denke aber das zugrunde liegende Konzept verstanden
zu haben.
Meine Konfiguration:
* PCA9685 auf selbstgeätztem "Breakout-Board"
-> A0 auf Vcc
-> A1, A2, A3, A4, A5 EXTCLK und OE auf GND
* ATmega16 steckt in STK500
-> PC0 (SCL) per 4k7 Ohm an Vcc und an Pin 26 des PCA9685
-> PC1 (SDA) per 4k7 Ohm an Vcc und an Pin 27 des PCA9685
Das Testprogramm habe ich angehängt. Der Code entstammt im wesentlichen
dem hiesigen Tutorial:
http://www.mikrocontroller.net/articles/AVR_TWI
Das Problem ist nun, dass das Programm bereits beim Senden der
START-Bedingung in der Funktion i2c_send() "hängenbleibt".
1 | void i2c_send (uint8_t adresse, uint8_t anzahl_datenbytes) {
|
2 | // I2C-Bus initialisieren und START-Bedingung senden
|
3 | TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
|
4 | PORTD |= (1 << PD5); // <-- Befehl an dieser Stelle wird ausgeführt
|
5 | while (!(TWCR & (1<<TWINT)));
|
6 | PORTD |= (1 << PD6); // <-- Befehl an dieser Stelle wird NICHT ausgeführt
|
7 |
|
8 |
|
9 | // Ziel-Slave adressieren
|
10 | if ((TWSR & 0xF8) != TW_START)
|
11 | ERROR(); // Fehlerbehandlung
|
12 | TWDR = adresse + I2C_WRITE;
|
13 | TWCR = (1<<TWINT) | (1<<TWEN);
|
14 | while (!(TWCR & (1<<TWINT)));
|
15 |
|
16 | // Daten übertragen
|
17 | for (uint8_t i = 0; i < anzahl_datenbytes; i++) {
|
18 | if ((TWSR & 0xF8) != TW_MT_SLA_ACK)
|
19 | ERROR();
|
20 | TWDR = i2c_befehlspuffer[i];
|
21 | TWCR = (1<<TWINT) | (1<<TWEN);
|
22 | while (!(TWCR & (1<<TWINT)));
|
23 | }
|
24 |
|
25 | // STOP-Bedingung senden und Übertragung abschließen
|
26 | if ((TWSR & 0xF8) != TW_MT_DATA_ACK)
|
27 | ERROR();
|
28 | TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
|
29 | }
|
Ich weiß nicht, wie ich das Problem näher eingrenzen soll. Enthält der
Code offensichtliche Fehler? Könnte der IC defekt sein (meine
SMD-Lötkünste sind stark ausbaufähig...)? Ich wäre dankbar für jeden
Hinweis!