1-Wire Stm32f4discovery

OP #3054009
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.
Angehängte Dateien:
Gast #3054022
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
OP #3054048
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^^
Gast #3054121
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren