I2C zwischen Arduino Uno und Atmega8

Hallo zusammen,

ich wollte mir ein I2C Display selber basteln und habe dazu einen Atmega8 mit einem 16x2 LCD verbunden. Den Atmega8 betreibe ich ohne Bootloader mit dem internen Quarz und 8Mhz. Meine i2c Schaltung sieht so aus


----||—o 5V
| 4,7k
Arduino Uno Analog4 o-------------------o Pin 27 Atmega8
Analog5 o-------------------o Pin 28
| ___
----|
|—o 5V
4,7k

Wenn ich jetzt ich den Uno an USB anschließe erscheint “start loop” und “send” abwechselnd im Monitor. Sobald ich dann das i2c Display anschließe, erscheint im Display nach der Testphase “EMPTY”, das Backlight ist an und der Uno hängt nach “start loop”. Zieh ich das Display wieder ab, läuft der Uno weiter. Das Display geht aber nicht an und aus, darum denke ich das die receive Methode garnicht aufgerufen wird. Ich finde meinen Fehler nicht.

Das Kabel zwischen Uno und Atmega8 ist in etwa 40cm lang. Ich habe leider kein Oszilloskop. Mit meinem Voltmeter ist mir aufgefallen, dass auf SDA Vcc anliegt, auf SCL aber nur 3,15 V. Weiß nicht ob das so sein muss. Kann man überhaupt einen I2C Bus betreiben zwischen Geräten mit externem und internem Quarz und verschiedenen Frequenzen?

Folgender Code läuft auf dem Atmega8:

#include <LiquidCrystal.h>
#include <Wire.h>

LiquidCrystal lcd(3, 4, 5, 6, 7, 8);
char cI2c[16];
boolean lightToggle;

void setup() {
  lcd.begin(16, 2);
  pinMode(9, OUTPUT);
  
  lightToggle = true;
  digitalWrite(9, lightToggle);    
  sprintf(cI2c, "EMPTY\0");
  
  lcd.print("*LCDi2c test @4*");
  lcd.setCursor(0, 1);
  for (int i=0; i < 16; i++) {
    lcd.write('-');
    delay(100);  
  }
  lcd.clear();
  
  Wire.begin(4);
  Wire.onReceive(receiveEvent);
}



void loop() {
  delay(100);
  
  lcd.setCursor(0,0);
  lcd.print(cI2c); 
}



void receiveEvent(int dataCount)
{   
  int i=0;  
  lightToggle = !lightToggle;
  digitalWrite(9, lightToggle);  
    
  while (Wire.available() > 0) {
    char c = Wire.receive();
    cI2c[i] = c;
    i++;
  }
  cI2c[i] = '\0';  
}

An Pin9 haengt die Displaybeleuchtung ueber einen BD137.

Und folgender auf dem Uno:

#include <Wire.h>


void setup() {
  Wire.begin();  
  Serial.begin(9600);
  delay(1000);
}

void loop() {
  Serial.println("start loop");
  Wire.beginTransmission(4);  
  Wire.send("HalloWelt.");
  Wire.endTransmission();
  Serial.println("send");
  delay(1000);  
}

Den Code für den Atmega8 kompiliere ich mit der Arduino IDE mit den folgenden Eisntellungen

###########################################

atmega8noxtal.name=ATmega8-noxtal @8MHz

atmega8noxtal.upload.protocol=stk500
atmega8noxtal.upload.maximum_size=7168
atmega8noxtal.upload.speed=38400

atmega8noxtal.bootloader.low_fuses=0xdf
atmega8noxtal.bootloader.high_fuses=0xc4
atmega8noxtal.bootloader.path=atmega8_noxtal
atmega8noxtal.bootloader.file=ATmegaBOOT.hex
atmega8noxtal.bootloader.unlock_bits=0×3F
atmega8noxtal.bootloader.lock_bits=0×0F

atmega8noxtal.build.mcu=atmega8
atmega8noxtal.build.f_cpu=8000000L
atmega8noxtal.build.core=arduino

Ich weiß nicht mehr weiter und bin für jeden Tipp dankbar.
Schönen Gruß,
timeshift

Hab den Fehler gefunden. Alles was oben steht ist korrekt. Ich hatte leider einen Widerstand so feste über die Platine gezogen, dass sich der Draht durch die Isolierung einer darunter befindlichen Leitung geschnitten hat. Darum lag SDA immer auf 5V. Hat ne Weile gedauert bis ich das gefunden hatte…

Gruß,
ts

Hallo ts,

das ist ja ein hochinteressantes Projekt, so kann man sich also einfach ein I2C-Interface herstellen.

Mich interessieren zwei Dinge:

Hast Du den Atmega8 auf einem Arduino-Board geflasht oder nur mit der IDE den Flashcode erstellt? Welchen genauen Atmega8-Typ hast du verwendet?

Viele Grüße, wennjo

Hochinteressant ist das ! Jawohl, bitte einige weitere Details, Danke !

Hallo Timeshift,

Ksnn ich mit der oben beschriebenen Schaltung, so wie sie ist, auch Daten vom Atmega8 zum Arduino Uno schicken ?

----|__|---o 5V | 4,7k Arduino Uno Analog4 o-------------------o Pin 27 Atmega8 Analog5 o-------------------o Pin 28 | __ ----|___|---o 5V 4,7k

Warum muss ich die Leitung welche den Analog4 Pin des Arduino Uno mit dem Pin 27 des Atmega8 verbindet gleichzeitig auch mit der 5V Leitung verbinden ?

Hast Du vielleicht ein Foto des Schaltungsaufbaus ?

Wo kann ich bei der Arduino IDE die oben erwähnten Kompilierparameter für den Atmega8 eingeben ?

Warum muss ich die Leitung welche den Analog4 Pin des Arduino Uno mit dem Pin 27 des Atmega8 verbindet gleichzeitig auch mit der 5V Leitung verbinden ?

Weil I²C einen PullUp im Bus benötigt.

Ok, ich verbinde also die 5V des Arduino Uno mit Analog4 des Arduino Uno, und diesen gleichzeitig mit dem Pin27 des Atmega8.

Richtig. Und das Gleiche mit den Pins 5/28. Und die Widerstände nicht vergessen. Wobei es da mit der Größe bei kurzen Leitungsverbindungen nicht so genau geht, ich nehm immer 10K.

Vileicht verstehe ich Euch nicht richtig aber zur Sicherheit:
Die 2 Massen der 2 ATmegas verbinden, analog5 mit 28 und analog4 mit 27 und beide mit je einem Widerstand auf 5V (dabei ist es egal ob die 5V vom einen oder anderen Controller kommen (im Fall wenn 2 verschiedene Spannungsversorgungen verwendet werden)).
Grüße Uwe

Warum muss ich die Massen beider Atmegas miteinander verbinden ? Ist dies auch notwendig wenn ich zwei verschiedene Spannungsversorgungen habe ?

Benötige ich um den Atmega8 zu programmieren ein STK500 oder geht es auch preisgünstiger ?

Die Massen müssen verbunden sein damit ein gemeinsamer Bezugspunkt da ist; Spannungen können immer nur zwischen 2 Punkten gemessen werden und wenn die Masse nicht die geliche ist, kann der Slave weder beim Senden die Spannung an SDA gemessen werden noch beim Antworten die Spannung am SDA auf Masse gezogen werden. Du brauchst keine STK500. es geht auch ein STK200/300 oder ein Arduino kann dafür mißbraucht werden. http://aquaticus.info/avr , http://www.kreatives-chaos.com/artikel/stk200-programmieradapter , http://www.mikrocontroller.net/articles/STK200 , STK200 http://arduino.cc/en/Tutorial/ArduinoISP "mißbrauchter" Arduino

Erklährung der "fuses" http://www.mikrocontroller.net/articles/AVR_Fuses

Grüße Uwe

Danke für die ausführliche Antwort !

Bitte

Die einzige Frage welche bisher durch Timeshift unbeantwortet geblieben ist, leider, ist die Beschreibung wie er den Sketch auf den Amega8 ohne Boatloader übertragen hat ?

Die Antwort ist ISP. Da ich keine praktische Erfahrung habe, bitte ich jemanden zu antworten, der es gut erklähren kenn. Grüße Uwe