- 12V Akku mit 280 Ah bauen         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 18

Thema: Uhr und Wochentag

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    22.12.2006
    Beiträge
    109

    Uhr und Wochentag

    Einen schönen Sonntag euch allen hier im Forum!

    Kann mir bitte jemand helfen. Ich weiß, dass der Code etwas lang ist, jedoch möchte ich ihn komplett hier hereinstellen. Ggf. kann ihn ja jemand oder Teile davon brachen.

    Das Problem was ich habe ist, ich möchte gerne Abhängig vom Wochentag die Minimale Kesseltemperatur ändern. Nur wenn ich Weekday auf dem Display ausgebe kommt heute der Tag "5". Was mache ich da falsch.

    Ein paar Infos zu meinem Programm.
    In meinem Programm lese ich ein paar DS1820 aus. Zusätzlich noch zwei Temperaturwerte mit dem 10 Bit-AD-Wandler. Abhängig von den Messwerten und der Uhzeit schalte ich den Brenner sowie die Punpen ein und aus.

    Ich weiß, dass es etwas anfängerhaft programmiert ist. Wie auch immer! Ich lerne noch,
    __________________________________________________ ___________
    Code:
    $regfile = "m8def.dat"
    $crystal = 3686400
    $hwstack = 256
    $swstack = 256
    $framesize = 256
    '***************************Config Schaltausgänge*******************************
    Config Portb = Output
      Brenner Alias Portb.3
      Pumpefb Alias Portb.4
      Pumpehk Alias Portb.5
    '**************************Def. allgemeiner Variabeln***************************
    Dim Tagnacht As Bit
    Dim Nachtbetrieb As Byte
    Dim Tagbetrieb As Byte
    Dim Tempmessstelle(8) As Single
    Dim Brennerstarts As Integer
    Dim Interrupt_brenner As Bit
    Dim Zeit_in_min As Integer
    Dim Kessel_max As Single
    Dim Kessel_min As Single
    Dim Kessel_grenz_max As Single
    Dim Kessel_grenz_min As Single
    Dim Delta_kessel As Single
    Dim Delta_vl_rl_fb As Single
    Dim Wassertemp As Bit
    Dim Aussentemp As Single
    Dim Flag_aussentemp As Bit
    
    Aussentemp = 2.68
    Dim Flag_frequenz As Bit
    Flag_frequenz = 0
    
    Kessel_max = 57.0                                           '60.0
    Kessel_min = 40.0                                           '43.0
    Kessel_grenz_max = Kessel_max
    Kessel_grenz_min = Kessel_min
    
    Wassertemp = 1
    
    Brennerstarts = 0
    Interrupt_brenner = 0
    
    Nachtbetrieb = 22
    Tagbetrieb = 4
    
    Const Tagtemp_og = 21.8
    Const Tagtemp_ug = 21.6
    Const Nachttemp_og = 21.4
    Const Nachttemp_ug = 21.2
    
    '**************************Funktionen LCD-Display*******************************
    
    Config Lcd = 40 * 4
    Config Lcdpin = Pin , Rs = Portb.0 , Db4 = Portd.5 , Db5 = Portd.4 , Db6 = Portd.3 , Db7 = Portd.2 , E = Portd.6 , E2 = Portd.7
    Config Lcdbus = 4
    Config Lcdmode = Port
    
    Dim ___lcdno As Byte
    
    ___lcdno = 0
     Initlcd
     Cursor Off
     Cls
    ___lcdno = 1
    Initlcd
    Cursor Off
    Cls
    '*******************************************************************************
    
    Config 1wire = Portc.1                                      'DS1820
    
    Match_rom Alias &H55
    Read_scratchpad Alias &HBE
    Start_conversion Alias &H44
    
    Innen Alias 0
    Vorlauf_fb Alias 1
    Rücklauf_fb Alias 2
    Vorlauf_hk Alias 3
    Kessel Alias 4
    
    Dim Read_temp As Integer
    Dim Sensor_ids(48) As Byte
    Dim Id As Byte
    Dim Offset As Byte
    Dim Ds_array(7) As Byte
    Dim Bruchteil As Single
    Dim Temperatur As Single
    Dim I As Integer
    '*************************Config INT0 zur Frequenzmesung************************
    Enable Interrupts
    Enable Int0
    Config Int0 = Falling
    Dim Flankenzahl As Integer
    Flankenzahl = 0
    On Int0 Irq
    '*************************Config Timer1*****************************************
    Config Timer1 = Timer , Prescale = 256                      '256                      '64       '256       'Konfiguriere Timer1
    Enable Timer1                                               'schalte den Timer1 ein
    On Timer1 Isr_von_timer1                                    'verzweige bei Timer1 überlauf zu   Isr_von_Timer1
    Enable Interrupts
    Timer1 = 51135                                              'Timer1 soll schon von 34285 wegzählen
    '***************************Config RTC******************************************
    Config Sda = Portc.4
    Config Scl = Portc.5
    
    Const Ds1307w = &HD0                                        ' Addresses of Ds1307 clock
    Const Ds1307r = &HD1
    
    Config Clock = User                                         ' this will dim the bytes automatic
    Dim Weekday As Byte
    
    'Time$ = "01:50:00"                                          ' to watch the day changing value
    Date$ = "10.28.07"                                          ' erstmaliges stellen der Uhr
    'Weekday = 7
    '***************************AD-Config*******************************************
    Config Adc = Single , Prescaler = Auto
    Dim Faktor As Single
    Dim Sp As Integer
    Faktor = 5.28 / 1023
    
    '***************************ID 1Wire configurieren******************************
    For Id = 1 To 40                                            'Einlesen der 5 Sensoren IDs (5*8 Byte)
       I = Id - 1
       Readeeprom Sensor_ids(id) , I
    Next Id
    '**************************Initialisierung**************************************
    
       Brenner = 0
       Pumpefb = 1
       Pumpehk = 1
    
    '**************************Hauptrogramm*****************************************
    Do
       Waitms 1000
       For Id = Innen To Kessel                                 'Kessel
          Offset = Id * 8
          Offset = Offset + 1                                   'Offset geht auf 1, 9, 17, 25 und 33
          1wreset                                               'hier wird der Temperaturwert eingelesen
          1wwrite Match_rom
          1wwrite Sensor_ids(offset) , 8                        '8 Byte ID wird übertragen
          1wwrite Read_scratchpad
          For I = 1 To 7                                        'nur bis 7, weil 8 und 9 uninteressant
             Ds_array(i) = 1wread()
          Next I
          Read_temp = Makeint(ds_array(1) , Ds_array(2))
          1wreset                                               'jetzt wird wieder die Konvertierung gestartet
          1wwrite Match_rom
          1wwrite Sensor_ids(offset) , 8
          1wwrite Start_conversion
          Shift Read_temp , Right
          If 127 < Read_temp Then Read_temp = Read_temp - 32768
          Bruchteil = 16 - Ds_array(7)
          Bruchteil = Bruchteil / 16
          Bruchteil = Bruchteil - 0.25
          Temperatur = Read_temp + Bruchteil
    
          If Temperatur >= -16.0 Then
            Tempmessstelle(id + 1) = Read_temp + Bruchteil      'Temperatur
          End If
           ___lcdno = 0
           Locate 1 , 2 : Lcd "BO-U RA-T KE-T VLB-T RLB-T"
          Select Case Id
          Case Innen:                                           '1
               Locate 2 , 7 : Lcd Fusing(tempmessstelle(1) , "#.#")
               Locate 2 , 11 : Lcd " "
          Case Kessel:                                          '2
              Locate 2 , 12 : Lcd Fusing(tempmessstelle(2) , "#.#")
              Locate 2 , 16 : Lcd " "
          Case Vorlauf_fb:                                      '3
              Locate 2 , 17 : Lcd Fusing(tempmessstelle(3) , "#.#")
              Locate 2 , 21 : Lcd "  "
          Case Rücklauf_fb:                                     '4
              Locate 2 , 23 : Lcd Fusing(tempmessstelle(4) , "#.#")
              Locate 2 , 27 : Lcd " "
          End Select
            Locate 2 , 6 : Lcd " "
          If Tempmessstelle(8) >= 0 Then
            Locate 2 , 2 : Lcd Fusing(tempmessstelle(8) , "#.##")
          Else
            Locate 2 , 1 : Lcd Fusing(tempmessstelle(8) , "#.#")
          End If
    
            ___lcdno = 1
    
          Locate 2 , 20
          Lcd Time$
          Locate 2 , 15 : Lcd "     "
          Select Case Id
          Case Vorlauf_hk:                                      '5
             Locate 1 , 1 : Lcd "Vl-hk " : Lcd Fusing(tempmessstelle(5) , "#.#")
             Locate 1 , 11 : Lcd "  "
          End Select
          'Locate 1 , 12 : Lcd "AU-T " : Lcd Fusing(tempmessstelle(7) , "#.##")
          Locate 1 , 12 : Lcd "AU-T " : Lcd Fusing(aussentemp , "#.##")
          Locate 1 , 21 : Lcd "        "
          Locate 2 , 1 : Lcd "Starts:"                          '"B-Start:     "
          Locate 2 , 9 : Lcd Brennerstarts                      'Brennerstarts
          Locate 2 , 16
          Lcd Weekday
         Cursor Off
       Next Id
    
       If _hour >= Nachtbetrieb Or _hour < Tagbetrieb Then      'Or _hour = 7 Or _hour = 8 Then
         Tagnacht = 0                                           'Nachteinstellung
       Else
         Tagnacht = 1                                           'Tageinstellung
       End If
    
       Gosub Ad_wandler
       Gosub Überwachung_kesseltemp                             'Aussentemp_mittel
       Gosub Schalterelais
       Gosub Aussentemp_mittel
       Gosub Kesselgrenzwert
       'Gosub Überwachung_pumpen
       If Wassertemp = 0 Then
         Gosub Überwachung_brauchwassertemp
       End If
      Loop
    End
    '*******************************Uhr stellen + 1min******************************
    Uhr_plus_min:
    Return
    '*******************************Frequenzzähler**********************************
    Frequenz:
    Return
    
    '*******************************Überwachung Brauchwassertemp********************
    Überwachung_brauchwassertemp:
       If Tempmessstelle(4) <= 42.0 Then
         Wassertemp = 0
         If Tempmessstelle(2) < 48.0 Then
           Brenner = 1
         End If
         If Tempmessstelle(2) > 58.0 Then
           Brenner = 0
         End If
         Pumpehk = 1
         Pumpefb = 0
       End If
       If Tempmessstelle(2) >= 50 Then
          Wassertemp = 1
       End If
    Return
    '*******************************Überwachung Pumpen******************************
    Überwachung_pumpen:
       If Tempmessstelle(2) < 29.0 Then
         Pumpefb = 0
       End If
       If Tempmessstelle(2) >= 32.0 Then
         Pumpefb = 1
       End If
       If Tempmessstelle(2) < 38.0 Then
         Pumpehk = 0
       End If
       If Tempmessstelle(2) >= 36.0 Then
         Pumpehk = 1
       End If
    Return
    '*******************************AD-Wandler**************************************
     Ad_wandler:
        Start Adc
        Sp = Getadc(0)
        Tempmessstelle(8) = Sp * Faktor
        'Tempmessstelle(8) = Tempmessstelle(8) - 0.35
        'Tempmessstelle(8) = 132.14 * Tempmessstelle(8)
        'Tempmessstelle(8) = Tempmessstelle(8) - 153.93          ' Boiler_temp unten
        Sp = Getadc(2)
        Tempmessstelle(7) = Sp * Faktor                         ' Außentemp
        'Sp = Getadc(2)
        'Tempmessstelle(6) = Sp * Faktor
     Return
                                                          '
    '**************************Überwachung Kesseltemp*******************************
    Überwachung_kesseltemp:
     If Tempmessstelle(2) >= Kessel_grenz_max Or Tempmessstelle(8) >= 1.52 Then
       Brenner = 0
       If Interrupt_brenner = 0 Then
         Brennerstarts = Brennerstarts + 1
         Interrupt_brenner = 1
       End If
     End If
    
     If Tempmessstelle(2) < Kessel_grenz_min And Tempmessstelle(8) <= 1.46 Then
       Brenner = 1
       Interrupt_brenner = 0
     End If
    Return
    '*************************Kesselgrenzwert bestimmen*****************************
    Kesselgrenzwert:
    If Aussentemp > 1.8 And Aussentemp < 3.0 Then
        If Aussentemp >= 2.68 Then                              ' Aussentemp >= 18 Grad
          Delta_kessel = 0
        End If
    
        If Aussentemp > 2.10 And Aussentemp < 2.68 Then
          Delta_kessel = 2.68 - Aussentemp
          Delta_kessel = Delta_kessel * 11
          Delta_kessel = Abs(delta_kessel)
        End If
    
        If Aussentemp <= 2.10 Then                              'Aussentemp <= -7 Grad
          Delta_kessel = 0.58 * 11
        End If
    End If
    Return
    '*************************Mittelwert der Außentemp******************************
    Aussentemp_mittel:
       'If _min = 0 Then
        Aussentemp = Tempmessstelle(7) + Aussentemp
        Aussentemp = Aussentemp / 2
       'End If
    Return
    '*************************Sub Relais schalten***********************************
    Schalterelais:
    Select Case Tagnacht
      Case 0
        Gosub Nachtbetrieb
      Case 1
        Gosub Tagbetrieb
    End Select
    Return
     '**************************Sub für Tagbetrieb**********************************
    Tagbetrieb:
     'If Weekday = 6 Or Weekday = 7 Then
     '   If _hour <= 8 Then
      ''   Kessel_grenz_min = Kessel_min
       '  Kessel_grenz_max = Kessel_max + Delta_kessel
       ' Else
       '  Kessel_grenz_min = Kessel_min + Delta_kessel
       '  Kessel_grenz_max = Kessel_max + Delta_kessel
       ' End If
     'Else
        If _hour <= 12 Then
         Kessel_grenz_min = Kessel_min
         Kessel_grenz_max = Kessel_max + Delta_kessel
     Else
         Kessel_grenz_min = Kessel_min + Delta_kessel
         Kessel_grenz_max = Kessel_max + Delta_kessel
        End If
     'End If
         If Tempmessstelle(1) <= Tagtemp_ug Then
           Pumpefb = 1
         End If
         If Tempmessstelle(1) >= Tagtemp_og Then
           Brenner = 0
           Pumpefb = 0
         End If
    Return
    '**************************Sub für Nachtbetrieb*********************************
    Nachtbetrieb:
      Kessel_grenz_min = 29.0
      If Tempmessstelle(2) >= Kessel_grenz_min Then
        Brenner = 0
        Pumpefb = 1
      Else
        Brenner = 0
        Pumpefb = 0
      End If
      If _hour = 0 Then                                         'Brennerstarts auf Null setzen
        Brennerstarts = 0
        Delta_kessel = 0
        Aussentemp = 2.68
      End If
    Return
    '***************************INTO Interrupt**************************************
    Irq:
      Incr Flankenzahl
    Return                                                      '
     '**************************Subroutine für Timer1*******************************
    Isr_von_timer1:                                             'ISR von Timer1
      Timer1 = 51135
      Flankenzahl = 0
    Return
    '***************************Subs für RTC****************************************
    Getdatetime:
      I2cstart                                                  ' Generate start code
      I2cwbyte Ds1307w                                          ' send address
      I2cwbyte 0                                                ' start address in 1307
    
      I2cstart                                                  ' Generate start code
      I2cwbyte Ds1307r                                          ' send address
      I2crbyte _sec , Ack
      I2crbyte _min , Ack                                       ' MINUTES
      I2crbyte _hour , Ack                                      ' Hours
      I2crbyte Weekday , Ack                                    ' Day of Week
      I2crbyte _day , Ack                                       ' Day of Month
      I2crbyte _month , Ack                                     ' Month of Year
      I2crbyte _year , Nack                                     ' Year
      I2cstop
      _sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour)
      _day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year)
    Return
    
    Setdate:
      _day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year)
      I2cstart                                                  ' Generate start code
      I2cwbyte Ds1307w                                          ' send address
      I2cwbyte 4                                                ' starting address in 1307
      I2cwbyte _day                                             ' Send Data to SECONDS
      I2cwbyte _month                                           ' MINUTES
      I2cwbyte _year                                            ' Hours
      I2cstop
    Return
    
    Settime:
      _sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour)
      I2cstart                                                  ' Generate start code
      I2cwbyte Ds1307w                                          ' send address
      I2cwbyte 0                                                ' starting address in 1307
      I2cwbyte _sec                                             ' Send Data to SECONDS
      I2cwbyte _min                                             ' MINUTES
      I2cwbyte _hour                                            ' Hours
      I2cstop
    Return
    
    '*******************************************************************************
    $eeprom
    
    Data &H10 , &HE8 , &HF4 , &H23 , &H01 , &H08 , &H00 , &HEF  '     0
    Data &H10 , &H1B , &HD0 , &H23 , &H01 , &H08 , &H00 , &H23  '     1
    Data &H10 , &H78 , &H37 , &H39 , &H01 , &H08 , &H00 , &H11  '     2
    Data &H10 , &HC0 , &H46 , &H19 , &H01 , &H08 , &H00 , &H67  '     3
    'Data &H10 , &HBD , &HB6 , &H23 , &H01 , &H08 , &H00 , &H40  '     4
    Data &H10 , &H56 , &HA3 , &H23 , &H01 , &H08 , &H00 , &H3F  '     5

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Hallo Martin,
    ist das das ganze Programm? Ich vermisse den Aufruf von "Getdatetime".

    Gruß

    Rolf

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    22.12.2006
    Beiträge
    109
    Hallo Rolf!

    Ja, das ist das ganze Programm. Getdatetime ist aber drin. SO ca. 50 Zeilen vor dem Ende. Kann sein, dass der Aufruf nicht richtig ist aber die Uhrzeit funktioniert.

    Gruß
    Martin

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Hallo Martin,

    Nur wenn ich Weekday auf dem Display ausgebe kommt heute der Tag "5". Was mache ich da falsch.
    Du must den Wochentag auch in die RTC schreiben:

    Code:
    I2cstart 
    I2cwbyte Ds1307w 
    I2cwbyte 3 
    I2cwbyte Weekday 
    I2cwbyte _day 
    I2cwbyte _month 
    I2cwbyte _year 
    I2cstop
    Gruß Dirk

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Zitat Zitat von martin66119
    Hallo Rolf!

    Getdatetime ist aber drin. SO ca. 50 Zeilen vor dem Ende.
    Ne, ich meine den Befehl "Gosub Getdatetime", ebenso "Gosub Setdate" und "Gosub Settime", die müssen doch auch irgendwo sein.

    Gruß

    Rolf

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    22.12.2006
    Beiträge
    109
    Sorry, das verstehe ich jetzt nicht. Die Befehle stehen nirgendow! Aber die Uhr läuft doch. Was muss ich tun?

  7. #7
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Hallo Martin,

    Die Befehle stehen nirgendow!
    Du setzt doch die Anfangswerte für die RTC in der Sub "Setdate:"!

    Diese Sub änderst du so, wie ich oben geschrieben habe. Zusätzlich must du dann noch das ' vor Weekday = 7 entfernen, damit der richtige Wochentag in die RTC geschrieben wird.

    Gruß Dirk

  8. #8
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    22.12.2006
    Beiträge
    109
    Hallo Dirk

    ich habe das von dir eingesetzt: nun sieht es so aus. das ' werde ich entfernen

    Getdatetime:
    I2cstart ' Generate start code
    I2cwbyte Ds1307w ' send address
    I2cwbyte 0 ' start address in 1307

    I2cstart ' Generate start code
    I2cwbyte Ds1307r ' send address
    I2crbyte _sec , Ack
    I2crbyte _min , Ack ' MINUTES
    I2crbyte _hour , Ack ' Hours
    I2crbyte Weekday , Ack ' Day of Week
    I2crbyte _day , Ack ' Day of Month
    I2crbyte _month , Ack ' Month of Year
    I2crbyte _year , Nack ' Year
    I2cstop
    '-----------------dein Teil------------------------------
    I2cstart
    I2cwbyte Ds1307w
    I2cwbyte 3
    I2cwbyte Weekday
    I2cwbyte _day
    I2cwbyte _month
    I2cwbyte _year
    I2cstop
    '--------------------------------------------------------

    _sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour)
    _day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year)
    Return

    Setdate:
    _day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year)
    I2cstart ' Generate start code
    I2cwbyte Ds1307w ' send address
    I2cwbyte 4 ' starting address in 1307
    I2cwbyte _day ' Send Data to SECONDS
    I2cwbyte _month ' MINUTES
    I2cwbyte _year ' Hours
    I2cstop
    Return

    Settime:
    _sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour)
    I2cstart ' Generate start code
    I2cwbyte Ds1307w ' send address
    I2cwbyte 0 ' starting address in 1307
    I2cwbyte _sec ' Send Data to SECONDS
    I2cwbyte _min ' MINUTES
    I2cwbyte _hour ' Hours
    I2cstop
    Return

  9. #9
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    22.12.2006
    Beiträge
    109
    sorry falsch kpiert. so müsste es sein

    Setdate:
    _day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year)
    I2cstart ' Generate start code
    I2cwbyte Ds1307w ' send address
    I2cwbyte 4 ' starting address in 1307
    I2cwbyte _day ' Send Data to SECONDS
    I2cwbyte _month ' MINUTES
    I2cwbyte _year ' Hours
    I2cstop

    I2cstart
    I2cwbyte Ds1307w
    I2cwbyte 3
    I2cwbyte Weekday
    I2cwbyte _day
    I2cwbyte _month
    I2cwbyte _year
    I2cstop
    Return

    Settime:
    _sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour)
    I2cstart ' Generate start code
    I2cwbyte Ds1307w ' send address
    I2cwbyte 0 ' starting address in 1307
    I2cwbyte _sec ' Send Data to SECONDS
    I2cwbyte _min ' MINUTES
    I2cwbyte _hour ' Hours
    I2cstop
    Return

  10. #10
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    ... ja, und Setdate: würde ich auch noch ändern (d.h. auch den Weekday schreiben).

    Gruß Dirk

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress