mikrocontroller.net

Forum: PC-Programmierung Problem für Profis


Autor: x86 (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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 !

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

Autor: Roland Praml (pram)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Roland Praml (pram)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: x86 (Gast)
Datum:

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

Autor: Roland Praml (pram)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: x86 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Roland Praml (pram)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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 ...

Autor: x86 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: x86 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Wie muss ich den diesen PIN auslesen ? Ganz einfach wie immer

Ja, genau so!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.