'----------------------------------------------- 'Nixie-Clock No.8 Version 1.2 for our loved Anne '----------------------------------------------- ' 'Coded by Migele. Christmas 2023 'Caution! ATmega164/324/644/1248! JTAG ist on by default! '..Switch off the JTAG-functionality in the Atmega-fuses! '..Otherwise PortC will not behave as coded! 'I needed hours to realise this :-) ' 'Versions '-------- '1.0 just functionality and electronic-tests, no clock yet. '1.1 clock-functionality fully implemented, no NIXIE-protection yet. '1.2 added cathode-poisioning-reducktion-funtctionality for NIXIE-Tubes-protection $regfile = "m644pdef.dat" $crystal = 10000000 $hwstack = 128 $swstack = 128 $framesize = 128 'the implemented DCF77-Routine uses interrupts. Therefore, interrupts must be enabled. Enable Interrupts Config Porta = Output 'hours Config portc = Output 'minutes config PortD = Output 'seconds config Portb.1 = output 'glowlamp1 config portb.2 = output 'glowlamp2 'configure implemented dcf77-routine with Timer1, noninverted output and secondly called interrupt-routine "Sectic" Config Dcf77 = PinB.0 , Timer = 1 , Timer1sec = 0 , Debug = 1 , Inverted = 0 , Check = 0 , Gosub = Sectic Config Date = Dmy , Separator = . 'not really needed Dim Stunden, Minuten, Sekunden As Byte Dim Minutenalt, Minutenneu as byte Dim Ziffer As Byte dim i as byte 'used for counter dim valuestring as string * 8 dim zeit as string * 8 time$="00:00:00" 'Time when switching on Minutenalt = 0 'Main routine. It translates the payload of the "Time$"-variable to the slides Do 'hours high valuestring = Mid(time$,1,1) Stunden = Val(valuestring) Stunden = Makebcd(Stunden) Gosub Ausgabe_stunden_high 'hours low valuestring = Mid(time$,2,1) Stunden = Val(valuestring) Stunden = Makebcd(Stunden) Gosub Ausgabe_stunden_low 'minutes high valuestring = Mid(time$,4,1) Minuten = Val(valuestring) Minuten = Makebcd(Minuten) Gosub Ausgabe_minuten_high 'minutes low & cathode-cleaner routine call every new minute valuestring = Mid(time$,5,1) Minutenneu = valuestring 'call cathode-cleaner every minute if Minutenneu <> Minutenalt then gosub kathodecleaner Minutenalt = Minutenneu endif Minuten = Val(valuestring) Minuten = Makebcd(Minuten) Gosub Ausgabe_minuten_low 'seconds high valuestring = Mid(time$,7,1) Sekunden = Val(valuestring) Sekunden = Makebcd(Sekunden) Gosub Ausgabe_sekunden_high 'seconds low valuestring = Mid(time$,8,1) Sekunden = Val(valuestring) Sekunden = Makebcd(Sekunden) Gosub Ausgabe_sekunden_low Loop '+++++++++++++++++++++++++++++++++++++++++ kathodecleaner: 'cleans cathodes of NIXIEs by switching on every tile minutely, 'this prevents the "cathode-poisioning-effect". See WWW and '.https://jurameer.de/index.php/how-to/8-elektronik/41-kathodenvergiftung-bei-nixie-roehren-rueckgaengig-machen 'This routine takes half a second in total (50 ms * 10) for i = 0 to 9 stunden = i stunden = Makebcd(stunden) Gosub Ausgabe_stunden_high Stunden = i Stunden = Makebcd(Stunden) Gosub Ausgabe_stunden_low Minuten = i Minuten = Makebcd(Minuten) Gosub Ausgabe_minuten_high Minuten = i Minuten = Makebcd(Minuten) Gosub Ausgabe_minuten_low Sekunden = i Sekunden = Makebcd(Sekunden) Gosub Ausgabe_sekunden_high Sekunden = i Sekunden = Makebcd(Sekunden) Gosub Ausgabe_sekunden_low waitms 50 next i Return '+++++++++++++++++++++++++++++++++++++++++ Ausgabe_stunden_high: 'set hour-high tiles Ziffer = Stunden And &B00000001 Porta.4 = Ziffer Shift Stunden , Right , 1 Ziffer = Stunden And &B00000001 Porta.5 = Ziffer Shift Stunden , Right , 1 Ziffer = Stunden And &B00000001 Porta.6 = Ziffer Shift Stunden , Right , 1 Ziffer = Stunden And &B00000001 Porta.7 = Ziffer Return Ausgabe_stunden_low: 'set hour-low tiles Ziffer = Stunden And &B00000001 Porta.0 = Ziffer Shift Stunden , Right , 1 Ziffer = Stunden And &B00000001 Porta.1 = Ziffer Shift Stunden , Right , 1 Ziffer = Stunden And &B00000001 Porta.2 = Ziffer Shift Stunden , Right , 1 Ziffer = Stunden And &B00000001 Porta.3 = Ziffer Return '+++++++++++++++++++++++++++++++++++++++++ Ausgabe_minuten_high: 'set minute-high tiles Ziffer = Minuten And &B00000001 Portc.4 = Ziffer Shift Minuten , Right , 1 Ziffer = Minuten And &B00000001 Portc.5 = Ziffer Shift Minuten , Right , 1 Ziffer = Minuten And &B00000001 Portc.6 = Ziffer Shift Minuten , Right , 1 Ziffer = Minuten And &B00000001 Portc.7 = Ziffer Return '+++++++++++++++++++++++++++++++++++++++++ Ausgabe_minuten_low: 'set minute-low tiles Ziffer = Minuten And &B00000001 Portc.0 = Ziffer Shift Minuten , Right , 1 Ziffer = Minuten And &B00000001 Portc.1 = Ziffer Shift Minuten , Right , 1 Ziffer = Minuten And &B00000001 Portc.2 = Ziffer Shift Minuten , Right , 1 Ziffer = Minuten And &B00000001 Portc.3 = Ziffer Return '+++++++++++++++++++++++++++++++++++++++++ Ausgabe_sekunden_high: 'set second-high tiles Ziffer = Sekunden And &B00000001 PortD.0 = Ziffer Shift Sekunden , Right , 1 Ziffer = Sekunden And &B00000001 Portd.1 = Ziffer Shift Sekunden , Right , 1 Ziffer = Sekunden And &B00000001 Portd.2 = Ziffer Shift Sekunden , Right , 1 Ziffer = Sekunden And &B00000001 Portd.3 = Ziffer Return '+++++++++++++++++++++++++++++++++++++++++ Ausgabe_sekunden_low: 'set second-low tiles Ziffer = Sekunden And &B00000001 PortD.4 = Ziffer Shift Sekunden , Right , 1 Ziffer = Sekunden And &B00000001 Portd.5 = Ziffer Shift Sekunden , Right , 1 Ziffer = Sekunden And &B00000001 Portd.6 = Ziffer Shift Sekunden , Right , 1 Ziffer = Sekunden And &B00000001 Portd.7 = Ziffer Return '+++++++++++++++++++++++++++++++++++++++++ sectic: 'the dcf77-routine in "config dcf77" interrupts secondly to this subroutine. 'The dcf77-time ist represented in the implemented variable "Time$" Zeit = Time$ 'switch on-off the glow-lamps alternately toggle portb.1 toggle portb.2 return End