Forum: Projekte & Code C: AVR: Library für verschiedene I2C-Chips unter Verwendung der P.Fleury-Lib inkl. Datenblätter


von René Z. (dens)


Angehängte Dateien:

Lesenswert?

Ich hab mal meine ganzen Libs von I2C-Chips zusammengestellt und die 
Datenblätter dazugepackt.

Wird im Laufe der Zeit noch erweitert für den DS1307 und EEPROMs.

Ist glaub ich gut genug kommentiert, falls es noch Fragen gibt habt ihr 
hier die Möglichkeit.

von Robert S. (razer) Benutzerseite


Lesenswert?

Eine Liste der unterstützten Devices wäre nicht schlecht - nicht dass 
sich jeder immer alles runterladen muss...

von René Z. (dens)


Lesenswert?

dabei ist die benötigte P.Fleury'sche I2C-Lib

LM75 (Temperatursensor)
MCP23017 (extrem mächtiger 16bit Portexpandern mit allem möglichem Zeug)
PCF8574 (ganz einfacher 8bit Portexpander)
MCP3421 (18bit delta/sigma ADC mit Differenzmessung, eingebauter 
Referenz und internem ultralinearem einstellbarem Vorverstärker)
SHT21 (Luftfeuchte und Temperatursensor mit Kompensation und allem 
möglichen Zeug, Werte direkt als BCD auslesbar)
TSL2561 (Lichtsensor mit indirekter IR-Kompensation und humanähnlicher 
Kennlinie) (es fehlt allerdings noch die Umrechnung Rohwert-lux)

Kommt bald:
DS1307 (RTC)
allerlei EEPROMs

von René Z. (dens)


Angehängte Dateien:

Lesenswert?

So hier V1.1 mit DS1307

von René Z. (dens)


Angehängte Dateien:

Lesenswert?

V1.2 mit zusätzlicher Lib für das HDMM01-2-Achsen-Kompass-Modul von 
Pollin

von René Z. (dens)


Angehängte Dateien:

Lesenswert?

V1.4 mit zusätzlicher Lib für EEPROMs

von René Z. (dens)


Lesenswert?

DIE HDMM01-LIB NOCH NICHT BENUTZEN DA IST NOCH EIN FEHLER DRIN

von René Z. (dens)


Angehängte Dateien:

Lesenswert?

Und hier die aktuelle Lib mit der Lib von P.Fleury und folgenden Chips:

LM75 (Temperatursensor)

MCP23017 (extrem mächtiger 16bit Portexpandern mit allem möglichem Zeug)

PCF8574 (ganz einfacher 8bit Portexpander)

MCP3421 (18bit delta/sigma ADC mit Differenzmessung, eingebauter
Referenz und internem ultralinearem einstellbarem Vorverstärker)

SHT21 (Luftfeuchte und Temperatursensor mit Kompensation und allem
möglichen Zeug, Werte direkt als BCD auslesbar)

TSL2561 (Lichtsensor mit indirekter IR-Kompensation und humanähnlicher
Kennlinie) (es fehlt allerdings noch die Umrechnung Rohwert-lux)

DS1307(RTC)

HDMM01 (2-Achsenkompassmodul von Pollin)

EEPROMs (Universallib für alle mögliche I2C-EEPROMs)

Könnte mal n Mod all die alten Versionen von V1.1 bis V1.3 löschen

von Nils S. (kruemeltee) Benutzerseite


Lesenswert?

6.5MB und Archiv mit Datenblättern zu den Chips mit drin...

Lade doch einfach die einzelnen C- und Headerdateien hoch, 
Syntaxhighlighting hast du dann inklusive.

Traffic sparen, viel übersichtlicher und man kann schnell mal 
nachschauen.

von René Z. (dens)


Lesenswert?

das mach ich erst wenn s noch ein zweiter will weil des einiges an 
beiträgen wird und noch mehr platz braucht

von Nils S. (kruemeltee) Benutzerseite


Lesenswert?

Das geht alles in einen Beitrag, Dateianhang auswaehlen und auf "Weitere 
Datei anhaengen" klicken.

von René Z. (dens)


Angehängte Dateien:

Lesenswert?

tada

von Simon K. (simon) Benutzerseite


Lesenswert?

Wer hat die Dateien zu den Bauteilen erstellt? Da wurde ja ganz gut 
gemurkst!
1
int   pcf8574_input  (int portexaddress)
2
{
3
  int portexin1;
4
  int portexin2;
5
  
6
  i2c_start(portexaddress+I2C_READ);
7
  
8
  portexin1 = i2c_readAck();
9
  portexin2 = i2c_readAck();
10
  
11
  i2c_stop();
12
  
13
  if (portexin1 == portexin2)
14
  {
15
    return portexin1;
16
  }
17
  else
18
  {
19
    return "ERR";
20
  }
21
}

einen char* implizit in einen int konvertieren? Was soll das und wie 
soll die entsprechende Überprüfung auf Fehler von außen erfolgen?

Grober Pfusch ist sowas.

von Simon K. (simon) Benutzerseite


Lesenswert?

Ist das überhaupt getestet?

Das macht mit Sicherheit nicht, was es soll:
1
float read_mcp3421_adc (int bits)
2
{
3
  volatile signed int data_adc;
4
  volatile signed float readenvoltage;
5
  volatile unsigned float onebitvoltage;
6
  
7
  data_adc = read_mcp3421_adc_raw();
8
9
  onebitvoltage = 4,096 / 2^bits;
10
  
11
  readenvoltage = onebitvoltage * data_adc;
12
  
13
  return readenvoltage;
14
}

Komma ist in C nicht der Dezimalpunktoperator und Zirkumflex nicht der 
Potenzoperator!

Da sind mit Sicherheit noch mehr grobe Schnitzer in den Dateien, habe 
nur die Beiden angeschaut.
Daher lieber erst mal Hände weg, bis die alle überprüft wurden.

Achso und float ist hier bei AVRs Quatsch und Unsinn. Das geht mit 
Festkomma-Arithmetik besser, einfacher und ressourcenschonender.

von Nils S. (kruemeltee) Benutzerseite


Lesenswert?

Was der User mit den ADC-Daten anfängt, sollte ihm selbst überlassen 
bleiben um die Lib/den Treiber möglichst kein zu halten.
z.B. bei einem 12bit ADC reicht ein signed/unsigned short (je nach gew. 
Vorzeichen) und die Funktion sollte nicht mehr machen, als den direkten 
ADC-Wert auszugeben.

Umrechnungen, anzeigen auf Display, UART, xxxxx, ...., kann man ja als 
Beispiel in einer main() unterbringen.

von Simon K. (simon) Benutzerseite


Lesenswert?

Nils S. schrieb:
> Was der User mit den ADC-Daten anfängt, sollte ihm selbst überlassen
> bleiben um die Lib/den Treiber möglichst kein zu halten.
Das kann man machen, wenn der Rest funktioniert ;-)

> z.B. bei einem 12bit ADC reicht ein signed/unsigned short (je nach gew.
> Vorzeichen) und die Funktion sollte nicht mehr machen, als den direkten
> ADC-Wert auszugeben.
Besser: uint16_t / int16_t

von René Z. (dens)


Lesenswert?

Simon K. schrieb:
> Komma ist in C nicht der Dezimalpunktoperator
isn tippfehler

von Simon K. (simon) Benutzerseite


Lesenswert?

René Zahn schrieb:
> Simon K. schrieb:
>> Komma ist in C nicht der Dezimalpunktoperator
> isn tippfehler

Das ist alles, was du dazu sagst? Tippfehler? In einem C-Programm?! Du 
hast also das Ganze nicht mal kompiliert...

Ganz toll! Ich dachte immer das Hereinstellen von Sachen in die 
Codesammlung setzt ein wenig Verantwortungsbewusstsein voraus.

von René Z. (dens)


Lesenswert?

Simon K. schrieb:
> Ist das überhaupt getestet?
Ja mit Umrechnung noch nicht aber den AD-Wert bekomm ich zuverlässig 
zurück (ausser wenn zeitgleich mein SNT rödelt dass Störungen aufm Bus 
verursacht)


>
> Da sind mit Sicherheit noch mehr grobe Schnitzer in den Dateien, habe
> nur die Beiden angeschaut.
> Daher lieber erst mal Hände weg, bis die alle überprüft wurden.


> Festkomma-Arithmetik besser, einfacher und ressourcenschonender.
aber schiweriger und wenns funktioniert ists wurscht.
Wer ein super dupper ressourcenschonendes sich selber den Hintern 
abwischendes Programm braucht, dass auch nicht mehr funktioniert als 
diese soll das Bitte verdammt noch mal selber machen.

Nils S. schrieb:
> z.B. bei einem 12bit ADC reicht ein signed/unsigned short
bei short und long spinnt bei mir teilweise der Compiler deshab hab ichs 
so gemacht

Simon K. schrieb:
> einen char* implizit in einen int konvertieren? Was soll das und wie
> soll die entsprechende Überprüfung auf Fehler von außen erfolgen?
es funktioniert nicht mehr oder besser als ein anderes
zur überprüfung: die " " gehören weg und ERR ist bei mir definiert hab 
ich vergessen mit einzufügen.
der pcf8574 sendet die eingangswerte zur überprüfung zweimal und wenn 
ein fehler drauf unterschieden sich die beiden.

von Uwe B. (boerge) Benutzerseite


Lesenswert?

Mahlzeit,

also ich hab mal den Quelltext zum LM75 überflogen...

Ich sollte wohl nochmal einen C-Grundkurs machen, den irgendwie verstehe 
ich die Prozedur Temperaturumrechnen() nicht. (zuerst dachte ich, dass 
es vielleicht BASIC-Code sein könnte, da gibt es zumindestens ein ^ als 
Potenz... :-))

Vielleicht könntest du mal erklären, wie das Zeugs funktionieren soll. 
Es könnte sein, dass ich nicht hinter diese trickreiche Programmierung 
steige.

Danke Uwe

PS.: ich bezweifle, dass dieser Codefetzen überhaupt warnung- und 
fehlerfrei übersetzbar ist!

PPS.: deine abfällige Bemerkung zu den "Spinnern" die ressourcenarm 
programmieren wollen, gefällt mir auch nicht besonders. Wenn der Rest 
der Quelltexte ähnliche Qualität hat, solltest du es vielleicht sein 
lassen...

von René Z. (dens)


Lesenswert?

Uwe Berger schrieb:
> solltest du es vielleicht sein
> lassen...

wenns euch nicht gefällt könnt ihr es ja löschen lassen

von rexkramer (Gast)


Lesenswert?

Hallo ,
letztendlich eine brauchbare Basis und allemal besser als das 
rumgefrotzel der Anderen.
Die können einem auch den Spass nehmen. Weiter so ihr Experten.

Und Danke an Rene für den Code.

von Uwe B. (boerge) Benutzerseite


Lesenswert?

rexkramer schrieb:
> Und Danke an Rene für den Code.

...und schon mal probiert, ob sich das Zeug fehler- und warnungsfrei 
übersetzen läßt?

von tribel (Gast)


Lesenswert?

Uwe Berger schrieb:
>
> ...und schon mal probiert, ob sich das Zeug fehler- und warnungsfrei
> übersetzen läßt?

Und warum so abfällig über jemanden herziehen.
Probiere es doch selbst aus.

Da hat sich jemand mal die mühe gemacht , und schon wird er wieder 
runtergemacht .

von F. F. (foldi)


Lesenswert?

Der SHT ist schweineteuer. Für den DHT (5 Stück 6Euro und) gibts auch 
eine lib.

von ein Gast (Gast)


Lesenswert?

Ich denke Simon ging es primät darum, daran zu erinnern, daß es nun mal 
erhöhter Selbstkritik bedarf, wenn man Code einstellt.
Man sollte nicht als profihafter Gönner auftreten und dann auch noch auf 
Kritik und erkannte Fehler schmollend und nach Waden beißend reagieren.
Das ist unreif und unprofessionell. Und, nun ja, nichts anderes ist es 
wenn man auf die Einwände der compilierbarkeit, unnötiger float 
Verwendung etc (daß der Compiler spinnt ist eher unwahrscheinlich btw) 
mit "Machs doch alleine wenns dir nicht passt" reagiert.

Ich finde das posten einer konkreten Chip Sammlung super! Das bereichert 
das Forum natürlich und Anfängern ist das sehr dienlich. Die nehmen das 
aber auch als Vorlage und da sollten auch möglichst keine blöden Sachen 
gemacht werden. Eine compilierbarkeit sowiso vorausgesetzt.

Bedenke einfach, daß du nicht so erfahren bist, wie du meinst und dann 
kannst du auf Kritik von anderen souveräner reagieren. Die infantilen 
Antwoerten ignorier ich mal.

Danke dir für die Mühe!

von Uwe B. (boerge) Benutzerseite


Lesenswert?

tribel schrieb:
> Probiere es doch selbst aus.
>
...es reicht ein kurzer(!) Blick in ein paar Quellcode-Dateien:

lm75.h
1
volatile int string[16]    AS Temperatur;

oder sht21.h
1
volatile int string[8] AS sht21_crc;
2
int string[16] AS sht21_data;

was ist das? Mit welchem C-Compiler soll das übersetzbar sein?

lm75.c
1
...
2
while ( Stelle >16)
3
{
4
    char i2c_readAck(void)
5
    Temperatur = i2c_readAck()
6
    Stelle++;
7
}
8
...

Meine C-Compiler würden wegen fehlenden Semikolon meckern...

lm75.c
1
...
2
if ( Temperatur.(8-Stelle) = 1) 
3
{
4
   Temp = Temp + 2^Stelle
5
} 
6
   else
7
{
8
   Temp = Temp + 0
9
}
10
...

Mal abgesehen von dem komischen "Temperatur.(8-Stelle)" (was soll das 
sein?) fehlt in der if-Bedingung ein Gleichheitszeichen. Weiterhin habe 
ich weiter oben schon angemerkt, dass "^" kein Operator in C ist!

sht21.c
1
...
2
int convert_sht21_str_sht21_val (int data, int type)
3
{
4
  data.0 = 0;
5
  data.1 = 0;
6
...

Auch hier scheine ich etwas beim Typ Integer in C etwas verpasst zu 
haben... oder?

Reichen diese Beispiele?

Ich dachte bisher auch immer, dass gerade in der "Codesammlung" fertige 
Software vorgestellt wird. Zu "fertig" gehört nach meiner Ansicht aber 
auch, dass man die Software mal übersetzt und getestet hat.

Was bitteschön soll ein Anfänger mit soetwas anfangen können?

Grüße Uwe

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Ich habe auch mal stichprobenweise reingeschaut:

ds1307.h:
1
#define ds1307_address 0x68;

Hier ist das Semikolon zuviel.

HDMM01.c:
1
  _delay_ms(10); //wait 10ms to let the sensor take the measurement

Wie kann man _delay_ms() aufrufen ohne das dazu passende Include?
Da fehlen sowieso zig Include-Statments, allein schon, damit man 
wenigstens die extern-Deklaration zur Fleury-Lib hat.

HDMM01.c:
1
#define Config_reg  0x00;
2
#define MSB_X_Axis  0x01;
3
#define LSB_X_Axis  0x02;
4
#define MSB_Y_Axis  0x03;
5
#define LSB_Y_Axis  0x04;

Auch hier sind alle Semikolons zuviel und führen garantiert zu einem 
Syntax-Error.

PCF8574.h:
1
#define pcf8574_address_LLL    32;
2
#define pcf8574_address_LLH    33;
3
#define pcf8574_address_LHL    34;
4
#define pcf8574_address_LHH    35;
5
#define pcf8574_address_HLL    36;
6
#define pcf8574_address_HLH    37;
7
#define pcf8574_address_HHL    38;
8
#define pcf8574_address_HHH    39;

Dito.

So, mehr Dateien wollte ich mir nicht anschauen.

Fazit: Es gibt keine einzige Quelltextdatei, die durch irgendeinen 
C-Compiler geht. Diese Software wurde weder jemals kompiliert noch wurde 
sie getestet. Wie denn auch, wenn sie gar nicht übersetzbar ist?

Wie wäre es mal mit einem Statement vom TO, was dieser Thread hier soll? 
Verarsche? Mal gucken, wieviele "Danke" sagen, obwohl die Software 
unbenutzbar ist?

EDIT:
Ich sehe gerade, dass dieser Thread bereits ein Jahr alt ist. Mir ist 
absolut schleierhaft, wie so etwas hier ein Jahr lang unkommentiert hier 
rumlungern durfte.

von ElectricJohnny (Gast)


Lesenswert?

also der SHT21 Code lässt sich auch nicht kompilieren...

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

ElectricJohnny schrieb:
> also der SHT21 Code lässt sich auch nicht kompilieren...

Es haben hier schon mehrere Leute darauf hingewiesen, dass der Code 
generell nicht kompilierbar ist und auch nie kompilierbar war. Am besten 
ist es wohl, wenn dieser Thread verschwindet bzw. zumindest gesperrt 
wird.

Schließlich sind wir hier in "Projekte & Code". Mit dem Code kann man 
aber nichts anfangen. Ganz im Gegenteil: Anfänger werden in die Irre 
geführt.

Ich drücke mal auf "Beitrag melden".

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.