Forum: Projekte & Code AVR: I2C Master Software Library für alle AVR


von Christian J. (Gast)


Angehängte Dateien:

Lesenswert?

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

von Klaus (Gast)


Lesenswert?

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

von Arduinoquäler (Gast)


Lesenswert?

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?

von Christian J. (Gast)


Lesenswert?

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

von Christian J. (Gast)


Lesenswert?

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.

von PICianer (Gast)


Lesenswert?

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.

von Arduinoquäler (Gast)


Lesenswert?

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?

von PICianer (Gast)


Lesenswert?

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.

von Christian J. (Gast)


Lesenswert?

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.

von Arduinoquäler (Gast)


Lesenswert?

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?

von PICianer (Gast)


Lesenswert?

Ich würde sie uint8_t spiTransfer(uint8_t data) nennen.

von Christian J. (Gast)


Lesenswert?

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.

von Bastler (Gast)


Lesenswert?

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?

von Konrad S. (maybee)


Lesenswert?

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

von Christian J. (Gast)


Lesenswert?

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.

von Konrad S. (maybee)


Lesenswert?

Christian J. schrieb:
> Ist
> mir auch wurscht,

Ja, so habe ich mir das bei dir schon gedacht.

von Walter S. (avatar)


Lesenswert?

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

von Michael X. (Firma: vyuxc) (der-michl)


Lesenswert?

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
Noch kein Account? Hier anmelden.