Forum: Mikrocontroller und Digitale Elektronik Initialisierung vom DS2408 (1-Wire-Port-Expander) - Probleme


von Dietmar E (Gast)


Lesenswert?

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);
| }

von Dietmar E (Gast)


Lesenswert?

Falls es jemanden interessiert: Problem gelöst, es ist ein Chip-Bug. Bei 
bestimmten Power-On-Bedingungen landet der Chip in einem 
undokumentierten Test-Modus und reagiert nicht mehr richtig: die ganze 
1-Wire-Kommunikation läuft noch, der Chip scheint zu leben, aber 
Schreibvorgänge in das Output-Register werden nicht mehr ausgeführt. Die 
Lösung ist ein ebenfalls im Datenblatt nicht dokumentiertes Kommando, 
den Test-Modus zu verlassen. Die Details dazu findet man im 
Maxim-1-Wire-Forum (http://discuss.dalsemi.com) im Thread "Ds2408 Power 
Up With Pins Off?".

von Rolf (Gast)


Lesenswert?

Da ich mit dem DS2408 einen Microcontroller als 1-Wire-Client anbinden 
will, interessiert mich dieses Thema doch brennend ;-)

Leider läßt sich auf das Maxim-1-Wire-Forum nur noch mit bestehenden 
alten Accounts zugreifen, neue Accounts werden nicht akzeptiert.

Kann mir jemand den Inhalt des Threads verraten? Also, wie man diesen 
Testmodus wieder verlassen kann.

Danke und einen guten Rutsch
Rolf

von Sucher (Gast)


Angehängte Dateien:

Lesenswert?

Hallo

@Rolf Deinen anderen Beitrag habe ich nicht gefunden...

MfG
Achim

von Rolf B. (dk7in)


Lesenswert?

Vielen Dank für Deine Mühe!

Ich denke, mit dem Kommando für das Verlassen des Test-Modus komme ich 
weiter, sollte ich tatsächlich Probleme bekommen. Ich will einen DS2408 
einsetzen, um einen Microcontroller als Slave an den 1-Wire-Bus zu 
hängen und das sollte schon zuverlässig funktionieren...

Viele Grüße
Rolf

von GPSler (Gast)


Lesenswert?

Hallo

@Rolf ich habe zwar keinen DS2408 im Einsatz, aber falls Du das zum 
laufen bringts, wäre der Code von Interesse. Ich nehme dazu einen 
Atmega8.

MfG
Achim

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
Noch kein Account? Hier anmelden.