50Hz-Taktquelle für den Attiny13-Timer           

von Ralf Beesner             
Elektronik-Labor  Projekte   AVR   T13-Contest

 
 

Sailor's Clock

Leider ist der Attiny13 nicht so recht für Langzeit-Timer und Uhr-Anwendungen geeignet, weil er keinen internen Quarzoszillator aufweist. Man kann zwar einen externen Quarzoszillator verwenden und daraus den Takt gewinnen bzw. den externen Timer-Eingang ansteuern, aber es ist einfacher, statt des Attiny13 z.B. einen Attiny25 einzusetzen.Als Attiny13-Fan habe ich es dennoch schon gemacht, z.B. bei der "Sailor's Clock"

http://www.elektronik-labor.de/AVR/SoilorsClock.html
oder der "Attiny13-Mutteruhr"
http://www.elektronik-labor.de/AVR/Mutteruhr.html ,
 
Aber es ist relativ aufwendig (32kHz-Oszillator am Timereingang) oder etwas heikel und mit den Bordmitteln des LP Mikrocontroller nicht durchführbar (umfusen auf externen Takt).  
 
Will man die Schaltung nur in Innenräumen einsetzen bzw. sogar aus dem Netz betreiben, gibt es eine weitere genaue Taktquelle: den "Elektrosmog", also das 50Hz- Streufeld, das alle elektrischen Verbraucher bzw. Leitungen umgibt.
 
Meist ist es ja lästig, wenn es z.B. im Verstärker brummt oder eine unabgeschirmte Leitung am Oszilloskopeingang sich mehrere 10V einfängt, aber hier ist es mal nützlich: eine kurze Strippe am externen Takteingang des Attiny13 (Pin PB2) triggert den Attiny recht zuverlässig mit 50 Hz, wenn die Masse des Attiny irgendwie mit dem 230V-Netz verbunden ist (die eigentliche Stromversorgung des Attiny kann durchaus auch aus Batterien erfolgen).
 
Man kann den "Antennendraht", falls das konstruktiv möglich ist, parallel zum Netzkabel führen und mit Klebeband befestigen, damit wird das Risiko von Funkeinstrahlungen weiter vermindert und eine gute Kopplung zum 50 Hz-Streufeld erreicht, ohne direkt an der Netzspannungsversorgung "herumfummeln" zu müssen.
 
Zur Sicherheit gegen Funkstörungen sollte man das Signal über einen Tiefpass aus ca. 1 MOhm und einem kleinen Kondensator von 47 pF oder 100 pF (notfalls reicht sogar die Eingangskapazität des Attiny-Ports) filtern.



24-Stunden-Timer
 
Zwei Beispielprogramme sind beigefügt: ein 24-Stunden-Timer, mit dem man einen 12V- Verbraucher z.B. für eine Stunde pro Tag einschalten kann (die Leuchtdiode dient zur Funktionskontrolle; sie zeigt die Sekundenimpulse an), und die "Sailor's Clock".
 
Wenn man die "Sailor's Clock" nicht mit 1,2 MHz Takt betreibt, sondern auf 128 kHz Takt umfust, liegt die Ruhe-Stromaufnahme bei lediglich 100µA, so dass sie mehrere Jahre aus einem Satz Mignonzellen laufen dürfte. 
 
Einen kleinen Schönheitsfehler hat die ganze Sache: Wenn der Attiny nicht per ISP, also mit LPMikroISP.exe, geflasht wurde, sondern mit LPMikros.exe und dem Bootloader, kann es passieren, dass der Bootloader ungewollt startet. Bei jedem Booten (z.B. bei Anlegen der Betriebsspannung) prüft dieser kurz, ob PB2 auf "High" liegt; dann verzweigt er in die Loader-Routine. Bei einem "Low" wird das in den Attiny geflashte Programm gestartet. Es kann jedoch vorkommen, dass der Attiny sich fälschlicherweise über die "Elektrosmog-Antenne" ein "High" einfängt.
 
Man kann das vermeiden, wenn man die "Elektrosmog-Antenne" beim Booten des Attiny13 kurz mit Masse verbindet, dann zieht sie über den 1 MOhm- Widerstand den Attiny-Eingang auf "Low".

Downlaod: 50Hz-Timer.zip

 
' 50Hz-tiny-sailors-clock.bas
' Hardware:
' Start des Timers durch Reset
' Timer-Takt durch 50Hz-Streufeld an PB2
' Schaltausgang an PB4
' Anzeige Sekundentakt per LED an PB3 oder Buzzer an PB0
'
'----------------------------------------------------------



$regfile = "attiny13.dat"
$crystal = 1200000

$hwstack = 8
$swstack = 8
$framesize = 8
'Baud = 9600


Portb = &B00000011
Ddrb = &B00011001
Acsr.acd = 1 ' Analog-Komparator ausschalten


' Timer zu Fuss konfigurieren:

Tccr0a = 0 ' Betrieb als Zaehler bis 255; einfach nur Überlauf
Tccr0b = &B00000110 ' externer Takt an TO; falling edge
Timsk0 = &B00000010 ' Interruptquelle: Counter0 overflow

Sreg.7 = 1 ' Interrupts global freigeben

On Timer0 Ontimer0 ' Interrupt-Routine für Timer0-Overflow


Dim S As Long



Do

If S = 86400 Then ' Zähler auf Null setzen; 24 h sind um
S = 0
End If

If S > 10 And S < 3600 Then ' nach 10 Sekunden für 1 Stunde Schaltausgang ein
Portb.4 = 1
Else ' Rest der Zeit Schaltausgang aus
Portb.4 = 0
End If

Loop

End



Ontimer0:
Tcnt0 = 206
Portb.3 = 1 ' Sekunden-LED ein
Waitms 50
Portb.3 = 0 ' Sekunden-LED aus
' Sound Portb.0 , 100 , 100 ' alternativ: Soundausgabe an PB0
Incr S

Return







' 50Hz-Langzeittimer.bas
' Hardware:
' Start der Uhr durch Reset 8Schalter "4" des Mäuseklaviers)
' Timer-Takt durch 50Hz-Streufeld an PB2
' Buzzer an PB 0
' Halb-Stundenvorwahl (Startzeit) durch 3 Schalter an PB1, PB3, PB4 (jeweils gegen Masse)
'
' Nach Start wird die aktuelle Uhrzeit ausgegeben und 15 Sekunden lang zur Kontrolle die
' Sekundenimpulse
'----------------------------------------------------------

$regfile = "attiny13.dat"
$crystal = 1200000

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


'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
Dim Clocktest As Byte


' Konstanten

Const Dit1 = 40 ' Laenge Sound
Const Dit2 = 25
Const Tonhoehe1 = 120
Const Tonhoehe2 = 160


' Register

Acsr.7 = 1 ' Analog-Komparator ausschalten, spart etwas Strom
Sreg.7 = 1 ' Global Interrupt Enable
Ddrb = &B0000_0001 ' alle Pins Eingang bis auf PB0
Portb = &B0001_1010 ' alle Pins Pullup-Widerstand bis auf PB2 und PB0


' Timer zu Fuss konfigurieren:

Tccr0a = 0 ' Betrieb als Zaehler bis 255; einfach nur Überlauf
Tccr0b = &B00000110 ' externer Takt an TO; falling edge
Timsk0 = &B00000010 ' Interruptquelle: Counter0 overflow

Sreg.7 = 1 ' Interrupts global freigeben

On Timer0 Ontimer0 ' Interrupt-Routine für Timer0-Overflow

Buzzer Alias Portb.0


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



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

Goto Einsprung:




Do 'Hauptschleife

' If T > 29 Then ' Testbetrieb: 30 sek statt 30 min
If T > 1799 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 = 206 ' Preset auf 206, damit er 50 Takte bis Ueberlauf zählt
Incr T ' also 1 Interrupt pro Sekunde
If Clocktest < 15 Then ' nach Start 15 Sek Test, ob die Impulse sicher erkannt werden
Sound Buzzer , Dit1 , Tonhoehe1
Incr Clocktest
End If
Return



Elektronik-Labor  Projekte   AVR   T13-Contest