I2C Bus - wie funktioniert die Kommunikation

Frage zu I2C Kommandos

  • 1
  • 2
  • Page 1 of 2
Roy
Benutzer
Avatar
Gender:
Age: 68
Posts: 24
Registered: 07 / 2024
Subject:

I2C Bus - wie funktioniert die Kommunikation

 · 
Posted: 16.09.2024 - 19:17  ·  #1
Hallo zusammen,

Ich habe mir einen SHT31-D (Temperatur- und Feuchtigkeits-) Sensor zugelegt, der mit dem I2C-Bus angesprochen wird, und möchte gern unter AVRco Pascal "mit ihm reden". Verwenden will ich den HardwareTWI im Atmega 32, also SCL auf C.0, SDA auf C.1.
Ich finde aber keinen Ansatz. Die einzigen Befehle, die ich zur Kommunikation gefunden habe sind TWIin und TWIout.
Nun ist es so, dass ich das Teil schon über BASCOM ausprobiert habe und dort hat es wie folgt geklappt:
---------------------------------------------
I2Cstart
Adressbyte + Schreibbit senden
MSB Befehl senden
LSB Befehl senden
I2Cstop
200ms warten
I2Cstart
Adreesbyte + Lesebit senden
LSB einlesen , Ack //Temperatur
MSB einlesen, Ack //Temperatur
CRC einlesen, Ack
LSB einlesen, Ack //Feuchte
MSB einlesen, Ack //Feuchte
CRC einlesen, NAck
I2Cstop
---------------------------------------------
und dann alles ausrechnen usw.
Wie bekomme ich diesen Ablauf in AVRco hin oder ist der Ansatz dort ein ganz anderer?

Grüsse
Roy
wilbo
Benutzer
Avatar
Gender:
Age: 68
Posts: 34
Registered: 11 / 2023
Subject:

Re: I2C Bus - wie funktioniert die Kommunikation

 · 
Posted: 16.09.2024 - 19:56  ·  #2
Hallo Roy,

falls du das als Word sendest dann vertausch mal mittels Swap Lo und hi Byte. Das ist im Avrco kosmischer Weise vertauscht.
Gruß wilbo
wilbo
Benutzer
Avatar
Gender:
Age: 68
Posts: 34
Registered: 11 / 2023
Subject:

Re: I2C Bus - wie funktioniert die Kommunikation

 · 
Posted: 17.09.2024 - 07:30  ·  #3
Hallo Roy,
bitte meinen Beitrag von gestern ignorieren das habe ich mit spi verwechselt
Gruß wilbo
Roy
Benutzer
Avatar
Gender:
Age: 68
Posts: 24
Registered: 07 / 2024
Subject:

Re: I2C Bus - wie funktioniert die Kommunikation

 · 
Posted: 17.09.2024 - 10:35  ·  #4
Hallo,
ich suche immer noch die Sytax wie ich den Bus starte, Bytes sende und empfange, ein ACK und NACK sende und den Bus wieder stoppe.

Grüsse
Roy
Harry
Moderator
Avatar
Gender:
Location: zwischen Augsburg und Ulm
Age: 59
Posts: 2123
Registered: 03 / 2003
Subject:

Re: I2C Bus - wie funktioniert die Kommunikation

 · 
Posted: 17.09.2024 - 20:06  ·  #5
Der Bus muß nicht gestartet werden, das (wenn man es überhaupt so nennen kann) passiert durch die Angaben im Init und den Import des Treibers. Du brauchst tatsächlich nur die beiden Befehle und das Datenblatt des Sensors, in dem steht, wie der ausgelesen werden will. Möglicherweise benötigt der Sensor am Anfang eine Initialisierung, die du ihm sendest. Dann wird es vermutlich Register mit den Sensorwerten geben, die du erst adressierst und dann liest. Ich lad mir mal das DB runter und schau es mir an .... es gibt auch sche.... Sensoren die umständlich zu bedienen sind :D
Harry
Moderator
Avatar
Gender:
Location: zwischen Augsburg und Ulm
Age: 59
Posts: 2123
Registered: 03 / 2003
Subject:

Re: I2C Bus - wie funktioniert die Kommunikation

 · 
Posted: 17.09.2024 - 20:23  ·  #6
Finde kein spezifisches DB, aber die I2C-Adresse ist wohl 44h? Im AVRCo wird diese um 1 nach rechts geschoben:
%01000100 gibt dann %00100010 = $22
Das Lese-/Schreibbit wird durch den AVRCo gesetzt bzw. ergänzt. Um das jetzt mit deiner Beschreibung zu sagen, sollte es so laufen:
TWIoutWord($22,Befehl)
TWIin($22,LSB)
usw.

Du kannst auch ein Array mit 6 Byte definieren und das in einem Rutsch einlesen und dann die Daten daraus zusammen setzen.
Manche Sensoren mögen es überhaupt nicht, wenn man ein Word sendet, dann mußt du eben MSB und LSB getrennt als Byte senden. Einfach ausprobieren, wie es der Sensor gerne hätte.
Roy
Benutzer
Avatar
Gender:
Age: 68
Posts: 24
Registered: 07 / 2024
Subject:

Re: I2C Bus - wie funktioniert die Kommunikation

 · 
Posted: 18.09.2024 - 07:09  ·  #7
Danke erstmal Harry,
kannst Du mal noch was zu „Angaben im Init“ sagen und welchen Treiber ich importiren muss?
Gruß
Roy
Harry
Moderator
Avatar
Gender:
Location: zwischen Augsburg und Ulm
Age: 59
Posts: 2123
Registered: 03 / 2003
Subject:

Re: I2C Bus - wie funktioniert die Kommunikation

 · 
Posted: 18.09.2024 - 07:41  ·  #8
Hallo Roy,

ich vermute, daß du den TWIMaster verwendest?
Dann einfach nur
Import TWIMaster, .......
und im Define
TWIpresc = TWI_BR400; //TWI_BR100

Das ist alles.

Gruss
Harry

Beispielsweise Initialisierung des Temperatursensors MCP9844
Code

If TWIStat(MCP9844Adr)=true
      then
        Error:=TWIOut(MCP9844Adr,$01,$0101);     // set MCP9844 in shutdown-mode
        mDelay(10);
        Error:=TWIOut(MCP9844Adr,$09,$0300);     // Resolution-Register 12 Bit
        mDelay(10);
        Error:=TWIOut(MCP9844Adr,$01,$0100);     // set MCP9844 in normal-mode
        MCP9844Messung;
      EndIf;


Lesen und Umrechnen
Code

Procedure MCP9844Messung;                        // LM73 auslesen
  Var MCPTemp : Integer;
      TN      : Boolean;                         // Temperatur negativ?
  Begin
    TWIOut(MCP9844Adr,$05);                      // Register 0 zum lesen vorbereiten
    TWIInp(MCP9844Adr,MCPTemp);                  // Temperatur vom Sensor lesen

    If Bit(MCPTemp,4)=true                       // Temperatur negativ?
      then
        TN:=true;
      else
        TN:=false;
      EndIf;
    MCPTemp:=MCPTemp and $FF0F;                  // Statusbits entfernen

    MCPHi:=Lo(MCPTemp);                          // MCP-Werte zuweisen
    MCPLo:=Hi(MCPTemp);

    If TN=true
      then                                       // Temperatur negativ
        MCP9844FTemp:=(-1)*(256-((Float(MCPHi*16))+( Float(MCPLo)/16)));
      else                                       // Temperatur positiv
        MCP9844FTemp:=((Float(MCPHi*16))+( Float(MCPLo)/16));
      EndIf;
    MCP9844ITemp:=Round(MCP9844FTemp*10);        // Temperatur als Integer*10
  End MCP9844Messung;
  • 1
  • 2
  • Page 1 of 2
Selected quotes for multi-quoting:   0

Registered users in this topic

Currently no registered users in this section

The statistic shows who was online during the last 5 minutes. Updated every 90 seconds.
MySQL Queries: 14 · Cache Hits: 14   138   152 · Page-Gen-Time: 0.022682s · Memory Usage: 2 MB · GZIP: on · Viewport: SMXL-HiDPI