Frage zu AVR / I2C

Gast #1730070
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
Angehängte Dateien:
Gast #1730357
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
Gast #1731323
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
Persönliche Seite #1731445
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.
Gast #1731485
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?
#1732525
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren