Hallo Leute,
Ich bin dabei, mir eine Marsuhr zu bauen, damit ich immer weiß, wie spät es bei Curiosity auf dem Mars ist.
Hier würde ich das ganze dokumentieren, falls jemand sich auch sowas nachbauen will
Vorläufig wird die Uhr binär sein, d.h. LEDs zeigen die Uhrzeit an.
http://www.binaer-armbanduhr.de/ablesen.htmlDer aktuelle Sol wird durch einen Morsecode angezeigt, wenn man einen Taster drückt. Eventuell werde ich das ganze später mal auf einem LCD in richtigen Buchstaben und Zahlen ausgeben, aber bis dahin wird das binäre auch schon genug Herausforderung sein.
Geschrieben wird das ganze in BASCOM sein, Arbeitstier ist ein ATmega8.
Hier, das ist mal der vorläufige Quellcode, ist noch nicht debugged oder gar compiliert.
Funktionsweise: Der Timer 1 ist ein 16-Bit-Timer und zählt daher bis zur Zahl 65536. Ich lasse den Timer aber schon bei 6942 (nicht bei 0) beginnen, und mit einer Frequenz von ~960 Hz (1 Mhz, prescaler 1024) des Chips dauert ein Überlauf des Zählers also genau eine Minute. Dann gibt er einen Interrupt, und die Variable 'minutes' erhöht sich um 1. Bei 60 min wird 'minutes' auf 0 gesetzt und 'hours' um 1 erhöht. Bei 24h 39 min 3524 Millisekunden kommt ein Sol dazu und die Uhr beginnt bei 0:00.
Mit 4 Tastern kann man die Minuten (immer +1), Stunden (+1), Sols (+1 und +100) einstellen.
Beim Drücken des 5ten Tasters wird der Sol angezeigt.
$regfile = "m8def.dat"
$crystal = 1000000
$hwstack = 130
$swstack = 130
Config Portd = Output
Config Timer1 = Timer , Prescale = 1024
Enable Timer1
Dim minutes as Byte
Dim hours as Byte
Dim sol as Integer
Dim tausender as Byte
Dim hunderter as Byte
Dim zehner as Byte
Dim einer as Byte
DDRD=&B11111111
DDRC=&B11111111
DDRB=&B11111000
On Timer1 Isr_von_timer1
Enable Interrupts
Timer1 = 6942
Do ' Hauptprogramm
if hours=24 and minutes=39
then
waitms 3524
sol=sol+1
hours=0
end if
If Pinb.0 = 1 Then
minutes=minutes+1
End If
If Pinb.1 = 1 Then
hours=hours+1
End If
If Pind.b = 1 Then
sol=sol+1
End If
If Pinb.3 = 1 Then
sol=sol+100
End If
If Pinb.4 = 1 Then
tausender=sol/1000
hunderter=(sol-1000*tausender)/100
zehner=(sol-1000*tausender-100*hunderter)/10
einer=(sol-1000*tausender-100*hunderter-10*zehner)
for i=0 to i=tausender step 1
Pinb.5=1
waitms 100
Pinb.5=0
waitms 100
Next
for i=0 to i=hunderter step 1
Pinb.6=1
waitms 100
Pinb.6=0
waitms 100
Next
for i=0 to i=zehner step 1
Pinb.7=1
waitms 100
Pinb.7=0
waitms 100
Next
for i=0 to i=einer step 1
Pind.7=1
waitms 100
Pind.7=0
waitms 100
Next
End If
PORTD=Bin(minutes)
PORTC=Bin(hours)
Loop
End
Isr_von_timer1:
Timer1 = 6942
minutes=minutes+1
if minutes=60
then minutes = 0
hours=hours+1
end if
PORTD=Bin(minutes)
PORTC=Bin(hours)
Return
In etwa so würde sie dann aussehen, nur dass keine 3 kleinen Controller nötig sind (1 großer)
Natürlich kommt unter die LEDs eine Beschriftung zur besseren Ablesbarkeit wie hier