Pages: [1]   Go Down
Author Topic: ATMEGA328P-PU mit UNO Bootloader: funktioniert nicht als i2c-slave  (Read 334 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 1
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ich habe einen ATMEGA328P-PU mit UNO Bootloader als master mit wire.h, und der erkennt hardware i2c slaves.
Jedoch bekommen ich weder einen weiteren ATMEGA328P-PU noch einen originalen Adruino micro dazu als slave zu funktionieren.
Ich habe viel gegoogelt und auch sämtliche Beispiele die ich finden konnte ausprobiert, der slave antwortet einfach nicht, soweit ich sagen kann wird der Interrupt auch nicht ausgelöst...

Auch über Tipps wie ich des i2c "belauschen" kann ohne Speicheroszi/Logicanalysator würde ich mich freuen.

der Slave:
Code:
// Wire Slave Receiver
// by Nicholas Zambetti <http://www.zambetti.com>

// Demonstrates use of the Wire library
// Receives data as an I2C/TWI slave device
// Refer to the "Wire Master Writer" example for use with this

// Created 29 March 2006

// This example code is in the public domain.


#include <Wire.h>

void setup()
{
  Wire.begin(4);                // join i2c bus with address #4
  Wire.onReceive(receiveEvent); // register event
  Serial.begin(9600);           // start serial for output
}

void loop()
{
  delay(100);
}

// function that executes whenever data is received from master
// this function is registered as an event, see setup()
void receiveEvent(int howMany)
{
  while(1 < Wire.available()) // loop through all but the last
  {
    char c = Wire.read(); // receive byte as a character
    Serial.print(c);         // print the character
  }
  int x = Wire.read();    // receive byte as an integer
  Serial.println(x);         // print the integer
}

der Master/Scanner:
Code:
/**
 * I2CScanner.pde -- I2C bus scanner for Arduino
 *
 * 2009, Tod E. Kurt, http://todbot.com/blog/
 *
 */

#include "Wire.h"
extern "C" {
#include "utility/twi.h"  // from Wire library, so we can do bus scanning
}

// Scan the I2C bus between addresses from_addr and to_addr.
// On each address, call the callback function with the address and result.
// If result==0, address was found, otherwise, address wasn't found
// (can use result to potentially get other status on the I2C bus, see twi.c)
// Assumes Wire.begin() has already been called
void scanI2CBus(byte from_addr, byte to_addr,
                void(*callback)(byte address, byte result) )
{
  byte rc;
  byte data = 0; // not used, just an address to feed to twi_writeTo()
  for( byte addr = from_addr; addr <= to_addr; addr++ ) {
    rc = twi_writeTo(addr, &data, 0, 1, 0);
    callback( addr, rc );
  }
}

// Called when address is found in scanI2CBus()
// Feel free to change this as needed
// (like adding I2C comm code to figure out what kind of I2C device is there)
void scanFunc( byte addr, byte result ) {
  Serial.print("addr: ");
  Serial.print(addr,DEC);
  Serial.print( (result==0) ? " found!":"       ");
  Serial.print( (addr%4) ? "\t":"\n");
}


byte start_address = 1;
byte end_address = 100;

// standard Arduino setup()
void setup()
{
    Wire.begin();

    Serial.begin(19200);
    Serial.println("\nI2CScanner ready!");

    Serial.print("starting scanning of I2C bus from ");
    Serial.print(start_address,DEC);
    Serial.print(" to ");
    Serial.print(end_address,DEC);
    Serial.println("...");

    // start the scan, will call "scanFunc()" on result from each address
    scanI2CBus( start_address, end_address, scanFunc );

    Serial.println("\ndone");
}

// standard Arduino loop()
void loop()
{
    // Nothing to do here, so we'll just blink the built-in LED
    digitalWrite(13,HIGH);
    delay(300);
    digitalWrite(13,LOW);
    delay(300);
}
Danke,
Michael
Logged

Offline Offline
Faraday Member
**
Karma: 80
Posts: 2738
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hast du Pullup Widerstände mit 4,7k eingebaut? Wenn du einen Hardware Device verwendest sind die i.d.R. auf der Platine. Aber wenn du dich mit einem anderen Arduino verbinden willst fehlen die.
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 234
Posts: 20218
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Wieviel Kabel ist zwischen den beiden ATmega bzw ATmega und Arduino?
Grüße Uwe
« Last Edit: August 17, 2013, 03:00:57 pm by uwefed » Logged

Offline Offline
Sr. Member
****
Karma: 10
Posts: 441
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo,

ich habe das mal ausprobiert. Der Masterteil läuft auf einem Arduino Leonardo. Den Sketch habe ich genau so wie er in Deinem Post steht compiliert und in den Leonardo geflasht. Als ersten Test habe ich dann ein I²C-Display an den Leonardo angeschlossen und den Sketch laufen lassen. Dabei hat sich gezeigt, dass mir das zu schnell gegangen ist und deshalb habe ich den Programmteil in der loop()-Funktion in eine Schleife gepackt, die 20 mal durchlaufen wird. Der I²C-Bus wird also 20 mal gescannt. Das Display (mit Adresse 64) hat er auf Adresse 32 gefunden. Passt soweit, die Diskrepanz in den Adressen erklärt sich damit, dass über den I²C-Bus nur 7 Bit für die Adresse übertragen werden, die Adresse muss also um ein Bit nach links geshiftet, bzw. mit 2 multipliziert werden.

Dann habe ich den Slave-Teil in einen Duemilanove geflasht und die beiden verbunden. Der Master findet den Slave auf Anhieb. Also die beiden Sketches aus Deinem Post funktionieren. Verbunden werden zwischen den beiden Arduinos SDA mit SDA, SCL mit SCL und (nicht vergessen) GND mit GND. SDA und SCL werden außerdem über einen 4,7 KOhm Widerstand mit Plus 5V verbunden (das ist der Pullup-Widerstand). Die Kabellänge beträgt bei mir ca. 30 cm und wie gesagt, das klappte auf Anhieb. Ich wollte eigentlich auch noch mal längere Kabel probieren, das spare ich mir aber jetzt erstmal, ich bin eigentlich auch so sicher, dass es bis vielleicht 70 - 80cm Kabellänge keine Probleme gibt.

Wenn Deine Kabel nicht länger sind, kann ich mir bei Dir als Fehlerquelle eigentlich nur vorstellen, dass mit den beiden Pullup-Widerständen etwas nicht stimmt (ich habe in anderen Projekten auch schon 10KOhm-Widerstände genommen und es hat geklappt, aber 4K7 geht sicher) oder aber das Du keine Verbindung von GND zu GND hast.

Ich hoffe, das hilft Dir irgendwie weiter.

Gruß,
Ralf
« Last Edit: August 18, 2013, 05:01:03 am by Schachmann » Logged

Es gibt 10 Arten von Menschen, die einen verstehen Binär, die anderen nicht...

Pages: [1]   Go Up
Jump to: