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


von Peter (Gast)


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

von Axel(ojojo) (Gast)


Lesenswert?

hi

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

jo
Axel

von Peter (Gast)


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

von Mario G. (estummel)


Angehängte Dateien:

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

von peter dannegger (Gast)


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

von Mario G. (estummel)


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

von peter dannegger (Gast)


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

von Konrad Heisig (Gast)


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

von Mario G. (estummel)


Angehängte Dateien:

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

von Konrad Heisig (Gast)


Lesenswert?

Also meine Funktionen sehen folgendermaßen aus:
1
/*******************************
2
  OneWire Funktionen
3
*******************************/
4
5
void OW_Transmit(char byte)
6
{
7
  char i, Maske;
8
  Maske = 1;
9
  for(i=0;i<8;i++)
10
  {
11
    DQ_t = 0;                     // DQ_t ist der Daten-PIN
12
    if((byte&Maske)>0) DQ_t = 1;
13
    else DQ_t = 0;
14
    Maske <<= 1;
15
    delay_zus(7);                 // wartet 70µs
16
    DQ_t = 1;
17
  }
18
}
19
20
char OW_Receive(void)
21
{
22
  char i,R,z;
23
  R=0;
24
  for(i=0;i<8;i++)
25
  {
26
    R >>= 1;
27
    DQ_t = 0;
28
    DQ_t = 1;
29
    for(z=0;z<7;z++);// ja ich weiß, sowas macht man eigentlich nicht
30
    if(DQ_r==1) R += 0x80;
31
    delay_zus(7);
32
  }
33
  return R;
34
}
35
36
void OW_ROMcommand(char command)
37
{
38
  char i, Presence;
39
  DQ_t = 0;
40
  delay_zus(50);
41
  DQ_t = 1;
42
    //auf Antwort warten
43
  for(i=0;i<200;i++)
44
  {
45
    if(DQ_r==0) Presence = 1;
46
    if((i>100) && (DQ_r==0)) Presence = 0;
47
  }
48
  if(Presence == 1)
49
  {
50
    //printRS("Sensor antwortet \n");
51
    OW_Transmit(command);
52
  }
53
  else printRS("Kein Sensor da :( \n");
54
}

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

Gruß
Konrad

von Konrad Heisig (Gast)


Lesenswert?

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

von Mario G. (estummel)


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.

von Konrad Heisig (Gast)


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

von Mario G. (estummel)


Lesenswert?

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

bye Mario.

von kartal (Gast)


Lesenswert?

hallo Mario

und hast du das geschaft mit dem ds 1991?

von ismail (Gast)


Lesenswert?

hi,

ruf mich mal an wegen ds1991.

0178-6841420

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.