- fchao-Sinus-Wechselrichter AliExpress         
Ergebnis 1 bis 5 von 5

Thema: Programm Binäruhr

Baum-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    01.11.2004
    Alter
    40
    Beiträge
    29

    Programm Binäruhr

    Moin Moin,

    ich habe mir ne Binäruhr auf eine 160x100mm Platine gebastelt und betreibe die Uhr mit einem AT Mega 8. Der Mega 8 steuert 3 450 ICs (dual Binär-Zähler), die wiederrum die LEDs direkt ansteuern.
    Auf der Platine befinden sich zwei Taster. Der erste Taster hält auf Druck das normale Zählen an und wechselt bei weiterem Tastendruck von Stunden zu Minuten, von Minuten zu Sekunden, von Sekunden zum Normalbetrieb. Währenddessen kann man mit dem zweiten Taster die Uhr stellen.

    Das Progamm, das ich schrieb, wirkt mir wesentlich zu lang und umständlich. Das liegt vielleicht daran, daß es mein erstes ist
    Naja funktionieren tut es, aber zwei gefallen mir noch nicht:

    Wenn die 1er-Sekundenanzeige den Wert 10 errreicht, muß Sie ja augenblicklich zurückgesetzt werden und die 10er Sekundenanzeige zählt um 1 hoch. Bei der 1er Anzeige ist für eine halbe Sekunde trotzdem die 10 zu erkennen.

    Dann läuft die Uhr nicht genau auf 1Hz - ich habe ziemlich große Abweichungen, wenn ich das Ganze mit einer normalen Uhr vergleiche.
    Ich nutze den internen 1Mhz Ozillator, der natürlich nicht genau 1Hz erreicht. Ich habe hier noch ein Uhrenquarz liegen, mit dem man die gewünschten 1Hz bestimmt realisieren kann - ich weiß nur noch nicht wie.

    Ausserdem wäre es nicht schlecht, wenn das Programm automatisch zählt, wenn Taster, der zum Stellen benutzt wird, länger als beispielsweise 1 Sekunde gedrückt wird.

    Ok jetzt zeig ich endlich den code (hoffentlich ausreichend kommentiert):

    Code:
    '                ######################################
    '   ##################  Binäruhr (groove version  #####################
    '                ######################################
    
    
    'Zuordnung Pins:
    
    'Pin:
    '28.  PC5 - Taster Stellen
    '6.   PD4 - Taster Auswahl
    
    '2.   PD0 - Stunden2  Reset
    '3.   PD1 - Stunden2  Clock
    '4.   PD2 - Stunden1  Reset
    '5.   PD3 - Stunden1  Clock
    
    '11.  PD5 - Minuten2  Reset
    '12.  PD6 - Minuten2  Clock
    '15.  PB1 - Minuten1  Reset
    '16.  PB2 - Minuten1  Clock
    
    '17.  PB3 - Sekunden2 Reset
    '18.  PB4 - Sekunden2 Clock
    '19.  PB5 - Sekunden1 Reset
    '23.  PC0 - Sekunden1 Clock
    
    $regfile = "m8def.dat"
    $crystal = 1000000
    Declare Sub Anhalten
    Declare Sub Stellen
    
    Ddrd = &B11101111
    Portd = &B00010000
    Ddrc = &B11011111
    Portc = &B00100000
    Ddrb = &B11111111
    Portb = &B00000000
    
    Dim S1 As Byte
    Dim S2 As Byte
    Dim M1 As Byte
    Dim M2 As Byte
    Dim H1 As Byte
    Dim H2 As Byte
    Dim X As Byte
    Dim Y As Bit
    Dim Stacht As Bit
    
    S1 = 0
    S2 = 0
    M1 = 0
    M2 = 0
    H1 = 0
    H2 = 0
    X = 0
    Y = 0
    Stacht = 0
    
    Do
    
    Debounce Pind.4 , 0 , Anhalten , Sub                        'entprellen
    Debounce Pinc.5 , 0 , Stellen , Sub
    
    
    
    'Start Reset:
    
    If Stacht = 0 Then
    Portd.0 = 1
    Portd.2 = 1
    Portd.5 = 1
    Portb.1 = 1
    Portb.3 = 1
    Portb.5 = 1
    Waitms 20
    Portd.0 = 0
    Portd.2 = 0
    Portd.5 = 0
    Portb.1 = 0
    Portb.3 = 0
    Portb.5 = 0
    Stacht = 1
    Else
    End If
    
    '---------------------------
    
    'Startbedingungen:
    
    Select Case X
    Case 0:
    Goto Normal
    Case 1 To 3:
    Goto Stellmodus
    Case 4:
    X = 0
    Goto Ende
    Case Else
    End Select
    
    '----------------------------
    
    'Normalbetrieb:
    
    Normal:
    
    'Sekunden:
    
    Waitms 500
    Portb.4 = 1
    Waitms 500
    Portb.4 = 0                                                 'takt jede sekunde
    S2 = S2 + 1
    
    If S2 = 10 Then                                             'wenn s2 = 10 dann reset sek2, set sek1
    S1 = S1 + 1
    S2 = 0
    Portb.3 = 1
    Portc.0 = 1
    Waitms 10
    Portb.3 = 0
    Portc.0 = 0
    Else
    End If
    
    'Minuten:
    
    If S1 = 6 Then                                              'wenn sek1 = 6 dann reset sek1, set min2
    M2 = M2 + 1
    S1 = 0
    Portb.5 = 1
    Portd.6 = 1
    Waitms 10
    Portb.5 = 0
    Portd.6 = 0
    Else
    End If
    
    If M2 = 10 Then                                             'wenn min2 = 10 dann reset min2, set min1
    M1 = M1 + 1
    M2 = 0
    Portd.5 = 1
    Portb.2 = 1
    Waitms 10
    Portd.5 = 0
    Portb.2 = 0
    Else
    End If
    
    'Stunden:
    
    If M1 = 6 Then                                              'wenn min1 = 6 dann reset min1, set h2
    H2 = H2 + 1
    M1 = 0
    Portb.1 = 1
    Portd.1 = 1
    Waitms 10
    Portb.1 = 0
    Portd.1 = 0
    Else
    End If
    
    If H2 = 10 Then                                             'wenn h2 = 10 dann reset h2, set h1
    H1 = H1 + 1
    H2 = 0
    Portd.0 = 1
    Portd.3 = 1
    Waitms 10
    Portd.0 = 0
    Portd.3 = 0
    Else
    End If
    
    If H1 = 2 And H2 = 4 Then                                   'wenn h1 = 2 und h2 = 4 dann reset h1,h2
    H1 = 0
    H2 = 0
    Portd.2 = 1
    Portd.0 = 1
    Waitms 500
    Portd.2 = 0
    Portd.0 = 0
    Else
    End If
    Goto Ende
    
    '---------------------------
    
    'Uhrzeit einstellen:
    
    Stellmodus:
    
    'Stunden:
    
    If X = 1 And Y = 1 Then                                     'wenn x=1 und taster gedrückt dann takt
    H2 = H2 + 1
    Portd.1 = 1
    Waitms 10
    Portd.1 = 0
    Y = 0
    Else
    End If
    
    If H2 = 10 Then                                             'wenn h2 = 10 dann reset h2, set h1
    H1 = H1 + 1
    H2 = 0
    Portd.0 = 1
    Portd.3 = 1
    Waitms 10
    Portd.0 = 0
    Portd.3 = 0
    Else
    End If
    
    If H1 = 2 And H2 = 4 Then                                   'wenn h1 = 2 und h2 = 4 dann reset h1,h2
    H1 = 0
    H2 = 0
    Portd.2 = 1
    Portd.0 = 1
    Waitms 10
    Portd.2 = 0
    Portd.0 = 0
    Else
    End If
    
    'Minuten:
    
    If X = 2 And Y = 1 Then                                     'wenn x=2 und taster gedrückt dann takt
    M2 = M2 + 1
    Portd.6 = 1
    Waitms 10
    Portd.6 = 0
    Y = 0
    Else
    End If
    
    If M2 = 10 Then                                             'wenn min2 = 10 dann reset min2, set min1
    M1 = M1 + 1
    M2 = 0
    Portd.5 = 1
    Portb.2 = 1
    Waitms 10
    Portd.5 = 0
    Portb.2 = 0
    Else
    End If
    
    If M1 = 6 Then                                              'wenn min1 = 6 dann reset min1
    M1 = 0
    Portb.1 = 1
    Waitms 10
    Portb.1 = 0
    Else
    End If
    
    'Sekunden:
    
    If X = 3 And Y = 1 Then
    Portb.4 = 1
    Waitms 20
    Portb.4 = 0                                                 'sekundentakt auf tastendruck
    S2 = S2 + 1
    Y = 0
    Else
    End If
    
    If S2 = 10 Then                                             'wenn s1 = 10 dann reset sek2, set sek1
    S1 = S1 + 1
    S2 = 0
    Portb.3 = 1
    Portc.0 = 1
    Waitms 10
    Portb.3 = 0
    Portc.0 = 0
    Else
    End If
    
    If S1 = 6 Then                                              'wenn sek1 = 6 dann reset sek1
    S1 = 0
    Portb.5 = 1
    Waitms 10
    Portb.5 = 0
    Else
    End If
    
    'Ende:
    
    Ende:
    Loop
    
    '------------------------
    
    'Unterprogramme:
    
    Sub Anhalten
    X = X + 1
    End Sub
    
    Sub Stellen
    Y = 1
    End Sub
    
    '------------------------
    
    End
    Anbei noch die .bas Datei für Bascom.
    Ich würde mich freuen, wenn sich jemand das Programm mal anschauen könnte und mir ein paar Verbesserungsvorschläge geben kann.

    Mfg Baumschubser
    Angehängte Dateien Angehängte Dateien

Berechtigungen

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

Labornetzteil AliExpress