Hanna
Sourcecode Batteriemanagementsystem
ds1388_rtc.c
gehe zur Dokumentation dieser Datei
1 
14 #include <stdio.h>
15 #include <stdint.h>
16 #include <avr/io.h>
17 #include <avr/interrupt.h>
18 #include <stdbool.h>
19 
20 #include "twi_master_driver.h"
21 #include "temp_mcp9843.h"
22 #include "ds1388_rtc.h"
23 
24 //#include "ad7997.h"
25 
26 #ifndef BMS_BASIC_TEMP_MCP9843_H_
27 TWI_Master_t twi_TEMP_RTC;
28 uint8_t sendRegData[8] =
29 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
30 #endif
31 datetime_t now;
32 char weekday[8][10] = { "ERROR", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag", "Sonntag" };
33 
46 void DS1388_init ()
47 {
48 
49 // I2C-Bus wird im Temperaturmodul eingestellt. Falls nicht, wird das hier als Fallback durchgeführt.
50 #ifndef BMS_BASIC_TEMP_MCP9843_H_
51  TWI_MasterInit ( &twi_TEMP_RTC, &TWIE, TWI_MASTER_INTLVL_LO_gc, TWI_BAUDSETTING );
52 #endif
53 
54 // PORTC.DIRSET = PIN2_bm; // RTC => !RST
55 // PORTC.OUTSET = PIN2_bm;
56 
57 // CONFIG Register - Oszillator bei Batteriebetrieb ein, Watchdog aus
58  sendRegData[0] = DS1388_CTRL_REG;
59  sendRegData[1] = DS1388_OSC_EN_bm | DS1388_WD_RST_DIS_bm;
60  TWI_MasterWrite ( &twi_TEMP_RTC, DS1388_CLOCK_ADDR, &sendRegData[0], 2 );
61 
62  // TRICKLE CHARGE Register - TC ausschalten
63  sendRegData[0] = DS1388_TRICKLE_CHRG_REG;
64  sendRegData[1] = DS1388_TR_CHG_DISABLE_bm;
65  TWI_MasterWrite ( &twi_TEMP_RTC, DS1388_CLOCK_ADDR, &sendRegData[0], 2 );
66 
67  // Stundenregister lesen, um 24h-Einstellung zu prüfen
68  sendRegData[0] = DS1388_HR_REG;
69  TWI_MasterWrite ( &twi_TEMP_RTC, DS1388_CLOCK_ADDR, &sendRegData[0], 1 );
70  TWI_MasterRead ( &twi_TEMP_RTC, DS1388_CLOCK_ADDR, 1 );
71  if ( (uint8_t) twi_TEMP_RTC.readData[0] & DS1388_24HR_SET_FLT_bm ) // Wenn 24h-bit nicht 0, dann 24h-bit löschen => 24h-Modus aktiv
72  {
73  sendRegData[0] = DS1388_HR_REG;
74  sendRegData[1] = (uint8_t) twi_TEMP_RTC.readData[0] & ~DS1388_12HR_SEL_bm;
75  TWI_MasterWrite ( &twi_TEMP_RTC, DS1388_CLOCK_ADDR, &sendRegData[0], 2 );
76  }
77 
78 
79  // Prüfen, ob der Oszillator seit dem letzten Start angehalten wurde
80  sendRegData[0] = DS1388_FLAG_REG;
81  TWI_MasterWrite ( &twi_TEMP_RTC, DS1388_CLOCK_ADDR, &sendRegData[0], 1 );
82  TWI_MasterRead ( &twi_TEMP_RTC, DS1388_CLOCK_ADDR, 1 );
83  if ( (uint8_t) twi_TEMP_RTC.readData[0] & DS1388_OSF_FLAG_FLT_bm ) // Oszillator angehalten
84  {
85  printf ( "\x1B[1;31mERROR\x1B[0m - Oscillator angehalten - Zeit neu einstellen !\r\n\n" );
86 #if ZEIT_SETZEN
88 #endif
89  }
90 
91  // Oscillator Stop Flag OSF zurücksetzen
92  sendRegData[0] = DS1388_FLAG_REG;
93  sendRegData[1] = DS1388_FLAG_REG_RST_bm;
94  TWI_MasterWrite ( &twi_TEMP_RTC, DS1388_CLOCK_ADDR, &sendRegData[0], 2 );
95 
96  // Interrupt enable
97  PMIC.CTRL |= PMIC_HILVLEN_bm | PMIC_MEDLVLEN_bm | PMIC_LOLVLEN_bm; // enable interrupt levels
98  sei();
99  // enable all interrupts
100 }
101 
107 void DS1388_get_datetime ( void )
108 {
109  // Einlesen der hundertstel Sekunden
110  sendRegData[0] = DS1388_H_SEC_REG;
111  TWI_MasterWrite ( &twi_TEMP_RTC, DS1388_CLOCK_ADDR, &sendRegData[0], 1 );
112  TWI_MasterRead ( &twi_TEMP_RTC, DS1388_CLOCK_ADDR, 1 );
113  now.hundredth_sec = ((uint8_t) twi_TEMP_RTC.readData[0] & DS1388_001_SEC_FLT_bm) + (((uint8_t) twi_TEMP_RTC.readData[0] & DS1388_01_SEC_FLT_bm) >> 4) * 10;
114 
115  // Einlesen der Sekunden
116  sendRegData[0] = DS1388_SEC_REG;
117  TWI_MasterWrite ( &twi_TEMP_RTC, DS1388_CLOCK_ADDR, &sendRegData[0], 1 );
118  TWI_MasterRead ( &twi_TEMP_RTC, DS1388_CLOCK_ADDR, 1 );
119  now.seconds = ((uint8_t) twi_TEMP_RTC.readData[0] & DS1388_SEC_FLT_bm) + (((uint8_t) twi_TEMP_RTC.readData[0] & DS1388_10_SEC_FLT_bm) >> 4) * 10;
120 
121  // Einlesen der Minuten
122  sendRegData[0] = DS1388_MIN_REG;
123  TWI_MasterWrite ( &twi_TEMP_RTC, DS1388_CLOCK_ADDR, &sendRegData[0], 1 );
124  TWI_MasterRead ( &twi_TEMP_RTC, DS1388_CLOCK_ADDR, 1 );
125  now.minutes = ((uint8_t) twi_TEMP_RTC.readData[0] & DS1388_MIN_FLT_bm) + (((uint8_t) twi_TEMP_RTC.readData[0] & DS1388_10_MIN_FLT_bm) >> 4) * 10;
126 
127  // Einlesen der Stunden
128  sendRegData[0] = DS1388_HR_REG;
129  TWI_MasterWrite ( &twi_TEMP_RTC, DS1388_CLOCK_ADDR, &sendRegData[0], 1 );
130  TWI_MasterRead ( &twi_TEMP_RTC, DS1388_CLOCK_ADDR, 1 );
131  now.hours = ((uint8_t) twi_TEMP_RTC.readData[0] & DS1388_HR_FLT_bm) + (((uint8_t) twi_TEMP_RTC.readData[0] & DS1388_10_HR_24_FLT_bm) >> 4) * 10;
132 
133  // Einlesen der Tage
134  sendRegData[0] = DS1388_DAY_REG;
135  TWI_MasterWrite ( &twi_TEMP_RTC, DS1388_CLOCK_ADDR, &sendRegData[0], 1 );
136  TWI_MasterRead ( &twi_TEMP_RTC, DS1388_CLOCK_ADDR, 1 );
137  now.day = ((uint8_t) twi_TEMP_RTC.readData[0] & DS1388_DAY_FLT_bm) + (((uint8_t) twi_TEMP_RTC.readData[0] & DS1388_10_DAY_FLT_bm) >> 4) * 10;
138 
139  // Einlesen der Monate
140  sendRegData[0] = DS1388_MON_REG;
141  TWI_MasterWrite ( &twi_TEMP_RTC, DS1388_CLOCK_ADDR, &sendRegData[0], 1 );
142  TWI_MasterRead ( &twi_TEMP_RTC, DS1388_CLOCK_ADDR, 1 );
143  now.month = ((uint8_t) twi_TEMP_RTC.readData[0] & DS1388_MON_FLT_bm) + (((uint8_t) twi_TEMP_RTC.readData[0] & DS1388_10_MON_FLT_bm) >> 4) * 10;
144 
145  // Einlesen der Jahre (zweistellig)
146  sendRegData[0] = DS1388_YR_REG;
147  TWI_MasterWrite ( &twi_TEMP_RTC, DS1388_CLOCK_ADDR, &sendRegData[0], 1 );
148  TWI_MasterRead ( &twi_TEMP_RTC, DS1388_CLOCK_ADDR, 1 );
149  now.year = ((uint8_t) twi_TEMP_RTC.readData[0] & DS1388_YR_FLT_bm) + (((uint8_t) twi_TEMP_RTC.readData[0] & DS1388_10_YR_FLT_bm) >> 4) * 10;
150 
151  // Einlesen des Wochentags
152  sendRegData[0] = DS1388_WDAY_REG;
153  TWI_MasterWrite ( &twi_TEMP_RTC, DS1388_CLOCK_ADDR, &sendRegData[0], 1 );
154  TWI_MasterRead ( &twi_TEMP_RTC, DS1388_CLOCK_ADDR, 1 );
155  now.wday = ((uint8_t) twi_TEMP_RTC.readData[0] & DS1388_WDAY_FLT_bm);
156 }
157 
158 #if ZEIT_SETZEN
159 
166 void DS1388_set_datetime ( void )
167 {
168  datetime_t set_datetime;
169  _delay_ms ( 2 );
170  set_datetime.hundredth_sec = settime( 0, 0 ); // Hundertstel
171  set_datetime.seconds = settime( 0, 0 ); // Sekunden
172  set_datetime.minutes = settime( 3, 0 ); // Minuten
173  set_datetime.hours = settime( 1, 7 ); // Stunden
174  set_datetime.day = settime( 2, 0 ); // Tage
175  set_datetime.month = settime( 0, 3 ); // Monate
176  set_datetime.year = settime( 1, 6 ); // Jahre (zweistellig)
177  set_datetime.wday = sonntag; // Wochentag (user defined, Tage werden vom Startpunkt inkrementiert)
178 
179  // Setzen der hundertstel Sekunden
180  sendRegData[0] = DS1388_H_SEC_REG;
181  sendRegData[1] = set_datetime.hundredth_sec;
182  TWI_MasterWrite ( &twi_TEMP_RTC, DS1388_CLOCK_ADDR, &sendRegData[0], 2 );
183 
184  // Setzen der Sekunden
185  sendRegData[0] = DS1388_SEC_REG;
186  sendRegData[1] = set_datetime.seconds;
187  TWI_MasterWrite ( &twi_TEMP_RTC, DS1388_CLOCK_ADDR, &sendRegData[0], 2 );
188 
189  // Setzen der Minuten
190  sendRegData[0] = DS1388_MIN_REG;
191  sendRegData[1] = set_datetime.minutes;
192  TWI_MasterWrite ( &twi_TEMP_RTC, DS1388_CLOCK_ADDR, &sendRegData[0], 2 );
193 
194  // Setzen der Stunden
195  sendRegData[0] = DS1388_HR_REG;
196  sendRegData[1] = set_datetime.hours;
197 // sendRegData[1] = 0x17;
198  TWI_MasterWrite ( &twi_TEMP_RTC, DS1388_CLOCK_ADDR, &sendRegData[0], 2 );
199  sendRegData[0] = 0x17;
200  TWI_MasterWrite ( &twi_TEMP_RTC, DS1388_CLOCK_ADDR, &sendRegData[0], 1 );
201 
202  // Setzen der Tage
203  sendRegData[0] = DS1388_DAY_REG;
204  sendRegData[1] = set_datetime.day;
205  TWI_MasterWrite ( &twi_TEMP_RTC, DS1388_CLOCK_ADDR, &sendRegData[0], 2 );
206 
207  // Setzen der Monate
208  sendRegData[0] = DS1388_MON_REG;
209  sendRegData[1] = set_datetime.month;
210  TWI_MasterWrite ( &twi_TEMP_RTC, DS1388_CLOCK_ADDR, &sendRegData[0], 2 );
211 
212  // Setzen der Jahre
213  sendRegData[0] = DS1388_YR_REG;
214  sendRegData[1] = set_datetime.year;
215  TWI_MasterWrite ( &twi_TEMP_RTC, DS1388_CLOCK_ADDR, &sendRegData[0], 2 );
216 
217  // Setzen des Wochentags
218  sendRegData[0] = DS1388_WDAY_REG;
219  sendRegData[1] = set_datetime.wday;
220  TWI_MasterWrite ( &twi_TEMP_RTC, DS1388_CLOCK_ADDR, &sendRegData[0], 2 );
221 }
222 #endif
223 
224 #ifndef BMS_BASIC_TEMP_MCP9843_H_
225 ISR(TWIE_TWIM_vect)
226 {
227  TWI_MasterInterruptHandler ( &twi_TEMP_RTC );
228 }
229 #endif
#define DS1388_TRICKLE_CHRG_REG
Trickle Charger zum Laden des Backup-Akkus; TCS3 TCS2 TCS1 TCS0 DS1 DS0 ROUT1 ROUT0.
Definition: ds1388_rtc.h:58
#define DS1388_FLAG_REG
Flag Register zeigt die OSF und WD Flags an; OSF WF 0 0 0 0 0 0 Flag.
Definition: ds1388_rtc.h:59
#define DS1388_DAY_REG
Register Tag.
Definition: ds1388_rtc.h:54
Konstanten, Filter und Commands für den Temperatursensor MCP 9843.
#define DS1388_HR_REG
Register Stunden.
Definition: ds1388_rtc.h:52
Header, Definition der Konstanten und Commands für DS1388.
void DS1388_get_datetime(void)
Die Uhrzeit und das Datum werden ausgelesen.
Definition: ds1388_rtc.c:107
#define DS1388_DAY_FLT_bm
Filter Tag (einstellig, max 9)
Definition: ds1388_rtc.h:97
#define DS1388_H_SEC_REG
Register Hundertstel Sekunden.
Definition: ds1388_rtc.h:49
#define DS1388_10_SEC_FLT_bm
Filter 10 Sekunden (max 5)
Definition: ds1388_rtc.h:85
#define DS1388_HR_FLT_bm
Filter Stunden (max 9)
Definition: ds1388_rtc.h:90
#define DS1388_MIN_FLT_bm
Filter Minuten (max 9)
Definition: ds1388_rtc.h:87
#define DS1388_OSF_FLAG_FLT_bm
1 zeigt an, dass der Oszillator ausgeschaltet war und damit die Zeitdaten nicht mehr korrekt sind...
Definition: ds1388_rtc.h:108
void TWI_MasterInit(TWI_Master_t *twi, TWI_t *module, TWI_MASTER_INTLVL_t intLevel, uint8_t baudRateRegisterSetting)
Initialise the TWI module.
#define DS1388_10_MIN_FLT_bm
Filter 10 Minuten (max 5)
Definition: ds1388_rtc.h:88
register8_t readData[TWIM_READ_BUFFER_SIZE]
#define DS1388_SEC_REG
Register Sekunden.
Definition: ds1388_rtc.h:50
#define DS1388_10_MON_FLT_bm
Filter 10 Monate (0-1)
Definition: ds1388_rtc.h:101
#define DS1388_TR_CHG_DISABLE_bm
Trickle Charger disabled, Backupbatterie nicht aufladbar.
Definition: ds1388_rtc.h:69
#define DS1388_MON_REG
Register Monat.
Definition: ds1388_rtc.h:55
#define DS1388_12HR_SEL_bm
12-h-Darstellung, Bit 6 = 1 (|-Verknüpfung!), bit5 zeigt !AM/PM
Definition: ds1388_rtc.h:67
XMEGA TWI master driver header file.
#define DS1388_WD_RST_DIS_bm
Watchdog und RST PIN disabled.
Definition: ds1388_rtc.h:74
#define DS1388_YR_REG
Register Jahr.
Definition: ds1388_rtc.h:56
#define DS1388_24HR_SET_FLT_bm
SET 24h-Format gesetzt (=0) ?
Definition: ds1388_rtc.h:106
#define DS1388_OSC_EN_bm
Oszillator im Batteriebetrieb ein.
Definition: ds1388_rtc.h:75
#define DS1388_YR_FLT_bm
Filter Jahr (einstellig, max 9)
Definition: ds1388_rtc.h:103
void TWI_MasterInterruptHandler(TWI_Master_t *twi)
Common TWI master interrupt service routine.
bool TWI_MasterWrite(TWI_Master_t *twi, uint8_t address, uint8_t *writeData, uint8_t bytesToWrite)
TWI write transaction.
#define DS1388_01_SEC_FLT_bm
Filter Zehntel Sekunden.
Definition: ds1388_rtc.h:82
void DS1388_set_datetime(void)
Die Uhrzeit und das Datum werden neu gesetzt.
Definition: ds1388_rtc.c:166
#define DS1388_SEC_FLT_bm
Filter Sekunden (max 9)
Definition: ds1388_rtc.h:84
#define DS1388_FLAG_REG_RST_bm
Oscillator Stop Flag, muss zum Start auf 0 gesetzt werden.
Definition: ds1388_rtc.h:71
#define DS1388_WDAY_FLT_bm
Filter Wochentag (01-07)
Definition: ds1388_rtc.h:95
#define DS1388_10_HR_24_FLT_bm
Filter 10 Stunden im 24h-Format (max 2)
Definition: ds1388_rtc.h:91
#define DS1388_MON_FLT_bm
Filter Monat (einstellig)
Definition: ds1388_rtc.h:100
TWI master driver struct.
#define DS1388_001_SEC_FLT_bm
Filter Hundertstel Sekunden.
Definition: ds1388_rtc.h:81
#define DS1388_WDAY_REG
Register Wochentag.
Definition: ds1388_rtc.h:53
bool TWI_MasterRead(TWI_Master_t *twi, uint8_t address, uint8_t bytesToRead)
TWI read transaction.
#define DS1388_10_DAY_FLT_bm
Filter 10 Tage (max 3)
Definition: ds1388_rtc.h:98
#define DS1388_MIN_REG
Register Minuten.
Definition: ds1388_rtc.h:51
void DS1388_init()
Einstellungen des µC für die Arbeit mit DS1388.
Definition: ds1388_rtc.c:46
#define DS1388_10_YR_FLT_bm
Filter Zehn Jahre (max 9)
Definition: ds1388_rtc.h:104
#define DS1388_CTRL_REG
Control Register schaltet Oszillator mit Batterie und die Watchdogfunktionen; !EOSC 0 0 0 0 0 WDE WD/...
Definition: ds1388_rtc.h:60
#define DS1388_CLOCK_ADDR
Uhr-Adresse.
Definition: ds1388_rtc.h:42