Ok noch mal langsam:
Der Schaltplan ist keine normal RS232 über tragung sondern was getrickste wo die Steuerleitung als daten leitungen misbraucht werden. das ist aber nicht schlimm.
Code:
Private Sub Form_Load()
On Error Resume Next
MSComm1.Settings = "9600,N,8,1"
MSComm1.CommPort = 1
MSComm1.PortOpen = True
MSComm1.DTREnable = False
MSComm1.RTSEnable = True
End Sub
Öffnet der Comport 1 und stellt die Übertragungsrate auf 9600 Baud bei deien Schlatung aber föllig egal
Code:
DCB CommDCB;
COMMTIMEOUTS timeout;
long ret;
char s[100];
sprintf(s, "COM%d", ComPort);
hdCOMM = CreateFile(s,
(GENERIC_READ | GENERIC_WRITE), 0, NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED | FILE_FLAG_NO_BUFFERING,
NULL);
if ( hdCOMM != INVALID_HANDLE_VALUE )
{
ret = SetupComm(hdCOMM, 1024, 1024);
sprintf(s, "COM%d: baud=38400 parity=N data=8 stop=1", ComPort);
memset(&CommDCB, 0, sizeof(DCB));
CommDCB.DCBlength = sizeof(DCB);
ret = BuildCommDCB(s, &CommDCB);
CommDCB.DCBlength = sizeof(DCB);
CommDCB.fBinary = 1; // Binary Mode
CommDCB.fParity = 0; // No Parity Check
CommDCB.fOutxCtsFlow = 0; // CTS ignored
CommDCB.fOutxDsrFlow = 0; // DSR ignored
// CommDCB.fDtrControl = ; // DTR ignored
CommDCB.fDsrSensitivity = 0; //
CommDCB.fTXContinueOnXoff = 1;
CommDCB.fOutX = 1;
CommDCB.fInX = 1;
CommDCB.fAbortOnError = 0; // Ignore Errors
CommDCB.XoffLim = 100;
CommDCB.XonLim = 500;
CommDCB.XonChar = 17;
CommDCB.XoffChar = 19;
ret = SetCommState(hdCOMM, &CommDCB);
timeout.ReadIntervalTimeout = MAXDWORD; // Read returns if no chars available
timeout.ReadTotalTimeoutMultiplier = 0; // "
timeout.ReadTotalTimeoutConstant = 0; // "
timeout.WriteTotalTimeoutMultiplier = 3;
timeout.WriteTotalTimeoutConstant = 20;
ret = SetCommTimeouts(hdCOMM, &timeout);
Das Selbe in C++
Code:
Private Function TLC548_GetData() As Byte
Dim i As Integer, temp As Byte
temp = 0
MSComm1.RTSEnable = False 'Setze Chip Select low
For i = 7 To 0 Step -1
MSComm1.DTREnable = True 'Steigende Taktflanke
If MSComm1.CTSHolding = True Then 'Datenbit einlesen
temp = temp + 2 ^ i
End If
MSComm1.DTREnable = False 'fallende Taktflanke
Next
MSComm1.RTSEnable = False 'Setze Chip Select wieder hi
TLC548_GetData = temp
End Function
damit wird der Chip gelesen
RTSEnable = false / Steueer leitung aus low stellen damit der weiß das ich jetzt daten holen will.
DTREnable = true Takt auf High dann kannst du das erste bit lesen
mit MSComm1.CTSHolding wenn das wahr ist dann sende der chip eine 1
wenn false dann eine 0 dann takt wieder aus. und das ganze von vorne
bis wir 8 bit zusammen haben dann hast du den wert den der AD gemessen hast. Die schaltung ist meines erachtes so da man damit 0 bis 5V messen kann. Aber da müssen dir die Hardwar jung noch mal helfen / drüber gucken. Also wenn meine Annahme stimmt und du an den ein gang 5 V legst sollte der Chip 8 mal eine 1 bringen. also 255 als zahl.
8 bit bei 5v macht eine Auflösung von 0,01 Volt.
Gruß
Lesezeichen