mikrocontroller.net

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


Autor: Dietmar E (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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);
| }

Autor: Dietmar E (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?".

Autor: Rolf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sucher (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

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

MfG
Achim

Autor: Rolf B. (dk7in)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: GPSler (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.