Hat jemand Erfahrung mit dem DS2408? Der Chip scheint in meiner
Schaltung, in der er als 8x-Eingang benutzt wird, nach dem ersten
Einschalten zufällig einige seiner IO-Leitungen auf Ausgang zu stellen,
d.h. reagiert nicht auf angelegte Signale oder Pull-ups.
Den Reset-Pin habe ich auf VCC gelegt und die Initalisierung schreibt
0xff mit dem "channel access write command" (um die
Ausgangs-Transistoren abzuschalten). Danach sollten die IO-Bits
eigentlich wegen der Pull-Ups auf 1 gehen. Der Chip antwortet auf die
geschrieben 0xff zwar mit 0xaa (= "OK"), aber danach kommt - zumindest
beim ersten Einschalten - nicht der erwartete Wert 0xff. Nach dem zweite
Einschalten klappt es dann.
Der Chip wird mit VCC versorgt und hat einen 100N-Kondensator zwischen
den Supply-Pins.
-- initalization code, fails randomly (verify != 0xff)) ---
|
| /*! Initialize DS2408 IO chip
| *
| * This function will turn all output transistors off
| *
| * <bus> Bitmask of the bus where the DS2408 is located.
| *
| * <id> 64 bit identifier of the DS2408
| *
| * Return: void
| */
|
| unsigned char
| OWI_InitDS2408(unsigned char bus, unsigned char *id)
| {
| // any 1-wire device on bus (reset, detect presence)?
|
| uint8_t tries;
|
| for (tries = 0; tries < 8; ++tries)
| {
| if (OWI_DetectPresence(bus))
| {
| // match ID
|
| OWI_MatchRom(id, bus);
|
| // send write command
|
| OWI_SendByte(DS2408_CHANNEL_ACCESS_WRITE, bus);
|
| // write 0xff to turn off all output transistors
|
| OWI_SendByte(0xff, bus);
|
| // write inverted value (= checksum)
|
| OWI_SendByte(0x0 , bus);
|
| // check ok flag
|
| if (OWI_ReceiveByte(bus) == 0xaa)
| {
| uint8_t verify = OWI_ReceiveByte(bus);
|
| if (verify == 0xff)
| {
| return(1);
| }
| else
| {
| char out[16];
| uint8_t n;
|
| sprintf(out, "%d", verify);
|
| lcd_puts(out);
|
| for (n = 0; n < 100; ++n)
|
| _delay_ms(10);
| }
| }
|
| beep();
| }
| }
|
|
| // error
|
| return(0);
| }