- Labornetzteil AliExpress         
Ergebnis 1 bis 10 von 12

Thema: Problem mit Alarm bei Selbstbau-Uhr

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    03.10.2013
    Beiträge
    11

    Problem mit Alarm bei Selbstbau-Uhr

    Hallo!
    Im Rahmen eines größeren Bastelprojekts (Langzeitbetrieb einer Kamera mit PC über Jahre) habe ich ständig Probleme mit der (eingebauten) Wochenzeitschaltuhr.
    Diese ist ja leider nicht mit DCF77 ausgerüstet (hab ich noch nie gesehen) und darum muß ich ständig auf der Lauer sein.
    Jeden Monat einmal die Zeit korrigieren und jedes Halbjahr die Umstellung Sommer/Winterzeit. Und bei Stromausfall korrigieren.
    Das wurde mir jetzt zuviel und deshalb muß jetzt eine "richtige" Uhr her.
    Das Programm für die Uhr selbst ist schon fertig und läuft tadellos. Ich habe sie - als Anfänger - aus verschiedenen Codeschnipseln
    und etwas eigenem dazu zusammengesetzt. Ein I2C-RTC-Modul steuert die BASCOM-Softclock und wird von einem ELV-DFC77-Modul
    genau gehalten.
    Ohne Schaltausgang nützt sie mir allerdings garnichts, denn die Uhr soll ja täglich einmal den PC aufwecken, nach 5 Minuten ein
    Programm starten und den PC wieder schlafen legen.
    Also hab ich versucht, das mal selbst zu entwickeln. Der jetzige Stand ist:
    Die Umschaltung Stellen - Alarm EIN funktioniert.
    Beim Stellen kann ich auch Stunde und Minute erhöhen.
    Beim Zurückschalten auf Alarm Ein geht aber die Anzeige wieder auf Null.
    Das sagt mir: die Zahlen im LCD bleiben nicht erhalten. Warum? Keine Ahnung...
    Hier noch der Code:
    Code:
    Locate 4 , 1 : Lcd "Alarm"
    
    '--------------- Taster - Schleife --------------------------------
    Do
          If Ta_stellen = 0 Then
             Waitms 10
             While Ta_stellen = 0
                NOP                                             ' Debouncing
                Nop
             Wend
       Goto Set_alarm
          End If
    Locate 4 , 13 : Lcd " Ein     "
    Loop
    
    '-------------- Stellen - Schleife ------------------------------------------
    Set_alarm:
    Do
             If Ta_min = 0 Then
              Al_min = Al_min + 1                               'Minute stellen
                If Al_min = 60 Then Al_min = 0
                   Waitms 200
             End If
             If Ta_std = 0 Then
              Al_std = Al_std + 1                               'Stunde stellen
                If Al_std = 24 Then Al_std = 0
                   Waitms 200
             End If
    '-----------------------------------------------------------------------------------------
    If Ta_stellen = 0 Then Exit Do
    '-----------------------------------------------------------------------------------------
    Locate 4 , 13 : Lcd "Stellen"
    Locate 4 , 7 : Lcd Al_std ; ":" ; Al_min
    Loop
    
    Return
    
    End
    Wie schon ober geschrieben, ist das nur ein Teil einer ganzen Uhrsteuerung.
    Es sollte möglichst keinen Timer oder Interrupt brauchen.
    Das muß doch gehen!
    Den Rest, also den Uhrzeit-Vergleich und den Ausgang zum Pc kann ich wieder selbst.

    Vielleicht ist es nur eine Kleinigkeit, die ich mangels Erfahrung übersehe.
    Joachim

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Hallo Joachim,
    nur mit diesem Codeschnipsel kann man dir schlecht raten, was du ändern solltest.
    Du hast dort ein Goto Set_alarm drin, also ein Sprung zu einer anderen Stelle im Programm.
    Bei dem Label wird die Alarmzeit gestellt, soweit sollte es funktionieren.
    Nach der Schleife dort kommt ein Return. Wenn sich der ganze Codeteil innerhalb einer Subroutine befindet, dann würde er jetzt hinter dem entsprechenden Aufruf weitermachen. Wenn nicht, wird der Controller wahrscheinlich resetten und wieder von vorne beginnen.

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    03.10.2013
    Beiträge
    11
    Danke für die schnelle Rückmeldung!
    Dieser "Codeschnipsel" ist eigentlich schon das ganze Programm bzw. Teilprogramm für den Alarm.
    Vom Uhrenprogramm wird nur die aktuelle Zeitinformation übernommen (_hour, _min) und mit der eingestellten Zeit verglichen.
    Das ist das Ganze:

    Code:
    $regfile = "m8def.dat"
    $crystal = 9830400
    $hwstack = 60
    $swstack = 32
    $framesize = 64
    $include "INIT_LCD20x4.bas"                                 'LCD an Port D
    Pinb = &B11000000                                           'B 0,1 = Enc; 2,3,4,5 = Taster
    Portb = &B00111111
    Dim Al_min As Byte , Al_std As Byte
    Enc_a Alias Pinb.0
    Enc_b Alias Pinb.1
    Ta_std Alias Pinb.2
    Ta_min Alias Pinb.3
    Ta_stellen Alias Pinb.4
    Ta_enc Alias Pinb.5
    
    Locate 4 , 1 : Lcd "Alarm"
    
    '--------------- Taster - Schleife --------------------------------
    Do
          If Ta_stellen = 0 Then
             Waitms 10
             While Ta_stellen = 0
                NOP                                             ' Debouncing
                Nop
             Wend
       Goto Set_alarm
          End If
    Locate 4 , 13 : Lcd " Ein     "
    Loop
    
    '-------------- Stellen - Schleife ------------------------------------------
    Set_alarm:
    Do
             If Ta_min = 0 Then
              Al_min = Al_min + 1                               'Minute stellen
                If Al_min = 60 Then Al_min = 0
                   Waitms 200
             End If
             If Ta_std = 0 Then
              Al_std = Al_std + 1                               'Stunde stellen
                If Al_std = 24 Then Al_std = 0
                   Waitms 200
             End If
    '-----------------------------------------------------------------------------------------
    If Ta_stellen = 0 Then Exit Do
    '-----------------------------------------------------------------------------------------
    Locate 4 , 13 : Lcd "Stellen"
    Locate 4 , 7 : Lcd Al_std ; ":" ; Al_min
    Loop
    
    'Return
    
    End
    
    '(
    '-------------- LCD rechtsbündige Anzeige ------------------------------------
    Locate 4 , 7                                                ' Anzeige Al_Std
             If Al_Std < 10 Then Lcd " " ; Al_Std Else Lcd Al_Std ; "  "
          Locate 4 , 9                                          ' Anzeige Al_Min
             If Al_Min < 10 Then Lcd ":0" ; Al_Min Else Lcd ":" ; Al_Min
       Waitms 50
    ')
    Ich hab den RETURN mal rausgenommen, dann bleibt er wie vorhersehbar bei "Stellen" stehen.
    Die Frage ist für mich also: Wie komme ich aus der Stellroutine, ohne den Inhalt von Al_std und Al_min
    zu verlieren?
    Angehängte Dateien Angehängte Dateien

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    03.10.2013
    Beiträge
    11
    Ich hab jetzt mal versucht, die eingestellten Werte als Temp1 und 2 zu speichern, kein Erfolg, steht nur Null drin....
    Es muß doch möglich sein, die engestellten Daten vor dem Verlassen der Schleife woanders zu speichern?
    Ich hab auch schon die Stellen-Schleife als SUB deklariert. Dann kann er sie nicht mehr verlassen bzw. springt gleich
    nach Mode-Taste wieder rein. So sieht das jetzt aus:
    Code:
    $regfile = "m8def.dat"
    $crystal = 9830400
    $hwstack = 40
    $swstack = 16
    $framesize = 32
    $include "INIT_LCD20x4.bas"                                 'LCD an Port D
    Pinb = &B11000000                                           'B  2,3,4 = Taster
    Portb = &B00111100
    Dim Al_min As Byte , Al_std As Byte , Temp1 As Byte , Temp2 As Byte
    Ta_std Alias Pinb.2
    Ta_min Alias Pinb.3
    Ta_mode Alias Pinb.4
          Locate 1 , 1 : Lcd "Alarm "
          Locate 2 , 2 : Lcd Temp1
          Locate 3 , 2 : Lcd Temp2
    '---------------Mode - Taster - Schleife --------------------------------
    Do
          Locate 1 , 13 : Lcd "Ein    "
          Locate 1 , 7 : Lcd Al_std ; ":" ; Al_min
             If Ta_mode = 0 Then
                Waitms 10
                While Ta_mode = 0
                   NOP                                          ' Debouncing
                   Nop
                Wend
       Goto Set_alarm
             End If
    Loop
    '-------------- Stellen - Schleife ------------------------------------------
    Set_alarm:
    Do
                If Ta_min = 0 Then
                   Al_min = Al_min + 1                          'Minute stellen
                      If Al_min = 60 Then Al_min = 0
                         Waitms 200
                End If
                If Ta_std = 0 Then
                   Al_std = Al_std + 1                          'Stunde stellen
                      If Al_std = 24 Then Al_std = 0
                         Waitms 200
                End If
     '-----------------------------------------------------------------------------------------
          If Ta_mode = 0 Then Exit Do
     '-----------------------------------------------------------------------------------------
          Locate 1 , 13 : Lcd "Stellen"
          Locate 1 , 7 : Lcd Al_std ; ":" ; Al_min
    Temp1 = Al_std                                              'geht auch nicht
    Temp2 = Al_min                                              ' nur Nullen drin
    Loop
    
    Return
    
    End
    
    ')
    Ich weiß nicht mehr weiter, mit meinem Anfängerwissen bin ich am Ende...

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Hallo Joachim,
    dein Programm läuft jetzt nach dem Stellen wieder auf das Return. Das funktioniert so nicht.
    Du könntest aus dem Goto Set_alarm mal ein Gosub Set_alarm machen.
    Nach dem Ende des Stellens würde er aufgrund des Return zurück hinter den Gosub Befehl springen.
    Habe ich mir jetzt aber noch nicht angesehen, was dann passieren würde.

    Edit: Willst du eigentlich die Taste TA_mode drücken um in den Stellmodus zu gelangen und auch wieder, um den zu verlassen (If Ta_mode = 0 Then Exit Do)? Dann wäre die Taste immer noch gedrückt, wenn das Programm nach dem Return zum Befehl hinter Gosub ... zurückkehrt. Nach der Ausgabe aufs LCD springt er dann sofort wieder in die Set_alarm Routine. Dass müsstest du dir dann noch einmal ansehen.

  6. #6
    Erfahrener Benutzer Roboter Genie Avatar von HeXPloreR
    Registriert seit
    08.07.2008
    Ort
    Bad Bramstedt
    Alter
    45
    Beiträge
    1.369
    Hallo,

    ich meine das mit dem "return" was for_ro anspricht ist schon mal ein ganz heißer Tipp. Du solltest vielleicht Gosub's aus Deinen Einstellungsteilen machen und da muss dann mit einem "return" beendet werden - hier ist das "return" falsch, da vorher kein Aufruf erfolgt ist.

    Das Goto Set_Alarm benötigst Du nicht wenn Du den Teil auf den sich das bezieht in den ersten mit integrierst. Weil Du gehst ja sowieso dahin, wenn Du drin bist.

    Das "debouncing" ist nutzlos wenn nach dem zweiten testen nicht die Reaktion des Tasters ausgeführt wird.
    Geändert von HeXPloreR (03.11.2013 um 13:21 Uhr)

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    03.10.2013
    Beiträge
    11
    @ for_ro:
    Genau wie Du schreibst, ist es!
    Nochmal kurz erklärt, was ich eigentlich will:
    Der "Mode"-Taster soll zwischen "Anzeigen-und Alarm-Ein" Mode" und " Stellen" Mode" umschalten.
    Es könnte auch so gehen, das ich gleichzeitig Mode- und Stelltaster zum stellen drücken muß.
    Ich glaube, das geht wohl am Einfachsten.
    Das Debouncing stammt noch vom alten Codeschnipsel, das wird nicht nötig sein.

    - - - Aktualisiert - - -

    Ich hab das jetzt mal so gemacht:
    Code:
    $regfile = "m8def.dat"
    $crystal = 9830400
    $hwstack = 40
    $swstack = 16
    $framesize = 32
    $include "INIT_LCD20x4.bas"                                 'LCD an Port D
    Pinb = &B11000000                                           'B  2,3,4 = Taster
    Portb = &B00111100
    Dim Al_min As Byte , Al_std As Byte
    Ta_std Alias Pinb.2
    Ta_min Alias Pinb.3
    Ta_mode Alias Pinb.4
    Locate 1 , 1 : Lcd "Alarm "
    Do
          If Ta_mode = 0 Then
             Locate 1 , 13 : Lcd "Stellen"
                Else
             Locate 1 , 13 : Lcd "Ein     "
          End If
          If Ta_min = 0 And Ta_mode = 0 Then
                   Al_min = Al_min + 1                          'Minute stellen
                      If Al_min = 60 Then Al_min = 0
                         Waitms 200
          End If
          If Ta_std = 0 And Ta_mode = 0 Then
                   Al_std = Al_std + 1                          'Stunde stellen
                      If Al_std = 24 Then Al_std = 0
                         Waitms 200
          End If
    '-------------- LCD rechtsbündige Anzeige ------------------------------------
    Locate 1 , 7
                   If Al_Std < 10 Then Lcd " " ; Al_Std Else Lcd Al_Std ; "  "
    Locate 1 , 9
                   If Al_Min < 10 Then Lcd ":0" ; Al_Min Else Lcd ":" ; Al_Min
       Waitms 50
    Loop
    End
    und das geht so wie gewollt! Die zwei-Taster-Bedienung ist garnicht mal schlecht.

    Jetzt brauch ich nur noch den Uhrzeit-Vergleich und die Ausgabe austüfteln.

    Ich danke Euch für die hilfreichen Tipps, hab ich doch wieder was gelernt!

    Joachim

Ähnliche Themen

  1. Genauer Temperaturmonitor mit einstellbarem Alarm
    Von Roboternetz-News im Forum Neuigkeiten / Technik-News / Nachrichten / Aktuelles
    Antworten: 0
    Letzter Beitrag: 29.08.2012, 22:40
  2. Antworten: 3
    Letzter Beitrag: 03.07.2012, 16:55
  3. Bascom Uhr Problem
    Von xbgamer im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 33
    Letzter Beitrag: 03.07.2010, 13:11
  4. Problem mit Selbstbau-Ätzmaschinen-Heizung
    Von Majuz im Forum Konstruktion/CAD/3D-Druck/Sketchup und Platinenlayout Eagle & Fritzing u.a.
    Antworten: 19
    Letzter Beitrag: 24.04.2009, 11:43
  5. Tipp!!! Probleme bei Selbstbau ISP Dongel
    Von colognerabb im Forum AVR Hardwarethemen
    Antworten: 4
    Letzter Beitrag: 06.10.2006, 20:58

Berechtigungen

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

Labornetzteil AliExpress