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.
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.
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.
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.
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.
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
Tim schrieb: > Moin, ich hielt mich für ganz doll viel clever So wie von dir beschrieben funktioniert es, wenn richtig gemacht.
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!
Tim schrieb: > GPIOA->BSRR = 1 << 9; // set bit 9 to 1 > GPIOA->BSRR = 1 << 25; // set bit 9 to 1 Bissel widersprüchlich.
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.
(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!
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
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.
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
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.
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 ^^
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
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.