'----------------------------------------------------------------------------------------- 'Titel : DS1302 runde Binuhr 'Name : 'Datei : DS1302 Binuhr Stern.bas 'Autor : Arno Schweissinger 'Datum : 12.10.2014 'Version : 0.01 'Compiler : Bascom 1.11.8.7 'MicroController : AtMega8 1MHz interner Takt 'Hardware : DS1302 ' : MAX 7219 ' 16 Leds = 4xStd 6xMin 6xSek ' : Taster Pin: Pd.7 Stunden stellen ' : Taster Pin: Pd.6 Minuten stellen ' 'Stromversorgung: : 5V 'Besonderes : 'Letzte Änderung : 12.10.2014 Idee ' : 14.10.2014 Leds angeschlossen, erster Test ' : 15.10.2014 Tasten, Zeitstellen, eingefügt ' '------------------------------------------------------------------------------- '****************************** Allgemein ************************************** $regfile = "m8def.dat" $crystal = 1000000 $hwstack = 48 $swstack = 48 $framesize = 48 '************************ Tasten *********************************************** Declare Sub Tastatur() Declare Sub Ausgabe() Taster1 Alias Pind.6 ' Minuten Taster2 Alias Pind.7 ' Stunden Ddrd = &B0011_1111 ' Pin PD6 PD7 auf Eingang Portd = &B1100_0000 ' Pin PD6 PD7 Pullup aktivieren '************************ LCD ************************************************** Config Lcd = 24 * 2 Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3 , E = Portc.5 , Rs = Portc.4 Initlcd Cls Cursor Off '************************ MAX7219 ********************************************** Declare Sub Max7219_set() Declare Sub Max7219_cls() Declare Sub Max7219_init() Din Alias Portd.0 ' Dateneingang am MAX7219 Pin1 Config Pind.0 = Output Clk Alias Portd.1 ' Clock Signal am MAX7219 Pin13 Config Pind.1 = Output Strobe Alias Portd.3 ' Load Signal am MAX7219 Pin12 Config Pind.3 = Output Dim S As String * 2 Dim _data As Byte ' MAX7219 Data Bit D0-D7 Dim _register As Byte ' MAX7219 Address Bit D8-D15 Call Max7219_init Call Max7219_cls '************************ DS1302 RealTimeClock ********************************* Declare Function Rtc_get(byval Rtc_cmd As Byte ) As String * 2 Declare Sub Rtc_set(byval Rtc_cmd As Byte , Byval Rtc_data As Byte) Declare Sub Rtc_init() Rtc_rst Alias Portd.2 ' Dateneingang am DS1302 Pin 5 Config Portd.2 = Output Rtc_clk Alias Portd.1 ' Dateneingang am DS1302 Pin 7 Rtc_in Alias Pind.0 ' Dateneingang am DS1302 Pin 6 Rtc_out Alias Portd.0 Config Rtc_in = Output Const Rtc_sec = &H80 Const Rtc_min = &H82 Const Rtc_hour = &H84 Const Rtc_day = &H86 Const Rtc_month = &H88 Const Rtc_wday = &H8A Const Rtc_year = &H8C Const Rtc_wp = &H8E Const Rtc_tcs = &H90 Dim Timeset As Eram Byte Call Rtc_init '***************************** HAUPTSCHLEIFE *********************************** Do Call Tastatur Call Ausgabe Loop End '******************************** Zeit stellen ********************************* Sub Tastatur '------------------ Minuten stellen ------------------------ Dim Temp As Byte If Taster1 = 0 Then S = Rtc_get(rtc_min) Temp = Val(s) : _register = 2 Temp = Temp + 1 If Temp = 60 Then Temp = 0 _data = Makebcd(temp) Rtc_set Rtc_min , _data ' Minuten einstellen Call Ausgabe Waitms 500 ' 1/2 Sekunde warten While Taster1 = 0 ' Taster gehalten, dann scheller Vorlauf Temp = Temp + 1 If Temp = 60 Then Temp = 0 _data = Makebcd(temp) Rtc_set Rtc_min , _data ' Minuten einstellen Call Ausgabe Waitms 200 ' 1/5 Sekunde warten Wend Temp = 0 : _register = 1 Rtc_set Rtc_sec , Temp ' Sekunden löschen End If '------------------ Stunden stellen ------------------------ If Taster2 = 0 Then S = Rtc_get(rtc_hour) Temp = Val(s) : _register = 3 Temp = Temp + 1 If Temp = 24 Then Temp = 0 ' 24h Überlauf _data = Makebcd(temp) Rtc_set Rtc_hour , _data ' Std einstellen Call Ausgabe Waitms 500 ' 1/2 Sekunde warten While Taster2 = 0 ' scheller Vorlauf Temp = Temp + 1 If Temp = 24 Then Temp = 0 _data = Makebcd(temp) Rtc_set Rtc_hour , _data ' Std einstellen Call Ausgabe Waitms 200 ' 1/5 Sekunde warten Wend End If End Sub Sub Ausgabe 'Zeit Locate 1 , 1 Lcd Rtc_get(rtc_hour) ; ":" ; Rtc_get(rtc_min) ; ":" ; Rtc_get(rtc_sec) 'Datum Locate 2 , 1 Lcd Rtc_get(rtc_day) ; "." ; Rtc_get(rtc_month) ; "." ; Rtc_get(rtc_year) 'Wochentag Locate 2 , 12 Lcd "WT:" ; Rtc_get(rtc_wday) S = Rtc_get(rtc_sec) _data = Val(s) : _register = 1 Call Max7219_set S = Rtc_get(rtc_min) _data = Val(s) : _register = 2 Call Max7219_set S = Rtc_get(rtc_hour) _data = Val(s) : _register = 3 If _data > 12 Then _data = _data - 12 ' 12 Std Anzeige Call Max7219_set End Sub '******************************** RTC ****************************************** Sub Rtc_init 'Uhr konfigurieren ' ist nach einem Reset im EEPROM Timeset=1, dann wird die Uhr nicht gestellt ' ist Timeset=&hFF werden die default Daten übernommen. Bzw der MC war noch nicht progammiert If Timeset = 255 Then Rtc_set Rtc_wp , &B0000_0000 'Schreibschutz / WP=BIT7 / &B00000000=aus / &B10000000=an Rtc_set Rtc_tcs , &B0000_0000 'Batterieladung einstellen / 1 Diode, 2kOhm ~ 2,2mA Rtc_set Rtc_sec , &H00 'Sekunden einstellen / CH=BIT7 / 0,1=an,aus Rtc_set Rtc_min , &H30 'Minuten einstellen Rtc_set Rtc_hour , &H22 'Stunden einstellen Rtc_set Rtc_day , &H12 'Tag einstellen Rtc_set Rtc_month , &H10 'Monat einstellen Rtc_set Rtc_year , &H14 'Jahr einstellen Rtc_set Rtc_wday , &H00 'Wochentag einstellen Timeset = 1 'Zeit ist gestellt ' im EEPROM sicher End If End Sub Sub Rtc_set(byval Rtc_cmd As Byte , Rtc_data As Byte) Config Rtc_in = Output Set Rtc_rst Shiftout Rtc_out , Rtc_clk , Rtc_cmd , 3 , 8 , 5 Shiftout Rtc_out , Rtc_clk , Rtc_data , 3 , 8 , 5 Reset Rtc_rst End Sub Function Rtc_get(byval Rtc_cmd As Byte ) As Byte Rtc_cmd = Rtc_cmd + 1 Config Rtc_in = Output Set Rtc_rst Shiftout Rtc_out , Rtc_clk , Rtc_cmd , 3 , 7 , 50 Config Rtc_in = Input Shiftin Rtc_in , Rtc_clk , Rtc_cmd , 2 , 8 , 50 Config Rtc_in = Output Reset Rtc_rst Rtc_get = Bcd(rtc_cmd) End Function '******************************** Max7219 ************************************** Sub Max7219_init 'Initialise Max7219 _register = &H0F : _data = &B0000_0001 'Display Test aus=0 ein=1 Call Max7219_set Waitms 100 ' kurzes aufleuchten _register = &H0F : _data = &B0000_0000 'Display Test aus=0 ein=1 Call Max7219_set _register = &H0C : _data = &B0000_0000 'shutdown mode / nomal=1 down=0 Call Max7219_set _register = &H0A : _data = &B0000_0001 'Helligkeit der Anzeige / dunkel=0 hell=15 Call Max7219_set _register = &H0B : _data = &H02 'Anzahl der vorhanden Spalten / Eine=0 alle=7 Call Max7219_set ' _register = &H09 : _data = &B1101_1011 '0=switch off 7-segment decoding _register = &H09 : _data = &B0000_0000 '0=switch off 7-segment decoding Call Max7219_set _register = &H0C : _data = &H01 'normal mode / nomal=1 down=0 Call Max7219_set End Sub Sub Max7219_set Reset Strobe Shiftout Din , Clk , _register , 1 , 8 , 20 Waitus 10 Shiftout Din , Clk , _data , 1 , 8 , 20 Set Strobe Waitus 10 End Sub Sub Max7219_cls _data = &B0000_1111 For _register = 1 To 8 Call Max7219_set Next _register End Sub