Hi Leute, ich habe ein Problem mit dem DS18B20 Temperatursensor an meinem STM32f4Discovery. Ich habe mir die Funktionen geschrieben, die ihr in der one-wire.c nach dem Beispiel von BvB geschrieben. Beitrag "1-Wire-Bus-Projekt: DS1820 DS18S20 DS2450 DS2408 unter C und 8051" Die Reset-Funktion funktioniert. Allerdings alles andere nicht. Insbesondere versuche ich momentan die Read-Rom Funktion zum laufen zu bringen. Dabei habe ich das Problem, dass er anscheinend bei jedem Bit eine 1 einliest. Ich lese nämlich immer den Rom-Code 0x200001DC aus. Ich hoffe jemand von euch kann den Fehler finden, oder mir zumindest sagen woran das liegen kann. Danke schonmal für eure Hilfe.
Deine Read-Rom-Fkt. sieht auf den ersten Blick funktionsfähig aus. Aber wenn er bei jeden Bit eine 1 eingelesen hätte dann müsste doch irgendwas mit 0xFFFF... rauskommen?? Du speicherst doch die einzelnen Bytes in ein Array?? Wie kommst du von den Array auf den ausgelesen ROM-Code?? ( ROM-Code müsste 8-Byte lang ) und das erste Byte müsste der Family-Code sein ( bei DS18B20+ z.b. 40 dezimal )! Zum ROM-Code einlesen nur einen Sensor an den Bus hängen! lg
Mit dem nur 1 einlesen müsstest du recht haben, da hab ich nicht richtig nachgedacht... Ist das gespeicherte Array nicht der Rom-Code? Ich sende doch die Anfrage für den Rom-Code und bekomme ihn dann zurück. Im Debug-Modus sieht mein Array folgendermaßen aus: rom_c 0x200001dc rom_c[0] 255 rom_c[1] 255 . . rom_c[7] 255 Das erhalte ich sowohl wenn ich nur einen Sensor angeschlossen habe und auch, wenn ich gar nichts angeschlossen habe. Ich hab das Gefühl, dass das was ganz banales ist, was ich nur nicht raffe^^
Achso mit dem 0x200001dc meintest du die Adresse des ersten Elements des Arrays! Jetzt komme ich mit! :) Bekommst du den Presence-Puls beim Reseten?? Ich könnte mir vorstellen das du irgend ein Timing-Problem hast. Mein Code um ein Bit zu schreiben sieht so aus:
1 | void onewire_write_bit(onewire_t *p_ow, int bit) |
2 | {
|
3 | DELAY_US(2); // recovery, min 1us |
4 | onewire_line_low(p_ow); |
5 | |
6 | // First Part of the transmission
|
7 | if(bit) |
8 | DELAY_US(15); // max 15 us |
9 | else
|
10 | DELAY_US(80); // min 60us |
11 | |
12 | onewire_line_release(p_ow); |
13 | |
14 | // Second Part
|
15 | if(bit) |
16 | DELAY_US(80); |
17 | else
|
18 | DELAY_US(15); |
19 | }
|
Schaltest du beim Lesen den GPIO-Modus um??
1 | GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; |
lg
Es funktioniert :) :) Mit deinem Code klappt es ohne Probleme, dann passt wohl bei mir das Timing nicht richtig. Vielen vielen Dank :) dann mach ich mich jetzt mal ans temperatur-auslesen... und ich hoffe, das das klappt ;)
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.