Hallo,
tut mir leid, dass ich das Thema wieder aufgreife, aber bei mir tuts
nicht und ich verzweifle seit Tagen an dem Problem! :(
Ich möchte mal ein kleines Projekt starten! Dieses wird ein
Elektrinisches Sparschwein! Die Geldwurfanlage und so weiter ist noc in
Arbeit, es happert am Programm!
Ich benutze einen ATMEGA16L8 so wie das AVRStudio 4.18 SP2 und das
AVR-Starterkit STK500 zu testzwecken. Angeschlossen sind im Moment die 8
Taster um die Münzen zu simulieren! Der Speicher ist eine (double)
Variable, die ich einem I²C EEPROM (ST24C02) speichern möchte, damit der
Speicher erhalten bleibt, wenn der Strom ausgeschaltet wird.
Um die Funktion des EEPROMs zu testen schreibe ich den Startwert rein
und lese ihn anschliessend wieder aus, um damit weiter zu arbeiten!
Jedoch schreibe ich eine 10.00 rein und bekomme immer wieder 12.08
raus!?!
Bei anderen Versuchen meines Programms bekam ich andauernd 0.00 raus!?!
Hier der wichtige Teil des Codes:
1 | int main()
|
2 | {
|
3 | lcd_init(); // LCD Initialisieren
|
4 |
|
5 |
|
6 |
|
7 | lcd_print("Hallo Da");
|
8 | lcd_line(3);
|
9 | lcd_print("gobert ");
|
10 | _delay_ms(PAUSE4);
|
11 |
|
12 | EEOpen();
|
13 |
|
14 | float dSpeicher = 10.00;// 1. Durchlauf!
|
15 | schreiben(dSpeicher);// Zählstand des Geldspeichers in den EEPROM schreiben
|
16 |
|
17 |
|
18 | dSpeicher = lesen(); // 2. Durchlauf!
|
19 | // Zählstand des Geldspeicher aus dem EEPROM lesen
|
Meine Funktionen sind:
1 | // Schreibvorgang. Speichert (double) in die ersten 8 Speicherzellen des I²C-EEPROM
|
2 | void schreiben(float dWert)
|
3 | {
|
4 | unsigned int address=0;
|
5 | //char c[16];
|
6 | //sprintf(c,"%.2f",dWert);
|
7 |
|
8 | //_delay_ms(PAUSE1);
|
9 | //lcd_clear();
|
10 | //lcd_print(c);
|
11 | //_delay_ms(PAUSE1);
|
12 | char *c = (char*) &dWert;
|
13 | //lcd_clear();
|
14 |
|
15 | for(address=0; address<sizeof(float);address++)
|
16 | {
|
17 | lcd_clear();
|
18 | lcd_print("schreibe");
|
19 | lcd_line(3);
|
20 | lcd_print(*c);
|
21 | _delay_ms(PAUSE1);
|
22 | if(EEWriteByte(address,*c)==0) // Bediengung erfüllt wenn schreiben Fehlerhaft
|
23 | {
|
24 | lcd_clear();
|
25 | lcd_print("Fehler a");
|
26 | lcd_line(3);
|
27 | lcd_print("t: Write");
|
28 | while(1); // Endlosschleife um weiteres schreiben zu verhindern
|
29 |
|
30 | }
|
31 | if(EEReadByte(address)!=*c)
|
32 | {
|
33 | lcd_clear();
|
34 | lcd_print("Fehler a");
|
35 | lcd_line(3);
|
36 | lcd_print("t: Read");
|
37 | while(1); // Endlosschleife um weiteres schreiben zu verhindern
|
38 |
|
39 | }
|
40 | //address++;
|
41 | c++;
|
42 | }
|
43 | lcd_ausgabe(dWert);
|
44 | _delay_ms(PAUSE1);
|
45 | }
|
46 |
|
47 | // Lesevorgang. Speichert 8 Bytes in dWert und gibt (double) zurück
|
48 | float lesen(void)
|
49 | {
|
50 | unsigned int address=0;
|
51 | float dWert;
|
52 |
|
53 | char *c = (char *) &dWert;
|
54 | //char * pEnd;
|
55 | for(address=0; address<sizeof(float);address++)
|
56 | {
|
57 | *c = EEReadByte(address);
|
58 |
|
59 | c++;
|
60 | }
|
61 |
|
62 | //dWert = strtod(data, *c);
|
63 |
|
64 | lcd_ausgabe(dWert);
|
65 | _delay_ms(PAUSE1);
|
66 | return dWert;
|
67 |
|
68 | }
|