AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

I2C LM75 sensor

Ein Thema von yacdrak · begonnen am 22. Dez 2020 · letzter Beitrag vom 10. Apr 2021
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#11

AW: I2C LM75 sensor

  Alt 8. Jan 2021, 16:43
Also ja, man könnte die CTS/RTS/...-Leitungen eines Comports manuell ansteuern und darüber die Daten für I2C übertragen.
Man braucht ja "nur" irgendwelche 2 bis 3 IO-Pins -> SCL (OUT) und SDA (InOut oder IN+OUT).

Es gibt bestimmt auch fertige USB-I2C-Adapter, [ADD] https://www.amazon.de/gp/product/B07VSMW6P6, https://www.amazon.de/ELV-USB-I%C2%B.../dp/B007IR9CDY , ... [/ADD]
und wenn selber-machen, dann nicht deletantisch über CTS/RTS, sondern ich würde eher einen µPC empfehlen (z.B. ein winziger Arduiono-Kompatibler), wo man ein Programm draufmacht, welches COM-Port auf I2C weiterleitet (gibt es schon fertig in den Demos).
Oder sowas wie einen RaspberryPI, wo derartige Dinge direkt am GPIO verfügbar sind. Es gibt/gab auch für x86 (Intel) ein paar Mainboards, mit derartigen GPIO.


zu den USB-Comport-Adaptern oder oft auch auf Mainbords verbaut:
Oft sind Multi-Purpose-Chips verbaut, für die Windows oft sogar die Treiber im automatischen Download drin hat.
FT232R (Serial + frei programmierbare Ports des CBUS), FT232H (Serial, SPI und I2C), CP2102 (nur Serial), CH340 (Serial, Print, I2C und SPI) oder PL2303/TUSB3410 (Serial, I2C, Infrarot-I/O und 4 freie I/O-Ports)

Links die kleinen USB-ComPort-Adapter sind minimalbeschaltet, also raus gehen oft nur RX/TX/GND/VDD
aber es gibt auch "Besseres", bis hin zu den "Extremen", wie links unten.
Das ist ein vollbeschalteter CH341, wo man sieht, was diese Chips eigentlich können.

COM und LPT (ganz rechts die Stifte und mittig die Lötkontakte, welche den "kompletten" ComPort/UART mit 25 Pins oder den großen Druckerport darstellen)
und dazu dann noch I2C, SPI, ...
Er arbeitet je nach Mode-Schalter als CH340 (ComPort, VID=1A86,PID=7523) oder CH341 (I2C+SPI, VID=1A86,PID=5512)

Beim CH341 muß man zwar den Treiber sich selbst besorgen, aber dafür findet man dort neben der DLL auch eine Header-Datei für den Zugriff auf I2C.
http://deviceinbox.com/drivers/845-u...2c-ch341a.html
die kleine CH341PAR_2.2.2009.6.ZIP


https://othermod.com/gpio-buttons/
https://www.raspberrypi-spy.co.uk/20...ader-and-pins/

https://www.amazon.de/AZDelivery-Dig.../dp/B01N7SGC1I
https://www.amazon.de/AZDelivery-Atm...dp/B078SBBST6/

Der ATtiny85 hat nur einen USB-Emulator (nicht sehr optimal, da der Chip eigentlich zu langsam ist) ... es gibt einen besseren Nachfahren mit "neuerem" Chip (hab den Namen grad vergessen)


[ADD]
Der Ersatz für den ATTiny85 mit echtem Hardware-USB, anstatt einer "bösen" Emulation, die nicht immer zuverlässig funktioniert und einen eigenen Treiber benötigt.
https://www.amazon.de/TECNOIOT-Beetl.../dp/B07VL6G914
https://forum.pjrc.com/threads/50507...upt#post172802
Statt dem Original kann man aktuell überall eh nur den ChinaKlon kaufen.
Schade/witzig, dass selbst die Chinesen nichtmal auf eigene Ideen kommen, wie z.B. den unnötig großen Spannungswandler gegen einen Kleinen zu ersetzen ... allein die Stromversorgung belegt nutzlos über 70% des Platzes.
Miniaturansicht angehängter Grafiken
img_20210108_160332_.jpg  
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 9. Jan 2021 um 02:29 Uhr)
  Mit Zitat antworten Zitat
yacdrak

Registriert seit: 22. Dez 2020
7 Beiträge
 
#12

AW: I2C LM75 sensor

  Alt 10. Apr 2021, 21:54
Hallo zusammen,
Danke für eure Hilfe. Leider habe ich keine lösung gefunden. Ich habe den Code geändert aber ich bekomme noch 255 253 als Ergebnis. können sie bitte mir helfen ?

Delphi-Quellcode:
unit Unit1;

interface


uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs , i2cusb, Vcl.StdCtrls, Vcl.ComCtrls;


const
cTimeoutInMs = 1000;
cTimeoutInit = 5000;

type
  TArray = array[0..7] of Byte;
  TArray11 = array[0..10] of Byte;
  TByteArr = array of byte;
  TForm1 = class(TForm)
  Button1: TButton;
  StatusBar1: TStatusBar;
  Label1: TLabel;

  procedure Button1Click(Sender: TObject);


  private
    { Déclarations privées }
  public


  end;

   function start_i2c ( address : Integer ):ShortInt;
  function stop_i2c():ShortInt;
  function slave_port( address: TArray): ShortInt;
  function ACK_Slave():ShortInt;
  function ACK_Master():ShortInt;
 Function temperature_LM75_lesen():TArray;
 function Integer_To_Byte(str: String):TByteArr;
 function write( Wert : TArray ):ShortInt;
 function read():TArray;
 function No_ACK_Master():ShortInt;


var
  Form1: TForm1;
  ic : Ti2cUsb;
  Temperatur1 : Byte;
  Temperatur2 : Byte;
  Wert : Double ;
  Byte1, Byte2 :Byte;
  a : Double;
  write_add_temp : TArray = (1,0,0,1,0,0,0,0);
  read_add_temp : TArray = (1,0,0,1,0,0,0,1);
  write_add_pca : TArray = (0,1,0,0,1,1,1,0);
  read_add_pca : TArray = (0,1,0,0,1,1,1,1);
  init_temp : TArray = (0,0,0,0,0,0,0,0);
  pointer_Byte : TArray = (0,0,1,1,0,0,0,1);

implementation

     {$R *.dfm}



function slave_port( address : TArray): ShortInt;
var i:ShortInt;
begin
    for i := 0 to 7 do
   begin
   if address[i] = 1 then
   begin
  ic.wr_byte_port(1); //SDA = 1 SCL = 0
   ic.wr_byte_port(0); //SDA = 1 SCL = 1
   end
   else
   begin
   ic.wr_byte_port(3); //SDA = 0 SCL = 0
   ic.wr_byte_port(2); //SDA = 0 SCL = 1
   end;
   end;
   Result := 0;
end;

function start_i2c ( address : Integer ):ShortInt;
begin

  ic.wr_byte_port(0); //SDA = 1 ; SCL = 1
  ic.wr_byte_port(2); //SDA = 0 ; SCL = 1

   if address = 144 then
   begin
     slave_port(write_add_temp);
   end
   else if address = 145 then
   begin
     slave_port(read_add_temp);
   end
   else if address = 78 then
   begin
     slave_port(write_add_pca);
   end
   else if address = 79 then
   begin
     slave_port(read_add_pca);
   end;
   Result := 0;
end;



function ACK_Slave():ShortInt;
begin
  ic.wr_byte_port(1); //SDA = 1 SCL = 0
   ic.wr_byte_port(0); //SDA = 1 SCL = 1
   ic.wr_byte_port(3); //SDA = 0 SCL = 0 // 3
   Result := 0;
end;

function ACK_Master():ShortInt;
begin
    ic.wr_byte_port(3); //SDA = 0 SCL = 0
   ic.wr_byte_port(2); //SDA = 0 SCL = 1
   ic.wr_byte_port(3); //SDA = 0 SCL = 0
   Result := 0;
end;

function No_ACK_Master():ShortInt;
begin

   ic.wr_byte_port(1); //SDA = 1 SCL = 0
   ic.wr_byte_port(0); //SDA = 1 SCL = 1
   ic.wr_byte_port(3); //SDA = 0 SCL = 0
   Result := 0;
end;


function stop_i2c():ShortInt;
begin
  ic.wr_byte_port(3); //SDA = 0 SCL = 0
  ic.wr_byte_port(0); //SDA = 1 ; SCL = 1
  Result := 0;
end;





Function temperature_LM75_lesen():TArray; //Liest einen Wert (1 Byte) vom LM75 Temperatursensor
var
 i:ShortInt;
 value:Byte;
 arr:TArray;
begin

       for i := 7 downto 0 do
       begin
           ic.wr_byte_port(1);
           ic.wr_byte_port(0);
           ic.rd_byte_port(value);
          arr[i] := value;
          ShowMessage(value.ToString);


       end;

 Result := arr;


end;





function Integer_To_Byte(str: String):TByteArr;
var
i: integer;
begin
SetLength(Result, Length(str));
for i := 0 to length(str)-1 do
  Result[i] := ord(str[i+1]) -48;
end;




function write( Wert : TArray ):ShortInt;
var

myByte : TArray;
i : ShortInt;
begin
myByte := Wert;

   for i := 7 downto 0 do
   begin
   if myByte[i] = 1 then
   begin
   ic.wr_byte_port(1); //SDA = 1 SCL = 0
   ic.wr_byte_port(0); //SDA = 1 SCL = 1
   end
   else
   begin
   ic.wr_byte_port(3); //SDA = 0 SCL = 0
   ic.wr_byte_port(2); //SDA = 0 SCL = 1
   end;
   end;
Result := 0;
end;

function read():TArray;
 var
 i:ShortInt;
 value:Byte;
 arr : TArray;
begin

       for i := 7 downto 0 do
       begin
           ic.wr_byte_port(1);
           ic.wr_byte_port(0);
           ic.rd_byte_port(value);
           arr[i] := value;

       end;

 Result := arr;
 end;




procedure TForm1.Button1Click(Sender: TObject);

 var
 val1 : TArray;
 val2 : TArray;
 temp : TArray11;
 Value : double ;
  I: Integer;
 begin


 //Register Temp configurate
 ic := Ti2cUsb.Create;
 ic.Init(3);
 start_i2c(78);
 ACK_Slave;
 write(init_temp);
 ACK_Slave;
 stop_i2c;


 //Read Temp register with preset Pointer (2 Byte Data)
 start_i2c(79);
 ACK_Slave;
 val1 := temperature_LM75_lesen;
 ACK_Master;
 val2 := temperature_LM75_lesen;
 No_ACK_Master;
 stop_i2c;






  for I := 0 to 10 do
begin
   if I<3 then
   begin
     temp[I] := val2[I];

    
   end
   else
   begin
     temp[I] := val1[I];

  
   end;







end;

 end;

End.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:17 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz