Soy nuevo en I2C y estoy intentando que dos ATtiny85 se hablen entre sí.
- Tengo Arduino IDE 1.8.0
- Utilicé este enlace (damellis) para instalar el tablero de ATtiny en el IDE
- Utilizo un Arduino nano para programar el ATtiny85.
- Utilizo esta biblioteca TinyWire de lucullusTheOnly.
El ATtiny tiene que ser capaz de ser maestro y esclavo. Basé mi código en este ejemplo de lucullusTheOnly.
Tengo un programa muy simple (ver más abajo) que envía un carácter en el bus, pero aparece un error 0x0C USI_TWI_ARBITRATION_LOST
.
Reduje mi configuración solo al maestro en el tablero con 5kOhm pullups en los dos cables I2C (2x10kOhm en paralelo) a 5V para eliminar el resto del tráfico. Pero el error permanece. Realmente nada más en el tablero.
ATtiny pin usage
3 --> 1kOhm --> LED --> GND (for flashing out error-code)
4 --> GND
5 --> Pullup 5kOhm --> 5v
6 --> Pullup 5kOhm --> 5v
8 --> 5V
No tengo un alcance para controlar el tráfico en el bus. Puedo ir a un laboratorio la próxima semana, pero eso es una larga espera; - /
En Arduino IDE, tengo la velocidad de reloj de ATtiny configurada en 1Mhz (estaba predeterminada). ¿Podría ser el problema? ¿Debo aumentar eso? ¿Puedo simplemente cambiar eso en el menú Herramientas > Reloj? Pensé que leí en algún lugar que también tenía que grabar el gestor de arranque.
Programa de prueba:
#include <TinyWire.h>
int error_led_pin = 3; // == physical pin 2 on attiny
byte own_address = 10;
byte slave_address = 11;
void setup() {
// config error_led_pi as Output for driving an LED
pinMode(error_led_pin, OUTPUT);
// config TinyWire library for I2C slave functionality
TinyWire.begin( own_address );
TinyWire.beginTransmission( slave_address );
// fill the send buffer
TinyWire.send('b');
// execute the master sending and check for an error
// returns 0 if there was no error (otherwise you can find the different error code definitions in TinyWire.h)
int errorCode = TinyWire.endTransmission();
if(errorCode!=0) {
// turn on the error LED, if there was an error
handleError(errorCode);
}
}
void loop() {
}
void handleError(int code) {
if (code != 0) {
// *** ERROR ***
// errors defined at https://github.com/lucullusTheOnly/TinyWire/blob/master/TinyWire.h
digitalWrite(error_led_pin, LOW); // TODO: remove!
delay(500);
// blink resultCode number of times // TODO: should be led at pin 2 = push button
for (int i = 0; i <= code; i++) {
digitalWrite(error_led_pin, HIGH);
delay(500);
digitalWrite(error_led_pin, LOW);
delay(500);
}
}
}
¿Alguna idea sobre cómo descubrir por qué obtengo USI_TWI_ARBITRATION_LOST?