Forum: Mikrocontroller und Digitale Elektronik DS18B20 parasite: DQ aus STM32 Pin speisen


von Tim (Gast)


Lesenswert?

Moin, ich hielt mich für ganz doll viel clever: Um den Transistor im 
parasite power mode des DS18B20 zu sparen dachte ich mir, ich schalte 
den DQ-Pin einfach nach Absetzen des Befehls CONVERT_T als Ausgang mit 
high Pegel. Soll laut Datenblatt spätestens nach 10 µs nach dem Befehl 
passieren. Der STM32F103 soll ja laut Datenblatt bis 25 mA pro Pin 
liefern können, der DS18B20 braucht wesentlich weniger laut Datenblatt 
(max. 1,5 mA).
Laut Logikanalyzer geht die Spannung auch nach weniger als den 
geforderten 10 µs auf high. Nach etwa 60 µs geht er aber auf low. Oszi 
habe ich leider nicht.
Lesen ergibt im Anschluß dann die 85 °C Resetwert. Klappt also nicht.
Ist das also wirklich zuviel für den STM32 (Blue Pill)? Mit etwa 7 % vom 
angebenen Maximalstrom hätte ich noch keine Probleme erwartet. Bei 
mehreren DS18B20 und gleichzeitiger Wandlung natürlich schon, aber nicht 
schon bei einem.

von Zeno (Gast)


Lesenswert?

Tim schrieb:
> Laut Logikanalyzer geht die Spannung auch nach weniger als den
> geforderten 10 µs auf high. Nach etwa 60 µs geht er aber auf low.
Der Ausgang wird gar nicht die erforderliche Spannung erreichen.
Es hat schon seinen Grund warum das Dallas mit einem zusätzlichen Pin + 
FET (Highsite) macht.

von Peter D. (peda)


Lesenswert?

Tim schrieb:
> Nach etwa 60 µs geht er aber auf low.

Dann hast Du das irgendwo so programmiert oder statt strong high, nur 
einen Pullup eingeschaltet.

von Peter D. (peda)


Lesenswert?

Zeno schrieb:
> Es hat schon seinen Grund warum das Dallas mit einem zusätzlichen Pin +
> FET (Highsite) macht.

Das könnte dann aber nur bei einem standard 8051 der Fall sein, die 
haben nur open-drain Ausgänge mit Pullup.
Viele moderne 8051 können aber auch strong high.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Tim schrieb:
> Oszi habe ich leider nicht.
Ändere das. Solche Probleme auf einem seriellen Bus ohne Oszi zu suchen 
ist wie "Autofahren nach Gehör"...

Wennich irgendeinen seriellen bus in Betrieb nehme, kommt zuerst das 
Oszi dran, damit ich die Signalqualität richtig einschätzen kann. Wenn 
die gut aussieht, dann kann ich auch mit dem billigen 10€ LA 
weitermachen.

> Laut Logikanalyzer geht die Spannung auch nach weniger als den
> geforderten 10 µs auf high. Nach etwa 60 µs geht er aber auf low.
Löte mal einen Pullup mit 330...470R da rein und schau, ob sich was 
ändert.

von (prx) A. K. (prx)


Lesenswert?

Zeno schrieb:
> Es hat schon seinen Grund warum das Dallas mit einem zusätzlichen Pin +
> FET (Highsite) macht.

Der Grund dafür ist die Porteigenschaft der klassischen 8051er. Mit 
denen geht es wirklich nicht anders.

: Bearbeitet durch User
von (prx) A. K. (prx)


Lesenswert?

Tim schrieb:
> Moin, ich hielt mich für ganz doll viel clever

So wie von dir beschrieben funktioniert es, wenn richtig gemacht.

von Tim (Gast)



Lesenswert?

Lothar M. schrieb:
> Tim schrieb:
>> Oszi habe ich leider nicht.
> Ändere das. Solche Probleme auf einem seriellen Bus ohne Oszi zu suchen
> ist wie "Autofahren nach Gehör"...
>
> Wennich irgendeinen seriellen bus in Betrieb nehme, kommt zuerst das
> Oszi dran, damit ich die Signalqualität richtig einschätzen kann. Wenn
> die gut aussieht, dann kann ich auch mit dem billigen 10€ LA
> weitermachen.

Steht auf meiner Liste. Jetzt auch weiter oben.
P.S.: Trotzdem ein Hoch auf Sigrok (PulseView) und einen 8 € LA-Clon. 
Sonst würde ich jetzt wohl noch komplett im Dunkeln stehen.

>> Laut Logikanalyzer geht die Spannung auch nach weniger als den
>> geforderten 10 µs auf high. Nach etwa 60 µs geht er aber auf low.
> Löte mal einen Pullup mit 330...470R da rein und schau, ob sich was
> ändert.

Mit den STM32F103 bin ich nun nicht bewandert (bei den F1xx soll 
GPIO-Konfiguration ja anders als die Neueren funktionieren), aber laut 
Datenblatt sollte das hier PA9 als Ausgang und high schalten:
1
// ... PA9 läuft als USART konfiguriert
2
write_byte(ONEWIRE_SKIP_ROM);
3
write_byte(ONEWIRE_CONVERT_T);
4
// set PA9 output push pull and output high
5
GPIOA->CRH &= ~((1 << 6) | (1 << 7)); // set CNF9[1:0] to 00 => Output push/pull
6
GPIOA->BSRR = 1 << 9; // set bit 9 to 1
7
delay_ms(conversion_time);
8
// set PA9 back to alternate function open drain
9
GPIOA->CRH |= ((1 << 6) | (1 << 7)); // set CNF9[1:0] to 11 => AF Open Drain
10
GPIOA->BSRR = 1 << 25; // set bit 9 to 1

Laut Debugger werden auch die o.g. bits gesetzt und gelöscht. Der USART 
funktioniert danach auch prima weiter.
Das mit den magic numbers ist nur zum Testen.

Im Anhang vom LA das letzte bit (0) von CONVERT_T und die "Reaktion". 
Nach 20 µs kommt schon der erste Einbruch, hatte ich mit der vorherigen 
niedrigeren Samplerate gar nicht bemerkt. Beim Debuggen mit DWT-CYCCNT 
läßt sich aber sehen, daß das nach der Portumschaltung kommt, also von 
"Außen" kommt.

Das zweite Bild zeigt das Verhalten mit 470 Ohm als Pull-Up. Ich weiß 
jetzt also, daß meine Stromversorgung so nicht funktioniert. Vielen 
Dank!

von (prx) A. K. (prx)


Lesenswert?

Tim schrieb:
> GPIOA->BSRR = 1 << 9; // set bit 9 to 1
> GPIOA->BSRR = 1 << 25; // set bit 9 to 1

Bissel widersprüchlich.

von Peter D. (peda)


Lesenswert?

Tim schrieb:
> Der USART
> funktioniert danach auch prima weiter.

Dann mußt Du natürlich den Pin auch von der USART abschalten. Die USART 
überschreibt die Funktion als normalen IO.

von Tim (Gast)


Angehängte Dateien:

Lesenswert?

(prx) A. K. schrieb:
> Tim schrieb:
>> GPIOA->BSRR = 1 << 9; // set bit 9 to 1
>> GPIOA->BSRR = 1 << 25; // set bit 9 to 1
>
> Bissel widersprüchlich.

Sorry, natürlich
1
GPIOA->BSRR = 1 << 9; // set bit 9 to 1
2
GPIOA->BSRR = 1 << 25; // set bit 9 to 0
3
                                      ^^^

Der kurze Einbruch nach ca. 20-25 µs kommt doch von meinem 
Port-Geklimper. Merkwürdig, hatte ich anders rausgemessen beim Debuggen. 
Dachte ich.
Ohne das ist der Einbruch weg und es läuft. Also weiß ich auf jeden 
Fall, wo ich weitermachen muß.
Vielen Dank Euch!

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Tim schrieb:
> GPIOA->BSRR = 1 << 25; // set bit 9 to 0
Low-Aktive Logik?

So wäre der Kommentar weniger widersprüchlich:
// reset bit 9 to 0

von Jim M. (turboj)


Lesenswert?

Lothar M. schrieb:
> Tim schrieb:
>> GPIOA->BSRR = 1 << 25; // set bit 9 to 0
> Low-Aktive Logik?
>
> So wäre der Kommentar weniger widersprüchlich:
> // reset bit 9 to 0

Nö, das sind die kranken STM32 GPIO Ports wo die unteren 16 Bit den Pin 
High und die oberen 16 Bit (25-16 = 9) den Pin Low schalten.

Kommentar ist also korrekt, aber wegen der "magischen" 25 ist der C Code 
schlecht (Menschen-)lesbar.

von (prx) A. K. (prx)


Lesenswert?

Jim M. schrieb:
> Nö, das sind die kranken STM32 GPIO Ports wo die unteren 16 Bit den Pin
> High und die oberen 16 Bit (25-16 = 9) den Pin Low schalten.

Ich finde diese Methode eher genial als krank. Sowas wie
   bsrr = 0x000F<<16 | lcd_data;
um exakt nur Pins 0..3 auf einen bestimmten Wert zu setzen, das geht 
sonst nicht so einfach.

: Bearbeitet durch User
von Peter D. (peda)


Lesenswert?

Jim M. schrieb:
> aber wegen der "magischen" 25 ist der C Code
> schlecht (Menschen-)lesbar.

Man könnte schreiben BIT_CLEAR(9).
Das Macro BIT_CLEAR() vorher entsprechend definieren.

von Tim (Gast)


Lesenswert?

Jim M. schrieb:
> Lothar M. schrieb:
>> Tim schrieb:
>>> GPIOA->BSRR = 1 << 25; // set bit 9 to 0
>> Low-Aktive Logik?
>>
>> So wäre der Kommentar weniger widersprüchlich:
>> // reset bit 9 to 0
>
> Nö, das sind die kranken STM32 GPIO Ports wo die unteren 16 Bit den Pin
> High und die oberen 16 Bit (25-16 = 9) den Pin Low schalten.

Ich denke schon, daß Lothar das wußte. Ich habe seinen Hinweis zumindest 
anders/so verstanden:
set => immer auf 1 setzen
reset => immer auf 0 setzen
^^

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Jim M. schrieb:
> Kommentar ist also korrekt
Wenn man "set" und "set" unabhängig vom Wert 0 und 1 verwendet.

Bei posititver Logik ist aber üblicherweise mit "set" das Setzen auf 1, 
und mit "reset" das Zurücksetzen auf 0 gemeint.

Dass da bei Zurücksetzen ein Offset von 16 drin ist und man statt der 
magischen "25" eine magische "9+16" hätte schreiben können, damit die 9 
nochmal auftaucht, sei dahingestellt...

(prx) A. K. schrieb:
> Ich finde diese Methode eher genial als krank.
Die Methode ist ja schon anderweitig bekannt (und wer Hardwaredesign auf 
Chipebene z.B. im FPGA macht, kann sie leicht nachvollziehen). Aber dass 
man diese Bits unbedingt mit Offset aufs gleiche Register mappen musste, 
obwohl der Prozessor ja nun genügend Adressraum hat, das ist schon ... 
naja, wie heißt es hinterher: "Wir waren jung und brauchten das Geld!"

: Bearbeitet durch Moderator
von (prx) A. K. (prx)


Lesenswert?

Lothar M. schrieb:
> Aber dass
> man diese Bits unbedingt mit Offset aufs gleiche Register mappen musste,
> obwohl der Prozessor ja nun genügend Adressraum hat, das ist schon ...
> naja, wie heißt es hinterher: "Wir waren jung und brauchten das Geld!"

Nope. Es ist gerade die Kombination beider Funktionen in einer 
Portoperation, die den Wert dieses BSRR ausmacht. Nur so sind derartige 
Mehrfachbit-Operatonen atomar und frei von Glitches. Getrennt ausgeführt 
wie in
   reset = 0x000F;
   set   = lcd_data;
gibts einen low-Puls für gesetzte Daten. Was beim LCD schnuppe ist, aber 
in anderen Fällen nicht. Langsamer ist es obendrein.

Andere Spassvögel haben dafür ein Maskenregister definiert. Was man in 
einer ISR eigens sichern muss. Um genau da zusätzlich Zeit zu verbraten, 
wo man das am wenigsten brauchen kann.

In der ersten Generation gab es noch ein reines Reset-Register neben dem 
BSRR, für jene, die das mit dem Shift nicht kapierten. Später nicht 
mehr.

: Bearbeitet durch User
von Zeno (Gast)


Lesenswert?

Peter D. schrieb:
> Zeno schrieb:
>> Es hat schon seinen Grund warum das Dallas mit einem zusätzlichen Pin +
>> FET (Highsite) macht.
>
> Das könnte dann aber nur bei einem standard 8051 der Fall sein, die
> haben nur open-drain Ausgänge mit Pullup.
> Viele moderne 8051 können aber auch strong high.
Das mag schon sein. Dennoch wird es einen Grund haben warum Dallas auch 
bei DS2482 einen extra FET mit zugehörigem Steuerausgang vor sieht. 
Diese IC's sind ja speziell für 1-Wire Ansteuerung entwickelt worden, da 
könnte man ja diesen Strongpullup gleich mit integrieren. Hat man aber 
nicht. Man wird Gründe dafür haben, warum man es anders macht.

von Bauform B. (bauformb)


Lesenswert?

Zeno schrieb:
> Dennoch wird es einen Grund haben warum Dallas auch
> bei DS2482 einen extra FET mit zugehörigem Steuerausgang vor sieht.
> Diese IC's sind ja speziell für 1-Wire Ansteuerung entwickelt worden, da
> könnte man ja diesen Strongpullup gleich mit integrieren. Hat man aber
> nicht.

Hat man, aber erst bei den Nachfolgemodellen DS2483, -84 und -85. Der 
DS2484 hat auch noch integrierte Pegelwandler, I2C mit 3.3V auf 1-wire 
mit 5V.

Die ganze 1-Wire Familie stammt doch aus einer Zeit, als man von 3.3V 
noch nicht geträumt hat. Die Thermometer brauchen minimal 3.0V, der 
gewöhnliche 3.3V-Regler hat schon mal -5%, das bleibt einfach keine Luft 
mehr.

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.