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):
Anbei noch die .bas Datei für Bascom.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
Ich würde mich freuen, wenn sich jemand das Programm mal anschauen könnte und mir ein paar Verbesserungsvorschläge geben kann.
Mfg Baumschubser







Zitieren

Lesezeichen