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
hi ich kann zwar leider nicht helfen würde mich aber freuen, wenn mir jemand das 1Wire beschreiben könnte Danke jo Axel
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
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
"... 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
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
@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
@ 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
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
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
sorry wegen der Länge, wusste nicht dass immer eine Zeile frei gelassen wird ... :(
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.
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
Danke für deine Hilfe. Ich bau das mal um und melde mich wenn es funzt. bye Mario.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.