Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum

democode für I2C RTC DS1307 Kategorie: Programmierung Basic (von Achim - 4.08.2013 12:18)
Ich nutze:
C-Control Pro Mega128, CC-Pro 128 Application Board
So, ich wollte nach meiner endlosen Code-saugerei
auch mal was beisteuern, weil ich das hier im Forum noch
nicht gefunden habe. Man bekommt bei ebay für ein paar euronen
diese kleinen rtc-uhren. habe ein paar zeilen geschrieben, wie man
diese ausliest. ist ja wie immer, wenn man rausgefunden hat, ist das
ja immer ganz einfach. ich hoffe, das ist nicht zu trivial und kann
jemanden helfen.

bis dann

achim








'        democode für
'        I2C RTC DS1307 AT24C32 Real Time Clock Modul für Arduino
'        von achim dietz
'        08.2013

'        bei ebay gibts mehrere. ich kaufte das mit der blauen platine.
'        hersteller steht nicht drauf. shop ist von schibe elektronik.
'        ich will nicht unnötig werbung machen, aber es soll ja im ersten
'        anlauf klappen, ohne weitere probleme.
'        da steht "tiny rtc I2C modules" drauf und kostet ca. 4,60â?¬.
'        aber bestimmt klappts auch mit den anderen. ich habe die schmale
'        pfostenreihe "2" beschaltet.


'bytes
Dim DS1307_B_1, DS1307_B_2, DS1307_B_3, DS1307_B_4, DS1307_B_5, DS1307_B_6, DS1307_B_7 As Word
'ergebnisse
Dim DS1307_sec, DS1307_min, DS1307_hour, DS1307_wod, DS1307_day, DS1307_mon, DS1307_year As Integer

Sub main()
 I2C_Init(I2C_100kHz)                 ' I2C Bit Rate: 100 kHz


 'dieser teil dient zum stellen der uhr. erst probieren, wenn man das unten versteht.
 'als bespiel wird die uhrzeit gestellt. also auf register 00 springen mit write.
 'ich mache das zu besseren verständlichkeit binär.
 'als beispiel 19:12:00
 'I2C_Start()
 'I2C_Write(0B11010000)               ' adresse schreiben
 'I2C_Write(0x00)                     ' startregister setzen
 'I2C_Write(0B00000000)               ' Sekunden auf null
 'I2C_Write(0B00010010)               ' Minuten auf 12, also 1 links, 2 rechts 0001 0010
 'I2C_Write(0B00011001)               ' Stunden auf 19, also 1 links, 9 rechts 0001 1001
 'I2C_Stop()
 'AbsDelay(10)


 '-----------------------------------------------------------------------------
 'start rtc lesen
 'adresse schreiben, das Startregister setzen, von wo man aus lesen will.
 'dann einfach die verbliebenen register lesen. max 7.

 I2C_Start()
 I2C_Write(0B11010000)               ' I2C adresse auf schreiben setzen
 I2C_Write(0x00)                     ' startregister setzen

 AbsDelay(10)                        ' aus reiner gewohnheit

 I2C_Start()                         ' i2c neu starten
 I2C_Write(0B11010001)               ' I2C adresse auf lesen setzen
                                     ' jetzt 7 Bytes lesen

 DS1307_B_1=(I2C_Read_ACK())         'sec  reg 00 1-59
 DS1307_B_2=(I2C_Read_ACK())         'min  reg 01 1-59
 DS1307_B_3=(I2C_Read_ACK())         'h    reg 02 1-24
 DS1307_B_4=(I2C_Read_ACK())         'wod  reg 03 Wochentag 1-7
 DS1307_B_5=(I2C_Read_ACK())         'day  reg 04 1-31
 DS1307_B_6=(I2C_Read_ACK())         'mon  reg 05 1-12
 DS1307_B_7=(I2C_Read_NACK())        'year reg 06 1-xx

 I2C_Stop()

 'um die bytes umrechnen zu können, muss man ins datenblatt schauen, denn
 'die meisten bytes sind halbiert. in den vier bits rechts stehen die "einer"
 'und in den vier links die zehner. wenn man das byte komplett auswertet, kommen
 'da nur hausnummern raus. deshalb muss man das byte maskiert auswerten.
 'eigentlich ganz einfach. mal bei wikipedia unter "bitmaske" schauen.
 'die linke information maskieren, 4 bits nach rechts und mit 10 multiplizieren
 'dann die rechten maskierten bits dazuaddieren.

 DS1307_sec =  (((DS1307_B_1 And 0b01110000)>>4)*10) + (DS1307_B_1 And 0b00001111)
 DS1307_min =  (((DS1307_B_2 And 0b01110000)>>4)*10) + (DS1307_B_2 And 0b00001111)
 DS1307_hour = (((DS1307_B_3 And 0b00110000)>>4)*10) + (DS1307_B_3 And 0b00001111)

 DS1307_wod = DS1307_B_4 And 0b00000111

 DS1307_day =  (((DS1307_B_5 And 0b00110000)>>4)*10) + (DS1307_B_5 And 0b00001111)
 DS1307_mon =  (((DS1307_B_6 And 0b00010000)>>4)*10) + (DS1307_B_6 And 0b00001111)
 DS1307_year = (((DS1307_B_7 And 0b11110000)>>4)*10) + (DS1307_B_7 And 0b00001111)

 Msg_WriteWord(DS1307_hour)
 Msg_WriteText(":")
 Msg_WriteWord(DS1307_min)
 Msg_WriteText(":")
 Msg_WriteWord(DS1307_sec)
 Msg_WriteText("  ")
 Msg_WriteWord(DS1307_wod)
 Msg_WriteText(" wod ")
 Msg_WriteWord(DS1307_day)
 Msg_WriteText(" day ")
 Msg_WriteWord(DS1307_mon)
 Msg_WriteText(" mon ")
 Msg_WriteWord(DS1307_year)
 Msg_WriteText(" y ")
End Sub

 


    Antwort schreiben


Antworten:

Re: democode für I2C RTC DS1307 (von Carlo - 18.02.2020 18:45)