Ich bins wieder... ich habe jetzt mit Phillip, welcher auch hier im Forum aktiv ist, versucht ein Programm zu schreiben, womit man die Temperatur anzeigen lassen kann. Problem wie bekannt: Temperatursensor mit 11 Bit digital ausgang mit LPT auslesen... da man die 11 Bit nicht mit einem Packet verschicken kann, schickt der Sensor es mit 2 Packeten an den LPT..... --> Übertragungsprotokoll ist im ZIP Ordner: "IST_TSic_ZACwire_V2.3%20Digital%20Output_17-Oct-06.pdf" Datenblatt des Sensors ebenfalls im ZIP Ordner: ZMD TSic506 Data Sheet V3.6.pdf ************************************************************************ *** Hardware: Sensor LPT ------------------------------------- VCC---------- 1k ---------- D0 (PIN2) DATA OUTPUT ---------------- Select (PIN13);Input Only Pin GND ------------------------PIN 25 & 24 Zur entstörung 100nF nach Masse geschaltet. Natürlich so nahe am Sensor wie es geht. ************************************************************************ *** Source Code (Visual Basic); gearbeitet wird mit VB 2005 Express Edition ######################################################################## ## Wir haben mit diesem Code mal ausgeben lassen was für Zustände die einzelnen Bits haben. So eine Art "Oszilloskop" Public Declare Function Inp Lib "inpout32.dll" Alias _ "Inp32" (ByVal PortAddress As Short) As Short Public Declare Sub Out Lib "inpout32.dll" Alias _ "Out32" (ByVal PortAddress As Short, ByVal Value As Short) Sub Main() Dim data(2000) As Boolean Dim i, t As Integer Call Out(&H378, 1) '// Speisespannung Do While (Inp(&H379) And &H10) <> 0 'Auf die erste fallende Flanke warten Loop t = Environment.TickCount For i = 0 To 2000 If (Inp(&H379) And &H10) <> 0 Then data(i) = True End If Next t = Environment.TickCount - t 'Daten ausgeben Call Console.WriteLine("Die Messung dauerte " & t.ToString & "ms") For i = 0 To 2000 If data(i) Then Call s.Append("-"c) Else Call s.Append("_"c) End If Next Call InputBox("bla", "bli", s.ToString) End Sub Das Ergebnis befindet sich in der "Zeichnung.txt" Datei. Wir haben es dann mit per Hand "decodiert" Wie man in dieser Datei sehen kann, haben wir unser Ergebnis mit der Formel, die im Datenblatt ist, ausgerechnet und es kam auch ein realer Temperautrwert heraus. Das Protokoll des Sensors findet ihr im ZIP Ordner. (Sollte eventuell zu erst gelesen werden) Jetzt haben wir versucht ein Programm zu schreiben, womit wir das decodieren automatisieren können. Das Programm untersucht dabei die fallenden und steigenden Flanken. Leider ist in diesem Programm ein Fehler, es stürzt nach der Zeile "bitnummer -=1" bei der Do While Schleife ab: Index außerhalb des Arrays etc..." und wir finden es einfach nicht heraus woran es liegt. Der Source Code ist in der Datei "source.txt" Alle hier erwähnten Dateien sind in der ZIP Datei "Anhang.zip" vorhanden, welche im Dateihang zu finden ist. Ich hoffe ihr versteht den "source.txt". Danke ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~
Hi, warum hast jetzt noch nen 3. Thread zum gleichen Problem angefangen?? zuerst mal zum Messprinzip: du musst eigentlich nur die 4 verschiedenen Bittypen aus dem Datenstrom heraus suchen (Seite 3): im Datenblatt ist sogar ein Beispielcode in c drin. Das Problem das du haber hast, ist dass du das Timing ziemlich genau einhalten musst (es geht da um 60 µS, du hingegen misst in ms) und dass ist mit Windows alleine schon fast unmöglich und mit VB eigentlich komplett unmöglich. Ohne Hardwareunterstützung ist so ein kritisches Timing eigentlich nur mit einem Gerätetreiber einzuhalten. evtl schaust mal ob du vielleicht von LIRC (gibts auch für Windows) eine DLL oder so zweckentfremden kannst. Um möglichst schnell zum Ziel zu kommen würde ich deiner Stelle auf einen bewährten Sensor (z.B. DS1820) zurückgreifen, zu dem du im Internet auch eine Schaltung findest, wie man ihn an den PC anschließt. Das das Programm abstürzt, liegt an: i = i + tStrobe, da das > als 599 werden kann und data(i) da nicht definiert ist. Also vergiss den Fall, dass du das ohne Gerätetreiber/Hardwareunterstützung unter VB zum Laufen bekommst. Es ist einfach zu langsam, außerdem funken dir bei der Messung die Taskwechsel+ andere I/O Zugriffe dazwischen Gruß Roland
Hab hier was gefunden mit dem es gehen müsste: http://www.honestar.com/Data_zmd/31010/ZMD31010_Development_Kit.pdf http://www.zmd.de/pdf/ZMD31015_Development_Kit_rev0%203_20-Sep-06.pdf Gruß Roland
danke aber wozu nützen mir jetzt die pdf dateien ? Ich habe doch die ganze Hardware nicht hier... hmmm ???
Ich hab ja oben gesagt, dass es wahrscheinlich aussichtslos ist, das unter Windows (was nun mal kein Echtzeitbetriebssystem ist) und noch dazu unter VB vernünftig zum Laufen zu bringen. Du brauchst entweder einen Gerätetreiber, der die Schnittstelle auf eine Weise anspricht, in der die Zugriffszeiten (einigermaßen) deterministisch sind oder eben eine geeignete Hardwareunterstützung, welche dich beim Einlesen unterstützt. Hierfür wäre evtl LIRC geeignet, oder eben so ein Soundkarten-Oszi Dir wird bestimmt schon aufgefallen sein, dass bei "Die Messung dauerte x ms" jedes mal was anderes steht, oder? Wenn während der Messung nämlich ein Plattenzugriff oder ein Taskwechsel auftritt, kannst die Messung eigentlich schon vergessen. Du müsstest während der Messung dafür sorgen, dass kein anderer Prozess da was machen kann (und das mag Windows net so) Gruß Roland
Lieber Roland ;). Jaja du hast schon recht. Jetzt habe ich eine andere Idee würde gerne wissen ob diese geht: Ich verbinde den DATA Output Ausgang an einen PIN von einem MicroController (Hab hier Attiny 2313 und einen Atmega8 rumliegen) und lese die Daten dort aus und schicke sie dann an PC. Aber kann ich denn einfach PIN13 des LPTs an einen PIN des MC und PIN25 und 24 an GND des Controllers ranmachen und die Daten dann über diesen einen Kabel (PIN MC---PIN13 LPT) zum PC schicken ?. Danke
Nein, du bräuchtest eine timingunkritische Schnittstelle, z.B. I2C, SPI oder was eigenes. Der PC muss den Takt vorgeben, wie der Controller zu senden hat. Bsp für was eigenes: Du müsstest deinen Controller mit 3 Leitungen verbinden: PIN2 kurz HIGH vom LPT signalisiert den MC dass eine neue Messung beginnt PIN3 einmal HIGH und wieder LOW setzen signalisiert dem MC dass er das gelesene Datenbit an PIN13 anlegen soll. Demoprogramm für PC: // Starten der Messung PIN2 = HIGH; PIN2 = LOW; Wert = 0; for i = 1 to 11 do // nächstes Datenbit holen PIN3 = HIGH PIN3 = LOW // Datenbit einlesen und gleich in integer umwandeln Wert = Wert * 2; if (PIN13 == HIGH) then Wert = Wert + 1; end Gruß Roland
Wenn schon ein Controller verwendet wird, warum soll der dann noch über die ungeeignetste aller PC-Schnittstellen mit dem PC verbunden werden? Für sowas gibt es serielle Schnittstellen ...
Hallo Roland ! Wenn du meinst das es so Hardwaretechnisch möglich ist wird es wohl funktionieren. Ich werde es heute Abend erst testen können. Danke auch für das Demoprogramm.
So, Ich versuche gerade das Programm für den MC in BASCOM zu schreiben. Wie muss ich den diesen PIN auslesen ? Ganz einfach wie immer oder eine bestimmte Funktion benutzen wie z.B. 1wread(9) wobei 9 = Bit Anzahl ist. Die Funktion habe ich auf der Seite http://www.qsl.net/dg1xpz/elektronik/avr/ds1820.html gefunden, wo man einen DS1820 ausliest.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.