Gast
#738895
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); | }