Forum: Mikrocontroller und Digitale Elektronik Frage zu AVR / I2C


von Willy D. (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Zusammen,
ich habe eine Frage zum Thema AVR - I2C.

Das angehängte Bild zeigt einen Ausschnitt meiner Schaltung auf dem ein 
Display, Temperatursensor usw. an einen ATMEGA8 - Controller 
angeschlossen sind.

Für das Display benötige ich 6 Pins am AVR. Diese sollten wegen des 
späteren Layouts der Platine nebeneinaderliegen. Derzeit ist das Display 
unteranderem an den Pins SDA u. SCL angeschlossen, diese brauche ich 
doch aber eigentlich für meinen I2C-Temperatursensor

Nun meine Frage:
Kann ich den I2C-Bus auch über "normale" I/O-Pins betreiben oder müssen 
SDA u. SCL verwendet werden?

PS: ich setze Bascom ein.

Gruss
Willy

von Ein Gast (Gast)


Lesenswert?

Wenn du dir I²C-Routinen in Software schreibst ist es sehr wohl 
machbar...
Du kannst dann natürlich nicht die eingebaute TWI-Hardware nutzen.

von Merino (Gast)


Lesenswert?

Wenn du Hardware I2C benutzen musst, dann bist du auf diese Pins 
angewiesen.
Man kann aber auch via Software eine I2C Funktion realisieren - da 
kannst du die Pins frei wählen.

von Willy D. (Gast)


Lesenswert?

Danke für eure schnellen Antworten, das hört sich sehr aufwendig an. Ich 
glaube ich werde SDA und SCL vom Display lösen und schauen ob ich noch 2 
andere Pins in der Nähe freimachen kann.

von Merino (Gast)


Lesenswert?

am mega8:
Config Scl = Portb.4
Config Sda = Portb.5
Das ist nicht aufwendig - lies dir erst mal im PDF-Handbuch von BASCOM 
alles relevante über I2C durch!

von Axel R. (Gast)


Lesenswert?

Ist I2C nicht ein Bus? Kann man nicht zwei Geräte an jenem betreiben?
Ich denke, das sollte nur in Ausnahmefällen Probleme bereiten.

von Christian H. (netzwanze) Benutzerseite


Lesenswert?

Ja, I2C ist ein Bus. Es gibt einen Master und bis zu 127 Clients.
Probleme gibt es nur, wenn mehrere Clients die selbe ID haben.
Nur wenn dies nicht ausgeschlossen werden kann, müssen mehrere I2C-Busse 
verwendet werden. Zum Beispiel, wenn 20 Sensoren dranhängen, die es nur 
mit maximal 6 IDs gibt.

von Jens (Gast)


Lesenswert?

Hallo Ferdinand,

ich denke, der Aufwand für eine I²C-Implementierung per Software hängt 
sehr vom Problem ab: Ich habe gerade etwas geschrieben, um einen 
einzelnen Sensor per I²C auszulesen. Das Wort Aufwand passt da nicht 
wirklich, jedenfalls nicht mehr, als sich in die Hardware-Ressource 
einzuarbeiten.

Wenn Du aber viele Teilnehmer, Multimaster und andere Scherze brauchst, 
dann kippt das Verhältnis vermutlich in die andere Richtung.

Gruß
Jens

von Merino (Gast)


Lesenswert?

Hier sind zwei Beispiele für BASCOM:
1x Soft -I²C und
1x Hardware- I²C (TWI) und
1x Harware USI

http://www.rn-wissen.de/index.php/Bascom_I2C_Master

von Willy D. (Gast)


Lesenswert?

Hallo,

Danke für das Beispiel, das ist ja echt nicht wirklich viel "Aufwand" da 
ich ja nur einen Temperatursensor (LM75 SMD) über I2C ansteuern will.

Ich habe meinen Schaltplan nun so abgeändert das ich die Pins SDA und 
SCL am AVR verwenden kann, aber es ist nicht schlecht für zukünftige 
Schaltungen zu wissen das es die Möglichkeit einer 
Software-Implementation gibt und man andere Pins verwenden kann um das 
Layout zu optimieren oder für den Fall das es nicht anders geht.

Ich habe noch eine Frage zur Hardware-Adresse des LM75.
In anderen Foren habe ich herausgefunden das der LM75 seine Adresse wie 
folgt definiert: Die drei Pins A0-A2 stellen die Adresse ein.

Daraus folgt:
0b1001xxx

Ich habe A0-A2 auf GND gelegt was 3 logischen Nullen entspricht.

=> 0b1001000

Nun meine Fragen:
1. Der Block "1001" woher kommt der, ich finde dazu nichts im 
Datenblatt?
2. 0b1001000 müste doch dann Hex &H48 entsprechen oder?
3. Warum werden bei der initialisierung 2 Adressen angegeben wie in 
folgender Zeile:

Const Pcf_write = &H40                            ' Slaveadresse
Const Pcf_read = &H41

Gruss

von Christian H. (netzwanze) Benutzerseite


Lesenswert?

Die Datenblöcke im I2C sind immer 8Bit breit.
Die Adresse jedoch nur 7-bit. Das achte bit wird als R/W-Kennung 
verwendet.
Ist dieses 0, erwartet das Gerät im nächten Byte Daten, die geschrieben 
werden. Ist das Bit 1, so hat der Master nach der Übermittlung der 
Adresse ein (oder mehrere?) Bytes abzuholen.

Es sollte also meiner Meinung nach
1
Const Pcf_write = &H90                            ' Slaveadresse
2
Const Pcf_read = &H91

heissen.

Wenn Du ein Byte schreiben willst, verwendest Du also Pcf_write; zum 
Lesen Pcf_read.

von Willy D. (Gast)


Lesenswert?

Ah Ok, jetzt bin ich durchgestiegen:

10010000 => &H90 => Senden
10010001 => &H91 => Empfangen

Danke für deine Antwort netzwanze.

Nun verbleibt aber noch die Frage woher die ersten 4 Bits (1001) 
herkommen?

von Christian H. (netzwanze) Benutzerseite


Lesenswert?

Ferdinand Saufler schrieb:
> Nun verbleibt aber noch die Frage woher die ersten 4 Bits (1001)
> herkommen?

Na vom Hersteller, aus dem Datenblatt (Seite 9 => LM75).

von Willy D. (Gast)


Angehängte Dateien:

Lesenswert?

Ah, da geht die Leuchte an :)
Danke Dir.

von Detlev T. (detlevt)


Lesenswert?

Hallo Ferdinand,

soweit ich weiß, kann man bei BASCOM zwei beliebige Pins verwenden. Dann 
werden die Signale halt von BASCOM per Software und nicht per Hardware 
erzeugt. Es ist aber sicher nicht falsch, gleich die Pins zu nehmen, die 
man dann auch per Hardware ansteuern könnte. Damit hält man sich 
Optionen offen.

Gruß, DetlevT

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.