- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 6 von 6

Thema: Probleme mit I2C unter C++

  1. #1

    Probleme mit I2C unter C++

    Anzeige

    Praxistest und DIY Projekte
    Hallo Allerseits

    Wie der Titel schon sagt will das nicht laufen. Vermutlich liegt es an den Startbedingungen, denn das I2C_Beispielprogramm in Visal Basic ( USB -> RS232 -> I2C ) funktionert mit meiner Konfiguration einwandfrei. Ebenso die Kommunikation via USB -> RS232.
    Ich hab mir im source Code für das Beispiel Programm die Funktionen zum Initialisieren und Starten des I2C Datenverkehrs angeschaut und versucht in C++ nachzubilden, wohl ohne erfolg

    Was ich gerne wissen würde ist die korrekte Reihenfolge wie ich die SDA(DTR) bzw SCL(RTS) Leitung setzen muss, bevor ich mit der Datenübertragung beginnen kann.
    Falls jemand sogar noch den entsprechenden Code hätte, würde es der Sache ungemein helfen.

    Gruß
    Thorsten

    Hardware
    RN_Motor Controll
    RN_PCI2C
    USB -> RS232 Wandler

    Software
    Visual Studio 2005 (vollversion)
    wsc4
    Windows XP

    PS: Falls ich den Beitrag im falschen Forum erstellt habe bitte ich um Nachsicht Grade entsprechend verschieben, danke

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Prinzipiell einfach:
    SDA und SCL sind oben ("ruhestellung")
    START---------------------------------------------
    SDA runter, pause, SCL runter.
    BYTE-senden---------------------------------------
    8 Mal ein Bit:
    SDA 0 oder 1, pause, SCL rauf, pause, SCL runter
    ACK/NAK holen:
    SDA rauf, pause, SCL rauf, schauen, ob SDA = 0 (ACK) oder 1 (NAK)
    SCL runter

    1. Adresse, dann die Bytes

    STOP---------------------------------------------
    SDA runter, pause, SCL rauf, pause, SDA rauf

    "pause" bestimmt die Geschwindigkeit, kannst du bei PC->RS232->I2C wahrscheinlich auch auslassen, so schnell geht das eh' nicht.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    Ich habs mal nach deinen Anweisungen entsprechend ausprobiert.
    Also wirklich jedes Bit einzeln gesendet.. kein erfolg :/

    Ich bräuchte nur das I2C_Beispiel Programm in C++ oder C

    Nen Codebeispiel in einer anderen Programmiersprache hilft vielleicht auch schon

    danke

    PS: Ich hab den Code nicht angehängt weil er fürchterlich lang ist...

  4. #4
    Kleiner Naschlag meinerseits

    Ich kann nun sicher seien, dass es an der Reihenfolge der Bits liegt, die auf die DTR bzw RTS Leitungen gelegt werden.
    -> Ich habe mir ein Port Analyzer installiert und mir angeschaut in welcher Reihenfolge die Leitungen vom RN_PCI2C Beispielprogramm beschalten werden und sie 1:1 in C++ nachgebildet und siehe da es funktionert.
    Dummerweise ist diese implementierung extrem umständlich ( für einen Befehl 300 zeilen code )

    Von daher such ich immer noch jemanden, der mir vielleicht ein Code Schnipsel in C / C++ zukommen lassen könnte *hust*

    Thorsten

  5. #5
    Ich hab mir nun einen "Treiber" geschrieben mit dem ich beliebige Daten via RS232->I2C Adapter auf den Bus schicken kann. Funktioniert soweit auch prima, aber die Sache hat ein Hacken...
    Ich benutzte dabei immer die Befehle set / clear RTS bzw set / clear DTR. Das hat zwei Nachteile:
    1. Ich muss neben der Start / Stopp Bedingung viermal auf die Serielle Schnittstelle zugreifen um eine einzige(!) null (eins) zu versenden. Macht bei einem 3 Byte Befehl etwa 1600 Zugriffe auf die Schnittstellle
    -> Die ganze Sache wird extrem langsam ...
    2. Es ist halt bissel unübersichtlich und hässlich

    Wenn ich nun zB 40 Befehle direkt hintereinander an RN_MotCntrl via I2C Bus schicke, dann benötige ich dafür etwa 6 Sek.
    Bei der Benutzung der Seriellen Schnittstelle von RN_MotCntrl benötige ich für die 40 Befehle etwa 0,5 Sekunden(!)
    Ich weiß nicht genau warum der Unterschied so heftig ist, aber ich vermute es liegt daran, dass ich bei der seriellen Übertragung die Bits nicht einzeln auf die Leitungen schalten muss, sondern immer direkt ein Byte Array schicken kann. ( normaler "print" Befehl )
    Ich hab es mehrfach probiert, ob ich nicht die Start Stopp Bedingung beim I2C Bus mit setzen der RTS / DTR Leitung generieren kann und dann die daten als Byte Array drüber jage. Das will bei mir aber nicht .. Hat da jemand schon mit Erfahrungen gemacht?

    Lange rede kurzer Sinn: Der I2C Bus ist ja recht beliebt, würde mich freuen, wenn Ihr mir kuez erklärt, mit welchen Befehlen ( egal welche Sprache, PC oder µC ) Ihr Eure Daten auf den Bus jagt.

    Vielen Dank im voraus
    Thorsten

    PS: Ich hoffe es ist nicht zulang geworden

  6. #6
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    07.11.2004
    Beiträge
    332
    Hi,

    ich verwende einen fertigen Treiber unter Linux 2.6 und habe hier keine Probleme.

    Kann es sein, das Du Deinen "Treiber" auf Applikationsebene geschrieben hat ?
    Normalerweise sollte es kein Problem sein, direkt auf die Port Bits zuzugreifen.

    Hier aber vielleicht ein netter Link:
    http://www.matronix.de/elektronik/i2c.php

    Gruss Ritchie
    Kaum macht man es richtig, schon funktioniert's ...

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test