Ich habe versucht, eine I2C-Kommunikation von Arduino Uno zu ATtiny44A herzustellen.
Uno als Master- und Sendercode:
#include <Wire.h>
#define LED_PIN 13
byte x = 0;
void setup()
{
Wire.begin(); // Start I2C Bus as Master
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, LOW);
}
void loop()
{
Wire.beginTransmission(0x26); // transmit to device #9
Wire.write(x); // sends x
Wire.endTransmission(); // stop transmitting
x++;
if (x > 5) x=0;
delay(450);
}
ATtiny44A Slave/Empfänger-Code:
#include "TinyWireS.h" // wrapper class for I2C slave routines
#define I2C_SLAVE_ADDR 0x26 // i2c slave address (38)
#define LED1_PIN 10
void setup(){
pinMode(LED1_PIN,OUTPUT); // for general DEBUG use
TinyWireS.begin(I2C_SLAVE_ADDR); // init I2C Slave mode
}
void loop(){
byte byteRcvd = 0;
if (TinyWireS.available()){ // got I2C input!
byteRcvd = TinyWireS.receive(); // get the byte from master
if(byteRcvd == 5){
digitalWrite(LED1_PIN,HIGH);
delay(1000);
}
else{
digitalWrite(LED1_PIN,LOW);
}
}
}
Mache ich etwas falsch? Die LED blinkt nicht. Was sind die anderen Möglichkeiten, ATtiny zu debuggen?
Dies ist ein Fallstrick bei der Verwendung der Arduino-Bibliothek - alles ist so von Ihnen abstrahiert, dass Sie mit einem kleinen Schluckauf völlig verloren sind. Ich weiß nicht viel über die Arduino-Bibliotheken, aber wenn ich es wäre, würde ich die TWI/I2C-Interrupts aktivieren und verwenden und sehen, ob sie ausgelöst werden. Ein einfaches LED-Blinken in den ISRs würde als Indikator für die ordnungsgemäße Funktion gut ausreichen. Wenn die LED nicht blinkt, liegt das Problem in der Protokollimplementierung.
Schließen Sie SCL und SDA korrekt zwischen den Controllern an? Und haben Sie die SCL- und SDA-Leitungen an Pull-up-Widerstände an VCC gebunden?
Ähnlich wie dies:
srinivas
sherrelbc
srinivas