I2C Bus - wie funktioniert die Kommunikation

Frage zu I2C Kommandos

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

Re: I2C Bus - wie funktioniert die Kommunikation

 · 
Posted: 18.09.2024 - 07:57  ·  #9
Danke Harry, ich probiere es mal so.
Gruß Roy
golf
Benutzer
Avatar
Gender:
Location: Donauwörth
Age: 71
Posts: 256
Registered: 11 / 2009
Subject:

Re: I2C Bus - wie funktioniert die Kommunikation

 · 
Posted: 18.09.2024 - 09:34  ·  #10
Hallo Roy

Es ist egal, ob du I2C oder TWI nimmst für sowas.
Bei I2C kann man halt beliebige Pins an einem Port nehmen.
I2C geht auch ohne den Systick, falls man den nicht will.

Wie Harry schon geschrieben hat
TWI: Import TWI ,dann z.b. TWIprescC = TWI_BR400;
I2C: I2CPort, dann z.b. I2Cport = PortC;
I2Cclk = 1,19;
I2Cdat = 0; //SDA port C bit 0

Das ist auch gut nachvollziehbar im Treibermanual des Compilers.

zu dem SHT31, probier mal sowas aus:


const
SHT3xI2CAdr : byte = $44; // I2C-Adresse SHT3x
var

SHT30TimeOut: boolean; // 1,2 sec
SHTReadArray: array[0..5] of byte;
SHTTemperaturWert: word;
SHTHumidityWert : word;
TemperaturF: float;
HumidityF: float;

//als Interrupt z.b, falls Du so was so lösen willst, ist aber vom ATXmega

Interrupt TCC4_INTOVF; // counterzeit auf z.b. 1 msec einstellen
begin
TCC4INTFLAGS:= $01;
SHT30TimeOut:= true;
end;

// in der main

//...........................................................
// Timer setzen für 1,2 sec Overflow @16MHz $493E: 1,2 sec

TCC4PERL := $3E; // PERL - Period Register L Bite 7..0
TCC4PERH := $49; // PERH - Period Register H 15..8
TCC4CTRLA := $07; // 3..0 Clock.select Prescaler 07 : clk/1024
TCC4INTCTRLA := $02;
//...........................................
// TCC4CTRLA := $00; // bei $00 ist Timer Off
//............................................
TCC4CTRLA := $00; // Timer setzen für 1,2 sec Overflow @16MHz



// TWIOutC(SHT3xI2CAdr,$2400); // so bei TWI
I2COut(SHT3xI2CAdr,$2400); // no clock streching , high repeatability
I2COut(SHT3xI2CAdr,$2130); // $2130 1 sec, high repeatability

//in der loop

if SHT30TimeOut = true then
SHT30TimeOut:= false;
TCC4CTRLA := $00; //

I2COut(SHT3xI2CAdr,$E000); // $E000: fetch data cmd
I2CInp(SHT3xI2CAdr,SHTReadArray); // array[0..5] of byte; temperatur, crc, humidity,crc

//LCDxy(0,0);
//Write(LCDout, bytetohex(SHTReadArray[0])+ bytetohex(SHTReadArray[1])+ bytetohex(SHTReadArray[3])+bytetohex(SHTReadArray[4]));

copyblockReverse(@SHTReadArray[0],@SHTTemperaturWert,2);
copyblockReverse(@SHTReadArray[3],@SHTHumidityWert,2);
TemperaturF:= ((float(SHTTemperaturWert)/65535.0 ) *175) -45; // T in ° = -45 +175 * Wert/65535
HumidityF:= (float(SHTHumidityWert) /65535) *100; // RH = 100 * Wert/65535


LCDxy(0,1);
Write(LCDout, 'T:'+ floattostr(TemperaturF:2:1) +' H:'+ floattostr(HumidityF:2:1));

I2COut(SHT3xI2CAdr,$2130); // $2130 1 sec, high repeatability neue Messung
TCC4CTRLA := $07; // Timer neu setzen für 1,2 sec Overflow @16MHz
endif;

Alles ohne Gewähr
golf
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 - 09:48  ·  #11
Nur ist die I²C-Adresse nicht $44 sondern $22 ;)
Roy
Benutzer
Avatar
Gender:
Age: 68
Posts: 24
Registered: 07 / 2024
Subject:

Re: I2C Bus - wie funktioniert die Kommunikation

 · 
Posted: 19.09.2024 - 19:58  ·  #12
Hallo Harry / golf,
Vielen Dank für die ausführlichen Hilfestellungen. Dank Euch habe ich das nicht nur hinbekommen, es ist auch viel einfacher geworden. Die ganze Kommunikation mit dem Sensor ist auf 4 (!) Zeilen geschrumpft (siehe Bascom - Beispiel).
Code
 loop
    TWIOut(Sadr, $2C06);
    mDelay(100);
    TWIout(Sadr, $E000);
    TWIinp(Sadr,DataArray);

und die Ratschläge fürs Array haben die weitere Bearbeitung - ohne MSB und LSB Gedöns - auf weitere 2 Zeilen begrenzt:
Code
    CopyBlockReverse(@DataArray[0],@TData,2);
    CopyBlockReverse(@DataArray[3],@FData,2);

- Klasse!

Danke nochmal!

Grüsse
Roy

An Harry: ich weis nicht so recht wo ich das Posten soll, ich habe noch einige Probleme mit der IDE - Sachen, die in Version 6.. funktionieren, in Vers. 7 aber nicht,
- die "Replace" Funktion bringt das Prog. zu Absturz
- die "IDE PED32 Help" und der "Help Sytax" unter "Info" reagieren nicht
- beim Aufruf der PDF-Manuals unter "Info" öffnet sich immer der Explorer zur Dateiauswahl - das Prog merkt sich die Pfade aber nicht.
- die Formatierungshilfe "STRG+D" funktioniert teilweise erst nach einem Neustart des Progs wieder.

Oder die Fehler treten nur bei mir auf - kann auch sein, aber wie gesagt, unter der älteren Version funktioniert all das.
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: 20.09.2024 - 06:02  ·  #13
Hallo Roy,

ja da hast du leider Recht, aber der PED32new ist auch immer noch Beta. Miparo wird sich, wenn es klappt, ab 01.10. darum kümmern können um wenigstens die von dir beschriebenen Fehler zu beseitigen.
Im Zweifelsfall immer den original PED32 benutzen ;).

Gruss
Harry
Roy
Benutzer
Avatar
Gender:
Age: 68
Posts: 24
Registered: 07 / 2024
Subject:

Re: I2C Bus - wie funktioniert die Kommunikation

 · 
Posted: 20.09.2024 - 09:11  ·  #14
Alles klar, danke Harry.

Grüße
Roy
  • 1
  • 2
  • Page 2 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: 15 · Cache Hits: 14   109   123 · Page-Gen-Time: 0.032291s · Memory Usage: 2 MB · GZIP: on · Viewport: SMXL-HiDPI