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
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?
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.