[Rant] Wann gibt es die Spannungsteiler-Lib?

Hallo allerseits!

Nachdem ich mir den heutigen Nachmittag mit der erfolglosen Beschäftigung mit einem SAA1064-IC versaut habe (das ist ein IC, der vier 7-Segment-Anzeigen bedienen kann und per I²C angesteuert wird), und der Erfolg sich erst mit der SAA1064-Lib (siehe hier) einstellte, habe ich mich bei einer Zigarette auf dem Balkon gefragt, ob das denn wirklich sein muss.

Für mich sieht es so aus, dass dieses ganze Arduino-Geraffel einen Grad an Leistungsfähigkeit und Komplexität erreicht hat, die der Angelegenheit (und vor allem mir) nicht mehr nutzt. Eigentlich sollte es doch genügen, dass es die I²C-Bibliothek gibt. Nur ist diese so schlecht dokumentiert (auch die Dokus der entsprechenden Bausteine sind IMO teilweise sehr schlecht), dass man sich damit eher ein Wochenende zerschießen als versüßen kann.

Und jetzt frage ich mich eben, wann es den eigentlich die Spannungsteiler-Lib oder die sagenhafte Bibliothek zum BC548C gibt. Denn wenn es erst mal die gibt – und die Bibliotheken für Kondensatoren, Widerstände und LEDs erst! – dann geht wirklich die Post ab.
Nur bringt das irgendwie so viel, wie wenn man TV glotzt und nicht kapiert, was dort eigentlich gezeigt wird.

Brauche ich vielleicht einfach nur einen Realitätscheck mit Rosa-Brillen-Kur?

Seufz...

Gregor

Das ist eine sehr gute Idee.
Ran setzen und selbst schreiben.

:wink: :wink: :smiley:

Schade, dass ich den Post (I2C) zu spät gesehen habe. Da hatte Serenifly schon die Libs angesprochen.
Ich setze den Baustein hier auch ein. Allerdings mit einer anderen Lib.
Aber ich denke, du bist damit durch.

HotSystems:
Ran setzen und selbst schreiben.

Mache ich schon seit Wochen (siehe hier) . Anstatt mein Merkzettel-Verzeichnis zu sprengen, schreibe ich es lieber so auf, dass vielleicht auch andere etwas davon haben. Aber mit so einem Zeug wie der I²C-Lib kann das zur Strafe werden.

HotSystems:
Aber ich denke, du bist damit durch.

Aber sowas von …!

Gruß

Gregor

:slight_smile:

Mache ich schon seit Wochen (siehe hier) . Anstatt mein Merkzettel-Verzeichnis zu sprengen, schreibe ich es lieber so auf, dass vielleicht auch andere etwas davon haben. Aber mit so einem Zeug wie der I²C-Lib kann das zur Strafe werden.

Na, das sieht doch schon sehr gut aus.
Aber eine "Spannungsteiler-Lib" vermisse ich da noch. :wink:

Ok, weiterhin viel Erfolg.

Und was I2C betrifft, siehst du ja auch bei mir in der Signatur.

HotSystems:
Na, das sieht doch schon sehr gut aus.

Also gut, der Tag und das Wochenende waren’s wert. Könntest Du diesen Satz in Gold gießen und auf Mahagoni genagelt bei mir an die Wand hängen? :slight_smile:

Gruß

Gregor

Na du stellet aber Ansprüche.

HotSystems:
Na du stellet aber Ansprüche.

Nach dem Wochenende muss das, nä!

Gruß

Gregor

Es steht sogar dort, aber ich habe auch nicht mehr dran gedacht:

There are both 7- and 8-bit versions of I2C addresses. 7 bits identify the device, and the eighth bit determines if it's being written to or read from. The Wire library uses 7 bit addresses throughout. If you have a datasheet or sample code that uses 8 bit address, you'll want to drop the low bit (i.e. shift the value one bit to the right), yielding an address between 0 and 127.

Insgesamt stimmt es aber dass die Doku von Wire sehr schlecht ist. Siehe zum Beispiel dass Leute ständig denken nach requestFrom() müsste ein endTransmission() kommen. Der Name der Funktion suggeriert, dass das das Ende der gesamten Kommunikation ist, aber damit wird eigentlich gar nichts beendet, sondern überhaupt erst was gesendet. Das sollte man mal deutlicher machen.

Eine andere Sache die nicht dokumentiert ist und auf die ich schon reingefallen bin. Im Request EventHandler onRequest() kann man aus irgendeinem Grund nur ein einziges write() machen. Und wenn mehre Bytes angefordert werden muss da man da wohl mitzählen oder ein Array schicken. Das steht in der Doku nirgends! Ist aber wohl den Machern bekannt, da ich das endlich in der issue Liste auf github nebenbei irgendwo gelesen habe.
Als Workaround hatte ich das mal so programmiert dass der Master einfach mehrmals jeweils ein Byte auf einmal von unterschiedlichen Adressen angefordert hat. Aber mir war dabei nicht klar wieso es nicht anders funktioniert hat.

Serenifly:
Insgesamt stimmt es aber dass die Doku von Wire sehr schlecht ist. Siehe …

Dass Du das auch so siehst, ist beruhigend. Nach einem Tag wie heute frage ich mich manchmal, ob es vielleicht an mir liegt … (tut es ab und zu ja auch)

Gruß

Gregor

"Spannungsteiler-Lib"

Das ist eigentlich eine gute Idee!!

Ich glaube, da mache ich mal was draus.....

@gregorss: Sieht gut aus, habe deine Seite gleich gebookmarked :slight_smile:

Was ist/wäre denn die Spannungsteiler-Lib ?

Da hier ein paar Cracks zum Thema Library's sind gleich mal eine Newcomerfrage:

Libs sind beim Arduino keine vorcompilierte binären Bibliotheken, sondern
einfach Sourcen, die via Header-Datei (und dem Wissen wo sich die Sourcen befinden)
eingebunden und mitcompiliert werden.

Sehe ich das richtig?

Viele Grüße

Harry

Sehe ich das richtig?

Yes!

Was ist/wäre denn die Spannungsteiler-Lib ?

Ein Stück Software mit Humor.
An der Grenze zum Sarkasmus.

combie:
Ein Stück Software mit Humor.
An der Grenze zum Sarkasmus.

Jaja, mit uns Newbies könnt ihr es ja machen ;D ;D ;D

Also ich habe den SAA1064 ohne Lib mit mehrereren Beispielsketchen problemlos zum Laufen gebracht. Ich habe auch recht schnell mit dem Datenblatt und dem Demosketch rausgefunden, wie der Konstantsrom für die Segmente eingestellt wird, indem ich da mal ein bisschen rumgespielt habe und nach dem Ändern von 1-2 Bits geguckt habe, ob das Ergebnis mit meiner Vermutung übereinstimmt.

{
Wire.beginTransmission(saa1064);
Wire.write(B00000000); // this is the instruction byte. Zero means the next byte is the control byte
Wire.write(B00010111); // control byte (dynamic mode on, digits 1+3 on, digits 2+4 on, 21mA segment current
// left 111 is relevant for current left hand "1" 12mA, middle 6mA and right 3mA - so you can tewak it
Wire.endTransmission();
}

Als Nächstes habe ich dann noch eine weitere für mich nützliche Funktion in die Void Setup implementiert.(funktioniert natürlich nur, wenn man zuvor im Arry die passenden Zeichen definiert hat)

void displayOff()         // displays "Aus"
{
 Wire.beginTransmission(saa1064);
 Wire.write(1);          // instruction byte - first digit to control is 1 (right hand side)
 Wire.write(digits[12]); // digit 1 A
 Wire.write(digits[13]); // digit 2 u
 Wire.write(digits[5]);  // digit 3 S (5)
 Wire.write(digits[11]); // digit 4 blank
 Wire.endTransmission();
 delay(10);
}

Die Adresszuweisung mußte ich auch erstmal kapieren, aber dafür gibt es ja den I2C Scannersketch. Dieses Programm ist bei I2C recht nützlich und man kann feststellen, ob sich ein I2C Device tot stellt oder ob man das Device einfach nur unter der falschen Adresse erwartet.
Etwas Elektronikerfahrung ist bei der Arduinobastelei schwer von Vorteil. Ich habe zuvor schon viele Jahre gebastelt und so ist für mich wenigstens nur der Softwarepart Neuland :wink:
Ich habe mir mit Eagle eine passende Leiterplatte entworfen und in China davoen ein zehnerpack fertigen lassen. So habe ich eine universelle Baugruppe in mehrfacher Ausfertigung für verschiedenste Projekte :grin:

nix_mehr_frei:
Also ich habe den SAA1064 ohne Lib mit mehrereren Beispielsketchen problemlos zum Laufen gebracht. ...

Ich nehme an, dass Du deutlich mehr Erfahrung mit diesen ganzen Dingen hast als ich. Im Vergleich zu vollkommen ahnungslosen Newbies habe auch ich ziemlich viel Erfahrung. Aber das hat mir in diesem Fall nicht geholfen, vermutlich weil die Doku so schlecht ist. In Dokus zu I²C-Geräten ist zum Beispiel oft von „Startbedingung“ die Rede, in der Doku zur Wire-Bibliothek taucht dieses Wort jedoch kein einziges Mal auf (AFAIR). Und dass in Datenblättern der Signalverlauf beschrieben ist, der eine Startbedingung darstellt, hilft mir rein gar nichts, wenn ich etwas nicht „zu Fuß“ sondern mit Hilfe von Wire.h umsetzen möchte.

Gruß

Gregor

Ja, die ganzen Start und Stop Conditions werden von der Wire Lib intern erledigt. Das ist auch der Grund weshalb man eine Funktion wie endTransmission() braucht. Man denkt leicht dass Wire.write() analog zu Serial.write() funktioniert und gleich die Daten sendet. Das ist aber nicht der Fall. write() schreibt Daten nur in den Puffer. Und erst endTransmission() sendet die Daten und die Stop Condition. Selbst wenn write() die Daten direkt senden würde, müsste man immer noch irgendwie das Ende der Übertragung mitteilen.

Hier beißt sich auch die Realität etwas mit der Arduino Philosophie alles einheitlich und ganz einfach haben zu wollen. Es ist zwar verständlich, dass man Serial und Wire ähnlich aussehen lassen will, aber andererseits funktionieren sie völlig anders.
Wenn man es sowas wie startSend(), enqueue(), stopSend() genannt hätte wäre es vielleicht deutlicher. Aber man hat dann halt andere Funktionen wie bei anderen Kommunikations Bibliotheken.

Das verwirrenste ist aber eben die Sache mit den Adressen.