Re: I2C Routinen Kategorie: I²C-Bus (von André H. - 23.02.2005 23:44) | ||
Als Antwort auf Re: I2C Routinen von Epp - 22.02.2005 21:46 | ||
| ||
Hallo Epp, > Danke für den Code, aber wie funktioniert sie? Gibt es irgendwo ein paar Zeilen Doku dazu? > Ich nehme mal an, dass die Funktion einen Wert zurückliefert, wenn die �bertragung beendet wurde? > Wo soll ich die Funktion einbinden? Oder wie setze ich sie am besten ein? Das hatte ich eigentlich kurz im anderen Thread geschrieben. Nach jedem Lese- oder Schreibvorgang mu� die Funktion aufgerufen werden. Die Funktion waitI2C_Ready() hat keinen Rückgabewert. Ansonsten würde ein returns int dahinterstehen. Innerhalb der Funktion läuft eine Schleife, die erst beendet wird, nachdem an SCL ein Highpegel anliegt. Getestet habe ich die Funktion noch nicht, da ich hier keine langsamen I²C-Bus-Bausteine habe, die Clockstreching betreiben. (Ich müsste dafür erst extra einen Atmel-Controller programmieren und die Interruptroutine etwas verzögern. Dazu habe ich habe keine Zeit.) Nach welchen Anweisungen Du die Funktion einbinden mu�t, zeigt Dir hier nur ein Probieren. Denn wird an einer Stelle kein Clock-Streching benötigt, kann der Aufruf der Funktion als zusätzlicher Clock-Pulse interpretiert werden. Taste Dich einfach durch und ersetze ersteinmal die sleeps hinter den i2c.write() durch den Funktionsaufruf. Nach i2c.stop() darf normal keine Pause und auch kein Aufruf der Wartefunktion erfolgen. Nach dem i2c.cstart() sollte normal auch keine Pause notwendig sein. Der Aufbau Deiner Funktion würde dann so aussehen: //------------------------------------------- function direction (byte motor, byte direct) returns int //------------------------------------------- { /* Motor Drehrichtung */ if i2c.cstart(0x56) { i2c.write (10); waitI2C_Ready(); i2c.write (04); waitI2C_Ready(); i2c.write (motor); waitI2C_Ready(); i2c.write (direct); waitI2C_Ready(); i2c.write (0); waitI2C_Ready(); i2c.stop(); return -1; } i2c.stop(); return 0; } Die extra If-Abfrage dient dazu, zu erkennen, ob das I²C-Device angeschlossen ist bzw. reagiert. Wenn die Zeitangaben von Frank korrekt sind, kannst Du aber auch mit den Sleeps weiterarbeiten, jedoch sleep 1; angeben, da die Verarbeitung eines Bytes unter einer 1ms dauern soll. MfG André H. Antworten bitte nur ins Forum! Fragen per EMail auf Forum-Postings werden nicht beantwortet! Das macht meine Heizung gerade | ||
Antwort schreiben Antworten: Re: I2C Routinen (von Epp - 1.03.2005 9:26) |