mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik I²C-Code - fehlt noch was?


Autor: Andreas (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

hab einen Quelltext zur Implenetierung einer softwaremäßigen
I²C-Schnittstelle bekommen, welche ich gerade für meine Zwecke
"umbaue". Im Moment hängt an der I²C-Schnittstelle ein
Temperaturfühler. Über I²C ist dieser mit meinem Microprozessor 80C552
von Philips verbunden (8051er).
Eigentlich soll mein Programm nur einfache Funktionen haben:
Die Umgebungstemperatur soll gemessen werden, über I²C verarbeitet
werden, und dann am angeschlossenen LCD-Display (geht normal über die
Pins des MCU, nicht über I²C) ausgegeben werden.
Nun bin ich ein wenig ratlos, ob ich rein für I²C alles impleniert
habe..
Der Wert, der dann ans Display weitergegeben wird, wird in der Variable
"data_received" gespeichert und dann eben über bestimmte Ports ans
LCD-Display weitergegeben. (Der Quelltext für die Ansteuerung hab ich
jetzt nicht beigelet).
Was meint ihr? Die Ansteuerung kann doch nicht nur aus Start, Receive
und Stop bestehen???!!? Ich glaub, ich guck nochmal in den
Philips-Spezifikationen für I²C...

Autor: Andreas (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hier ist noch die Main-Funktion dazu, mit den Aufrufen der Funktionen
STart, REceive und Stop...

Autor: Buchmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Verwendest du den lm75?
du must dem temp.sensor vorher mitteilen, dass er dir dir temperatur
senden soll, erst dann kannst du sie lesen.

Autor: Eddi (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Andreas

In der i2c.h war doch ein Beispiel drin. Du musst natuerlich die
entsprechenden Device-Adressen benutzen.
Im Anhang noch mal ein etwas ausfuerlicheres Beispiel fuer einen DS1621
auf Adresse 0x90 (A0 bis A2 auf GND).
Falls Du einen LM75 benutzt musst Du die Adresse und den Start-Befehl
aendern.

Nach Aufruf von GetTemp(0x90) stehen dann die gelesenen Bytes in MSB
und LSB.

Gruss
Eddi

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
1m75?
sorry, bin absoluter Anfänger in Sachen Microcontroller.
Der Temperatursensor ist der AD (Analog Devices) 7416. Das Datenblatt
hab ich hier vor mir liegen. Mein Betreuer meint jedoch, dass es
reichen würde, wenn ich von den angeschlossen Temperatursensoren die
Adressen (also die Adresse des angeschlossenen Devices, über die I²C
dann den Sensor anspricht), weiß. Und die hab ich von ihm bekommen (000
und 111, wobei es vorerst reicht, nur einen der beiden Sensoren
anzusprechen).
Falls du den Microcontroller gemeint hast, mit 1m75, es ist ein 80C552
Mircrocontroller, der eigentlich eine hardwaremäßge implentierung von
I²C hat. Wir brauchen aber eine softwaremäßige Lösung (nur, falls sich
jemand darüber wundert...).

Mhmmm, wie mache ich denn jetzt weiter?
Im Moment füge ich die Ansteuerung für das LCD-Display in dieses
I²C-Projekt ein...
Wie muss ich dem Temp-Sensor mitteilen, dass er mir jetzt DAten senden
soll???
Ich glaub, ich hab hier grad ein grundsätzliches Verständnisproblem
bezüglich der Kommunikation Microcontroller-Temp.Sensor...

Mit der bisherigen Software setze ich ja nur die beiden Ports (SCL,
SDA) auf HIGH oder LOW, z.B. generiere ich halt so die Start-Funktion,
die ja den Datentransport anleiert. Okay, zugegeben, der Temp-Sensor
fühlt sich da noch nicht angesprochen, wie mache ich das denn jetzt?
Eigentlich macht man das ja mit dem ersten DAtenbyte, oder???

Autor: Eddi (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ich denke mal auf den Seiten 9-12 im Datenblatt steht alles wichtige.
Zusammen mit dem Beispiel sollte das kein Problem mehr sein.
Mehr Hilfe kann man da wohl nicht geben, ohne den Code gleich selber zu
schreiben. Aber da fehlt dann der Lerneffekt.

Ansonsten : Lesen, Lesen, Lesen...

Autor: Uwe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum benutzt du nicht die im 80C552 vorhandenen I²C Schnittstelle ???

Hier mal ne ganz einfache Beschreibung wie der I²C funktioniert:

Nach deinem Startbefehl mußt du die Adresse des Slaves(Sensor) senden,
der antwortet mit ACK. Bit 0 der Adresse teilt dem Slave mit ob er
Daten senden oder empfangen soll.
Beim Empfang wird beim LM75 (Temperatursensor) einfach nach der Adresse
ein "Repeated Start" gesendet und der LM75 schickt dann die Daten.

Bevor man mich nun erschlägt: Nagelt mich nicht darauf fest das alles
so stimmt :)

Das alles ist auch im Datenblatt zur genüge beschrieben (wenn man
einigermassen Englischen lesen kann ;)

Bei einer Hardware I2C Schnittstelle hast du den großen Vorteil das man
ein Statusregister auslesen kann und so alle Buszustände sieht.
(schau mal ins Datenblatt des 80C552)

Gugst du auch mal hier:

http://www.elektronik-kompendium.de/public/borcher...

oder hier

http://www.mcc-us.com/i2chowto.htm


MfG   Uwe

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke danke, bin gerade dabei, meine 2 Projekte (LCD und I²C)
zusammenzuführen damit ich gleich testen kann, ob die Kommunikation
über I²C funktionniert (also Temp. auslesen und so).
Tja, die hardwaremäßige Implementiertung nehmen wir nicht, da wir 2
I²C-Interfaces brauchen und so bräuchte man noch einen
nachgeschaltenten MUX-und das will mein Betreuer nicht....
Da ich mich ja auch überhaupt nicht auskenne, suche ich jetzt halt nach
der softwaremäßigen Lösung für I²C.
Datenblätter hab ich am Wochenende schon gewälzt, bzw. mir die
Spezifikation von I²C durchgelesen, aber hängen geblieben ist jetzt
nich sooo viel---> ich lese das ganze jetzt halt nochmal durch...
Trotzdem danke für die Hinweise!

Autor: Andreas (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab da noch eine Frage (oh no...) bezüglich des
Vorlagenquelltexts...

Mit
 a) I2C_Transmit (0x90);
 b) I2C_Transmit (0xee);

Spricht man ja
a) das angeschlossene Device an und ob der Master Daten lesen oder
schreiben will
und mit
b) setzt man doch den Adress Pointer auf das "Temperature Valure
Register"
danach wird die Datenübertragung gestoppt, und erst die eigentliche
GetTemp()-Funktion aufgerufen. Das verstehe ich irgendwie nicht...

Mit meinem Kollegen zusammen haben wir anhand des Datenblattes für den
Temp.fühler und den Timing-Diagrammen für I²C folgende Funktionsaufrufe
zusammengestellt (siehe Anhang)...
Aber irgendwie kommen keine Daten von I²C zurück...wir haben auch keine
Ahnung mehr, wieso. Habt ihr ne Ahnung?

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat sich erledigt, haben mitm Oszi nachgemessen, der Temperatursensor
war wohl im Eimer...Neuer Sensor und jetzt funktionnierts (also die
abgeänderte Variante vom Eddi!) Sogar das Timing :-) year *year*
year *year* year *year* year

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.