- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 10 von 10

Thema: Steuerung für TN Tochteruhr

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    27.08.2013
    Ort
    Region Basel
    Alter
    67
    Beiträge
    2.435
    Hallo, Kannst du auch so lösen:

    Code:
    Dim D As Word
    
     ...
    
    D = 0
    Do
      If D = 0 And C = 915 Then
        C = 999
        Incr D
      Else If D = 1 And C = 916 Then
        C = 999
        Incr D
      Else If D = 2 And C = 916 Then
        C = 999
        Incr D
      Else If D = 3 And C = 916 Then
        C = 999
        D = 0
      End If
    
      If C > 990 Then
        C = 0
    
        Toggle B
    
    
    
          If B = 0 Then
    
             Portb.1 = 1
    
             Waitms 400
    
             Portb.1 = 0
    
             Else
    
             Portb.0 = 1
    
             Waitms 400
    
             Portb.0 = 0
    
          End If
    
      End If
    
      Loop
    Kannst du beliebig ausbauen.
    Ich kenn dein BASIC nicht, müsste aber auch ein Switch haben, geht auch an Stelle der verschachteltet If's

    MfG Peter(TOO)
    P.S. BASIC ist bei mir schon ewig her ....

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.242
    Die Lösung könnte ein RTC Chip sein.
    Bei Dallas gibt es welche, die eine Abweichung von 3 Sekunden pro Jahr haben.
    Deine Uhr läuft dann mit dem normalen Quarz und jede Minute / Stunde wird der RTC Chip einmal ausgelesen und der Controller aktualisiert.
    Der Stromverbrauch sollte dann auch nicht das Problem sein.
    Zudem hat der RTC Chip eine eigene externe Stützbatterie, falls Du die Batterie der Uhr doch mal wechseln musst.

    DCF 77 ist auch ne Lösung, braucht aber mehr Strom.
    Ich hab das mal so gemacht, das die Controller Uhr 3 mal eine gültige Uhrzeit vom DCF77 kriegen muss, damit sie für die Tochteruhr übernommen wird.
    Bei jedem 30igstem Sekundenimpuls wird die interne Controlleruhr wieder auf 30 Sekunden gestellt.
    Damit vermeidet man dann einen Gangfehler von max 1:59 Minuten.
    Die Konfiguration läuft bei mir seit etwa 2 Jahren problemlos.
    Sommer und Winterzeit stellt sich auch automatisch um, so lange ein DCF Signal vorhanden ist.

    Die Soft ist in "C" also nicht mit Bascom kompatibel.

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    08.06.2011
    Ort
    Ruhrgebiet
    Alter
    36
    Beiträge
    42
    Hallo zusammen!

    Gestern Abend habe ich den Code nochmal geändert, so dass jede Minute gewechselt wird zwischen C = 915 oder 916. Da mittelt sich aber garnichts. Wird eher schlimmer . Nach 17 Stunden Betrieb, gibts nen Gangfehler von 7 Minuten (nachgehend).

    Werd mir nochmal alle Möglichkeiten anschauen. Die idee mit der Realtimeclock ist auch gut.

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    27.08.2013
    Ort
    Region Basel
    Alter
    67
    Beiträge
    2.435
    Hallo,

    Dann hat sich der Fehle verdoppelt, dann musst du 914 und 915 nehmen.

    Die genaue Rechnerei habe ich mir erspart, ging nur ums Prinzip, wie man nicht ganzzahlige Teiler machen kann.

    MfG Peter(TOO)

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    08.06.2011
    Ort
    Ruhrgebiet
    Alter
    36
    Beiträge
    42
    Kurze Aktualisierung...

    Nach 15 Stunden hab ich es auf 1 Minute und 5 Sekunden Gangfehler geschafft.

    Die Variable D wurde hinzugefügt, um jede Minute einen anderen Zählwert einzusetzen. Ist mit sicherheit keine elegante Methode. Vorallem kann ich mir vorstellen das es besser wäre, schon innerhalb einer Minute zu mitteln. Und das ganze nicht über mehrere Minuten zu ziehen. Warscheinlich hätte man mit etwas Mathematikverständnis den richtigen Mittelwert auch direkt errechnen können. Da ich ein sollches Verständnis nicht besitze, lief es über try and error

    Hier ist der aktuelle Code:

    Code:
    $regfile = "attiny45.dat"
    
    '### 2 MHz Quarz, Fusebit für 1/8 Systemtakt gesetzt ###
    $crystal = 250000
    $hwstack = 36
    $swstack = 4
    $framesize = 4
    
    
    '### Bit zum minütlichen Wechsel des Ausgangsports ###
    Dim B As Bit
    
    
    '### Zählvariable wird beim Timerüberlauf inkrementiert ###
    Dim C As Word
    
    
    '### Zählkonstante für Mittelung
    Dim K As Word
    
    
    
    Dim D As Byte
    
    
    '### Ausgänge für beide Brückenzweige ###
    Config Portb.0 = Output
    Config Portb.1 = Output
    
    
    
    
    '### Timer0 konfigurieren. 0,25 MHz (Systemtakt) / 64 (Prescaler) = 3906,25 / 256 (8-Bit Timer) * 60 (Sekunden) = 915,527 ###
    
    Config Timer0 = Timer , Prescale = 64
    
    
    
    '### Timerüberlauf ###
    On Ovf0 On_ovf0
    Enable Ovf0
    
    
    Enable Interrupts
    
    Start Timer0
    
    
    C = 0
    D = 0
    
    Do
    
    
    
    
    Select Case D
    
    Case 0 : K = 915
    Case 1 : K = 916
    Case 2 : K = 915
    Case 3 : K = 915
    Case 4 : K = 916
    Case 5 : K = 916
    Case 6 : K = 916
    Case 7 : K = 916
    Case 8 : K = 915
    
    End Select
    
     If D = 8 Then
    
     D = 0
    
     End If
    
       Incr D
    
    
    
    
    
    
    
      If C = K Then
    
      C = 0
    
      Toggle B
    
    
    
          If B = 0 Then
    
             Portb.1 = 1
    
             Waitms 400
    
             Portb.1 = 0
    
             Else
    
             Portb.0 = 1
    
             Waitms 400
    
             Portb.0 = 0
    
          End If
    
      End If
    
    
    
    
    
    
    
      Loop
    
    End
    
    
    
    '### Routine bei Timerüberlauf ###
    On_ovf0:
    
    Incr C
    
    
    Return

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    27.08.2013
    Ort
    Region Basel
    Alter
    67
    Beiträge
    2.435
    Hallo,

    Das
    incr D
    ist so falsch !

    Dein Do ... Loop wird tausende male pro Sekunde durchlaufen, nicht nur dann wenn C incrementiert wurde !!

    Code:
    [...]
    
    
    C = 0
    D = 0
    K = 915
    
    Enable Interrupts
    Start Timer0
    
    Do
    
      Select Case D
        Case 0 : K = 915
        Case 1 : K = 916
        Case 2 : K = 915
        Case 3 : K = 915
        Case 4 : K = 916
        Case 5 : K = 916
        Case 6 : K = 916
        Case 7 : K = 916
        Case 8 : K = 915
      End Select
    
      If C >= K Then
        C = 0
        Incr D
        If D > 8 Then
          D = 0
        End If
    
        Toggle B
    [...]
    1. Da C im Interrupt incrementiert wird, solltest du C initialisieren, bevor du den Timer startest.
    2. Bei solchen Zählern sollt man immer auf grösser als oder grösser gleich abfragen ( If D > 8 Then).
    Falls D irgendwie einen Wert ausserhalb von 0 bis 8 annimmt, läuft deine Schlaufe sonst über 65'000 mal durch, D ist Word, also 16 Bit, bis D endlich auf 0 gesetzt wird!



    MfG Peter(TOO)

Ähnliche Themen

  1. steuerung für 18 Servos
    Von freekster im Forum Suche bestimmtes Bauteil bzw. Empfehlung
    Antworten: 6
    Letzter Beitrag: 05.11.2013, 13:49
  2. Steuerung für CNC
    Von GrEEkLoVeR im Forum Elektronik
    Antworten: 3
    Letzter Beitrag: 12.10.2010, 16:30
  3. Steuerung für tauchroboter
    Von P4D im Forum Suche bestimmtes Bauteil bzw. Empfehlung
    Antworten: 1
    Letzter Beitrag: 14.02.2010, 21:22
  4. DC/DC-Wandler für PC-Steuerung
    Von amarikar im Forum Elektronik
    Antworten: 2
    Letzter Beitrag: 21.07.2005, 19:16
  5. Steuerung für Roboterarm
    Von Rubi im Forum Mechanik
    Antworten: 11
    Letzter Beitrag: 15.07.2005, 16:40

Berechtigungen

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

Labornetzteil AliExpress