Forum: Mikrocontroller und Digitale Elektronik 1-Wire Stm32f4discovery


von Malte B. (aerandir)


Angehängte Dateien:

Lesenswert?

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.

von Student (Gast)


Lesenswert?

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

von Malte B. (aerandir)


Lesenswert?

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^^

von Student (Gast)


Lesenswert?

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

von Malte B. (aerandir)


Lesenswert?

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 ;)

von Student (Gast)


Lesenswert?

Bitte, noch viel Spaß mit deinen Projekt! :)

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.