1Wire Temperaturmessung für PI-Regelung

also wenn in dem MSb steht ob mein Wert positiv oder negativ ist,
dann müsste man doch mit
Code:
dim test as byte
test = scratch(2)
if test = 0 then 
print "p"
else 
print "n"

denn wenn in dem MSB
1111 1111 (dez 255) für n und
0000 0000 (dez 0) für p drinsteht
machen können oder?
oder hab ich jetzt schon wieder zu komisch gedacht ?
 
Hallo,

also wenn in dem MSb steht ob mein Wert positiv oder negativ ist,
dann müsste man doch mit
Code:
dim test as byte
test = scratch(2)
if test = 0 then 
print "p"
else 
print "n"

denn wenn in dem MSB
1111 1111 (dez 255) für n und
0000 0000 (dez 0) für p drinsteht
machen können oder?
oder hab ich jetzt schon wieder zu komisch gedacht ?
Die folgende Tabelle ist aus dem Datenblatt des DS18S20 und von mir
farblich etwas aufgehübscht ...

Code:
[FONT="Courier New"]Table 1. Temperature/Data Relationship

  °C   |        BINARY        |  HEX
-------+----------------------+-------
+85.0* | [COLOR="Red"]0000 0000[/COLOR]  1010 1010 | [COLOR="Red"]00[/COLOR]AAh
+25.0  | [COLOR="Red"]0000 0000[/COLOR]  0011 0010 | [COLOR="Red"]00[/COLOR]32h
 +0.5  | [COLOR="Red"]0000 0000[/COLOR]  0000 0001 | [COLOR="Red"]00[/COLOR]01h 
  0    | [COLOR="Red"]0000 0000[/COLOR]  0000 0000 | [COLOR="Red"]00[/COLOR]00h Plus
       |                      |
 -0.5  | [COLOR="Red"]1111 1111[/COLOR]  1111 1111 | [COLOR="Red"]FF[/COLOR]FFh Minus
-25.0  | [COLOR="Red"]1111 1111[/COLOR]  1100 1110 | [COLOR="Red"]FF[/COLOR]CEh
-55.0  | [COLOR="Red"]1111 1111[/COLOR]  1001 0010 | [COLOR="Red"]FF[/COLOR]92h
       | [COLOR="Red"]---MSB---[/COLOR]  ---LSB--- |  [/FONT]

*The power-on reset value of the temperature register is +85°C.
Die Tabelle ist auf Seite 4 des Datenblattes.
Anhang anzeigen DS18S20_HighPrecisionDigitalThermometer.pdf

Die Zahlen sind im Zweierkomplement. Natürlich kannst du mit der Abfrage
des MSB auf 0x00 oder 0xFF auf positive oder negative Temperaturen
entscheiden aber der Sinn ist eigentlich das Rechnen im Zweierkomplement.
Bei 16Bit Breite (Word) hat man direkt in der Berechnung positive oder
negative Zahlen da man den Bereich von 0...65535 nach -32767..0..+32767
geändert hat. Diese Veränderung passiert durch die Bildung des
Zweierkomplements.

Gruß
Dino
 
dank eisiger aussentemperaturen konnte ich heut morgen mal testen was denn da so schönes ausgegebene wird, und siehe da das Minus steht schon in meinem wert :) dann ist ja alles ok,.
 
die Lüfter welche ich regeln m öchte, verwirren mich,
auf dem Typenschild steht, 12V, 1.15A, messe ich jetzt nach (hab 2mal 2 Stück) paralell und das ganze 2 mal,. also insgesamt 2x2x2 Lüfter also 2 mal 4 parallel, und ich kann an einem "strang" nur ne Stromaufnahme von 0,3A messen? kann das normal sein oder is mein messgerät fürn arsch?

hab nochma nachgemssenbei 12V hab ich ne max stromaufnahme von 0,4A, aber nur an einem strang an dem anderen Strang hab ich nur 0,3A

EDIT. es handelt sich um das folgende Konstrukt / Produkt,.
http://www.pollin.de/shop/dt/MTk3OTc2OTk-/Bauelemente/Luefter/Lueftereinheit_371708_001.html
 
komisch komisch, hab jetzt noch leichte modifikatioenen vorgenommen am programm, jetzt startet es einfach nicht mehr, bekomme keine ausgabe am RS232 und keine Ausgabe mehr,. erkennat wird er und beschreiben lässt er sich ohne probleme,.
hier mein prog,.
Code:
'HEADER##########################################
$regfile = "m8def.dat"                                      'Chip
$baud = 9600                                                'Baud für RS232
$crystal = 8000000                                          'Quarz auf 8mhz eingestellt
$hwstack = 32                                               'Standardwert 32 für hardware stack
$swstack = 10                                               'Standardwert 10 für the SW stack
$framesize = 40                                             'Standardwert 40 für the frame space
'Ein/Ausgänge configurieren
Config 1wire = Portd.2                                      '1-Wire Pins Configurieren
Config Portb.1 = Output                                     'PWM Out1
Config Portb.2 = Output                                     'PWM Out2
Config Portd.3 = Output                                     'Piezo

'Ein/Ausgängen Namen Zuweisen
Piezo Alias Portd.3

'Declarationen
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 1024
Declare Function Piregler(byval Istwert As Single , Channel As Byte) As Single

'Variablen Config
Dim Scratch(9) As Byte                                      'werte des Temp sensors
Dim Temp As Word                                            'temperatur vorverarbeitungswert
Dim Temp1 As Integer                                        'temporärer tempwert
Dim Ist_temp1 As Single                                     'ist temperatur Gehäuse
Dim Ist_temp2 As Single                                     'ist temperatur Kühler
Dim Sensor1(8) As Byte                                      'Array Sensor Gehäuse
Dim Sensor2(8) As Byte                                      'Array Sensor Kühler
Dim Ausgabe As Single
Dim Piregel1 As Single
Dim Piregel2 As Single
Dim I As Byte                                               'zählervariable bis 255
Dim Change1 As Byte                                         'wandelt das ergbnis der Funktion Pi_regler in Word format
Dim Change2 As Byte                                         'wandelt das ergbnis der Funktion Pi_regler in Word format
Dim Alarm As Single                                         'alarm temperatur!
Dim Sollwert As Single                                      'Sollwert = Gewünschte Temp
Dim Regelgroesse As Single                                  'Ergebnis der PI_regler funktion
Dim Kri As Integer                                          'Integrierbeiwert
Dim Krp As Integer                                          'Proportionalbeiwert
Dim Channel As Word                                         'Enthält Kanal change oder change1
'Dim T As Byte                                               'Integrierzeit

'Variablen setzen
'T = 1                                                       'integrierzeit auf 1 Setzen
Kri = 1
Krp = 20                                                    '20
Sollwert = 30                                               'Sollwert auf 40°C setzen
Alarm = 70                                                  'Alarmtemperatur
'$sim

'PROGRAMM########################################
Sensor1(1) = 1wsearchfirst()                                'Suche nach erstem Gerät am Bus
   If Err = 0 Then                                          'Wenns ein Gerät am Bus gibt
      Do                                                    'Nach Weiterem Gerät Suchen
         Sensor2(1) = 1wsearchnext()                        'Bis es keine mehr gibt
      Loop Until Err = 1
   End If
    'Print Hex(sensor1(1))                                   'familycode sensor1 ausgeben
    'Print Hex(sensor2(1))                                   'familycode sensor2 ausgeben

Do                                                          'Beginn Der Hauptschleife
   Enable Timer1
   Start Timer1

'Temp auslesen von DS18S20 Gehäusetemp, Family code &H10=(dez)16
   1wreset                                                  ' Initialisierung
   1wwrite &HCC                                             ' überspringe ROM-Befehl
   1wwrite &H44                                             ' Temperaturmessung anstoßen
   Wait 1                                                   ' warten bis Messung fertig
   1wreset                                                  ' Initialisierung
   1wverify Sensor1(1)                                      'sensor mit bestimmter id ansprechen
   1wwrite &HBE                                             ' Temperatur auslesen
   Scratch(1) = 1wread(9)                                   'scratchpad auslesen
   Temp = Scratch(2)
   Shift Temp , Left , 8
   Temp = Temp + Scratch(1)
   Temp1 = Temp
   Temp1 = Temp1 / 2
   Ist_temp1 = Scratch(8) - Scratch(7)
   Ist_temp1 = Ist_temp1 / Scratch(8)
   Ist_temp1 = Ist_temp1 + Temp1
   Ist_temp1 = Ist_temp1 - 0.25

'Temp auslesen von DS1822 Kühlertemp, Family code &H22=(dez)34
   1wreset                                                  ' Initialisierung
   1wwrite &HCC                                             ' überspringe ROM-Befehl
   1wwrite &H44                                             ' Temperaturmessung anstoßen
   Wait 1                                                   ' warten bis Messung fertig
   1wreset                                                  ' Initialisierung
   1wverify Sensor2(1)                                      ' sensor mit bestimmter id ansprechen
   1wwrite &HBE                                             ' Temperatur auslesen
   Scratch(1) = 1wread(9)                                   'scratchpad auslesen
   Temp = Scratch(2)                                        'MSB holen
   Shift Temp , Left , 8                                    'Platz für LSB machen
   Temp = Temp + Scratch(1)                                 'zu Word Format zusammenfügen
   Temp1 = Temp                                             'Integer Format
   Temp1 = Temp1 / 16
   Ist_temp2 = Scratch(8) - Scratch(7)
   Ist_temp2 = Ist_temp2 / Scratch(8)
   Ist_temp2 = Ist_temp2 + Temp1
   Ist_temp2 = Ist_temp2 - 0.25

'sonstige Ausgaben############################
   Piregel2 = Piregler(ist_temp2 , Change2)
   Piregel1 = Piregler(ist_temp1 , Change1)
   Change2 = Piregel2
   Change1 = Piregel1                                       'in typ word wandeln
   Compare1b = Change1                                      'Gehäuselküfter                   'weisst compare1a den wert von Change zu
   Compare1a = Change2                                      'Kühlerlüfter

   'KONTROLLWERTE ÜBERMITTELN ÜBER RS232
   'Print "PWM1 " ; Change1 ; " | Temp:" ; Ist_temp1;
   'Print
   'Print "PWM2 " ; Change2 ; " | Temp:" ; Ist_temp2;
   'Print
   If Ist_temp1 > Alarm Then
       Set Piezo
       'Print "Ton-ausgabe AN";
       'Print
   Else
       'Print "Ton-ausgabe AUS";
       'Print
       Reset Piezo
   End If

Loop
End

'Funktion PI-Regeler#########################################
Function Piregler(byval Istwert As Single , Channel As Word) As Byte
      Local Regeldifferenz As Single                        'Regeldifferenz
      Local Pverstellung As Integer
      Local Iverstellung As Integer
      Local Tmp_i As Integer
      Local Tmp_i2 As Integer
      Local I_alt As Integer
      Regeldifferenz = Istwert - Sollwert
      'prüfen ob Regelung überhaupt angewendet werden soll
      If Regeldifferenz >= 0 Then

        'P-Anteil
        Pverstellung = Regeldifferenz * Krp
        If Pverstellung < 0 Then Pverstellung = 0
        If Pverstellung > 255 Then Pverstellung = 255

        'I Anteil
        Tmp_i = Regeldifferenz * Kri
        Tmp_i2 = Tmp_i                                      '/ T
        'Iverstellung = Tmp_i2 + I_alt
        I_alt = Iverstellung
        If Channel < 255 Then                               ' Integral wirkt erst im Regelbereich
           Iverstellung = Tmp_i2 + I_alt
        Else
           Iverstellung = Tmp_i2
        End If

        If Iverstellung < 0 Then Iverstellung = 0
        If Iverstellung > 255 Then Iverstellung = 255

        'Ergebnis
        Ausgabe = Iverstellung + Pverstellung
        If Ausgabe < 0 Then Ausgabe = 0
        If Ausgabe > 255 Then Ausgabe = 255

        'Print "Stellgroesse: " ; Test2 ; " | Temp: " ; Istwert ; " | P: " ; Pverstellung ; " | I: " ; Iverstellung ;
        'Print
      Else
         Ausgabe = 0
      End If

      Piregler = Ausgabe                                    'entspricht der regelgröße
End Function
 
Hallo Bonze,
wenn ich das richtig sehe, hast du alle Prints auskommentiert.
Ob bei der PWM etwas rauskommen kann, hängt von vielen Faktoren ab, die aus der ferne schlecht vorherzusagen sind.
Schalte doch erst einmal die Prints wieder ein.

HBA
 
ok, bin blöd,.
:D
geht jetzt nochma, allerdings hab ich das prob das die ausgabe nach ca 5 meldungen einfach stehene bleibt und ich denke der mega sich aufhängt?
kann das sein ?
 
komisch hab über ne stunde gesucht un nixgefunden dabei wars wahrscheinlich die kombi aus nem wackler, und das ich alle print ausgaben entfernt hatte :(

aber mal was anderes mein PWm wert scheint zu schwingen ?
auf 255 dann auf 0,. obowohl ne differenz zwischen sollwert und istwert besteht?


so,. hier mal ein grafisch aufgewerte Darstellung der Regelung, würde sagen 1a Kurve,.
 

Anhänge

  • pi-regler.jpg
    pi-regler.jpg
    46,6 KB · Aufrufe: 10
mal was anderes kann ich irgendwie einfügen das falls 1 oder beide Sensoren ausfallen sollten, einfach die Lüfter auf dauerbetrieb laufen?
wie geht das?
Code:
if Err=1 
           Set PWM1=255
           Set PWM2=255
else 
           führe den normalen Code aus 
endif
 
hab festgestellt das meine 1wire sensoren nur bei ca jedem 5 Messvorgang einen plausibln wert liefern, bzw bei 4 von 5 Messungen der CRC wert nicht stimmt,.,
ist das schlimm? woher kann das kommen?
 
mh so jetzt ists doch schlkimm, denn es zeigt mir nen wert von 154°C an , und somit geht mein piezo andauernd an, könnte mir also jemand sagen wie ich die crc überprüfung realisieren kann ?
 
Hallo Bonze,
in BASCOM ist die CRC8() Funktion integriert. Aufgerufen mit den ersten 8 Byte des 1wRead liefert es die CRC für diese zurück, die du dann gegen das 9. Byte des 1wRead vergleichen kannst. Bei Übereinstimmung war die Übertragung in Ordnung.

HBA
 
Nee, so
If scratch(9) = crc8(scratch(1),8) Then
...
End If

Siehe auch die Hilfe zu crc8().
Arrays sind übrigens 1-basiert.

HBA
 
Ds1820

Hallo,


Aus dem Datenblatt ...

64Bit = 8Bit+8Bit+8Bit+8Bit+8Bit+8Bit+8Bit+8Bit = 8Byte


2^0 = 1
2^1 = 2
2^2 = 4
2^3 = 8
2^4 = 16
2^BitNr = Wertigkeit
2^BitAnzahl = Anzahl der möglichen Werte
Also sind 2^7 = 128 Also ist bei einem Byte (Bit0, Bit1, ...) Bit7 die
Wertigkeit 128
Bei 8 Bit (2^8) gibt es maximal 256 mögliche Werte (0,1,2,...,254,255)


Also da die 64Bit-Seriennummer/ID des Chips ein wenig aufgeteilt ist ...

8-Bit (1Byte) CRC / 48-Bit (6Byte) Seriennummer / 8-Bit (1Byte) FamilyCode

würde ich das in einem 2-Dimensionalen Array speichern. Ich weiß nicht so
recht wie das in Bascom gemacht wird ... Ich nehme mal so an ...

DIM OneWireSN (5, 8) as Byte
OneWireSN (1,1) = CRC Device1
OneWireSN (1,2) = AddrByte1 Device1
...
OneWireSN (1,7) = AddrByte6 Device1
OneWireSN (1,8) = FamilyCode Device1
OneWireSN (2,1) = CRC Device2

So könnte es gehen ... sieh dir das aber sicherheitshalber nochmal an.


Also wie gesagt 2dimesionales Array. Oder sowas. Ist wohl das einfachste.

EDIT: Also ich hab mal ein wenig gespielt und anscheinend kann Bascom nur
1-dimensionale Arrays. Also anders bezeichnet nur Listen. So ein Mist. Da muß
ich mir mal was überlegen ...
Anhang anzeigen 1841
mein 1Wire-Bus mit nem DS18S20 ;) Also mit Phantomspeisung und einem
Device am Bus läuft es schon. Aber ich wollte eigentlich ein Array mit den
gesamten SN der Devices anlegen. Geht aber nicht. Also werde ich wohl
ein Array mit 8 Zeichen langen Strings anlegen und in den Strings die
Seriennummern auf binärer Art ablegen. Wenn es nicht will dann biegt man
so lange bis es geht ;) Von hinten durch die Brust ins Auge :D :eek:

Gruß
Dino

Hallo Dino03
Das Programmieren mit der Seriennummer kannst du weglassen wenn du mit einem analog - MUX arbeitest (HC 4051)!
Ich arbeite mit acht DS1820 und HC4051 und es läuft gut.
Zudem hast du den Vorteil wenn ein Fühler kaputt ist, Fühler austauschen und alles geht wieder.
mfG. AVRfun
 
also meint ihr das ist sinnvoll?
Code:
Do

TEMp messen Sensor 1
(scratch auslesen usw)

Loop  until scratch(9) = crc8(scratch(1),8)
Code:
Do

TEMp messen Sensor 2
(scratch auslesen usw)

Loop  until scratch(9) = crc8(scratch(1),8)


ich hab nur angst das wenn er nicht die richtige Temp liest und es zu lange andauert mein Zeugs überhitzt,.

obwohl ich hab ja , oder versuche zumindest ne sperre einzubauen, das ab 50 oder so die ausgänge sofort auf 255 schalten,.
 
Wenn du mehrere Messstellen abfragst oder dein Programm noch andere Sachen machen soll, ist es schlecht, wenn es in einer Endlosschleife festhängen kann. Wenn die CRC-Prüfung z.B. wegen eines defekten Sensors permanent schief geht, kommt dein Programm da nicht mehr raus.
Da immer mal eine Übertragung gestört sein kann, habe ich es so gelöst, dass ich nur ein zweites mal abfrage, falls die erste CRC nicht funktioniert hat. Wenn die zweite auch fehlschlägt, macht er mit dem nächsten Sensor weiter, erhöht aber einen Zähler der Fehlversuche. Die Temperatur wird dabei als unverändert angenommen.
Kann der Sensor 10 mal nicht korrekt abgefragt werden, kommt ein Alarm, dass der Sensor defekt ist. Je nach Art der Messstelle geht das Programm dann in verschiedene Modi. War es z.B. die Kesseltemp., dann wird der Brenner abgeschaltet, war es die Wohnzimmer Temp. macht das Programm einfach weiter und lässt nur den Alarm stehen.
Du brauchst dazu einen Zähler pro Sensor. Jede erfolgreiche Messung setzt den entsprechenden Zähler wieder auf 0.

HBA
 
mh also
Code:
dim i as byte 'zähler sensor 1
dim i2 as byte 'zähler sensor 2
TEMP1 AUSLESEN
if scratch(9) <> crc8(scratch(1),8) then 
Do
scratch(9) = crc8(scratch(1),8)  'Temp 1 auslesen
i = i+1
Loop Until i = 2
else ....

so in etwa?
 
Ich würde die Do Schleife weglassen, ist ja eh nur ein zweites Mal:

Code:
dim fehlversuche1 as byte 'zähler sensor 1
dim fehlversuche2 as byte 'zähler sensor 2

<Temp Sensor 1 auslesen>
If scratch(9) <> crc8(scratch(1),8) then 
   <Temp Sensor 1 auslesen>
   If scratch(9) <> crc8(scratch(1),8) then 
      Incr fehlversuche1 
   Else
      fehlversuche1 = 0
   End If
Else
   fehlversuche1 = 0
End If
If fehlversuche1 = 0 Then
   <Temp Wert verarbeiten>
ElseIf fehlversuche1 = 10 Then
   <Alarm sensor 1>               'mach was
End If
Um nicht alles doppelt zu schreiben (oder wenn es denn mal mehr Sensoren werden noch öfter) solltest du mal überlegen, ob du den Code nicht so ändern kannst, dass du eine Schleife über alle Sensoren durchlaufen lässt.

HBA
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)