Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - FAQ - Zum CC1-Forum - Zum CC-Pro-Forum

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
Ich nutze:
C-Control II Unit, C164CI-ControllerBoard, CC2-Application-Board, CC2-StarterBoard, CC2-ReglerBoard, OSOPT V3.0
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)