Hallo an alle Ich hab ein Programm geschrieben, das alle ~5 Sekunden einen Wert über A2D einließt (Timergesteuert). Wenn dieser Wert unter 614 ist, wird dieser im Eeprom abgelegt und ein Zähler um 1 erhöht. Doeser wird auch im Eeprim abgelegt. Erst wenn der Wieder einmal über 614 war, kann der Wert und der Zähler um eins erhöht werden. Das ganze hab ich für 2 A2D Kanäle gemacht. Weiters hab ich eine Unterfunktion zum Auslesen der Wert aus dem Eeprom. (FUnktionsaufruf wenn PD7 gedrückt ist). Nur leider funktioniert es nicht wie sollte. Bei jeder MEssungen kommen zusätzlich Zeichen aufs Display die eigentlich nicht dort hingehören. Ich weiß aber nicht warum Sobald ein falsches Zeichen aus der main (messfunktion) am Display ist, werden bei der lesefunktion auch falsche Zeichen Dargestellt. Das Abspeichern im Eeprom funktioniert auch nicht. Als Prozessor verwende ich einen Mega8. Ich hoffe mir kann jemand helfen. Im Anhang ist die main. Danke im Voraus Gruß Robert
Ein Fehler fällt mir schon mal sofort auf: Was soll die Deklaration volatile uint16_t zelle[1]; ??? Ein Array mit einem Element? Da im Programmverlauf 2 Elemente des Arrays angesprochen werden, ist eine Fehlfunktion hier schon mal vorprogrammiert. Gruß Johnny
Hallo Ich hab nun vieles geändert. Und es funktioniert so einigermaßen. edoch funktioniert der Zähler für den Eeprom noch nicht Richtig. Der EEprom hat doch nach einem Flash den Wert 255 (0xFF). Jedoch stimmt der Wert beim nächsten Zählerzugriff nicht und es steht ein falscher Wert. Ab hier zählt nun der Zähler im um 1 aufwärts. Was ist da los?? Wann wird der EEprom gelöscht?? Nur wenn ich das explizit im AVRDUDE mach??? Weiters versteh ich noch nicht das Auslesen. Das Auslesen der WORDs funktioniert nur mit den Adressen 4,6. Ich dacht die Adressen sind 2,4. Warum?? Im Anhang wieder der aktuelle Code Gruß Robert
> Wann wird der EEprom gelöscht? It depends. By default, bei einem chip erase. Du musst erst die EESAVE-Fuse programmieren, damit das nicht mehr passiert. Außerdem hat AVR Studio wohl (zumindest bei Benutzung des JTAG ICE) noch eine, naja, Nicht-Intuitivität, wo du neben der EESAVE-Fuse noch irgendwo versteckt irgendeinen Haken abwählen musst, der im Einschaltzustand ebenfalls zur Zerstörung des EEPROM führt... Ich weiß, warum ich AVR Studio nicht leiden kann. ;-)
> Wann wird der EEprom gelöscht?
Das jeweilige Byte automatisch bei/vor jedem beschreiben.
P.S.
Falls es keine Rolle spielt ob exakt auf adresse 0, 2 oder 4 rate ich
das ganze dem Compiler und Linker zu überlassen.
Als Beispiel
1 | ...
|
2 | #include <avr/eeprom.h> |
3 | |
4 | #define IP_ADDRESS {172,16,50,212}
|
5 | #define MAC_ADDRESS {0x00,0x00,0x1b,0x35,0xa4,0xaf}
|
6 | |
7 | uint8_t eeMYIP[4] __attribute__ ((section(".eeprom"))) = IP_ADDRESS; |
8 | uint8_t ee_mymac[6] __attribute__ ((section(".eeprom"))) = |
9 | MAC_ADDRESS; |
10 | |
11 | //IP Adresse des Web Servers
|
12 | uint8_t MYIP[4]; |
13 | |
14 | //MAC Adresse des Web Servers
|
15 | uint8_t mymac[6]; |
16 | |
17 | ...
|
18 | |
19 | // MAC Adresse aus eeprom lesen
|
20 | eeprom_read_block(&mymac[0], &ee_mymac[0], sizeof(mymac)); |
21 | // IP Adresse aus eeprom lesen
|
22 | eeprom_read_block(&MYIP[0], &eeMYIP[0], sizeof(MYIP)); |
23 | ...
|
Das Schreiben erfolgt sinngemäß mit eeprom_write_block()
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.