Freunde der sparsamen Portbreite,
ich hab hiern OneWire EEPROM DS2430A (32Byte x 8), der sich prima
beschreiben lässt - aber stets nur an der falschen Stelle. Ich habe
immer ein Adressoffset von 2.
1
if(!OneWire__reset())returnerrorcode=0;// reset pulse (480µs to 960µs)
if(i>0&&!(i%8))printf("\r\n");//only 8 Bytes in a line
13
printf("%02X: %02X\t\t",i,eepromData[i]);
14
}
OneWire EEPROM DS2430A test
00: FF 01: FF 02: 33 03: FF 04: FF 05: FF 06: FF
07: 11
08: FF 09: FF 0A: FF 0B: FF 0C: FF 0D: FF 0E: FF
0F: FF
10: FF 11: FF 12: FF 13: FF 14: FF 15: FF 16: FF
17: FF
18: FF 19: FF 1A: FF 1B: FF 1C: FF 1D: 7F 1E: FF
1F: FF
02: 33 <- erstes Byte
jetzt sollte eigentlich das erste Byte an Adresse 0 geschrieben werden,
er steht aber an Adresse 2, d.h. alle getesteten Bytes die ich bisher
schrieb waren um zwei nach oben versetzt. Was ist da los? Auch im
Datenblatt hab ich nix darüber finden können.
Die beiden Dateien waren für den Arduino DUE in C++ geschrieben, ich
habe sie auf C umgeschrieben.
Ich hab 32 Bytes mit dem Inhalt 0x40 + 0..1F ins EEPROM geschrieben, der
Effekt ist immer der gleiche: Das Byte an Position 00 bleibt auf 0xFF
stehen (nicht beschreibbar???), alle anderen lassen sich mit einem
ungewollten Adressoffset von 2 beschreiben. Auch der Rollover bei
Adresse 1F -> 00 passt. Ich dachte zuerst, es läge vielleicht an einem
Fehler beim zurücklesen und auswerten, das habe ich jetzt geändert - der
Effekt ist der gleiche.
Die Länge beim Schreiben muss uint32_t sein:
uint32_t writeInOneWireEEPROM ( uint32_t startaddr, uint32_t len)
Du hast es als int deklariert: int eepromNumOfBytes = 32;
>uint32_t writeInOneWireEEPROM ( uint32_t startaddr, uint32_t len)
Yo... hab ich geändert und ausprobiert. Ändert nix am eigentlichen
Problem.
Ich hatte anfangs mit der delay-Routine Schwierigkeiten, die
mitgelieferte lib verursachte falsche Zeiten. Das hab ich jetzt soweit
repariert daß ich das Device benutzen kann, wenn auch die Zeiten immer
noch nicht sauber sind.
Interessant ist halt, daß alles bis auf die Teilfunktion "MASTER Tx DATA
BYTE TO SCRATCHPAD ADDRESS" alles funktioniert. Und die ist Chip hart
verdrahtet.
Ich hab noch nen Thermometer DS18B20, der funktioniert in allen
Teilfunktionen ohne Fehler.
Hallo Joachim,
habe mir interessehalber mal das Datasheet des EEPROM angesehen. Die
Befehle stimmen wohl. Es werden auch nur 8 Bit übertragen, das passt
auch.
Angenommen die Übermittlung der Startaddress funktioniert, dann müsste
2x ein Inkrement des Address Pointers stattfinden, nur warum?
Alternativ funktioniert die Übertragung der Startaddress nicht richtig
und es wird als 2 interpretiert.
Könnte das mit dem Timing etwas zu tun haben?
Du hast ja an ein paar Stellen das Timing angepasst, wie man an den
Kommentaren sehen kann, das behebt aber das Problem nicht.
Vielleicht wäre es besser das Timing global zu fixen, entweder einen
Oszillator verwenden oder nachsehen, ob das delay mit FCPU funktioniert
und dann das FCPU um die paar Prozent anders setzen, dann verschiebt
sich die Rechnung für das Delay minimal und es könnte passen.
Ansonsten kann man den internen Oszillator eines AVR auch trimmen, da
gibt's ein Register für, das habe ich aber noch nicht gemacht.
Vg,
Conny
Könnte das mit dem Timing etwas zu tun haben?
Yep, mittlerweile glaub ichs auch - aber ich verwende keinen AVR
sondern einen SAM3X8 Cortex M3 von Atmel. Die delay Routinen sind völlig
anders als für die AVRs und scheint von Atmel von einem anderen M3
angepasst worden zu sein. Vielleicht schreib' ich was neues und benutze
den M3 Core Timer.
Merkwürdig ist halt auch, daß der Chip auf der EEPROM-Adresse 00 nicht
beschreibbar ist. Selbst wenn der Adresszeiger "verrutscht" sollte das
aber der Fall sein. Andererseits glaube ich nicht, daß ich mich irgendwo
außerhalb der EEPROM-Funktionalität aufhalte (zB Seriennummer lesen,
64bit Application Register), da kämen sicherlich viele Fehler.
Alles sehr seltsam.
Ach, stimmt, das 5E wurde "verworfen", das hatte ich vorher gar nicht
wahrgenommen.
Ja, das ist seltsam.
Aber auf jeden Fall erstmal das Timing perfektionieren, wer weiss, was
es für Nebeneffekte hat.