Forum: PC-Programmierung Problem für Profis


von x86 (Gast)


Angehängte Dateien:

Lesenswert?

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 !

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
~

von Roland P. (pram)


Lesenswert?

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

von Roland P. (pram)


Lesenswert?


von x86 (Gast)


Lesenswert?

danke aber wozu nützen mir jetzt die pdf dateien ? Ich habe doch die 
ganze Hardware nicht hier... hmmm ???

von Roland P. (pram)


Lesenswert?

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

von x86 (Gast)


Lesenswert?

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

von Roland P. (pram)


Lesenswert?

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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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 ...

von x86 (Gast)


Lesenswert?

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.

von x86 (Gast)


Lesenswert?

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.

von Gast (Gast)


Lesenswert?

>Wie muss ich den diesen PIN auslesen ? Ganz einfach wie immer

Ja, genau so!

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
Noch kein Account? Hier anmelden.