maximum / minimum Werte speichern

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.

    Hinweis kann nach Kenntnisnahme deaktiviert werden!

    • maximum / minimum Werte speichern

      Hallo,

      ich möchte den maximalen und minimalen Temperaturwert speichern.
      Als Sensor benutze ich den LM92.
      Ich erhalte im pos. und im neg. Temp.-bereich jeweils pos. Daten-Werte.
      Zusätzlich dazu das Vorzeichen.
      im Temp.-bereich von 0°C bis + 100°C geht das auch problemlos.
      Im Temp.-bereich von 0°C bis - 50°C funktioniert es teilweise.
      Kommt man vom pos. Temp.-Bereich nach minus werden die min. Werte richtig angezeigt, der minimalste Wert (z.B. -28,5 °C) wird gespeichert.
      Beim max. Wert funktioniert es nur solang, wie die aktuelle Temp kleiner wie der max. Wert ist (z.B +21,3°C).
      Dann wird als max. Wert die minimalste Temp. übernommen.
      Ich brauche bitte Unterstützung bei dieser Sache.
      Danke

      Anbei der Code-Auschnitt.

      Gruß
      Dago


      BASCOM-Quellcode

      1. Dim Lm92tempint As Word 'Temperaturwert als High- und Lowbyte zusammengefasst in richtiger Reihenfolge
      2. Dim Lm92tempbytehi As Byte at Lm92tempint + 1 Overlay 'LM92 Highbyte in Variable Lm92tempint
      3. Dim Lm92tempbytelo As Byte at Lm92tempint Overlay 'LM92 Lowbyte in Variable Lm92tempint
      4. Dim Lm92temprs232 As Word
      5. Dim Lm92temprs232_S As byte
      6. Dim Lm92temperature As Single 'Temperaturwert dezimal
      7. Temp_lesen:
      8. Lm92tempint = 0
      9. I2cstart 'I²C Bus starten
      10. I2cwbyte Lm92addr 'Temperatur-Sensor ansprechen
      11. I2crbyte Lm92tempbytehi , Ack 'Highbyte auslesen
      12. I2crbyte Lm92tempbytelo , Nack 'Lowbyte auslesen
      13. I2cstop 'I²C Bus anhalten
      14. waitms 500
      15. Lm92temprs232 = Lm92tempint
      16. Lm92tempsign = Lm92tempbytehi And 128
      17. If Lm92tempsign = 128 Then 'wenn im Highbyte bit 8 (128), minus Temp.-Werte, gesetzt dann
      18. Lm92tempint = Not Lm92tempint 'binären Temp.-Wert invertieren
      19. Lm92tempint = Lm92tempint + 1 'invertierten Temp.-Wert +1 -> positve Zahlenwerte
      20. Locate 2,5
      21. LCD "-" 'Minus-Zeichen ausgeben
      22. 'Lm92tempsign_plus = 0
      23. Lm92tempsign_minus = 1
      24. 'Flag_minus_min = 1
      25. Else 'wenn nicht, dann
      26. Locate 2,5
      27. LCD "+" 'Plus-Zeichen ausgeben
      28. Lm92tempsign_plus = 1
      29. 'Lm92tempsign_minus = 0
      30. 'Flag_plus_min = 1
      31. End If
      32. '--------------------------------------------------------------
      33. if Lm92tempsign_minus = 1 then
      34. 'if Flag_minus_min = 1
      35. if Lm92tempint_min < Lm92tempint then
      36. Lm92tempint_min = Lm92tempint
      37. 'Flag_minus_min = 1
      38. end if
      39. 'end if
      40. goto 1
      41. end if
      42. if Lm92tempsign_plus = 1 then
      43. 'if Flag_plus_min = 1
      44. if Lm92tempint_min > Lm92tempint then
      45. Lm92tempint_min = Lm92tempint
      46. end if
      47. 'end if
      48. goto 1
      49. end if
      50. 1:
      51. if Lm92tempsign_minus = 1 then
      52. 'if Flag_minus_min = 1
      53. if Lm92tempint_max > Lm92tempint then
      54. Lm92tempint_max = Lm92tempint
      55. 'Flag_minus_min = 1
      56. end if
      57. 'end if
      58. goto 2
      59. end if
      60. if Lm92tempsign_plus = 1 then
      61. 'if Flag_plus_min = 1
      62. if Lm92tempint_max < Lm92tempint then
      63. Lm92tempint_max = Lm92tempint
      64. end if
      65. 'end if
      66. goto 2
      67. end if
      68. 2:
      69. Shift Lm92tempint , Right , 3 'schiebe die 16 Bit um 3 bit nach rechts
      70. Lm92temperature = Lm92tempint * Lm92resolution 'binaeren Temperaturwert mit Aufloesung multiplizieren
      71. Return
      72. Temp_max:
      73. 'Lm92tempint_max1 = Lm92tempint_max
      74. if Lm92tempsign_minus = 1 then
      75. Locate 2,5
      76. LCD "-"
      77. Lm92tempint_max1 = Lm92tempint_max
      78. end if
      79. if Lm92tempsign_plus = 1 then
      80. Locate 2,5
      81. LCD "+"
      82. Lm92tempint_max1 = Lm92tempint_max
      83. end if
      84. Shift Lm92tempint_max1 , Right , 3 'schiebe die 16 Bit um 3 bit nach rechts
      85. Lm92temperature_max1 = Lm92tempint_max1 * Lm92resolution 'binaeren Temperaturwert mit Aufloesung multiplizieren
      86. Lm92tempint_max1 = 0
      87. locate 2,1
      88. lcd "max"
      89. Locate 2 , 10
      90. Lcd Chr(1) ; "C"
      91. locate 2,6
      92. Lcd = Fusing(Lm92temperature_max1 , "##.#")
      93. If Lm92temperature_max1 < 9.95 Then
      94. Locate 2 , 7
      95. Lcd = Fusing(Lm92temperature_max1 , "##.#")
      96. Locate 2 , 6
      97. Lcd " "
      98. end if
      99. waitms 2000
      100. return
      101. Temp_min:
      102. 'Lm92tempint_min1 = Lm92tempint_min
      103. if Lm92tempsign_minus = 1 then
      104. Locate 2,5
      105. LCD "-" 'Minus-Zeichen ausgeben
      106. Lm92tempint_min1 = Lm92tempint_min
      107. Else 'wenn nicht, dann
      108. Locate 2,5
      109. LCD "+" 'Plus-Zeichen ausgeben
      110. Lm92tempint_min1 = Lm92tempint_min
      111. End If
      112. Shift Lm92tempint_min1 , Right , 3 'schiebe die 16 Bit um 3 bit nach rechts
      113. Lm92temperature_min1 = Lm92tempint_min1 * Lm92resolution 'binaeren Temperaturwert mit Aufloesung multiplizieren
      114. Lm92tempint_min1 = 0
      115. locate 2,1
      116. lcd "min"
      117. Locate 2 , 10
      118. Lcd Chr(1) ; "C"
      119. locate 2,6
      120. Lcd = Fusing(Lm92temperature_min1 , "##.#")
      121. If Lm92temperature_min1 < 9.95 Then
      122. Locate 2 , 7
      123. Lcd = Fusing(Lm92temperature_min1 , "##.#")
      124. Locate 2 , 6
      125. Lcd " "
      126. end if
      127. waitms 2000
      128. return
      Alles anzeigen
    • Was hindert dich daran, das Programm komplett mit Header zu posten?
      Stackwerte und Variablen sind wichtig für die Helfer.
      (Du benutzt auch Variablen, die nicht deklariert sind)
      Deine Helfer kopieren sich das in ihre IDE und testen das.
      Ohne ganzes (compilierfähiges) Programm schwierig und nicht motivierend.

      Ich will nicht raten, aber ich würde so ein Programm mit Integer-Variablen benutzen.

      Statt
      If Wert = 1 Then
      ...
      Goto X
      End If
      If Wert = 0 Then
      ...
      Goto X
      End If

      X:

      wäre es deutlich einfacher (auch lesbarer), wenn du
      If Wert = 1 Then
      ...
      Else
      ...
      End If

      schreiben würdest.
      oder eben mit Integer

      If Temperaturwert < 0 Then
      ...
      Else
      ...
      End If
    • Ja, damit kann man schon etwas anfangen.

      Zeile 29 und 30 würde ich tauschen.
      Zeile 31 solltest du löschen, ist alles schon konfiguriert.
      In Zeile 181 benutzt du noch gar keine Adresse, der Wert, den du schreibst, ist null und an der Adresse gibt es keinen Teilnehmer.
      Das Ergebnis wird in Zeile 188/189 aber sowieso gelöscht.
      Wie ich schon schrieb, würde das umständliche Sign ab Zeile 256 entfallen, wenn du statt Word ein Integer für Lm92tempint benutzt.
      In Zeile 260 machst du den Fehler, eine 1 zu addieren, es müssten eigentlich 8 sein, da du noch 3 Stellen daneben bist.
      Dein ausgelesener Wert aus dem LM92 ist ja 13 Bit linksbündig.
      Die ganze Umrechnerei und mehrfrage Sign-Abfrage könntest du dir mit Integer sparen.

      Dim Lm92tempint As Integer
      Dim Lm92tempint_max As Integer
      usw.
      ...
      ...

      Temp_lesen:

      I2C Lese-Routine

      Lm92tempint = Lm92tempint / 8
      If Lm92tempint < Lm92tempint_min Then Lm92tempint_min = Lm92tempint

      If Lm92tempint > Lm92tempint_max Then Lm92tempint_max = Lm92tempint

      Lm92temperature = Lm92tempint * Lm92resolution
      Return

      Für die Anzeige brauchst du die Signs nicht

      If Wert >= 0 Then Lcd "+"
      Lcd Wert
    • Hallo Michael,
      danke für die Antwort.
      Nun, das Vorzeichen ist ja das Bit 15.

      Bei der Word-Variante von mir frag ich im Highbyte das Bit 7 (Vorzeichen) ab.

      BASCOM-Quellcode

      1. LM92tempsign = LM92tempbytehi and 128
      Wenn dann LM92tempsign = 1 ist (negative Temperatur) dann invertiere ich die Word-Variable LM92tempint.

      BASCOM-Quellcode

      1. LM92tempint = Not LM92tempint
      Dann halt +1 und im negativen Temperaturbereich erhalte ich positve Werte.

      BASCOM-Quellcode

      1. LM92tempint = LM92tempint +1
      Damit funktioniert das ganze mit Word-Variable und im pos. und neg. Temp-Bereich sind immer pos. Zahlenwerte.

      Ich hab das ganze nun mit integer-Variable realisiert.
      Die max/min Speicherung funktioniert damit natürlich sehr einfach.
      Der Code oben muss aber auch bei Integer verwendet werden, da sonst im neg.Temp-Bereich die Zahlenwerte nicht stimmen.
      Also, der Hinweis mit integer war schon richtig. Danke.
      Programm noch aufräumen und Kommentare anfügen und Taste zum löschen der max/min Werte einfügen, dann ist es schick.
      Anbei die Programmdatei.
      Dateien
    • Dago1 schrieb:

      Nun, das Vorzeichen ist ja das Bit 15.
      Richtig, und jetzt schau dir mal eine Integer-Variable an, die funktioniert hier genauso.



      Dago1 schrieb:

      Der Code oben muss aber auch bei Integer verwendet werden, da sonst im neg.Temp-Bereich die Zahlenwerte nicht stimmen
      Wie kommst du darauf? Bei Integer nimmst du das negative Bit mit.
      In deinem neuen Programm machst du auch wieder den Fehler, 1 zu addieren.
      Ich hatte dir ja in Beitrag #4 beschrieben wie es geht. Inklusive Ausgabe, bei der du ja dein Sign auch nicht brauchst.

      Du wirst in deinem Programm nicht schneller, wenn du Assembler-Routinen in Bascom nachbildest.
      Mit Integer (Long/Double) hast du Variablen an der Hand, die auch negative Werte handhaben können.
      Zumal du ja doppelt wandelst, da dein Sign-Bit ja schon an der richtigen Stelle steht und du nur noch durch 8 dividieren (nicht recht schieben) musst.
    • Dago1 schrieb:

      Bei der Word-Variante von mir frag ich im Highbyte das Bit 7 (Vorzeichen) ab.
      Schau dir bitte in "Language Fundamentals" mal die Wertebereiche von Data Types an!

      avrhelp.mcselec.com/index.html?language_fundamentals.htm

      Zugriff auf Bits auch über (z.B.):

      BASCOM-Quellcode

      1. Dim B as Byte, W as Word
      2. B = W.15
      Code first, think later - Natural programmer :D
    • Hallo,

      danke für die Antworten.
      Bitte habt etwas Geduld mit mir. Bin schon Ü50 und in der Zeit wo ich das Licht der Welt erblickte, gab es keine USB Schnittstelle am Kopf, um eine Speichererweiterung des Gehirns vorzunehmen.
      Vielleicht denke ich auch manchmal zu kompliziert. Nun gut.

      Es führen doch halt auch etliche Wege nach Rom.
      Ich habe also die Variante von Michael umgesetzt, und es funktioniert.
      Hab mich auch intensiver mit den Datentypen und Wertebereiche, wie von six1 erwähnt, beschäftigt.
      Bin dann nochmal bei dem shift-Befehl gelandet. Da gibt es noch die Option "signed". Das Ergebnis ist wie die Division durch 8.
      Im Endeffekt ist die ganze Temp-Wert-Abfrage und max/min Speicherung auf ein paar Zeilen geschrumpft.
      Also, die Temp-Auswertung funktioniert erstmal. Gibt sicher noch Optimierungspotential.
      Anbei die Programmdatei.
      Dateien