PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : I2C-Bus an Ser. Port mit C++



Tacpin
23.02.2005, 18:30
Hallo zusammen,

ich habe mir einen I2C Bus Adapter zusammengebaut und möchte mich mit einer externen Hardware unterhalten.
Nur habe ich bisher nur VB Programme gefunden. Mein Projekt beinhaltet bereits eine menge C Quellcode und den möchte ich nicht unschreiben müssen.
Da ich nun nicht die nötwendige Zeit habe mich in das Telegrammbild des I2C Busses einzuarbeiten, möchte ich die Frage an euch alle richten ob jemand soetwas bereits fertig hat und bereit ist mir das zukommen zu lassen?
Ich meine eine Funktion die das Senden vorbereitet (Port bei Windows frei machen) und eine die zum absenden der Telegramme verwendet werden kann.

Für eure Hinweise währe ich sehr dankbar.

MfG
Sebatian

Tacpin
28.02.2005, 20:50
Hallo zusammen,

wo sind die Experten? Laßt mich bitte nicht im Regen stehen?!

MfG
Sebastian

28.02.2005, 22:34
Sorry... könntest du dein Problem noch ein bisschen näher beschreiben? Was für einen Adapter hast du gebaut? I²C auf was?
Von wo aus willst du steuern? Vom PC. Oder?
Und welche externe Hardware willst du über den I²C Bus ansteuern?

coolchip
28.02.2005, 22:35
Sorry, war nicht eingelogged. :-(

X-Ultra
01.03.2005, 19:50
Das meiste hat er doch geschrieben: Er hat einen Adapter von serieller SChnittstelle auf I²C gebastelt. Jetzt sucht er Software oder Programmschnippsel in C, die ihm das Senden von Daten über die serielle Schnittstelle ermöglichen.

coolchip
01.03.2005, 20:15
Echt? Wo hat er denn was von serieller Schnittstelle geschrieben? Aber egal, das ist hier ja nicht das Thema.

Mit der seriellen Schnittstelle unter Windows kenne ich mich leider nicht so aus.

02.03.2005, 10:41
Das ansprechen des COMPorts unter c ist eigentlich recht einfach.



//================================================== =========================//
// Copyright 01.05 Michael Sonst für Systeme Helmholz GmbH, Weisendorf //
// //
// Autor : Michael Sonst //
// Version : 1.1 //
// Erstellt am : 21.01.2005 //
// //
//================================================== =========================//
s8 IsWinNT()
{
OSVERSIONINFO OSinfo;
OSinfo.dwOSVersionInfoSize = sizeof(OSinfo);
GetVersionEx(&OSinfo);
return(OSinfo.dwPlatformId == VER_PLATFORM_WIN32_NT);
}
//---------------------------------------------------------------------------
void __fastcall EnumComPorts(TComboBox* combobox)
{
if(combobox==NULL)return;
combobox->Clear();

s8 Name[16];
HANDLE hCom;
u8 maxport;

if(IsWinNT())maxport=99;
else maxport=9;

for(s32 i=0; i<maxport; i++){
Name[0] = '\0';
strcat(Name, "COM"); strcat(Name, IntToStr(i).c_str());
hCom = CreateFile ( Name, // name of comport
(GENERIC_READ | GENERIC_WRITE), // access mode
0, // only exclusive open a comport
NULL, // security none
OPEN_EXISTING, // only if exist
FILE_FLAG_OVERLAPPED, // open with overlapped structure FILE_ATTRIBUTE_NORMAL
0); // always zero

if(hCom != INVALID_HANDLE_VALUE){
combobox->AddItem("COM"+IntToStr(i), (TObject*)i); //abuse TObject
CloseHandle(hCom);
}
}
}


Danach kannst du den Filedeskriptor wie eine Datei verwenden.
Schau dir doch mal die im quellcode verfügbaren Komponenten an.
(www.torry.com)

Gruss
Michael

FoCus
02.03.2005, 10:51
Sorry war nicht eingeloggt...
Schau dich unter anderem in der MSDN nach GetCommModemStatus und EscapeCommFunction um. Damit kannst du die Signale am COM lesen und schreiben.

ps: www.torry.com war falsch meinte http://www.torry.net.

Gruss
Michael

Tacpin
02.03.2005, 15:54
Wie bereits richtig vermutet wurde möchte ich die Serielle Schnittstelle nutzen. Der Adapter stammt von Roboter Hardware. Auf eine Serielle Schmittstelle zugreifen, das bekomme ich ja sogar hin, nur klappt das mit den Pegeln nicht. Sprich das Bitmuster zu erzeugen, welches den I2C Bus zu darstellt.

Aber soweit schon mal vielen dank.

Hat den jemand etwas, was bereits fertig ist?
Wenn ich einen Baustein verwende der an den Bus gehangen wird und 8 Ausgänge bereit stellt. Welche maximale Frequenz kann ich an einem der Ausgänge erzeugen? Und welchen Baustein würdet Ihr empfehlen?

MfG
Sebastian

Tacpin
05.03.2005, 12:25
Bitte helft mir nocheinmal auf die Sprünge...

FoCus
07.03.2005, 08:28
Meinst du die maximale Frequenz die hinter dem Comport rauskommt??
Die ergibt sich aus deiner Baudrate und deiner Codegeschwindigkeit.
Ich glaube ich verstehe dein Problem nicht richtig?!Was soll mit den Pegeln nicht stimmen?! -Die hast du doch garnicht im Griff...das machen doch der max und der 7406 für dich. Oder meinst du, du weisst nicht wie die signale nachher auf dem Bus aussehen sollen, bzw. wie, wann das SDL zu kommen hat?

Gruss
Michael

Tacpin
07.03.2005, 20:40
Genau, ich glaube Du hast mich verstanden. Einen COM-Port auf "normale" Art und Weise zu betreiben finde ich gich wirklich schwer, nur die Bits einzeln anzusprechen. Gleichzeitig fehlt mir das Verständnis über Bitmuster welches auszugeben ist. Sprich, welches Bit muß wann welchen Pegel haben um den Bus ans laufen zu bringen???

FoCus
08.03.2005, 08:07
Prinzipiell hat man zwei Probleme:
1) Pins am Comport müssen bitweise angesprochen werden
2) Um das Programm nicht immer die Pins abfragen zu müssen wird ein bzw. mehrere Interrupts benötigt.

zu1)
Es gibt an dem Port nichtnur Datenbits, sondern auch Statusleitungen (RTS, CTS, DTR, ..) Diese können einzeln angesproche/gesetztn werden und
zu2) sie besitzen die Möglichkeit Interrupts auszulösen.

Das Setzen eines Bits geschieht mit EscapeCommFunction ( http://msdn.microsoft.com/library/en-us/devio/base/escapecommfunction.asp?frame=true ).
Du solltest mit SetCommMask ( http://msdn.microsoft.com/library/en-us/devio/base/setcommmask.asp?frame=true ) festlegen, auf welche Events reagiert werden soll, desweiteren solltest du dir in deinem Programm einen Thread erzeugen, der immer wieder auf ein WaitCommEvent ( http://msdn.microsoft.com/library/en-us/devio/base/waitcommevent.asp?frame=true ) aufläuft. Diese Funktion wartet darauf, dass die in LPDWORD lpEvtMask festgelegten Interrupts/Events auftreten.
Kehrt die Funktion mit true zurück musst du prüfen, welches der Events aufgetreten ist (leider). Dies geschieht mit GetCommModemStatus ( http://msdn.microsoft.com/library/en-us/devio/base/getcommmodemstatus.asp?frame=true ).
Danach vergleichst du beim Auftreten eines Events die beiden Leitungen miteinander und wertest dies aus.

Siehe auch ( http://www.eseo.de/i2c.htm )

Start Condition = SDA(high->low)&&SCL(high)
Data = (SDA(high->low)||SDA(low->high))&&SCL(low)
Stop Condition = SDA(low->high)&&SCL(high)


Eine Übersicht über die ComApi-Funktionen findest du hier:
http://msdn.microsoft.com/library/en-us/devio/base/communications_functions.asp?frame=true


Hoffe ich konnte helfen.
Gruss
Michael

Tacpin
08.03.2005, 15:10
Hallo zusammen,

Du hast mir wirklich weiterhelfen können.
Nur hatte ich anfangs gehofft den Code nicht erst noch erstellen zu müssen. Nun gut, mache ich mich an dieArbeit...

mfg
Sebastian :roll:

FoCus
08.03.2005, 17:55
Ums selbst Code erstellen kommt man meisstens nicht herum ;-)
Ausserdem würde man dann schliesslich nixmehr draus lernen...


Gruss
Michael