Durchdrehende Steuerung

    This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

    • Durchdrehende Steuerung

      Hallo, es ist kein Problem mehr. Aber hier ist es so ruhig das vielleicht jemand rätseln möchte. (Natürlich sind auch Kritik und Verbesserungsvorschläge gern gehört).
      Folgende kleine Steuerung verhielt sich wunschgemäß bis zu dem Zeitpunkt als die Heizung eingeschaltet werden sollte. Dann sprang die Anzeige auf Sollwerte und schaltete im viertel Sekunden takt an und ab auch die Sollwerte änderten sich um 2-3 ohne die Potis zu bewegen.
      (Im Simulator tritt der Fehler nicht auf)

      Source Code

      1. $regfile = "attiny24.dat"
      2. $crystal = 1000000
      3. $hwstack = $16
      4. $swstack = $16
      5. $framesize = $20
      6. '$sim
      7. $lib "I2c_usi44.lib"
      8. Config Base = 0
      9. Config Watchdog = 2048
      10. Config Scl = Porta.4 'Platne außen: Gnd,Vdd, SDA,SCL
      11. Config Sda = Porta.6 'Isp 1-a4,2-Vcc,3-Sc(l),4-Mo(Sda),5-/R,6-Gnd
      12. Config Usi = Twimaster , Mode = Normal
      13. 'a0=temp/d7, a1=Feu/d6, a2=d5, a3=d4, a4=Sc(l), a5=Miso,a6=Mo/Sda a7=Rs
      14. 'b0=Temp , b1=Feucht, b2=E
      15. I2cinit
      16. Config Lcdpin = Pin , Db4 = Porta.3 , Db5 = Porta.2 , Db6 = Porta.1 , Db7 = Porta.0 , E = Portb.2 , Rs = Porta.7
      17. Config Lcd = 16 * 2
      18. Initlcd
      19. cursor off noblink
      20. Deflcdchar 1 , 14 , 31 , 31 , 31 , 31 , 31 , 14 , 32 ' replace [x] with number (0-7)
      21. 'Deflcdchar 1 , 14 , 31 , 31 , 31 , 31 , 31 , 31 , 14
      22. Cls
      23. Enable Interrupts
      24. Ddrb = $f
      25. Config Timer0 = Timer , Prescale = 1024
      26. Config Adc = Single , Prescaler = Auto , Reference = Avcc
      27. Dim I2cbuf(8) As Byte
      28. Dim A As Byte ' , V As Byte , Z As Byte 'a=Schleifenzähler,V=länge,Z=EEpromaddresse
      29. Dim Tist As Integer , Talt As Word , Tsoll As Word , Thy As Byte ' , T_h As Byte , T_l As Byte
      30. Dim Fist As Word , Falt As Word , Fsoll As Word , Fhy As Byte ', F_h As Byte , F_l As Byte
      31. Dim Ti As Byte , Fi As Byte , Tand As Byte , Fand As Byte ', Er As Byte
      32. Dim Temp As Byte , Tempw As Word , Tempi As Integer ' , Tempstr As String * 6
      33. Thy = 1
      34. Fhy = 1
      35. Start Watchdog
      36. Do
      37. Ddra = $dc
      38. Tempw = Getadc(0) 'Tempsoll
      39. Shift Tempw , Right , 5
      40. Tsoll = Tempw + 20
      41. If Tsoll <> Talt Then Tand = 10
      42. Talt = Tsoll
      43. Tempw = Getadc(1) 'Feuchtsoll
      44. Shift Tempw , Right , 4
      45. Fsoll = Tempw + 36
      46. If Fsoll <> Falt Then Fand = 10
      47. Falt = Fsoll
      48. Ddra = $df
      49. Gosub Lese_am
      50. If I2cbuf(0) = 3 Then
      51. Tempi = I2cbuf(2)
      52. Shift Tempi , Left , 8
      53. Tempi = Tempi + I2cbuf(3)
      54. If Tempi < 1000 Then
      55. Fist = Tempi / 10
      56. End If
      57. Tempi = I2cbuf(4)
      58. Shift Tempi , Left , 8
      59. Tempi = Tempi + I2cbuf(5)
      60. Tempi = Tempi + 5
      61. If Tempi < 1000 Then
      62. Tist = Tempi / 10
      63. End If
      64. If Fist >= Fsoll Then
      65. Reset Portb.1
      66. Fi = 79
      67. End If
      68. If Tist >= Tsoll Then
      69. Reset Portb.0
      70. Ti = 79
      71. End If
      72. Temp = Fist + Fhy
      73. If Temp < Fsoll Then
      74. Set Portb.1
      75. Fi = 1
      76. End If
      77. Temp = Tist + Thy
      78. If Temp < Tsoll Then
      79. Set Portb.0
      80. Ti = 1
      81. End If
      82. Else
      83. Fi = $45
      84. Ti = $45
      85. End If
      86. Locate 1 , 1
      87. If Fand > 0 Then
      88. Lcd "Feu.Soll: " ; Fsoll
      89. Decr Fand
      90. Else
      91. Lcd "Feuchte : " ; Fist
      92. End If
      93. Lcd "%r "
      94. Lcd Chr(fi)
      95. Locate 2 , 1
      96. If Tand > 0 Then
      97. Lcd "Raumsoll: " ; Tsoll
      98. Decr Tand
      99. Else
      100. Tempi = Tempi Mod 10
      101. Lcd "Raum : " ; Tist ; "," ; Tempi
      102. End If
      103. Lcd Chr(223) ; "C " ; Chr(ti)
      104. #if _sim = 0
      105. Do
      106. Loop Until Timer0 > 250
      107. #endif
      108. Timer0 = 0
      109. Reset Watchdog
      110. Loop
      111. Lese_am:
      112. #if _sim = 0
      113. I2cstart
      114. I2cwbyte &HB8 'Schreibadresse
      115. Waitms 1
      116. I2cstop
      117. I2cstart
      118. I2cwbyte &HB8 'Schreibadresse 184 ($B8)
      119. I2cwbyte 3 'Registerlesen
      120. I2cwbyte 0 'beginne Bei Reg 0
      121. I2cwbyte 4 'lese 4 Register
      122. I2cstop
      123. Waitms 2
      124. I2cstart
      125. I2cwbyte &HB9 'Leseadresse 185 ($B9)
      126. For A = 0 To 6 '0=funktion code(3), 1=Registeranzahl(4)
      127. I2crbyte I2cbuf(a) , Ack '2-3=Feuchte*10 (LB,HB)
      128. Next '4-5=Temperatur*10 (LB,HB)
      129. I2crbyte I2cbuf(7) , Nack '6-7=CRC
      130. I2cstop
      131. #else
      132. I2cbuf(0) = 3
      133. Tempw = Getadc(2)
      134. I2cbuf(4) = Adch
      135. I2cbuf(5) = Adcl
      136. Tempw = Getadc(3)
      137. I2cbuf(2) = Adch
      138. I2cbuf(3) = Adcl
      139. #endif
      140. Return
      Display All
    • Das Problem bei Relais ist nicht die Belastung der Versorgungsspannung.
      Die 50 mA machen kaum was aus.
      Problematisch ist der Moment des Ein- bzw. Ausschaltens.
      Bei entsprechender Leitungsführung aka Layout gibt es unschöne Effekte, ebenso, wenn Dioden vergessen wurden oder Abblockkondensatoren.
      Ich wollte es nur nochmal sagen, das weißt du sicher alles, aber da ich dein Layout nicht kenne, ist das nur eine Vermutung
    • Michael wrote:

      wenn Dioden vergessen wurden
      Hab ich wirklich keine; aber es sind SSRs . Die haben einen Optokoppler intern? Oder "vergewaltige" ich gerade die Bodydioden?
      Die Störempfindlichkeit ist bisher kein Problem ,sie wird sich noch beweisen müssen wenns ans Netz geht. Ein Schütz im selben Gehäuse und ein Magnetventil in ca 1m Entfernung. Aber ich bin ganz zuversichtlich das die VDRs am Relaisausgang das meißte schlucken.