Hallo, nachdem ich mich im Netz totgesucht habe und kaum wirklich etwas Gescheites gefunden habe, was auch funktioniert hier mal einen extrem kurze und funktionierende Library eines Inders, die nur einen einzigen Bug enhielt, den ich korrigiert habe. Lässt sich auf jeden AVR anpasssen, bei mir rennt sie auf einem Attiny mit 8 Mhz und 1 Mhz gleichermaßen. Viel Spass! Christian
Ein paar Sachen, die mir beim schnellen Lesen aufgefallen sind: vor dem Ausgeben eines Starts wird nicht geprüft, ob der Bus Idle ist Wenn der Slave (oder auch die Kapazität des Busses) den Clock streched, wird die minimale High-Zeit des Busses verletzt MfG Klaus
Christian J. schrieb: > Viel Spass! Seltsam die invertierte Namensgebung der Signale Beispiel:
1 | #define SOFT_I2C_SDA_LOW SDADDR|=((1<<SDA))
|
Wer soll da durchblicken wenn man es schnell verstehen soll?
Arduinoquäler schrieb: > Wer soll da durchblicken wenn man es schnell verstehen soll? Glaube dass der Code auch nicht für Arduino Benutzer geschrieben wurde. Für die ist das zu hoch....
Klaus schrieb: > Ein paar Sachen, die mir beim schnellen Lesen aufgefallen sind: > > vor dem Ausgeben eines Starts wird nicht geprüft, ob der Bus Idle ist > > Wenn der Slave (oder auch die Kapazität des Busses) den Clock streched, > wird die minimale High-Zeit des Busses verletzt > > MfG Klaus Ändere es und stelle den Code neu ein. Fertig ist ja nie was. Nur geprüft sollte es sein auf dem Breadboard. Fehlerhafte Codes gibt es genug im Netz. Auch dieser war es weil der Autor einfach nicht alle Funktionen gestestet hat.
Arduinoquäler schrieb: > Christian J. schrieb: >> Viel Spass! > > Seltsam die invertierte Namensgebung der Signale > > Beispiel: > #define SOFT_I2C_SDA_LOW SDADDR|=((1<<SDA)) > > Wer soll da durchblicken wenn man es schnell verstehen soll? Dann musst du einen PIC* nehmen, da entspricht 0 einem Ausgang. * Vielleicht gibt es auch andere µC wo das so ist, ich kenne nur den PIC.
PICianer schrieb: > Dann musst du einen PIC* nehmen, da entspricht 0 einem Ausgang. Hä? Wenn ich beim PIC eine 1 schreibe bekomme ich am Ausgang eine 0?
Arduinoquäler schrieb: > PICianer schrieb: >> Dann musst du einen PIC* nehmen, da entspricht 0 einem Ausgang. > > Hä? > > Wenn ich beim PIC eine 1 schreibe bekomme ich am Ausgang eine 0? Nein, 1 ist Input.
Boah, jetzt müllt das hier doch nicht so zu !!!!!! Ja, beim PIC ist 1 = INPUT, das steht hier aber nicht zur Debatte, weil es für AVR ist und easy angepasst werden kann, da die Defindes die Hardware kapseln.
Christian J. schrieb: > Glaube dass der Code auch nicht für Arduino Benutzer geschrieben wurde. > Für die ist das zu hoch.... Wenn du eine Funktion zur Ausgabe auf SPI schreibst, dann nennst du die vermutlich SPI_Read, oder SPI_Input ... nicht wahr?
Ich würde sie uint8_t spiTransfer(uint8_t data) nennen.
Das ist noch mehr Grütze drin ;-( Frage mich manchmal was die Leute machen, die ihren Kot ins Netz blasen ohne richtig zu testen. void i2c_init() { SDAPORT&=(1<<SDA); SCLPORT&=(1<<SCL); SOFT_I2C_SDA_HIGH; SOFT_I2C_SCL_HIGH; } muss void i2c_init() { SDAPORT&= ~(1<<SDA); SCLPORT&= ~(1<<SCL); SOFT_I2C_SDA_HIGH; SOFT_I2C_SCL_HIGH; } heissen, sonst sind die anderen Bits auch platt.
Das ist doch (bis auf die üblichen Flüchtigkeitsfehler) eine gute Grundlage. Es hat was man "wartbar" nennt. Hat der Mitbastler aus Indien sich eigentlich irgendwie zur Bug-Freiheit seines Geschenks verpflichtet?
@Christian J. Ich finde es bedenklich, dass du hier Code anbietest, der nicht von dir stammt und ein Copyright, offenbar von einer Firma, enthält. Damit bewegst du dich auf sehr dünnem Eis. Falls der Copyright-Inhaber den Quelltext unter einer Open-Source-Lizenz veröffentlicht hat, dann pack die Lizenz mit dazu. Falls nicht, dann bitte einen Moderator den Thread zu löschen.
Konrad S. schrieb: > Ich finde es bedenklich, dass du hier Code anbietest, der nicht von dir > stammt und ein Copyright, offenbar von einer Firma, enthält. Damit > bewegst du dich auf sehr dünnem Eis. Liegt sicher kein Patent drauf, zumindest auf den Fehlern nicht :-) Ist mir auch wurscht, Indien ist weit weg.
Arduinoquäler schrieb: > Seltsam die invertierte Namensgebung der Signale > > Beispiel:#define SOFT_I2C_SDA_LOW da ist nichts seltsam, SOFT_I2C_SDA_LOW macht genau das was der Name verspricht, nämlich ein Low am Pin erzeugen. Kleiner Tipp: es wird nicht auf PORTxx, sondern auf DDRxx eine 1 geschrieben
Das hier ist bit-banging mit Portpins. Da der AVR keinen ordentliche open drain hat wird beim schreiben die Richtung umgeschalten. Der Wert ist immer 0.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.