Forum: Mikrocontroller und Digitale Elektronik STM32 DS1820


von ARMIN (Gast)


Angehängte Dateien:

Lesenswert?

Guten Tag,

Ich versuche nun schon eine Weile den DS18B20 am STM32F103 zum Laufen zu
bringen jdoch ohne erfolg.

Angeschlossen ist der DS18B20 an PortC.0 mit externen Pullup 4,7K wie im
Datenblatt vom DS18B20 beschrieben.

Leider bekomme ich als Ausgabe nur null.

Vielleicht kann mir einer weiterhelfen
mfg

1
int main(void)
2
{
3
#ifdef DEBUG
4
  debug();
5
#endif
6
//Einausgabe Buffer für Strings
7
 char read_write_buffer[50];
8
9
 unsigned long Show_Data;
10
 
11
 Initialize_DS18B20();
12
 
13
  while(1)
14
  {
15
    Show_Data = Get_Temperature();
16
    
17
    sprintf( read_write_buffer, "%+d ", Show_Data );
18
    DrawString(23,127,read_write_buffer);  
19
    
20
    Temperature_Convert();
21
  }
22
23
}

: Gesperrt durch Moderator
von Peter D. (peda)


Lesenswert?

ARMIN schrieb:
> void us_Delay (u16 us)
> {
>         while(us--);
> }

Sicher, daß diese Zeile 50 Zyklen benötigt?

Wenn Dein Compiler keine <delay.h> mitbringt, nimm einen Timer und laß 
den Compiler dessen Vergleichswerte berechnen.
Die Delays ausprobieren, machen nur blutige Anfänger.

von Gebhard R. (Firma: Raich Gerätebau & Entwicklung) (geb)


Lesenswert?

Weiters dürfen keine Interrupt's laufen, die wieder eine unbestimmte 
Verzögerungszeit einbringen. So ein Eindrahtsensor ist die letzte 
Sch....

Grüsse

von ARMIN (Gast)


Lesenswert?

Gebhard Raich schrieb:
> Weiters dürfen keine Interrupt's laufen, die wieder eine unbestimmte
> Verzögerungszeit einbringen. So ein Eindrahtsensor ist die letzte
> Sch....
>
> Grüsse

Ja wenn ich die Interrupts sperre dann kann ich ja die Delay Zeit ja 
nich mit nen Timer
machen oder Irre ich mich da

von holger (Gast)


Lesenswert?

>Ja wenn ich die Interrupts sperre dann kann ich ja die Delay Zeit ja
>nich mit nen Timer
>machen oder Irre ich mich da

Timer kann man auch ohne Interrupt betreiben.

von Peter D. (peda)


Lesenswert?

Gebhard Raich schrieb:
> So ein Eindrahtsensor ist die letzte
> Sch....

So kann man die eigenen schlechten Programmierfähigkeiten auf den Punkt 
bringen.

Die Sensoren sind sehr leicht zu programmieren. Dreh den Spieß einfach 
um, gib dem Timerinterrupt für das Bittiming die höchste Priorität, dann 
stören andere Interrupts nicht.
Etwas schwieriger ist es wirklich nur bei den AVRs, da die keine 
Priorität zuweisen können. 60µs Interruptsperre sind aber oft auch kein 
Problem.

von Gebhard R. (Firma: Raich Gerätebau & Entwicklung) (geb)


Lesenswert?

>So kann man die eigenen schlechten Programmierfähigkeiten auf den Punkt
>bringen.
Kann ich so nicht unwidersprochen stehen lassen. Ein peripheres Gerät, 
bei dem ich alle Interrupts (bis auf ev. Timer)abdrehen muß, um ihn 
anzusprechen ist definitiv eine Krücke. Einziger Vorteil ist ein Draht 
weniger.

Grüsse

von Peter D. (peda)


Lesenswert?

Sorry, meine Formulierung ist etwas zu krass ausgefallen, nehme ich 
hiermit zurück.

Für einfache MC-Anwendungen ist der DS1820 gut zu gebrauchen.

Aber heutzutage geht ja nichts mehr ohne OS, GUI, Webinterface, da kann 
die Integration in der Tat haarig werden.

von marcel (Gast)


Lesenswert?

Speziell für den stm32f103 hab ich mal spaßen halber im I-Net nach einem 
Beispiel gesucht
Aber nix gefunden.
Das mit der Delay Geschichte würd ich lieber übern Timer machen.
Der stm hat ja genug

von ARMIN (Gast)


Angehängte Dateien:

Lesenswert?

So per Timer die Delay Zeiten.
Leider kommt bei mir  nur 00.0 Auf die Anzeige.

Vielleicht hat einer von ihnen noch eine Idee was ich hier verkehrt 
mache
mfg
1
int main(void)
2
{
3
#ifdef DEBUG
4
  debug();
5
#endif
6
//Einausgabe Buffer für Strings
7
 char read_write_buffer[50];
8
9
10
 
11
  while(1)
12
  {
13
//__disable_irq();
14
15
    DS18B20_Convert();
16
   
17
    DS18B20_Read();
18
  
19
    DrawString(23,127,read_write_buffer,&Arial_10x15,Orange,BLACK);        
20
21
//__enable_irq();     
22
23
    
24
  }
25
26
}

von Peter D. (peda)


Lesenswert?

Den 1-Wire darf man niemals auf 1 setzen!
Außer für parasite Power.
Er wird initial 0 gesetzt und fürderhin nur Direktion umgeschaltet.

Der Lesestart-Puls (0) sollte >=1µs sein, lesen dann nach 5..10µs.

von ARMIN (Gast)


Lesenswert?

Peter Dannegger schrieb:
> Den 1-Wire darf man niemals auf 1 setzen!
Meinten sie in der init_1820
SET_OP_1WIRE ();

> Außer für parasite Power.
> Er wird initial 0 gesetzt und fürderhin nur Direktion umgeschaltet.
>
> Der Lesestart-Puls (0) sollte >=1µs sein, lesen dann nach 5..10µs.

von Peter D. (peda)


Lesenswert?

ARMIN schrieb:
> Meinten sie in der init_1820
> SET_OP_1WIRE ();

Nö, überall.

SET_OP_1WIRE (); darf genau 0 mal vorkommen.
CLR_OP_1WIRE();  genau 1 mal
Der Rest macht nur:
DIR_1WIRE_OUT();
DIR_1WIRE_IN();

von ARMIN (Gast)


Angehängte Dateien:

Lesenswert?

Peter Dannegger schrieb:

> SET_OP_1WIRE (); darf genau 0 mal vorkommen.
> CLR_OP_1WIRE();  genau 1 mal
> Der Rest macht nur:
> DIR_1WIRE_OUT();
> DIR_1WIRE_IN();

ich habe das so gemacht und
bekomme aber als Anzeige immer noch Null.
Vielleicht könnte von ihnen nochmal drüber schauen.
mfg

von ARMIN (Gast)


Lesenswert?

Da kann mir  wohl keiner weiterhelfen.

von ARMIN (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

Ich habe es nach dem Beispiel vom AVR mal umgesetzt, leider bekomm ich 
als Anzeige immer noch o,o Grad.

vielleicht könnte mir von ihnen einer Weiterhelfen

von Peter D. (peda)


Lesenswert?

Hast Du mal Deine Delayfunktion überprüft, ob sie stimmt?

Ohne Sensor müssen alle Bytes 0xFF gelesen werden, auch bei falschem 
Timing.
Bzw. bei Kurzschluß 0x00.

Hier mal mein Code:
Beitrag "DS1820, DS18B20 in C"

von ARMIN (Gast)


Angehängte Dateien:

Lesenswert?

Peter Dannegger schrieb:
> Hast Du mal Deine Delayfunktion überprüft, ob sie stimmt?
>
Das Timing müsste so passen mit dem Timer

> Ohne Sensor müssen alle Bytes 0xFF gelesen werden, auch bei falschem
> Timing.
> Bzw. bei Kurzschluß 0x00.
>

Aloso ohne Sensor wandert die Anzeige mal 64 ,dann 128 ,dann 32.

Mit Sensor wanderts auch ab un an mal 0 mal 2048

von Peter D. (peda)


Lesenswert?

ARMIN schrieb:
> Aloso ohne Sensor wandert die Anzeige mal 64 ,dann 128 ,dann 32.

Dann liest Du was anderes ein, aber nicht den Pin, wo der Pullup dran 
hängt.

von ARMIN (Gast)


Lesenswert?

So als Ausgabe bekomme ich 4095.0 wenn der Sensor angeschlossen ist.

Bei nicht angeschlossenen Sonsor der gleiche Wert.

Entferne ich den Pullup erhalte ich 0.0

Vielleicht könnt mir noch einer Weiterhelfen.

von Peter D. (peda)


Lesenswert?

ARMIN schrieb:
> Mit Sensor wanderts auch ab un an mal 0 mal 2048

ARMIN schrieb:
> So als Ausgabe bekomme ich 4095.0 wenn der Sensor angeschlossen ist.

Du mußt also offensichtlich was geändert haben.
Aber niemand kann hellsehen, was.

Nun schreibe einen Test auf den Presence-Puls.

ARMIN schrieb:
> Das Timing müsste so passen mit dem Timer

"Müßte" zählt nicht, überprüfe es für alle gewünschten Delays.

von ARMIN (Gast)


Lesenswert?

Peter Dannegger schrieb:

> ARMIN schrieb:
>> Das Timing müsste so passen mit dem Timer
>
> "Müßte" zählt nicht, überprüfe es für alle gewünschten Delays.

DAS Wars jetz läufts.

von Thorsten (Gast)


Lesenswert?

Und woran lags?

Bloß nichts verraten, andere könnten ja was lernen...

von ARMIN (Gast)


Lesenswert?

Es lag am Timing .

von Uwe B. (Firma: TU Darmstadt) (uwebonnes)


Lesenswert?

ARMIN schrieb:
> Es lag am Timing .

Armin: NutOS hat auch einen One Wire Treiber...

von Louis (Gast)


Lesenswert?

Hallo
Ich brauche ein c code für Stm32 Ds18s20(temperatursensor)
Für meine Projektarbeit.
Danke schön voraus für Ihre Hilfe

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Louis schrieb:
> Für meine Projektarbeit.

Ist der Sinn einer Projektarbeit nicht, den Code selbst zu entwickeln 
statt abzukupfern? Also schreibe ihn doch!

Ich mache den 4 Jahre alten Thread jetzt zu, bevor noch einer 
versehentlich auf die uralten Beiträge antwortet.

Wenn Du Fragen zu Deinem eigenen STM32-Code hast, solltest Du diese 
besser in einem neu erstellten Thread stellen.

: Bearbeitet durch Moderator
Dieser Beitrag ist gesperrt und kann nicht beantwortet werden.