mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 1-wire Protokoll von Dallas


Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

ich habe mir so einen iButton von Dallas besorgt um etwas damit 
herumzuexperimentieren und möchte gerne den ROM-Code auslesen. Wenn ich 
das mit den Bibliotheksfunktionen eines kommerziellen Compilers mache, 
klappt es. Also der iButton ist mit Sicherheit nicht kaputt. Aber alle 
Versuche mit avrgcc selbst ein Programm zu schreiben sind bislang 
gescheitert, ich weiß nicht wieso!
Erst hab ich Code von dem Dallas-Toolkit genommen und für den AVR 
angepaßt, das lief jedoch nicht. Dann habe ich den Code von der 
Application Note 126 wirklich Zeile für Zeile abgeschrieben und mit dem 
AVR-Studio das Timing genau kontrolliert, no way!
Ich werde noch wahnsinnig und bin kurz davor alles hinzuschmeißen!
Was mache ich nur falsch? Das ist doch eine simple Geschichte, wieso 
läuft das nicht? Ich habe schon aufwendigere Dinge für den AVR 
programmiert und die liefen auf Anhieb bestens. Kann es denn sein, daß 
man beim Umschalten des Ports vom Ausgang zum Eingang etwas beachten muß 
wegen der internen pull-ups (Glitch???)? Oder gibt es hier irgendwelche 
versteckten Tricks die nur Insider kennen? Ich bin doch bestimmt nicht 
der erste der sowas zu programmieren versucht.

Bin für jede Hilfe dankbar!

Gruss, Peter

Autor: Axel(ojojo) (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi

ich kann zwar leider nicht helfen
würde mich aber freuen, wenn mir jemand das 1Wire beschreiben könnte
Danke

jo
Axel

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Axel,

kein Problem, hier ist die komplette Beschreibung:

http://pdfserv.maxim-ic.com/arpdf/AppNotes/appibstd.pdf

und hier ein kompletter C-Sourcecode um den 64-bit ROM-Code auszulesen:

http://dbserv.maxim-ic.com/appnotes.cfm?appnote_number=522

Den habe ich versucht, mit dem avrgcc zu realisieren, seltsamerweise bis 
heute ohne Erfolg. Eigentlich eine relativ simple Geschichte. Vielleicht 
versuchst du es ja mal und hast mehr Glück als ich.
Hier noch ein paar Infos zum Timing usw.:

usw.:http://pdfserv.maxim-ic.com/arpdf/AppNotes/app132.pdf

Also damit hast du nun mehr als genug Information.

Viel Glück!

Viele Grüße,

Peter

Autor: Mario G. (estummel)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
hi,
ich habe in etwa das gleiche Problem mit dem 2313. Als Anhang habe ich
mal den Source und die Beschaltung beigefügt. Ich versuche auch
krampfhaft erst einmal auf das Scrachpad ein Byte zu schreiben. Ganz zu
schweigen von dem Beschreiben des Security Subkeys.

Na dann....
Mario

Autor: peter dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"... genommen ... abgeschrieben ..."

Hast Du ihn aber auch verstanden ?

Ich bin da sehr skeptisch, daß man einen fremden Code bei sich einfügen
kann, ohne ihn verstanden zu haben.

In der Codesammlung sind ja auch C und Assemblerbeispiele für 1-Wire
von mir. Wenn Du Fragen dazu hast, frag mich ruhig.


"Kann es denn sein, daß man beim Umschalten des Ports vom Ausgang zum
Eingang etwas beachten muß wegen der internen pull-ups (Glitch???)?"

Da ist nichts geheimnisvolles. Der Pin wird einmalig auf 0 gesetzt und
immer, wenn eine 0 gesendet wird, wird er als Ausgang gesetzt, sonst
immer als Eingang. Damit ergibt sich eine echte Open-Drain Funktion.

Als Pullup empfehle ich 2,2kOhm.

Nur für parasite Power während der Temperaturwandlung oder Schreiben
des EEPROM darf der Pin als Ausgang auf 1 gesetzt werden !


Peter

Autor: Mario G. (estummel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Peter,

ich könnte mich nicht erinnern, dass ich code von dir eingefügt hätte.
Das Beispiel ist aus dem Buch "AVR Mikrocontroller-Praxis". Auf den
DS1991 abgeändert. Ich dachte, dass ich den Code verstanden hätte. Na
was ist denn Grundsätzlich falsch an dem Code??
Oder erkennst du den etwaigen Fehler warum ich kein Byte aud das
Scrachpad schreiben kann??

Danke im Voraus
Mario

Autor: peter dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Mario,

"ich könnte mich nicht erinnern, dass ich code von dir eingefügt
hätte."

ich könnte mich nicht erinnern, daß ich derartiges behauptet hätte.

Ich habe nur gesagt, daß ich Fragen bezüglich meines Codes beantworten
kann.


Meine Zitate stammmen aus dem Ursprungspost (Peter) und daher sind auch
die Antworten darauf bezogen.


Peter

Autor: Konrad Heisig (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Peter:

Ich hab mal die dementsprechenden Funktionen für die Anbindung von
DS1822-Sensoren an einen PIC geschrieben (auch in C) - das Ganze tat
dann auch was es sollte, nachdem ich das erwähnte Timing halbwegs
erfüllt habe und ein paar "Denkfehler" in den
Byte-Übertragungsfunktionen korrigiert habe. Als Quelle genügte mir das
zu Datenblatt des DS1822, das alle Detail der OneWire-Kommunikation
beschreibt.
Stell doch einfach dein Programm hier rein - vielleicht findet sich
dann das Problem...

Gruß
Konrad

Autor: Mario G. (estummel)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

@Konrad
Stell doch einfach dein Programm hier rein - vielleicht findet sich
dann das Problem...

Ich habe den Assembler Code angehangen. Vielleicht findet ja jemand den
Fehler.

Wäre für jeden Ansatz dankbar.
Mario

Autor: Konrad Heisig (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also meine Funktionen sehen folgendermaßen aus:
/*******************************
  OneWire Funktionen
*******************************/

void OW_Transmit(char byte)
{
  char i, Maske;
  Maske = 1;
  for(i=0;i<8;i++)
  {
    DQ_t = 0;                     // DQ_t ist der Daten-PIN
    if((byte&Maske)>0) DQ_t = 1;
    else DQ_t = 0;
    Maske <<= 1;
    delay_zus(7);                 // wartet 70µs
    DQ_t = 1;
  }
}

char OW_Receive(void)
{
  char i,R,z;
  R=0;
  for(i=0;i<8;i++)
  {
    R >>= 1;
    DQ_t = 0;
    DQ_t = 1;
    for(z=0;z<7;z++);// ja ich weiß, sowas macht man eigentlich nicht
    if(DQ_r==1) R += 0x80;
    delay_zus(7);
  }
  return R;
}

void OW_ROMcommand(char command)
{
  char i, Presence;
  DQ_t = 0;
  delay_zus(50);
  DQ_t = 1;
    //auf Antwort warten
  for(i=0;i<200;i++)
  {
    if(DQ_r==0) Presence = 1;
    if((i>100) && (DQ_r==0)) Presence = 0;
  }
  if(Presence == 1)
  {
    //printRS("Sensor antwortet \n");
    OW_Transmit(command);
  }
  else printRS("Kein Sensor da :( \n");
}

Ist eigntlich selbsterklärend ... - Wie gesagt, am Timing musste ich
bisschen rumoptimieren bis es klappte.

Gruß
Konrad

Autor: Konrad Heisig (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sorry wegen der Länge, wusste nicht dass immer eine Zeile frei gelassen
wird ... :(

Autor: Mario G. (estummel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Konrad,

ok das ist in c, da müßte ich mal den avrgcc compiler instalieren.
Hast du dir mal den Schaltplan angesehen, ob das io ist??
Der ist mit im DS1991 File des letzten posting.


Danke für deine schnelle Hilfe.
Mario.

Autor: Konrad Heisig (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich tippe mal, dass PB0 den "Open-Collector" Ausgang ansteuern soll -
das geht aber so nicht. Funktionieren kann es nur wenn statt dem BC327
irgendein NPN-Transistor mit Emitter an Masse usw. eingebaut.
Warum aber machst du dir überhaupt die Arbeit mir externem Treiber,
wenn man doch über die Tristate-Bits den IO-Pin des AVR als
Open-Collector nutzen kann (vgl. Peter Danneger
http://www.mikrocontroller.net/forum/read-1-3914.html#287303). Das
spart sogar noch einen IO-Pin.

Im übrigen könntest du, statt den Compiler zu installieren, einfach die
Funktionen in ASM nachprogrammieren - das liefert sicher ein
speichereffizienteres Ergebnis, zumal manches sicher nicht optimal
implementiert ist.

Gruß
Konrad

Autor: Mario G. (estummel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für deine Hilfe. Ich bau das mal um und melde mich wenn es funzt.

bye Mario.

Autor: kartal (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo Mario

und hast du das geschaft mit dem ds 1991?

Autor: ismail (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi,

ruf mich mal an wegen ds1991.

0178-6841420

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.