Wollte Euch mein aktuelles Nixie-Uhren-Projekt vorstellen. Irgendwie mag ich diese Röhren und als ich 6 noch nie benutze Z570M erhalten habe, gab es dafür keine (aus meiner Sicht) bessere Verwendung. Das ist mittlerweile meine 2. Nixie-Uhr. Die erste habe ich noch auf einer Lochrasterplatine aufgebaut, was nicht unbedingt zu empfehlen ist (zu viele Kabel).
Nun gibt es im Netz diverse Bauanleitungen, die jedoch meisten die Röhren im Multiplex-Verfahren ansteuern. Das hat aus meiner Sicht nur den Vorteil, dass die Baugröße der Uhr kleiner wird. Es sind jedoch nicht alle Röhrentypen dafür geeignet. Deshalb hat in dieser Version jede Röhre ihren eigenen Treiberbaustein. Der ist notwendig, da die Röhren erst bei > 140V überhaupt anfangen etwas anzuzeigen. Als Treiberbausteine werden sechs KM155ID1 benutzt (es gehen auch K155ID1 oder 74141), die im Vergleich zu den Röhren leicht beschaffbar und preiswert sind.
Die Ansteuerung selbst ist recht einfach. Für die 10 Ziffern einer Nixie braucht man 4 Pins des Mikrocontrollers. Der ATMega16 eignet sich hervorragend als µC. Als Programmiersprache verwende ich BASCOM.
Um die Hochspannung zu erzeugen, wird ein MC34063 eingesetzt. Die Schaltung dafür war auf der Homepage www.stefankneller.de verfügbar (über das Gästebuch lässt sich sich mittlerweile wieder herunterladen). Wichtig ist vor allen Dingen die Strombegrenzung. Wie bei einer LED kann die Nixie-Röhre ihren Strom nicht selbst begrenzen. Laut Datenblatt der Z570M sind 2 mA typisch. Am besten ermittelt man den dafür passenden Widerstand mit einem Strommessgerät (so um die 10 kOhm ist ein guter Startwert). In diesem Fall waren es 27 kOhm.
Bei den Röhren handelt es sich um sechs Z570M aus DDR-Produktion. Diese sind im Original rot lackiert, um den Kontrast zu erhöhen.
Die Firmware ist vielleicht nicht optimal, aber sie funktioniert. Zum Beispiel könnten die Pull-Up-Widerstände R10 und R12 weggelassen werden, wenn die Software noch etwas optimiert werden würde....... Die Uhrzeit liefert eine DS1307 Echtzeituhr. Ein Pin des µCs ist sogar noch frei, so dass hier auch ein Funkuhrmodul angeschlossen werden könnte.
Beim Aufbau könnte man den Quarz auch weglassen. Leider stimmen auch zwei Bohrungen nicht überein, deshalb sind die Verbindungen bei zwei Röhren etwas schräg, was die Funktionalität aber nicht beeinträchtigt.
Anbei noch ein paar Fotos und ein Video der Uhr im Rohbau, die Uhrzeit und Datum anzeigt. Das schnelle Durchzählen aller Ziffern zwischen Uhrzeit- und Datumswechsel dient nicht nur als Effekt, sondern auch dazu, die "Kathodenvergiftung (Cathode Poisoning)" zu minimieren. Über längere Zeit nicht eingeschaltete Ziffern würden aufgrund dieses Effekts dann ungleichmäßiger leuchten.
Die für die Nixie-Uhren notwendige Spannung kann lebensgefährlich sein. Insbesondere die spannungsführenden Teile/Leiterbahnen am Ausgang des MC34063 Schaltreglers und an den Nixie-Röhren selbst sollten unter keinen Umständen berührt werden.
[video=youtube;lGf1MKWt8wc]http://www.youtube.com/watch?v=lGf1MKWt8wc[/video]
Nun gibt es im Netz diverse Bauanleitungen, die jedoch meisten die Röhren im Multiplex-Verfahren ansteuern. Das hat aus meiner Sicht nur den Vorteil, dass die Baugröße der Uhr kleiner wird. Es sind jedoch nicht alle Röhrentypen dafür geeignet. Deshalb hat in dieser Version jede Röhre ihren eigenen Treiberbaustein. Der ist notwendig, da die Röhren erst bei > 140V überhaupt anfangen etwas anzuzeigen. Als Treiberbausteine werden sechs KM155ID1 benutzt (es gehen auch K155ID1 oder 74141), die im Vergleich zu den Röhren leicht beschaffbar und preiswert sind.
Die Ansteuerung selbst ist recht einfach. Für die 10 Ziffern einer Nixie braucht man 4 Pins des Mikrocontrollers. Der ATMega16 eignet sich hervorragend als µC. Als Programmiersprache verwende ich BASCOM.
Um die Hochspannung zu erzeugen, wird ein MC34063 eingesetzt. Die Schaltung dafür war auf der Homepage www.stefankneller.de verfügbar (über das Gästebuch lässt sich sich mittlerweile wieder herunterladen). Wichtig ist vor allen Dingen die Strombegrenzung. Wie bei einer LED kann die Nixie-Röhre ihren Strom nicht selbst begrenzen. Laut Datenblatt der Z570M sind 2 mA typisch. Am besten ermittelt man den dafür passenden Widerstand mit einem Strommessgerät (so um die 10 kOhm ist ein guter Startwert). In diesem Fall waren es 27 kOhm.
Bei den Röhren handelt es sich um sechs Z570M aus DDR-Produktion. Diese sind im Original rot lackiert, um den Kontrast zu erhöhen.
Die Firmware ist vielleicht nicht optimal, aber sie funktioniert. Zum Beispiel könnten die Pull-Up-Widerstände R10 und R12 weggelassen werden, wenn die Software noch etwas optimiert werden würde....... Die Uhrzeit liefert eine DS1307 Echtzeituhr. Ein Pin des µCs ist sogar noch frei, so dass hier auch ein Funkuhrmodul angeschlossen werden könnte.
Beim Aufbau könnte man den Quarz auch weglassen. Leider stimmen auch zwei Bohrungen nicht überein, deshalb sind die Verbindungen bei zwei Röhren etwas schräg, was die Funktionalität aber nicht beeinträchtigt.
Anbei noch ein paar Fotos und ein Video der Uhr im Rohbau, die Uhrzeit und Datum anzeigt. Das schnelle Durchzählen aller Ziffern zwischen Uhrzeit- und Datumswechsel dient nicht nur als Effekt, sondern auch dazu, die "Kathodenvergiftung (Cathode Poisoning)" zu minimieren. Über längere Zeit nicht eingeschaltete Ziffern würden aufgrund dieses Effekts dann ungleichmäßiger leuchten.
Die für die Nixie-Uhren notwendige Spannung kann lebensgefährlich sein. Insbesondere die spannungsführenden Teile/Leiterbahnen am Ausgang des MC34063 Schaltreglers und an den Nixie-Röhren selbst sollten unter keinen Umständen berührt werden.
[video=youtube;lGf1MKWt8wc]http://www.youtube.com/watch?v=lGf1MKWt8wc[/video]
Code:
$regfile = "m16def.dat"
$crystal = 8000000
Dim A As Integer
Dim Astr As String * 2
Dim Ziffer12str As String * 2
Dim Ziffer3str As String * 2
Dim Ziffer4str As String * 2
Dim Ziffer56str As String * 2
Dim Timestr As String * 8
Dim Datestr As String * 8
Dim Sekundestr As String * 2
Dim Minutestr As String * 2
Dim Minute3str As String * 1
Dim Minute4str As String * 1
Dim Stundestr As String * 2
Dim Jahrstr As String * 2
Dim Monatstr As String * 2
Dim Monat3str As String * 1
Dim Monat4str As String * 1
Dim Tagstr As String * 2
Dim Tagx As Integer
Dim Monatx As Integer
Dim Jahrx As Integer
Dim Stundex As Integer
Dim Minutex As Integer
Dim Sekundex As Integer
Dim Weekday As Byte
Dim Exitbit As Bit
Config Porta = Output
Config Portb = Output
Config Portd = Output
Config Portc.7 = Output
Config Portc.6 = Output
Config Portc.5 = Output
Config Portc.4 = Output
Config Pinc.3 = Input
Config Pinc.2 = Input
Portc.3 = 1
Portc.2 = 1
Config Debounce = 50
Config Clock = User
Config Date = Dmy , Separator = .
$lib "i2c_twi.lbx" '
Config Sda = Portc.1
Config Scl = Portc.0
Const Ds1307w = &HD0
Const Ds1307r = &HD1
Config Twi = 100000
Enable Interrupts
Declare Sub Setweekday
Declare Sub Showtime
Declare Sub Antipoisening
Declare Sub Setup
'Date$ = "23.12.11"
'Time$ = "22:22:00"
'Weekday = 5
'Call Setweekday
Do
'Portc.3 = 1
'Portc.2 = 1
Timestr = Time$
Datestr = Date$
Exitbit = 0
Sekundestr = Mid(timestr , 7 , 2)
Minutestr = Mid(timestr , 4 , 2)
Minute3str = Mid(minutestr , 1 , 1)
Minute4str = Mid(minutestr , 2 , 1)
Stundestr = Mid(timestr , 1 , 2)
Jahrstr = Mid(datestr , 7 , 2)
Monatstr = Mid(datestr , 4 , 2)
Monat3str = Mid(monatstr , 1 , 1)
Monat4str = Mid(monatstr , 2 , 1)
Tagstr = Mid(datestr , 1 , 2)
Tagx = Val(tagstr)
Monatx = Val(monatstr)
Jahrx = Val(jahrstr)
Stundex = Val(stundestr)
Minutex = Val(minutestr)
If _sec > 30 And _sec < 32 Then
Call Antipoisening
Elseif _sec > 31 And _sec < 38 Then
Ziffer12str = Tagstr
Ziffer3str = Monat3str
Ziffer4str = Monat4str
Ziffer56str = Jahrstr
Ziffer4str = Ziffer4str + "0"
Elseif _sec > 37 And _sec < 39 Then
Call Antipoisening
Else
Ziffer12str = Stundestr
Ziffer3str = Minute3str
Ziffer4str = Minute4str
Ziffer56str = Sekundestr
Ziffer4str = Ziffer4str + "0"
End If
Call Showtime
Debounce Pinc.2 , 0 , Setup , Sub
'Debounce Pinc.3 , 0 , Setup , Sub
Loop
'#####################################
Showtime:
Porta = Hexval(ziffer12str)
Portb = Hexval(ziffer3str)
Portc = Hexval(ziffer4str)
Portd = Hexval(ziffer56str)
Return
'#####################################
Antipoisening:
For A = 0 To 99 Step 11
Astr = Str(a)
Astr = Format(astr , "00")
Ziffer12str = Astr
Ziffer3str = Left(astr , 1)
Ziffer4str = Right(astr , 1)
Ziffer4str = Ziffer4str + "0"
Ziffer56str = Astr
Waitms 50
Call Showtime
Next
Return
'#####################################
Setup:
Bitwait Pinc.2 , Reset
While Exitbit = 0
Tagstr = Str(tagx)
Ziffer12str = Tagstr
Ziffer3str = Monat3str
Ziffer4str = Monat4str
Ziffer56str = Jahrstr
Ziffer4str = Ziffer4str + "0"
Call Showtime
Debounce Pinc.2 , 0 , Setup2 , Sub
Debounce Pinc.3 , 0 , Settag , Sub
Wend
Return
'#####################################
Settag:
Bitwait Pinc.3 , Reset
Incr Tagx
If Tagx > 31 Then Tagx = 1
Return
'#####################################
Setup2:
Bitwait Pinc.2 , Reset
While Exitbit = 0
Tagstr = Str(tagx)
Monatstr = Str(monatx)
Monatstr = Format(monatstr , "00")
Monat3str = Mid(monatstr , 1 , 1)
Monat4str = Mid(monatstr , 2 , 1)
Ziffer12str = Tagstr
Ziffer3str = Monat3str
Ziffer4str = Monat4str
Ziffer56str = Jahrstr
Ziffer4str = Ziffer4str + "0"
Call Showtime
Debounce Pinc.2 , 0 , Setup3 , Sub
Debounce Pinc.3 , 0 , Setmon , Sub
Wend
Return
'#####################################
Setmon:
Bitwait Pinc.3 , Reset
Incr Monatx
If Monatx > 12 Then Monatx = 1
Return
'#####################################
Setup3:
Bitwait Pinc.2 , Reset
While Exitbit = 0
Tagstr = Str(tagx)
Monatstr = Str(monatx)
Monatstr = Format(monatstr , "00")
Monat3str = Mid(monatstr , 1 , 1)
Monat4str = Mid(monatstr , 2 , 1)
Jahrstr = Str(jahrx)
Ziffer12str = Tagstr
Ziffer3str = Monat3str
Ziffer4str = Monat4str
Ziffer56str = Jahrstr
Ziffer4str = Ziffer4str + "0"
Call Showtime
Debounce Pinc.2 , 0 , Setup4 , Sub
Debounce Pinc.3 , 0 , Setjahr , Sub
Wend
Return
'#####################################
Setjahr:
Bitwait Pinc.3 , Reset
Incr Jahrx
If Jahrx > 41 Then Jahrx = 11
Return
'#####################################
Setup4:
Bitwait Pinc.2 , Reset
While Exitbit = 0
Stundestr = Str(stundex)
Ziffer12str = Stundestr
Ziffer3str = Minute3str
Ziffer4str = Minute4str
Ziffer56str = Sekundestr
Ziffer4str = Ziffer4str + "0"
Call Showtime
Debounce Pinc.2 , 0 , Setup5 , Sub
Debounce Pinc.3 , 0 , Setstunde , Sub
Wend
Return
'#####################################
Setstunde:
Bitwait Pinc.3 , Reset
Incr Stundex
If Stundex > 23 Then Stundex = 0
Return
'#####################################
Setup5:
Bitwait Pinc.2 , Reset
While Exitbit = 0
Stundestr = Str(stundex)
Minutestr = Str(minutex)
Minutestr = Format(minutestr , "00")
Minute3str = Mid(minutestr , 1 , 1)
Minute4str = Mid(minutestr , 2 , 1)
Ziffer12str = Stundestr
Ziffer3str = Minute3str
Ziffer4str = Minute4str
Ziffer56str = Sekundestr
Ziffer4str = Ziffer4str + "0"
Call Showtime
Debounce Pinc.2 , 0 , Setup6 , Sub
Debounce Pinc.3 , 0 , Setminute , Sub
Wend
Return
'#####################################
Setminute:
Bitwait Pinc.3 , Reset
Incr Minutex
If Minutex > 59 Then Minutex = 0
Return
'#####################################
Setup6:
Bitwait Pinc.2 , Reset
While Exitbit = 0
Stundestr = Str(stundex)
Minutestr = Str(minutex)
Minutestr = Format(minutestr , "00")
Minute3str = Mid(minutestr , 1 , 1)
Minute4str = Mid(minutestr , 2 , 1)
Sekundestr = Str(sekundex)
Ziffer12str = Stundestr
Ziffer3str = Minute3str
Ziffer4str = Minute4str
Ziffer56str = Sekundestr
Ziffer4str = Ziffer4str + "0"
Call Showtime
Debounce Pinc.2 , 0 , Setup7 , Sub
Debounce Pinc.3 , 0 , Setsekunde , Sub
Wend
Return
'#####################################
Setsekunde:
Bitwait Pinc.3 , Reset
Incr Sekundex
If Sekundex > 59 Then Sekundex = 0
Return
'#####################################
Setup7:
Bitwait Pinc.2 , Reset
Tagstr = Format(tagstr , "00")
Monatstr = Format(monatstr , "00")
Jahrstr = Format(jahrstr , "00")
Stundestr = Format(stundestr , "00")
Minutestr = Format(minutestr , "00")
Sekundestr = Format(sekundestr , "00")
Date$ = Tagstr + "." + Monatstr + "." + Jahrstr
Time$ = Stundestr + "." + Minutestr + "." + Sekundestr
Exitbit = 1
Return
'#####################################
Gotomain:
Exitbit = 1
Return
'#####################################
Getdatetime:
I2cstart
I2cwbyte Ds1307w
I2cwbyte 0
I2cstart
I2cwbyte Ds1307r
I2crbyte _sec , Ack
I2crbyte _min , Ack
I2crbyte _hour , Ack
I2crbyte Weekday , Ack
I2crbyte _day , Ack
I2crbyte _month , Ack
I2crbyte _year , Nack
I2cstop
_sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour)
_day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year)
Return
Setdate:
_day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year)
I2cstart
I2cwbyte Ds1307w
I2cwbyte 4
I2cwbyte _day
I2cwbyte _month
I2cwbyte _year
I2cstop
Waitms 10
Return
Setweekday:
I2cstart
I2cwbyte Ds1307w
I2cwbyte 3
I2cwbyte Weekday
I2cstop
Waitms 10
Return
Settime:
_sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour)
I2cstart
I2cwbyte Ds1307w
I2cwbyte 0
I2cwbyte _sec
I2cwbyte _min
I2cwbyte _hour
I2cstop
Waitms 10
Return
End