Sailor's Clock          

von Ralf Beesner, DK5BU                    
Elektronik-Labor   Projekte   AVR 




Ein Freund bekam vor vielen Jahren eine Schiffsuhr (Yachtzubehör) geschenkt, die seither in seinem Wohnzimmer die Stunden schlägt. Das Schlagwerk ist jedoch für Landratten ungewohnt, denn es orientiert sich am Schiffsbetrieb.

In der christlichen Seefahrt dauer(t)en die Wachen 4 Stunden in einem Zweischicht- oder Dreischicht-System. Auf den Windjammern wurde die Zeit mit der Schiffsglocke geschlagen:

 -Einzelschlag zur halben Stunde
 -Doppelschlag für jede volle Stunde

Beispiel: um 12.00 Uhr endete die alte Wache mit 4 Doppelschlägen. Um 12:30 Uhr ertönte ein Einfachschlag, um 13:00 Uhr ein Doppelschlag; um 13:30 ein Einfachschlag und (mit etwas Pause dazwischen) ein Doppelschlag; um 14:00 dann zwei Doppelschläge.

Eigentlich ist das viel praktischer als das übliche 12-Stunden-Schema von Turmuhren und Wohnzimmeruhren - ob es Vor- oder Nachmittag, morgens oder abends ist, weiß man ja, und während man z.B. um 11:00 Uhr bei einer Kirchturmuhr die 4 Viertelstunden - Schläge und 11 Stunden-Schläge mitzählen muss, sind es bei der Schiffsuhr nur 3 Doppelschläge.


AtTiny13 ausreizen


Das Thema "Morseuhren" ist ja schon ziemlich "ausgelutscht", aber mich wurmte immer, dass meine "Morseuhr 1"  in der AtTiny 13-Version einen externen Sekundentakt aus einer abgewrackten Analoguhr-Elektronik benötigte, da der AtTiny13 keinen Quarzoszillator und nur einen Timer hat.

Er lässt sich jedoch recht einfach an einem externen Quarzoszillator betreiben, und Töne kann man (mit Abstrichen bei der Ton-Konstanz) auch ohne Timer mit dem Bascom-Befehl "Tone" erzeugen, so dass der Timer für die Erzeugung der Sekundenimpulse frei wird.

Herausgekommen sind 3 Uhrenvarianten:

 -Sailor's Clock
 -eine Uhr mit konventionellem 12-Stunden-Schlagwerk
 -eine "standalone"-AtTiny13-Morseuhr 


Hardware


Im Beitrag "AtTiny13-Mutteruhr" hatte ich über Probleme berichtet, einen 3,6864 MHz-Pierce-Quarzoszillator mit geringem Stromverbrauch und großer Amplitude zu bauen (ich hatte dann stattdessen einen 32-kHz-Quarz in einer Multivibrator-Schaltung verwendet).



Wie ich später feststellte, saß das Problem vor dem Oszilloskop. Ich hatte den Tastkopf des Oszilloskops auf 1:1 gestellt und die Last, die er für den Oszillator darstellte, völlig unterschätzt. Nachdem ich bei einem neuen Versuch den Tastkopf auf 1:10 stehen hatte, stellte sich heraus, dass ein Pierce-Oszillator auch bei 1V schon wunderbar schwingt, nur etwas über 100µA verbraucht und eine sichere Taktquelle für den AtTiny 13 darstellt.

Der externe Takteingang des AtTiny13 ist PB3. Der Buzzer kann an einem beliebigen Port liegen; ich habe PB4 gewählt. Dadurch liegen die 3 Mäuseklavier-Schalter für die Zeitvorwahl an PB0 - PB2. Das ermöglicht einfaches Rechnen und ist auch beim Flashen des Controllers praktisch, da die drei Pins bei offenen Schaltern lastfrei sind.

Da der Controller sich ohne externe Taktquelle nicht programmieren lässt, habe ich eine Single-in-Line-Fassung vorgesehen (für Masse, MOSI, MISO,SCK); man kann 4 Drähte einstecken, mit der Platine des LP Mikrocontroller verbinden und darüber das Flashen durchführen.

Die Schaltung läuft mit ca. 1,5 V -5 V. Die Stromversorgung kann durch 2 oder 3 Mignonzellen bzw. eine Lithiumzelle erfolgen (mein Prototyp ist huckepack auf einen Batteriehalter für 3 Mignonzellen geschraubt).




Software

Von den 3 Uhrenvarianten gibt es neben der Quarztakt-Version je eine Testversion für den internen 1,2 MHz-Oszillator. Mit diesen ist die Programmentwicklung praktischer (und weil man mit ihnen die Programme ausprobieren kann, ohne den Controller auf externen Takt umzufusen, sind sie beigefügt).

Die Programme sind ähnlich aufgebaut - über das CLKPR-Register wird zunächst der Takt heruntergeschaltet, um Strom zu sparen. Der Timer wird so konfiguriert, dass er jede Sekunde (bzw. jede zweite Sekunde) einen Interrupt wirft. Die Interrupts werden gezählt und lösen alle 15 min (Morseuhr) bzw. alle 30 min das Schlagwerk aus.

Die Morseuhr ist aufwendiger als die beiden anderen Varianten und passt gerade noch in 1 KByte Flashspeicher.

Da die anderen beiden Programme recht kurz sind, habe ich herumprobiert, um den Ton prägnanter zu machen. Aber ohne PWM lässt sich nur wenig ausrichten, und übriggeblieben ist daher ein schlichter Doppelton, der ein wenig an PC-Spiele der achtziger Jahre erinnert.
 



Inbetriebnahme

Nach Aufbau der Schaltung sollte man sie zunächst ohne Controller in Betrieb nehmen und prüfen, ob der Quarzoszillator tatsächlich schwingt (vorzugsweise mit einem Oszilloskop oder durch Abhören mit einem Kurzwellenempfänger, der auf 3,686 MHz eingestellt ist).

Notfalls kann man den Stromverbrauch messen und mit einem Kondensator (ca. 100 nF), den man an Masse und Basis des Transistors klemmt, dafür sorgen, dass die Schwingungen abreißen. Die Stromaufnahme müsste sich dann ändern.

Dann sollte man das Programm in den AtTiny flashen und als letztes den Controller auf externen Takt umfusen. Da dieses mit Burkhard Kainkas MikroISP.exe nicht möglich ist, muss man ein anderes Tool verwenden - z.B. avrdude. Die erforderlichen Fusebytes sind: lfuse:0x68  und eventuell hfuse:0xef (letzeres schaltet den Brownout ab, falls man mit geringer Betriebsspannung arbeiten möchte). Danach ist der der Controller ohne externen Takt nicht mehr ansprechbar.

Wer die Programme nur mal kurz ausprobieren möchte, sollte die Versionen mit "1200000" im Namen verwenden, die mit dem internen RC-Oszillator des AtTiny 13 arbeiten




Download Software und Artikel-PDF: sailors-clock-software.zip

' Hardware:
' Start der Uhr durch Reset- Taster
' Takt durch externen Quarzoszillator mit 3,6864 MHz an PB3
' Buzzer an PB 4
' Halb-Stundenvorwahl (Startzeit) durch 3 Schalter an PB0, PB1, PB2 jeweils gegen Masse
'
' Quarztakt mit Clkpr auf 3,686400 / 32 herabgesetzt
' -> Timer alle 2 sec;
'
'----------------------------------------------------------

$regfile = "attiny13.dat"
$crystal = 115200 ' 3,86 MHz / 32


$hwstack = 32
$swstack = 0
$framesize = 0

On Timer0 Ontimer0 'Interrupt-Routine


'Variablen

Dim T As Word ' jeweils 2 Sekunden
Dim Q As Byte ' aufsummierte Halbstunden
Dim V As Byte ' Halbstunden für Gongausgabe
Dim H As Byte ' Stunden
Dim N As Byte ' wird in Zählschleife verwendet


' Konstanten

Const Dit1 = 40 ' Laenge Sound
Const Dit2 = 25
Const Tonhoehe1 = 12
Const Tonhoehe2 = 16



' Register

Acsr.7 = 1 ' Analog-Komparator ausschalten, spart etwas Strom
Sreg.7 = 1 ' Global Interrupt Enable
Ddrb = &B0001_0000 ' alle Pins Eingang bis auf PB4
Portb = &B0000_1111 ' alle Pins Pullup-Widerstand bis auf PB4


'----------------------------------------------------------

'
' Timer 0 macht 0,5 Interrupt / sec:
Config Timer0 = Timer , Prescale = 1024
Enable Timer0
Start Timer0

Buzzer Alias Portb.4

Clkpr = &B10000000 ' Änderung Clockteiler vorbereiten
Clkpr = &B00000101 ' 9600000 / 64
Clkpr = &B10000101


' Startzeit mit Dip- Schalter vorwählen; Raster: 30 min
Q = Not Pinb ' Invertieren, da gesetzter Schalter -> 0
Q = Q And &B000_0111 ' Bit 0 bis 2 filtern -> Q = 1 ... 7
If Q = 0 Then
Q = 8
End If

Goto Einsprung:


Do 'Hauptschleife

' If T > 14 Then ' Testbetrieb 30 sek statt 30 min
If T > 899 Then ' Realbetrieb halbe Stunde ist um
T = 0
Incr Q '
If Q > 8 Then ' Wachwechsel; Uhr auf 00 stellen
Q = 1
End If

Einsprung:

H = Q / 2 ' Stunden = aufsummierte Halbstunden / 2
V = Q Mod 2 ' Rest Stunden


' auszugebende Gongschlaege:


If V = 1 Then ' Halbe Stunde
Gosub Gong
End If

Wait 1

For N = 1 To H ' volle Stunden

Gosub Gong
Waitms 200
Gosub Gong
Waitms 800
Next

End If

Idle

Loop



Gong:

Sound Buzzer , Dit1 , Tonhoehe1
Sound Buzzer , Dit2 , Tonhoehe2

Return





'----------------------------------------------------------


Ontimer0: 'Timer1-Overflow-Interrupt-Routine

Tcnt0 = 31 ' Preset auf 31, damit er 225 Takte bis Ueberlauf zählt
Incr T ' also Interrupt alle 2 Sekunden
Return



Elektronik-Labor   Projekte   AVR