Raumcon
Allgemein => Schwarzes Brett => Thema gestartet von: runner02 am 31. Juli 2011, 18:23:04
-
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.html (http://www.binaer-armbanduhr.de/ablesen.html)
Der 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)
(http://t1.gstatic.com/images?q=tbn:ANd9GcRSUfTPW6N4q1G84ru450SMcme3HEPIwEm8zLxM06wbJCC8si3y)
Natürlich kommt unter die LEDs eine Beschriftung zur besseren Ablesbarkeit wie hier
(http://t3.gstatic.com/images?q=tbn:ANd9GcR7Lq0sxAOYl_8KyZI4_96nFnbWdgUvj2e47JJEBA3KMNXE6gBd)
-
Das ist eine sehr schöne Idee... zu der Du offensichtlich das technische Verständnis besitzt sie umzusetzen - was Dich von mir unterscheidet. ;D
Überleg' doch mal, ob Du solche Uhren, in geringer Stückzahl, nicht auch zum Verkauf anfertigen könntest. Der Kreis der Marsianer im Geiste ist größer, als man gemeinhin so glaubt.
-
Puh, verkaufen?? Ich weiß nicht...
Ich mache das ganze auf Lochrasterplatine, das ist jedes mal ein Haufen Arbeit zu löten...
Wollte ich das in Massen produzieren, bräuchte ich eine Vorlage zum Ätzen - das hat bei mir bis jetzt noch nicht geklappt am Computer.... Naja, mal schauen...
Obwohl, bei Pollin hab ich ein LCD für unter 3€ gesehen (!!), wenn ich das ansteuern könnte, bräuchte ich nicht alle diese Leds einzeln anlöten und das Werk wäre viel einfacher bzw. schneller....
$regfile = "m8def.dat"
$crystal = 1000000
$hwstack = 50
$swstack = 50
Config Portb = Output
Config Timer1 = Timer , Prescale = 1024
Enable Timer1
On Timer1 Isr_von_timer1
Enable Interrupts
Timer1 = 6942
Do
Toggle Portb.0
Waitms 200
' Hauptprogramm zb. wait
Loop
End
Isr_von_timer1:
Timer1 = 6942
Toggle Portb.1
Return
Dieses Programm funktioniert übrigends schon. Das ist auch die Grundlage der Marsuhr - der Minutenzähler als Interrupt (jede Minute schaltet sich die LED1 an und jede zweite aus) mit irgendwas machen im Hauptprogramm. Habe die Zeiten nachgemessen, stimmen mit relativ guter Genauigkeit.
Stay tuned ;)
P.S. Wäre cool, wenn ich irgendwie Bilder hochladen könnte .... :)
-
Die Opportunity-Marsuhr als App wäre leichter zu vertreiben. ;)
-
Hallo runner02,
lass Dir das patentieren... ;)
Die vergleichbaren Uhren für Spirit bzw. Opportunity :
http://www.spiegel.de/wissenschaft/weltall/0,1518,281974,00.html (http://www.spiegel.de/wissenschaft/weltall/0,1518,281974,00.html)
Schöne Grüße aus Hamburg - Mirko
-
Hallo runner02,
lass Dir das patentieren... ;)
Die vergleichbaren Uhren für Spirit bzw. Opportunity :
http://www.spiegel.de/wissenschaft/weltall/0,1518,281974,00.html (http://www.spiegel.de/wissenschaft/weltall/0,1518,281974,00.html)
Schöne Grüße aus Hamburg - Mirko
Digital ist die Zukunft ;)
Ob ich an dier Roverdriver ein Exemplar schicken soll, wenn sie mal hinhaut? :D
-
Hallo runner02,
die würden sich ganz gewiss freuen ;)
Aber nur eine Uhr... Das Roverdriver-Team für Spirit und Opportunity bestand in "Spitzenzeiten" ( also zu Beginn der Mission ) aus bis zu 20 Leuten, welche dabei wechselweise für beide Rover zuständig waren. Nebenbei ist ein Teil dieser Leute aber auch für andere Aufgaben am JPL eingesetzt gewesen und war/ ist nur bei Bedarf in die MER-Mission eingebunden...
Schöne Grüße aus Hamburg - Mirko
-
So, der Compiler spuckt keine Fehlermeldung mehr aus, also müsste der Code hinhauen.
Jetzt 'nur noch' die Schaltung aufbauen, und schauen, obs schon auf Anhieb klappt ;)
-
Ok, habe die Schaltung auf Steckplatine teilweise aufgebaut, aber komischerweise leuchtet D4 ohne Grund...
Habe auch im Code noch eine Kleinigkeit gefunden.
Ich denke, ich werde aus dem Code mal die Sols und alles weitere vorerst Unnötige rausnehmen, um zu sehen, wo der Fehler liegt...
-
Eine tolle Idee!!!!!! Gratuliere! :)
Aber verstehe ich es richtig, wenn das ganze als Armbanduhr geplant ist?
Interessant fände ich diese Uhr zbsp auch eingebaut in ein Mars-Relief, das aus Gips modelliert ist und sich dann als Wand-Deko aufhängen läßt...
Ich habe viele Jahre lang beruflich Gips-Modelle hergestellt, deswegen fällt mir so ein Mars-Relief spontan zu dieser Uhr ein. ::)
-
Eine tolle Idee!!!!!! Gratuliere! :)
Aber verstehe ich es richtig, wenn das ganze als Armbanduhr geplant ist?
Interessant fände ich diese Uhr zbsp auch eingebaut in ein Mars-Relief, das aus Gips modelliert ist und sich dann als Wand-Deko aufhängen läßt...
Ich habe viele Jahre lang beruflich Gips-Modelle hergestellt, deswegen fällt mir so ein Mars-Relief spontan zu dieser Uhr ein. ::)
Naja, da die elektronischen Bauteile sehr klein sind, könnte man sie theoretisch auch als Armbanduhr konzipieren. Vorerst mache ich aber einfach eine kleine Platine, da könnte man natürlich ein relief drübermachen zur Optik...
Wie auch immer, zuerst muss mal der Code stimmen ;)
Ich werde das Programm aus Beitrag 3 sukzessive so verändern - Schritt für Schritt - wenn alles klappt, dann die Erweiterung. Denn ab einer gewissen Codelänge wird es immer schwieriger, da eine einzelne Fehlerquelle auszumachen...
Gott sei Dank ist es ja noch ein Weilchen hin bis zum Start von Curiosity, das ist meine Zeitvorgabe ;)
-
Hier habe ich etwas ähnliches gefunden, nur mit einer Erduhr. Die außerdem auch noch die Sekunden anzeigt...
-
Hab neulich einen bekannten Elektroniker angefordert, dass er mir hilft den LCD anzuschließen+anzusteuern...
Ich denke, das ist besser als ne Binäruhr, weil dann jeder die Zeit ablesen kann, außerdem könnte man das dann auch einfach mit einem Temperatursensor etc. erweitern.
Ist zwar anfangs ein bisschen komplizierter als nur LEDs anzusteuern, dafür lässt sich dann aber alles in Zeichen, Buchstaben, Zahlen, Sonderzeichen, etc. ausgeben...
-
Hey Leute, gute Nachrichten!
Heute war der Elektroniker da - und siehe da: das LCD läuft ja...
Es schrieb zwar "Hallo wel_ shift" (Hallo welt - für die's nicht wissen: Der Standart-Test beim Ersten Programm obs richtig ausgegeben wird) , weil der Code für ein zweizeiliges war.
Jedenfalls besorg ich mir jetzt ein zweizeiliges (statt dem einzeiligem), und wenn das klappt ist der Rest ein Klacks ;)
-
Es geht weiter.
Mit neuem, doppelzeiligen LCD.
Folgendes wird bereits angezeigt:
MSL local Time
12:12 Sol 1234
aber die Ziffern springen wie wild herum, überschreiben den Sol und dann heißt es 4455466264542 und Bruchteile einer Sekunde später 874554268 usw. da ist noch ein Fehler drin... Ich arbeite halt noch daran ;) aber der Zeitpunkt der Landung auf dem Mars ist ja eh noch ein Weilchen hin ;)
-
Ohne Komplikationen wäre es kein für die Raumfahrt typischer Vorgang! ;D
Also einfach den längeren Atem haben als die Fehler, ich bin sehr sicher, dass Deine Hartnäckigkeit sich durchsetzen wird.
Ich will Dich da wirklich nicht indoktrinieren (naja, ein bißchen vielleicht...), aber stell' Dir mal vor Du bist erfolgreich, Du hast es geschafft und Du weißt wie diese Uhr gebaut werden muss.
"Umlaufbahn" fertigt eine Marslandschaftsschablone, sodass man relativ unkompliziert Marslandschaften gießen kann. In der Abteilung Modelbau finden wir vielleicht auch noch ein Talent, dass den Rover bauen kann. Die Uhr wird in die Landschaft eingelassen, der Rover auf den "Mars" gesetzt, das Ganze kommt unter Plexiglas... weißt Du, was Liebhaber des roten Planeten für diese Schreibtisch-Deko ausgeben würden?? :D
Wir bauen einen Raumfahrer.Net-Shop auf... wir vertreiben das Schmuckstück weltweit. Wir finanzieren damit Raumcon-Treffen, mehr Server-Kapazität... den Überschuß investieren wir in Werbespots... das bedeutet noch mehr Verkauf und riesige Publicity für diese Website... hmmmm, ich weiß, manchmal muss man mich ausbremsen... ;D
Was ich damit eigentlich sagen will ist: ich finde Deine Idee Spitze, verfolge den Bau sehr interessiert und bin sicher, dass ganz viele diese Uhr ebenso toll finden. ;)
-
Jetzt schießt Du aber doch etwas über das Ziel hinaus!
Raumfahrer.net ist nicht kommerziell und kostenlos - und so wird es auch bleiben.
Hier gibt es auch keine Werbung.
-
Ich weiß. :D
Ich sag' ja... manchmal muss man meine Gedankenspielereien mit dem Lasso zur Raison bringen.
Aber die Uhr würde ich kaufen... ;)
-
Jetzt schießt Du aber doch etwas über das Ziel hinaus!
Raumfahrer.net ist nicht kommerziell und kostenlos - und so wird es auch bleiben.
Hier gibt es auch keine Werbung.
Vielleicht keine Werbung, aber Anzeigen. Schau mal rechts in dem Kasten.
-
Vielleicht keine Werbung, aber Anzeigen.
Anzeige. Eine kleine themennahe Anzeige hilft uns etwas bei der Finanzierung des Servers.
Und dabei soll es auch bleiben.
Eine Ausnahme bestätigt die Regel! ;)
Würden wir Werbung zulassen, wäre hier alles voll davon und wir würden kaum noch Inhalte finden.
-
Ich habe eine großartige Nachricht zu verkünden:
Sie geht endlich!!!
Ich poste mal den vollständigen Code:
$regfile = "m8def.dat" ' specify the used micro
$crystal = 1000000 ' used crystal frequency
$baud = 19200 ' use baud rate
$hwstack = 150 ' default use 32 for the hardware stack
$swstack = 150 ' default use 10 for the SW stack
$framesize = 60 ' default use 40 for the frame space
'note : tested in PIN mode with 4-bit
Config Lcdpin = Pin , Db4 = Portb.1 , Db5 = Portb.2 , Db6 = Portb.3 , Db7 = Portb.4 , E = Portb.5 , Rs = Portb.6
Dim A As Byte
Config Lcd = 16 * 2 'configure lcd screen
'other options are 16 * 4 and 20 * 4, 20 * 2 , 16 * 1a
'When you dont include this option 16 * 2 is assumed
'16 * 1a is intended for 16 character displays with split addresses over 2 lines
Config Timer1 = Timer , Prescale = 1024
Enable Timer1
Dim Minutes As Byte
Dim Hours As Byte
Dim Minutes10 As Byte
Dim Hours10 As Byte
Dim Minutes1 As Byte
Dim Hours1 As Byte
Dim Sol As Integer
Dim Tausender As Byte
Dim Hunderter As Byte
Dim Zehner As Byte
Dim Einer As Byte
Dim I As Byte
Dim Minuteshelp As Byte
Dim Hourshelp As Byte
Minutes = 0
Minutes10 = 0
Hours10 = 0
Hours = 0
Sol = 1
Ddrd = &B00000000 'input D
On Timer1 Isr_von_timer1
Enable Interrupts
Timer1 = 6942
Cls 'clear the LCD display
Lcd "Mars Local Time"
Wait 2
Cls 'clear the LCD display
Lcd "MSL Curiosity"
Do
If Pind.0 = 0 Then
Minutes = Minutes - 1
End If
If Minutes > 59 Then
Minutes = 0
Hours = Hours + 1
End If
If Pind.1 = 0 Then
Minutes = Minutes + 10
End If
If Pind.2 = 1 Then
Hours = Hours + 1
End If
If Pind.3 = 1 Then
Sol = Sol + 1
End If
If Pind.4 = 1 Then
Sol = Sol + 100
End If
Minutes10 = Minutes / 10
Minuteshelp = Minutes10 * 10
Minutes1 = Minutes - Minuteshelp
Hours10 = Hours / 10
Hourshelp = Hours10 * 10
Hours1 = Hours - Hourshelp
Locate 2 , 0 'select the lower line
Lcd Str(hours10) 'Ausgabe Stunden, Minuten, Sol
Lcd Str(hours1)
Lcd ":"
Lcd Str(minutes10)
Lcd Str(minutes1)
Lcd " Sol "
Lcd Str(sol)
Cursor Off Noblink
Wait 1
If Hours = 24 And Minutes = 39 Then 'bei vollem Sol umschalten
Waitms 3524
Sol = Sol + 1
Hours = 0
End If
If Hours >= 25 Then 'falls man mit dem Taster versehentlich zu viel drückt (ist mir passiert ;) )
Hours = 0
Sol = Sol + 1
End If
Loop
Isr_von_timer1:
Timer1 = 6942
Minutes = Minutes + 1
Return
End
Somit kann sich jetzt jeder, der nen Atmega8, ein paar Kabel und einen 2*16 zeiligen LCD herumliegen hat, eine funktionsfähige Marsuhr bauen!!
So sieht die Anzeige als fertige aus:
_________________
MSL Curiosity
08:23 Sol 1253
_________________
Ich werde das ganze jetz mal von der provisorischen Steckplatine auf Lochrasterplatine löten, dann sieht die ganze Apperatur gleich mal um einiges besser aus ;)
Mit 5 Tastern kann man übrigens Zeit und Datum einstellen.
Minute -1 (Portd.0)
Minute +10 (Portd.1)
Hour+1 (Portd.2)
Sol +1 (Portd.3)
Sol +100 (für später, sonst müsste man bei Sol 1000 tausend mal drücken! ;D Portd.4)
-
Was nutzt Du denn zum programmieren? AVR Studio? Assembler ist das aber ja nicht wirklich oder? Woher kommen denn sonst die if's? Mein ATMEGA8 kann zumindest kein if bearbeiten sondern da muss man mit Statusregistern und branchequal und Sprüngen, Unterprogrammen usw arbeiten.
Gruß, Klaus
-
Ich habe keine Ahnung von dem technischen background, den Du gerade ausführst... aber ich gratuliere Dir sehr sehr herzlich zu dem Durchbruch... und warte auf erste Bilder des gelöteten Prototyps. ;)
-
Was nutzt Du denn zum programmieren? AVR Studio? Assembler ist das aber ja nicht wirklich oder? Woher kommen denn sonst die if's? Mein ATMEGA8 kann zumindest kein if bearbeiten sondern da muss man mit Statusregistern und branchequal und Sprüngen, Unterprogrammen usw arbeiten.
Früher habe ich immer mit dem MyAVR workpad (in C) programmiert.
Die Programmierung ist damit sehr übersichtlich und Hardware-Nah.
Als ich damit dann UART (Kommunikation zwischen Chips) und LCD nutzen wollte, wurde das sehr schwierig.
Darum programmiere ich jetzt in BASCOM-AVR. Die Sprache ist ähnlich zu Basic, nur auf Mikrocontroller optimiert.
Wie man oben sehen kann, muss man z.B. nur Lcd "...." eingeben und er schreibt es. In C müsste man verschiedene Register aufrufen, und das alles zu eruieren ist mir nicht gelungen. (BASCOM ist eine sehr gute Hochsprache, der "Nachteil" ist dabei nur, dass man eben die Register nicht mehr kennt, die man für den LCD aufrufen müsste. Das läuft alles wie in einer Blackbox - deutlichst vereinfacht. )
Assembler ist mir dann doch zu kompliziert ;) ::)
So sieht in etwa die Entwicklungsumgebung aus (nur eine neuere Version)
(http://xtronic.org/wp-content/uploads/2010/08/Bascom-AVR.jpeg)
http://www.mcselec.com/ (http://www.mcselec.com/)
-
Erfolgreich vor Assembler gedrückt 8)
Trotzdem schönes Bauprojekt. Mal sehn ob ich irgendwann nochmal was mit meinem ATMEGA8 mache.
Gruß, Klaus
-
Naja, ich habe großen Respekt vor Assembler und Leuten, die es beherrschen ;)
C wird zwar meistens in Industrielösungen eingesetzt, aber BASCOM ist da einfach unschlagbar was die Abstraktion angeht... eine Zeile Bascom ersetzt im Extremfall 10 Zeilen in C Sprache 8)
Naja, ich werde mal ein Video machen und posten, wenn ich es hier irgendwo hochladen kann. ;)