Hanna
Sourcecode Batteriemanagementsystem
eeprom.c
gehe zur Dokumentation dieser Datei
1 
15 #include <avr/io.h>
16 #include <stdio.h>
17 
18 #include "eeprom.h"
19 #include "eeprom_driver.h"
20 
21 akku_daten_t eeprom_akku_daten[8];
22 akku_basis_daten_t eeprom_akku_basis_daten[8];
23 eeprom_fs_data_t eeprom_fs_data;
24 
25 void eeprom_read_data ( void )
26 {
27  uint16_t temp_data;
28  eeprom_read_fs_data ();
29 
30  // Akku Basisdaten auslesen
31  for ( int i = 0; i < 4; i++ )
32  {
33  eeprom_akku_basis_daten[i].inbetriebnahme_yy = EEPROM_ReadByte ( AKKU_BASIS_PAGE_1, 0 + AKKU_BASIS_DATA_BYTE_OFFSET * i );
34  eeprom_akku_basis_daten[i + 4].inbetriebnahme_yy = EEPROM_ReadByte ( AKKU_BASIS_PAGE_2, 0 + AKKU_BASIS_DATA_BYTE_OFFSET * i );
35  eeprom_akku_basis_daten[i].inbetriebnahme_mo = EEPROM_ReadByte ( AKKU_BASIS_PAGE_1, 1 + AKKU_BASIS_DATA_BYTE_OFFSET * i );
36  eeprom_akku_basis_daten[i + 4].inbetriebnahme_mo = EEPROM_ReadByte ( AKKU_BASIS_PAGE_2, 1 + AKKU_BASIS_DATA_BYTE_OFFSET * i );
37  eeprom_akku_basis_daten[i].inbetriebnahme_dd = EEPROM_ReadByte ( AKKU_BASIS_PAGE_1, 2 + AKKU_BASIS_DATA_BYTE_OFFSET * i );
38  eeprom_akku_basis_daten[i + 4].inbetriebnahme_dd = EEPROM_ReadByte ( AKKU_BASIS_PAGE_2, 2 + AKKU_BASIS_DATA_BYTE_OFFSET * i );
39  eeprom_akku_basis_daten[i].inbetriebnahme_hh = EEPROM_ReadByte ( AKKU_BASIS_PAGE_1, 3 + AKKU_BASIS_DATA_BYTE_OFFSET * i );
40  eeprom_akku_basis_daten[i + 4].inbetriebnahme_hh = EEPROM_ReadByte ( AKKU_BASIS_PAGE_2, 3 + AKKU_BASIS_DATA_BYTE_OFFSET * i );
41  eeprom_akku_basis_daten[i].inbetriebnahme_mi = EEPROM_ReadByte ( AKKU_BASIS_PAGE_1, 4 + AKKU_BASIS_DATA_BYTE_OFFSET * i );
42  eeprom_akku_basis_daten[i + 4].inbetriebnahme_mi = EEPROM_ReadByte ( AKKU_BASIS_PAGE_2, 4 + AKKU_BASIS_DATA_BYTE_OFFSET * i );
43  eeprom_akku_basis_daten[i].inbetriebnahme_ss = EEPROM_ReadByte ( AKKU_BASIS_PAGE_1, 5 + AKKU_BASIS_DATA_BYTE_OFFSET * i );
44  eeprom_akku_basis_daten[i + 4].inbetriebnahme_ss = EEPROM_ReadByte ( AKKU_BASIS_PAGE_2, 5 + AKKU_BASIS_DATA_BYTE_OFFSET * i );
45  eeprom_akku_basis_daten[i].max_kapa = EEPROM_ReadBytes ( AKKU_BASIS_PAGE_1, 6, 2 + AKKU_BASIS_DATA_BYTE_OFFSET * i );
46  eeprom_akku_basis_daten[i + 4].max_kapa = EEPROM_ReadBytes ( AKKU_BASIS_PAGE_2, 6, 2 + AKKU_BASIS_DATA_BYTE_OFFSET * i );
47  }
48 
49  // Akku Zustandsdaten auslesen
50  for ( int i = 0; i < 8; i++ )
51  {
52  eeprom_akku_daten[i].timestamp_datensatz_yy = EEPROM_ReadByte ( AKKU_DATA_PAGE_START + i + eeprom_fs_data.page_offset, 0 );
53  eeprom_akku_daten[i].timestamp_datensatz_mo = EEPROM_ReadByte ( AKKU_DATA_PAGE_START + i + eeprom_fs_data.page_offset, 1 );
54  eeprom_akku_daten[i].timestamp_datensatz_dd = EEPROM_ReadByte ( AKKU_DATA_PAGE_START + i + eeprom_fs_data.page_offset, 2 );
55  eeprom_akku_daten[i].timestamp_datensatz_hh = EEPROM_ReadByte ( AKKU_DATA_PAGE_START + i + eeprom_fs_data.page_offset, 3 );
56  eeprom_akku_daten[i].timestamp_datensatz_mi = EEPROM_ReadByte ( AKKU_DATA_PAGE_START + i + eeprom_fs_data.page_offset, 4 );
57  eeprom_akku_daten[i].timestamp_datensatz_ss = EEPROM_ReadByte ( AKKU_DATA_PAGE_START + i + eeprom_fs_data.page_offset, 5 );
58  eeprom_akku_daten[i].soc = EEPROM_ReadByte ( AKKU_DATA_PAGE_START + i + eeprom_fs_data.page_offset, 6 );
59  eeprom_akku_daten[i].soh = EEPROM_ReadByte ( AKKU_DATA_PAGE_START + i + eeprom_fs_data.page_offset, 7 );
60  eeprom_akku_daten[i].c_max = EEPROM_ReadBytes ( AKKU_DATA_PAGE_START + i + eeprom_fs_data.page_offset, 8, 2 );
61  eeprom_akku_daten[i].charge = EEPROM_ReadBytes ( AKKU_DATA_PAGE_START + i + eeprom_fs_data.page_offset, 10, 2 );
62  eeprom_akku_daten[i].betriebszeit_s = EEPROM_ReadBytes ( AKKU_DATA_PAGE_START + i + eeprom_fs_data.page_offset, 12, 4 );
63  eeprom_akku_daten[i].ladezeit_s = EEPROM_ReadBytes ( AKKU_DATA_PAGE_START + i + eeprom_fs_data.page_offset, 16, 4 );
64 
65  temp_data = EEPROM_ReadBytes ( AKKU_DATA_PAGE_START + i + eeprom_fs_data.page_offset, 20, 2 );
66  eeprom_akku_daten[i].ladezyklen = temp_data / 100.0;
67  }
68 }
69 
70 void eeprom_write_akku_data ( void )
71 {
72  uint16_t temp_data;
73  eeprom_read_fs_data ();
74 
75  // Akku Zustandsdaten schreiben
76  for ( int i = 0; i < 8; i++ )
77  {
78  EEPROM_WriteByte ( AKKU_DATA_PAGE_START + i + eeprom_fs_data.page_offset, 0, eeprom_akku_daten[i].timestamp_datensatz_yy );
79  EEPROM_WriteByte ( AKKU_DATA_PAGE_START + i + eeprom_fs_data.page_offset, 1, eeprom_akku_daten[i].timestamp_datensatz_mo );
80  EEPROM_WriteByte ( AKKU_DATA_PAGE_START + i + eeprom_fs_data.page_offset, 2, eeprom_akku_daten[i].timestamp_datensatz_dd );
81  EEPROM_WriteByte ( AKKU_DATA_PAGE_START + i + eeprom_fs_data.page_offset, 3, eeprom_akku_daten[i].timestamp_datensatz_hh );
82  EEPROM_WriteByte ( AKKU_DATA_PAGE_START + i + eeprom_fs_data.page_offset, 4, eeprom_akku_daten[i].timestamp_datensatz_mi );
83  EEPROM_WriteByte ( AKKU_DATA_PAGE_START + i + eeprom_fs_data.page_offset, 5, eeprom_akku_daten[i].timestamp_datensatz_ss );
84  EEPROM_WriteByte ( AKKU_DATA_PAGE_START + i + eeprom_fs_data.page_offset, 6, eeprom_akku_daten[i].soc );
85  EEPROM_WriteByte ( AKKU_DATA_PAGE_START + i + eeprom_fs_data.page_offset, 7, eeprom_akku_daten[i].soh );
86  EEPROM_WriteBytes ( AKKU_DATA_PAGE_START + i + eeprom_fs_data.page_offset, 8, 2, eeprom_akku_daten[i].c_max );
87  EEPROM_WriteBytes ( AKKU_DATA_PAGE_START + i + eeprom_fs_data.page_offset, 10, 2, eeprom_akku_daten[i].charge );
88  EEPROM_WriteBytes ( AKKU_DATA_PAGE_START + i + eeprom_fs_data.page_offset, 12, 4, eeprom_akku_daten[i].betriebszeit_s );
89  EEPROM_WriteBytes ( AKKU_DATA_PAGE_START + i + eeprom_fs_data.page_offset, 16, 4, eeprom_akku_daten[i].ladezeit_s );
90 
91  temp_data = eeprom_akku_daten[i].ladezyklen * 100.0;
92  EEPROM_WriteBytes ( AKKU_DATA_PAGE_START + i + eeprom_fs_data.page_offset, 20, 2, temp_data );
93  }
94 
95  eeprom_write_fs_data ();
96 
97 }
98 
99 void eeprom_write_akku_basis_data ( void )
100 {
101  // Akku Basisdaten schreiben
102  for ( int i = 0; i < 4; i++ )
103  {
104  EEPROM_WriteByte ( AKKU_BASIS_PAGE_1, 0 + AKKU_BASIS_DATA_BYTE_OFFSET * i, eeprom_akku_basis_daten[i].inbetriebnahme_yy );
105  EEPROM_WriteByte ( AKKU_BASIS_PAGE_2, 0 + AKKU_BASIS_DATA_BYTE_OFFSET * i, eeprom_akku_basis_daten[i + 4].inbetriebnahme_yy );
106  EEPROM_WriteByte ( AKKU_BASIS_PAGE_1, 1 + AKKU_BASIS_DATA_BYTE_OFFSET * i, eeprom_akku_basis_daten[i].inbetriebnahme_mo );
107  EEPROM_WriteByte ( AKKU_BASIS_PAGE_2, 1 + AKKU_BASIS_DATA_BYTE_OFFSET * i, eeprom_akku_basis_daten[i + 4].inbetriebnahme_mo );
108  EEPROM_WriteByte ( AKKU_BASIS_PAGE_1, 2 + AKKU_BASIS_DATA_BYTE_OFFSET * i, eeprom_akku_basis_daten[i].inbetriebnahme_dd );
109  EEPROM_WriteByte ( AKKU_BASIS_PAGE_2, 2 + AKKU_BASIS_DATA_BYTE_OFFSET * i, eeprom_akku_basis_daten[i + 4].inbetriebnahme_dd );
110  EEPROM_WriteByte ( AKKU_BASIS_PAGE_1, 3 + AKKU_BASIS_DATA_BYTE_OFFSET * i, eeprom_akku_basis_daten[i].inbetriebnahme_hh );
111  EEPROM_WriteByte ( AKKU_BASIS_PAGE_2, 3 + AKKU_BASIS_DATA_BYTE_OFFSET * i, eeprom_akku_basis_daten[i + 4].inbetriebnahme_hh );
112  EEPROM_WriteByte ( AKKU_BASIS_PAGE_1, 4 + AKKU_BASIS_DATA_BYTE_OFFSET * i, eeprom_akku_basis_daten[i].inbetriebnahme_mi );
113  EEPROM_WriteByte ( AKKU_BASIS_PAGE_2, 4 + AKKU_BASIS_DATA_BYTE_OFFSET * i, eeprom_akku_basis_daten[i + 4].inbetriebnahme_mi );
114  EEPROM_WriteByte ( AKKU_BASIS_PAGE_1, 5 + AKKU_BASIS_DATA_BYTE_OFFSET * i, eeprom_akku_basis_daten[i].inbetriebnahme_ss );
115  EEPROM_WriteByte ( AKKU_BASIS_PAGE_2, 5 + AKKU_BASIS_DATA_BYTE_OFFSET * i, eeprom_akku_basis_daten[i + 4].inbetriebnahme_ss );
116  EEPROM_WriteBytes ( AKKU_BASIS_PAGE_1, 6 + AKKU_BASIS_DATA_BYTE_OFFSET * i, 2, eeprom_akku_basis_daten[i].max_kapa );
117  EEPROM_WriteBytes ( AKKU_BASIS_PAGE_2, 6 + AKKU_BASIS_DATA_BYTE_OFFSET * i, 2, eeprom_akku_basis_daten[i + 4].max_kapa );
118  }
119 
120 }
121 
122 void eeprom_read_fs_data ( void )
123 {
124  eeprom_fs_data.byte_offset = EEPROM_ReadByte ( EEPROM_FS_DATA_PAGE, BYTE_OFFSET_BYTE );
125  eeprom_fs_data.page_offset = EEPROM_ReadByte ( EEPROM_FS_DATA_PAGE, PAGE_OFFSET_BYTE );
126  eeprom_fs_data.write_cycles = EEPROM_ReadByte ( EEPROM_FS_DATA_PAGE, WRITE_CYCLES_BYTE + eeprom_fs_data.byte_offset );
127 }
128 
129 void eeprom_write_fs_data ( void )
130 {
131  eeprom_fs_data.write_cycles++;
132 
133  if ( eeprom_fs_data.write_cycles >= MAX_CYCLES )
134  {
135  eeprom_fs_data.byte_offset += 4; // Der Speicherplatz für write_cycles wird um vier Byte verschoben.
136  eeprom_fs_data.page_offset += 8; // Die Daten der Akkus werden um acht Pages verschoben.
137  eeprom_fs_data.write_cycles = 0; // Die write_cycles auf den neuen Bytes/Pages werden zurückgesetzt.
138  EEPROM_WriteByte ( EEPROM_FS_DATA_PAGE, BYTE_OFFSET_BYTE, eeprom_fs_data.byte_offset );
139  EEPROM_WriteByte ( EEPROM_FS_DATA_PAGE, PAGE_OFFSET_BYTE, eeprom_fs_data.byte_offset );
140  }
141 
142 // // Nur bei der ersten Inbetriebnahme ausführen
143 // if ( eeprom_fs_data.byte_offset == 0xFF && eeprom_fs_data.page_offset == 0xFF )
144 // {
145 // EEPROM_WriteByte ( EEPROM_FS_DATA_PAGE, BYTE_OFFSET_BYTE, 0 );
146 // EEPROM_WriteByte ( EEPROM_FS_DATA_PAGE, PAGE_OFFSET_BYTE, 0 );
147 // }
148 
149  EEPROM_WriteByte ( EEPROM_FS_DATA_PAGE, WRITE_CYCLES_BYTE + eeprom_fs_data.byte_offset, eeprom_fs_data.write_cycles );
150 }
151 
152 void eeprom_test ( void )
153 {
154  eeprom_read_fs_data ();
155 
156  // Akku Zustandsdaten
157  for ( int i = 0; i < 8; i++ )
158  {
159  eeprom_akku_daten[i].timestamp_datensatz_yy = i;
160  eeprom_akku_daten[i].timestamp_datensatz_mo = i;
161  eeprom_akku_daten[i].timestamp_datensatz_dd = i;
162  eeprom_akku_daten[i].timestamp_datensatz_hh = i;
163  eeprom_akku_daten[i].timestamp_datensatz_mi = i;
164  eeprom_akku_daten[i].timestamp_datensatz_ss = i;
165  eeprom_akku_daten[i].soc = i;
166  eeprom_akku_daten[i].soh = i;
167  eeprom_akku_daten[i].c_max = i;
168  eeprom_akku_daten[i].charge = i;
169  eeprom_akku_daten[i].betriebszeit_s = 5000 * i;
170  eeprom_akku_daten[i].ladezeit_s = 1000 * i;
171  eeprom_akku_daten[i].ladezyklen = 70.3;
172  }
173 
174  // Akku Basisdaten
175  for ( int i = 0; i < 4; i++ )
176  {
177  eeprom_akku_basis_daten[i].inbetriebnahme_yy = i;
178  eeprom_akku_basis_daten[i + 4].inbetriebnahme_yy = i + 4;
179  eeprom_akku_basis_daten[i].inbetriebnahme_mo = i;
180  eeprom_akku_basis_daten[i + 4].inbetriebnahme_mo = i + 4;
181  eeprom_akku_basis_daten[i].inbetriebnahme_dd = i;
182  eeprom_akku_basis_daten[i + 4].inbetriebnahme_dd = i + 4;
183  eeprom_akku_basis_daten[i].inbetriebnahme_hh = i;
184  eeprom_akku_basis_daten[i + 4].inbetriebnahme_hh = i + 4;
185  eeprom_akku_basis_daten[i].inbetriebnahme_mi = i;
186  eeprom_akku_basis_daten[i + 4].inbetriebnahme_mi = i + 4;
187  eeprom_akku_basis_daten[i].inbetriebnahme_ss = i;
188  eeprom_akku_basis_daten[i + 4].inbetriebnahme_ss = i + 4;
189  eeprom_akku_basis_daten[i].max_kapa = 7500;
190  eeprom_akku_basis_daten[i + 4].max_kapa = 8500;
191  }
192 
193  eeprom_fs_data.byte_offset = 0;
194  eeprom_fs_data.page_offset = 0;
195  eeprom_fs_data.write_cycles = 0;
196 
197  printf ( "Page Offset: %i\r\n", eeprom_fs_data.page_offset );
198 
199  eeprom_write_akku_basis_data ();
200  eeprom_write_akku_data ();
201 
202  // Akku Zustandsdaten reset
203  for ( int i = 0; i < 8; i++ )
204  {
205  eeprom_akku_daten[i].timestamp_datensatz_yy = 0;
206  eeprom_akku_daten[i].timestamp_datensatz_mo = 0;
207  eeprom_akku_daten[i].timestamp_datensatz_dd = 0;
208  eeprom_akku_daten[i].timestamp_datensatz_hh = 0;
209  eeprom_akku_daten[i].timestamp_datensatz_mi = 0;
210  eeprom_akku_daten[i].timestamp_datensatz_ss = 0;
211  eeprom_akku_daten[i].soc = 0;
212  eeprom_akku_daten[i].soh = 0;
213  eeprom_akku_daten[i].c_max = 0;
214  eeprom_akku_daten[i].charge = 0;
215  eeprom_akku_daten[i].betriebszeit_s = 0;
216  eeprom_akku_daten[i].ladezeit_s = 0;
217  eeprom_akku_daten[i].ladezyklen = 0;
218  }
219 
220  // Akku Basisdaten reset
221  for ( int i = 0; i < 4; i++ )
222  {
223  eeprom_akku_basis_daten[i].inbetriebnahme_yy = 0;
224  eeprom_akku_basis_daten[i + 4].inbetriebnahme_yy = 0;
225  eeprom_akku_basis_daten[i].inbetriebnahme_mo = 0;
226  eeprom_akku_basis_daten[i + 4].inbetriebnahme_mo = 0;
227  eeprom_akku_basis_daten[i].inbetriebnahme_dd = 0;
228  eeprom_akku_basis_daten[i + 4].inbetriebnahme_dd = 0;
229  eeprom_akku_basis_daten[i].inbetriebnahme_hh = 0;
230  eeprom_akku_basis_daten[i + 4].inbetriebnahme_hh = 0;
231  eeprom_akku_basis_daten[i].inbetriebnahme_mi = 0;
232  eeprom_akku_basis_daten[i + 4].inbetriebnahme_mi = 0;
233  eeprom_akku_basis_daten[i].inbetriebnahme_ss = 0;
234  eeprom_akku_basis_daten[i + 4].inbetriebnahme_ss = 0;
235  eeprom_akku_basis_daten[i].max_kapa = 0;
236  eeprom_akku_basis_daten[i + 4].max_kapa = 0;
237  }
238 
239  eeprom_fs_data.byte_offset = 0;
240  eeprom_fs_data.page_offset = 0;
241  eeprom_fs_data.write_cycles = 0;
242 
243  printf ( "Page Offset: %i\r\n", eeprom_fs_data.page_offset );
244  eeprom_read_data ();
245 
246  // Akku Zustandsdaten
247 
248  for ( int i = 0; i < 8; i++ )
249  {
250  printf ( "Akku %i Zustandsdaten:\r\n", i );
251  printf ( "%02i.%02i.%02i %02i:%02i:%02i\r\n", eeprom_akku_daten[i].timestamp_datensatz_dd, eeprom_akku_daten[i].timestamp_datensatz_mo, eeprom_akku_daten[i].timestamp_datensatz_yy,
252  eeprom_akku_daten[i].timestamp_datensatz_hh, eeprom_akku_daten[i].timestamp_datensatz_mi, eeprom_akku_daten[i].timestamp_datensatz_ss );
253  printf ( "SOC: %i\r\n", eeprom_akku_daten[i].soc );
254  printf ( "SOH: %i\r\n", eeprom_akku_daten[i].soh );
255  printf ( "c_max: %i\r\n", eeprom_akku_daten[i].c_max );
256  printf ( "charge: %i\r\n", eeprom_akku_daten[i].charge );
257  printf ( "charge: %li\r\n", eeprom_akku_daten[i].betriebszeit_s );
258  printf ( "charge: %li\r\n", eeprom_akku_daten[i].ladezeit_s );
259  printf ( "charge: %5.2f\r\n", eeprom_akku_daten[i].ladezyklen );
260  printf ( "\r\n" );
261  }
262 
263  // Akku Basisdaten
264  for ( int i = 0; i < 4; i++ )
265  {
266  printf ( "Block %i Basisdaten:\r\n", i );
267  printf ( "%02i.%02i.%02i %02i:%02i:%02i\r\n", eeprom_akku_basis_daten[i].inbetriebnahme_dd, eeprom_akku_basis_daten[i].inbetriebnahme_mo, eeprom_akku_basis_daten[i].inbetriebnahme_yy,
268  eeprom_akku_basis_daten[i].inbetriebnahme_hh, eeprom_akku_basis_daten[i].inbetriebnahme_mi, eeprom_akku_basis_daten[i].inbetriebnahme_ss );
269  printf ( "%02i.%02i.%02i %02i:%02i:%02i\r\n", eeprom_akku_basis_daten[i + 4].inbetriebnahme_dd, eeprom_akku_basis_daten[i + 4].inbetriebnahme_mo,
270  eeprom_akku_basis_daten[i + 4].inbetriebnahme_yy, eeprom_akku_basis_daten[i + 4].inbetriebnahme_hh, eeprom_akku_basis_daten[i + 4].inbetriebnahme_mi,
271  eeprom_akku_basis_daten[i + 4].inbetriebnahme_ss );
272  printf ( "MaxKapa: %i\r\n", eeprom_akku_basis_daten[i].max_kapa );
273  printf ( "MaxKapa: %i\r\n", eeprom_akku_basis_daten[i + 4].max_kapa );
274  printf ( "\r\n" );
275  }
276 
277 }
Standardheader.
uint8_t EEPROM_ReadByte(uint8_t pageAddr, uint8_t byteAddr)
Read one byte from EEPROM using IO mapping.
XMEGA EEPROM driver header file.
void EEPROM_WriteByte(uint8_t pageAddr, uint8_t byteAddr, uint8_t value)
Write one byte to EEPROM using IO mapping.
Definition: eeprom_driver.c:72