Hallo,
heute melde ich mich mit einer Erfolgsnachricht.
Mein Programm zur Übertragung der Uhrzeit vom PC auf den DS3231 läuft jetzt dank der vielen Tipps von Euch weitestgehend.
Es soll wie gesagt, keine Uhr im eigentlichen Sinne sein, das geht auch anders.
Ich will nur testen, wie man den RTC bedient, um herausbekommen, warum er sich beim Einschalten bzw. flashen des Atemgas öfter wieder zurücksetzt.
Das passiert leider immer noch, bisher nicht nachvollziehbar, warum.
Ich habe einige Kommentare eingefügt, vielleicht hilft dies auch anderen.
Man kann sicher noch einiges optimieren, mir ging es darum, das es funktioniert.(siehe TODO's in den Kommentaren)
Vielleicht habt ihr noch ein paar Hinweise, was ich besser machen kann.
Hier das Listing:
Hoffentlich farbig, wie in BASCOM, das sieht man in der Vorschau leider nicht, oder mache ich da was falsch?
CodeBox BascomAVR
Also nochmals vielen Dank
schönes WE
Gruß DS1074
PS: die farbige Darstellung des Listings erschien erst, nachdem ich die Nachricht gesendet habe und am PC mit F5 aktualisiert habe, aber nicht in der Vorschau und auch nicht in den von mir eingestellten Farben.
heute melde ich mich mit einer Erfolgsnachricht.
Mein Programm zur Übertragung der Uhrzeit vom PC auf den DS3231 läuft jetzt dank der vielen Tipps von Euch weitestgehend.
Es soll wie gesagt, keine Uhr im eigentlichen Sinne sein, das geht auch anders.
Ich will nur testen, wie man den RTC bedient, um herausbekommen, warum er sich beim Einschalten bzw. flashen des Atemgas öfter wieder zurücksetzt.
Das passiert leider immer noch, bisher nicht nachvollziehbar, warum.
Ich habe einige Kommentare eingefügt, vielleicht hilft dies auch anderen.
Man kann sicher noch einiges optimieren, mir ging es darum, das es funktioniert.(siehe TODO's in den Kommentaren)
Vielleicht habt ihr noch ein paar Hinweise, was ich besser machen kann.
Hier das Listing:
Hoffentlich farbig, wie in BASCOM, das sieht man in der Vorschau leider nicht, oder mache ich da was falsch?
CodeBox BascomAVR
'Echtzeituhr mit DS3231 am PollinBoard mit Mega 32 'Testprogramm von DS1074 '09.01.2020 '--- Atmega 32 ----------------------------------------------------------------------------------- $regfile = "m32def.dat" ' ATmega32 $crystal = 8000000 ' 8 MHz $hwstack = 100 'hardware stack $swstack = 100 'SW stack $framesize = 100 'frame space $baud = 9600 'für Prints '*** Init Tasten '*************************************** Config Portd.2 = Input Config Portd.3 = Input Config Portd.4 = Input Ta_links Alias Pind.2 Ta_mitte Alias Pind.3 Ta_rechts Alias Pind.4 '*** Init Leds und Beeper ******************************* Config Portd.5 = Output Config Portd.6 = Output Config Portd.7 = Output Led_links Alias Portd.5 Led_rechts Alias Portd.6 Beep Alias Portd.7 Waitms 100 '******************* Deklarationen ************************ '****************** Initialisierung LCD und I2C ********************************** $lib "i2c_TWI.lib" 'Hardware I²C einbinden Config Twi = 100000 'Takt 100kHz 400 geht auch noch '----------------------------------------------------------------------------------------------------------------------------- ' TWI gleich einschalten, das macht Bascom ansonsten erst beim I2CStart ! Twcr = &B00000100 ' nur TWEN setzen '!!! Scheint was zu bringen, warum auch immer !!! 'seit dieser Einstellung startet mein LCD ohne Probleme, 'warum steht sowas nicht in der BASCOM Hilfe? ;-( '****************** Initialisierung LCD und I2C ********************************** $lib "YwRobot_Lcd_i2c.lib" 'YwRobot Treiber für LCD Config Scl = Portc.0 'Clock Pullups wahrscheinlich softwaremäßig gesetzt Config Sda = Portc.1 'Data Jumper 11 und 12 entfernen blockieren AD4 und AD5 '-------- Init DS3231 ---------------------------------------- '7 Bit Addresse = 0h68 = 0110_1000 'Bit 8 entscheidet über 0 = schreiben 1 = lesen Const Ds3231_schreib_adresse = 208 'hex D0 write 0b 1101_0000 Const Ds3231_lese_adresse = 209 'hex D1 read 0b 1101_0001 '---- Init LCD ------------------------------------------------------------------------------------------------------- Const Pcf8574_lcd = 126 'Adresse des I2C-LCDs = hex 7E Waitms 500 ' für LCD-Init! Dim Lcd_backlight As Byte '1 = an; 0 = aus. Wird erst durch einen LCD-Befehl umgesetzt! Led_links = 1 Lcd_backlight = 1 'danach muß ein Kdo folgen Cls '*** Variablen **************************************** Dim Datum As String * 25 Dim Datum_byte(25) As Byte At Datum Overlay Dim Tag As Byte Dim Monat As Byte Dim Jahr_high As Byte Dim Jahr As Byte Dim Stunde As Byte Dim Minute As Byte Dim Sekunde As Byte Dim Wochentag As Byte 'Montag=1 bis Sonntag=7 Dim Wo_tag_str As String * 2 Dim Temp_h As Byte Dim Temp_l As Byte Dim X As Byte Deflcdchar 0 , 2 , 5 , 5 , 2 , 32 , 32 , 32 , 32 ' Grad Zeichen '### Pragrammstart ################################################### Locate 1 , 3 Lcd "Uhr mit DS3231" Waitms 500 '--- Hauptschleife ------------------------------------------- Do Toggle Led_links If Ta_rechts = 1 Then Gosub Uhr_stellen 'linke Taste am Pollinboard '---sonst Zeit anzeigen ------------------------------------------------------------------------------------------------ I2cstart I2cwbyte Ds3231_schreib_adresse I2cwbyte 0 'ab Register 0 I2cstop 'kann man gleich bei Zeile 84 weitermachen? I2cstart I2cwbyte Ds3231_lese_adresse I2crbyte Sekunde , Ack 'Zeit und Datum aus RTC lesen I2crbyte Minute , Ack I2crbyte Stunde , Ack I2crbyte Wochentag , Ack I2crbyte Tag , Ack I2crbyte Monat , Ack I2crbyte Jahr , Nack I2cstop Waitms 50 '--------------------- ab hier wird die Temp ausgelesen ---------------------------------- I2cstart I2cwbyte Ds3231_schreib_adresse I2cwbyte 17 'ab Register 11 hex = 17 dez I2cstop I2cstart I2cwbyte Ds3231_lese_adresse I2crbyte Temp_h , Ack 'Temp h lesen I2crbyte Temp_l , Nack 'Temp l lesen I2cstop 'generate stop '-- Anzeige im LCD Display ------------------------------------------------------------------------------- Locate 2 , 1 Wochentag = Makedec(wochentag) Select Case Wochentag Case 1 : Lcd "Mo " Case 2 : Lcd "Die " Case 3 : Lcd "Mi " Case 4 : Lcd "Do " Case 5 : Lcd "Fr " Case 6 : Lcd "Sa " Case 7 : Lcd "So " End Select '--- evtl. an Stelle von case 'TODO Wochentag aus Tabelle Wo_tag_data holen '---- Umrechnung der Nachkommastellen der Temp -------------------------------------- Shift Temp_l , Right , 6 'damit Temp_l 0 - 3 ... Temp_l = Temp_l * 25 '... * 0,25 = 0...0,75 (75 nach dem Komma) ergibt 'Vorzeichen noch nicht berücksichtigt '--------------------------------------------- Lcd Bcd(tag) ; "." ; Bcd(monat) ; "." ; "20" ; Bcd(jahr) Locate 3 , 8 Lcd Bcd(stunde) ; ":" ; Bcd(minute) ; ":" ; Bcd(sekunde) Locate 4 , 1 Lcd "Temp : " ; Temp_h ; "," ; Temp_l ; " " ; Chr(0) ; "C " '°C Waitms 50 Loop Until Ta_links = 1 '~> Sprung zum .... '--- ...Programmende ----------------------------------------------------------------- Led_links = 0 Lcd_backlight = 0 'LCD Licht aus Cls End '### ENDE Programm ############################################### '--- UPS --------------------------- Uhr_stellen: Led_links = 0 Led_rechts = 1 '( '--- Datum und Uhrzeit hier noch von Hand eingetragen: Wochentag = 1 'Montag=1 bis Sonntag=7 Tag = 13 Monat = 1 Jahr = 20 Stunden = 19 Minuten = 29 Sekunden = 00 ') '##### neu ######################################################## '**************************************************************************************** ' Datum vom PC batch oder hier direkt von der cmd ' Wochentag ' for /f %A in ('wmic path win32_localtime get dayofweek^|findstr /v /r "^$"') do (set daynumber=%A) ' Serielle Ausgabe per DOS cmd ' Echo %date% %time% %daynumber% '**************************************************************************************** Input Datum Noecho 'Datums String einlesen, Noecho ??? Sound Beep , 300 , 300 'Kontrollton für Empfang Bitwait Ta_links , Set 'Taste nach Empfang 'Terminal starten !!!!! Print Datum 'Kontrollanzeige '--- Berechnungen für RTC ------------------------------------------------------ ' TODO folgendes entweder in Assembler oder über Subroutinen If Datum_byte(1) > 13 Then X = 0 Else X = 1 '0x0A abfangen 'umwandeln Tag = Datum_byte(1 + X) - 0x30 Swap Tag Tag = Tag + Datum_byte(2 + X) Tag = Tag - 0x30 Monat = Datum_byte(4 + X) - 0x30 Swap Monat Monat = Monat + Datum_byte(5 + X) Monat = Monat - 0x30 Jahr = Datum_byte(9 + X) - 0x30 Swap Jahr Jahr = Jahr + Datum_byte(10 + X) Jahr = Jahr - 0x30 Jahr_high = 0x20 '--- Zeit ------------------------------------------------ Stunde = Datum_byte(12 + X) - 0x30 Swap Stunde Stunde = Stunde + Datum_byte(13 + X) Stunde = Stunde - 0x30 Minute = Datum_byte(15 + X) - 0x30 Swap Minute Minute = Minute + Datum_byte(16 + X) Minute = Minute - 0x30 Sekunde = Datum_byte(18 + X) - 0x30 Swap Sekunde Sekunde = Sekunde + Datum_byte(19 + X) Sekunde = Sekunde - 0x30 Wochentag = Datum_byte(24 + X) - 0x30 Wo_tag_str = Lookupstr(wochentag , Wo_tag_data) '--- vielleicht kann ich auch das verwenden 'Tag = Makebcd(tag) 'in BCD-Format fuer Uhr umsetzen 'Monat = Makebcd(monat) 'Jahr = Makebcd(jahr) '--- TODO wird noch getestet '--- Testausdruck ----------------------------------- Print Print Wo_tag_str Print Print Hex(tag) Print Hex(monat) Print Hex(jahr_high) '0x20 , da constant Print Hex(jahr) Print Print Hex(stunde) Print Hex(minute) Print Hex(sekunde) Print Print "Ta_mitte = Schreiben Ta_rechts = Abbruch" Do If Ta_mitte = 1 Then Gosub Schreiben 'Schreiben auf RTC Exit Do Else If Ta_rechts = 1 Then Exit Do 'wenn Datum falsch übertragen End If Loop Sound Beep , 600 , 300 'Ende Signal Wait 1 Led_rechts = 0 Return End '################################################################## Schreiben: Print "auf RTC Schreiben" '----- Datum schreiben: ----- '--- brauche ich hier nicht mehr, siehe Umwandlung 'Tag = Makebcd(tag) 'in BCD-Format fuer Uhr umsetzen 'Monat = Makebcd(monat) 'Jahr = Makebcd(jahr) I2cstart I2cwbyte Ds3231_schreib_adresse I2cwbyte 3 'Datum ab Register 3 I2cwbyte Wochentag I2cwbyte Tag I2cwbyte Monat I2cwbyte Jahr I2cstop ' ----- Uhrzeit schreiben: ----- '--- siehe Umwandlung 'Sekunde = Makebcd(sekunde) 'in BCD-Format fuer Uhr umsetzen 'Minute = Makebcd(minute) 'Stunde = Makebcd(stunde) I2cstart I2cwbyte Ds3231_schreib_adresse I2cwbyte 0 'Zeit ab Register 0 I2cwbyte Sekunde I2cwbyte Minute I2cwbyte Stunde I2cstop Return End 'vor Tabellen '---------------------------------------------------------------------------------------------------------------- Wo_tag_data: Data "So" , "Mo" , "Di" , "Mi" , "Do" , "Fr" , "Sa"
Also nochmals vielen Dank
schönes WE
Gruß DS1074
PS: die farbige Darstellung des Listings erschien erst, nachdem ich die Nachricht gesendet habe und am PC mit F5 aktualisiert habe, aber nicht in der Vorschau und auch nicht in den von mir eingestellten Farben.
Zuletzt bearbeitet: