Forum: Projekte & Code DS18S20 mit Visual Basic ohne µC auslesen


von Axel F. (afi)


Lesenswert?

Hallo,

seit einiger Zeit beschäftige ich mich mit der Temperaturerfassung in 
meinem Haus und der Heizungsanlage.

Relativ schnell fand ich den Lösungsansatz über den DS18S20:

- Schaltung: http://lena.franken.de/hardware/temperaturmessung.html
 (es gibt noch eine erweiterte Schaltung in der VCC auch integriert ist)

- digitemp Software auf Basis Windows

Mittels einer Access-Datenbank, Visual Basic 6 und digitemp habe ich
mir ein Programm gestrickt in der prinzipiell:

- Digitemp aufgerufen wird und Temperaturen in ein Textfile
  geschrieben werden
- Die Textdatei ausgelesen wird und die Temperaturen in die Datenbank
  geschrieben werden, mit Zeitstempel

Man könnte meinen das Projekt sei beendet, jedoch möchte ich ohne 
digitemp auskommen. Das Ziel ist, mit Visual Basic 6 und ev. MScomm die 
Auslesung
durch zu führen. Leider ist es mir bisher nicht gelungen trotz der Infos 
von Maxim den richtigen Ansatz zu finden. Seit Wochen suche ich im 
Internet.

Bitte um Hilfe!

Gruß Axel

von GG (Gast)


Lesenswert?

Servus Axel,

schau Dir mal die Seite an: http://www.fredhemme.de/ Temperaturmessung 
mit dem PC. Software kostet aber was!


Gruß GG

von Axel F. (afi)


Lesenswert?

Hallo GG,

mit Fred Hemme hatte ich bereits Kontakt, an den Kosten lag es 
sicherlich
nicht, denn er wollte nicht viel.

Jedoch hat er nicht das Programm zur Auslesung der DS 18S20 geschrieben, 
sondern zur Auswertung der gelesenen Daten. Dies habe ich bereits in 
meiner
Digitemp-Version via Visual Basic 6 auch geschrieben.

Mein Ziel ist es die Routine zur Auslesung der DS18S20 in Visual Basic 
durchzuführen.

Trotzdem vielen Dank für den Hinweis.

Gruß Axel

von Wittenhagen (Gast)


Lesenswert?

Hallo ich habe zwar keine Lösung für dein Projekt , aber ich würde mich 
freuen wenn du mir deine Erfahrungen und Lösungen zukommen lassen 
könntest denn ich arbeite auch an so einer Software die mir Temperatur 
ausliest .
beste grüsse von mir und viel Erfolg
Mfg Jörn

von Timo (Gast)


Lesenswert?

Servus,

ich habe vor einigen Jahren mal was damit in VB6 gemacht, sowohl Seriell 
als auch USB (Platinen habe ich noch, sind aber SMD). Als Grundlagen 
dienten die Routinen "TMEXLIB" von Maxim/Dallas. Such doch mal nach 
"TMEX".

Gruß

Timo

von Jörn W. (wittenhagen)


Lesenswert?

Hallo
ja das wäre ja super wenn du mir das erklären könntes wie ich den Ds1820 
mit VB anspreche ich bin ein absoluter Neuling . Habe grade mal nen 
wecker Programmiert und wollte mich nun mal daran wagen. Bitte könntest 
du mir das erklären im einzelnen ?Ich habe den Ds1820 so wie bei lena 
franken angeschlossen und es funktioniert auch mit Digitemp aber ich 
wollter ja was eigenes zum auslesen . Dachte mir das so :
Rom id auslesen ?
Temperatur auslesen und danach auf einem Label oder Textfeld anzeigen .
Ganz einfach und Simpel ohne Schnick Schnack ;-)
Danke im voraus . und einen schönen TAg noch
Gruss Jörn

von Timo (Gast)


Lesenswert?

Schau Dir mal das an. Die Beschreibung in ist aus C aber recht leicht in 
VB portierbar

1-Wire Ansteuerung via TMEX-API

Befehlsreferenz:
ftp://ftp.dalsemi.com/pub/auto_id/softdev/owdocs/Docs/TMEX/tmex3vlg.html

Genereller Ablauf:

    long integer SessionHandle   // global
    unsigned char m_Status[5125] // global

  1.StartSession
    short integer PortNum,PortType
    TMReadDefaultPort(&PortNum, &PortType)
    SessionHandle = TMExtendedStartSession(PortNum, PortType, Null)
    TMSetup (SessionHandle)


  2.SelectID (String 64Bit-ID)
    short int           ROM[9]
    String              sText
    while(TMNext(SessionHandle,&m_Status) > 0)
    {
      ROM [0] = 0
      TMRom(SessionHandle,&Status,&ROM)
      sText = ROM[7] + ROM[6] + ROM[5] + ROM[4] + ROM[3] + ROM[2] + 
ROM[1] +
ROM [0]
      if(sText == 64Bit-ID)
        return true // ID gefunden und jetzt aktiv
    }
    return false // ID nicht gefunden


  3.Gerätespezifische Kommandos
    [s.u.]

  4.StopSession
    TMClose(SessionHandle)  // wichtig, damit die Serielle Schnittstelle
wieder freigegeben wird !!!
    TMEndSession (SessionHandle)




Gerätespezifische Kommandos
z.B.Beispiel DS2408

  SetPort (Byte ToSet)
    unsigned char p[4]
    p[0] = 0x5A
    p [1] = ToSet
    p[2] = ~ToSet   // invertiert
    p[3] = 0xFF
    TMAccess(SessionHandle,&m_Status)
    TMBlockStream(SessionHandle,p,4)
    // zur Kontrolle: p[3] muß jetzt den Wert 0xAA enthalten

von JoachimB (Gast)


Lesenswert?

Das Grundproblem besteht im Interface. Die verwendeten 
Interfaceschaltungen bestehen aus ein paar Dioden und führen nur eine 
Pegelanpassung durch. Das Timing muß vom PC abgewickelt werden.
Dazu benötigt man den Durchgriff auf die Schnittstelle.
Unter Turbo Pascal und WIN95 / WIN98 funktionierte das so:

function resetcom(n:byte):boolean;
{ Diese Funktion initialisiert den Port N. Wenn alles ok ist,
  gibt die Funktion TRUE zurück, andernfalls FALSE. }
var
  s : array [1..4] of word absolute $40:0;
begin
  resetcom := false; SPA := 0;                {  }
  if (n>0) and (n<5) and (s[n] > 0) then begin { COM1..COM4 }
    spa := s[n];                            { Adresse laden }
    port[spa+3] := $83;                { Teiler adressieren }
    port[spa  ] :=   1;                        { 115200 bps }
    port[spa+1] :=   0;                        { 115200 bps }
    port[spa+3] :=   3;        { 8 Daten, 1 Stop, No Parity }
    port[spa+1] :=   0;                     { no interrupts }
    port[spa+4] :=   1;                  { RTS aus, DTR ein }
    m:=t+10; repeat until (m<t);
                        { Betriebsspannung muß einschwingen }
    port[spa+4] :=   3;                   { RTS und DTR ein }
    resetcom := true
  end
end;

function touchreset:boolean;
{ Diese Funktion sendet ein Reset-Signal auf den aktuellen Port.
  Wenn ein Chip erkannt wurde, gibt die Funktion TRUE zurück,
  andernfalls FALSE. }
var
  f : boolean;
  x,y : Byte;
begin
  touchreset := false;
  m:=t+1; repeat until (t>m);
  m:=t+1;
  repeat until port[spa+5] and $60 = $60;
  { warten, bis Trmshiftreg und Trmholdreg leer }
  while odd(port[spa+5]) do x := port[spa];
  { alle Empfangsregister 'leerlesen' }
  port[spa+3] := $83;    { Teiler adressieren }
  port[spa+1] :=   0;    { 10473 bps }
  port[spa  ] :=  11;    { 10473 bps }
  port[spa+3] :=   3;    { 8 Daten, 1 Stop, No Parity }
  port[spa  ] := $F0;    { Reset-Puls senden }
  repeat                 { Auf Zeichen oder timeout warten }
    y:= port[spa+5];     { Statusregister lesen }
    f:= odd(y);          { f := Data ready }
  until f or (t>m);
  if f then x:= port[spa] else x:= $F0;
  if (x<>$F0) then begin
    touchreset := true;
    if ((y and $18)<>0) then begin { wenn break oder framing error }
      repeat until port[spa+5] and $60 = $60;
      { warten bis Trmshiftreg und Trmholdreg leer }
      repeat f:= odd(port[spa+5]) until f or (t>m);
      if f then x:= port[spa] { Empfangsregister 'leerlesen' }
    end
  end;
  port[spa+3] := $83;    { Teiler adressieren }
  port[spa  ] :=   1;    { 115200 bps }
  port[spa+3] :=   3     { 8 Daten, 1 Stop, No Parity }
end;

Die heute aktuellen Betriebssysteme lassen das Anwenderprogramm nicht 
mehr direkt an die Schnittstellen. Damit wird es schwierig, das Timing 
sicherzustellen.

Die Alternative besteht darin ein Interface-IC für den one-wire-bus zu 
benutzen, dass seriell angesprochen wird. (Gibt es bei Dallas)
Diese Adapter sich jedoch zur Zeit eher selten anzutreffen.

Gruß
Joachim

von Axel F. (afi)


Lesenswert?

Hallo alle zusammen,

mein Beruf hat mich mal wieder komplett unter Kontrolle, laßt
mir etwas Zeit.

Vielen Dank für alle Infos, ich werde sie auswerten.

Grüsse Axel

von Jörn W. (wittenhagen)


Lesenswert?

Hallo
Mensch ist das schwierig aber gut von nichts kommt ja auch nichts. Also 
ich möchte das Programm ausschlieslich mit einer alten Win Version 98 
nutzen  . Können wir das gemeinsam zusammenstricken ? So das ich das 
lernen kann ? Ich habe VB 6 instaliert auf meinen alten Laptop , und da 
ist auch die digitemp Software drauf . So nun wollen wir mal anfangen 
;-)
Ich eröffne ein neues Project = Standart exe
eine neue Form erscheint und ich lege mein Visuelles design fest
einen Button   zum einschalten
einen Timer    für das Timing
einen MsComm   zum öffnen der com 1 Schnittstelle ( die bleibt auch 
immer comm 1 )
und ein Label  zum anzeigen der Daten
wenn ich nun doppelt auf den Button klicke ,
würde ich erst

MSComm1.CommPort = 1                 ' Use Com1 as the default Com port
    MSComm1.Settings = "9600,N,8,1"  ' 9600 baud, no parity, 8 data,
                                     '   and 1 stop bit.
schreiben und nun """""Hilfe """"

P.S wir arbeiten das schon aus denke ich :-) Danke für eure Hilfe
Gruss Jörn

von JoachimB (Gast)


Lesenswert?

Hallo Jörn,

einen Anfang hast Du nun bereits getan und auf Schwierigkeiten bist Du 
mental eingestimmt.

Wie Du an dem oben stehenden Pascal-Code siehst, sollte man den UART zur 
Initialisierung des one-wire-Busses auf 10473 bps einstellen. Warum das 
so ist kannst Du hier nachlesen:

http://www.maxim-ic.com/appnotes.cfm/an_pk/214

Dieser Applikationbericht wird Dir bei der Realisierung deines Projektes 
eine Hilfe sein!

Gruß
Joachim

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.