Forum: Mikrocontroller und Digitale Elektronik 1Wire-Bus SEARCH ROM missverstanden?


von Karsten W. (lsmod)


Lesenswert?

Mein aktuelles Problem habe ich hier bereits beschrieben:
Beitrag "Re: DS1820, DS18B20 in C"

Ich habe mich bereits schon die ganze Zeit gewundert wie mehrere 1-Wire 
Clients auf dem Bus nacheinander identifiziert und direkt ausgelesen 
werden können.

In dem Code wird nämlich der SEARCH ROM Befehl verwendet und direkt 
danach die Sensordaten abgefragt.
Allerdings steht in der Dokumentation:
1
When a system is initially powered up, the master must identify the ROM codes of all slave devices on
2
the bus, which allows the master to determine the number of slaves and their device types. The master
3
learns the ROM codes through a process of elimination that requires the master to perform a Search ROM
4
cycle (i.e., Search ROM command followed by data exchange) as many times as necessary to identify all
5
of the slave devices.

Ich verstehe den Text so das zunächst einmal der Master mit dem SEARCH 
ROM Befehl alle ID's der Slaves auf dem Bus lernen soll.
Danach sollen die Slaves gezielt mit der ID adressiert werden.

Da dies in dem Code so nicht getan wird, wäre doch ein guter Grund 
gegeben warum das auslesen mehrerer Sensoren so schlecht funktioniert !?

Vielleicht ist es mehr oder weniger Zufall das die bisherige 
Vorgehensweise in dem Code bei mehreren Slaves überhaupt funktioniert?

Sehe ich das falsch?

In dem IButton Dokument steht zwar das man mit dem Search auch 
adressieren kann, aber weiter unten in dem Text steht wieder das der 
Master die ID's lernt.
1
C.3. Search ROM Command
2
Even if the master does not know the serial numbers of
3
the devices connected to the 1–Wire bus, it is possible
4
to address one single device at a time. This is done by
5
using the command Search ROM, code F0H.
6
...
7
After the first
8
stage of selection, 63 reading/selecting cycles will fol-
9
low, until finally the master has learned one device’s
10
ROM code and simultaneously has addressed it.

Daher gehe ich davon aus das es so gedacht ist das man mehrere Slaves 
immer gezielt über ihre ID adressiert.

: Verschoben durch User
von Jörn P. (jonnyp)


Lesenswert?

Vorab: ich habe dein Programm nicht gelesen.

Karsten M. schrieb:
> Ich verstehe den Text so das zunächst einmal der Master mit dem SEARCH
> ROM Befehl alle ID's der Slaves auf dem Bus lernen soll.
> Danach sollen die Slaves gezielt mit der ID adressiert werden.
>
> Da dies in dem Code so nicht getan wird, wäre doch ein guter Grund
> gegeben warum das auslesen mehrerer Sensoren so schlecht funktioniert !?

Es ist ja gut und schön, wenn die Software das Knäul von DSxxx 
identifiziert,
deshalb kenne ich aber nicht die Position der  einzelnen Sensoren.
In der Praxis nützt mir das nix.
Ich lese deshalb die ID eines einzelnen Sensors aus, bapp dem die Nummer 
drauf und notiere wo der verbaut ist.

Karsten M. schrieb:
> Daher gehe ich davon aus das es so gedacht ist das man mehrere Slaves
> immer gezielt über ihre ID adressiert.

Wie soll es sonst gehen? Einen einzelnen DS kann man mit "read Rom" 
lesen, sind es mehrere, dann sendet man das "Match Rom" und die ID des 
Sensors den man auslesen will.

von Karsten W. (lsmod)


Lesenswert?

Jörn P. schrieb:
> Wie soll es sonst gehen? Einen einzelnen DS kann man mit "read Rom"
> lesen, sind es mehrere, dann sendet man das "Match Rom" und die ID des
> Sensors den man auslesen will.

Ich habe wie viele andere diese Firmware hier verwendet.
Beitrag "Re: DS1820, DS18B20 in C"

Diese Firmware benutzt nur den Befehl "Search Rom" um die Sensoren 
nacheinander auszulesen.
Offensichtlich funktioniert dies nicht zuverlässig.
Der Befehl "Match Rom" ist in der Firmware so nicht implementiert.

Gibt es irgendwo eine Firmware für den avr-gcc die vollständig ist?

Sonst kann ich nur diese Firmware hier für Arduino anpassen:
http://www.pjrc.com/teensy/td_libs_OneWire.html

von Falk B. (falk)


Lesenswert?

@Karsten M. (lsmod)

>Ich habe wie viele andere diese Firmware hier verwendet.
>Beitrag "Re: DS1820, DS18B20 in C"

Sagt doch gleich, daß du wahrscheinlich ein Hardwareproblem hast!

Beitrag "Re: DS1820, DS18B20 in C"

"Nun möchte ich allerdings 3 (max. 5) Sensoren an dem gleichen 1Wire-Bus
auslesen und ich habe dabei große Probleme.
Interessanterweise funktioniert das Auslesen von 3 Sensoren problemlos
im Laborbetrieb auf dem Schreibtisch!

In eingebautem Zustand sind die Sensoren aber über ein ca. 5m langes
CAT5 Kabel angeschlossen, von dem 3 Leitungen benutzt werden. 5V, Data
und GND (Schirmung ist ebenfalls an GND).
Am Ende des CAT5 Kabel sind noch 300 nF Blockkondensatoren und von dort
aus gehen jeweils 3 Leitungen mit ca. 1m zu jeweils einem Sensor."


>Diese Firmware benutzt nur den Befehl "Search Rom" um die Sensoren
>nacheinander auszulesen.
>Offensichtlich funktioniert dies nicht zuverlässig.

Was aber an der Hardware liegt!

>Der Befehl "Match Rom" ist in der Firmware so nicht implementiert.

Ist auch egal. Wenn dein Bus auf der Hardwareebene nicht solide läuft, 
nützt der dir auch nichts.

>Gibt es irgendwo eine Firmware für den avr-gcc die vollständig ist?

Ist es diese Software nicht?

Aber ja, es gibt noch andere.

Beitrag "Onewire + DS18x20 Library"

Kürze deine Kabel schrittweise ein. Im Idealfall mißt du mal an den 
Sensoren mit einem Oszilloskop. 5m sind schon recht viel, da muss man 
einen möglichst kleinen Pull-Up Widerstand nutzen, so 1,5kOhm.

von Falk B. (falk)


Lesenswert?

"Am Ende des CAT5 Kabel sind noch 300 nF Blockkondensatoren und von dort
aus gehen jeweils 3 Leitungen mit ca. 1m zu jeweils einem Sensor."

Auch das ist Unsinn, die 100nF gehören DIREKT an die 3 Sensoren, 10mm 
Abstand und weniger!!!

von Karsten W. (lsmod)


Lesenswert?

Falk B. schrieb:
> Was aber an der Hardware liegt!

Die aber leider bereits fest verbaut ist.
Z.B. in Form von verklebten vergossenen Sensoren.

Die hatte ich vorher selbstverständlich einzeln getestet und die liefen 
problemlos.

>>Gibt es irgendwo eine Firmware für den avr-gcc die vollständig ist?
>
> Ist es diese Software nicht?

Leider nicht.


> Aber ja, es gibt noch andere.
> Beitrag "Onewire + DS18x20 Library"

Super - Danke für den Link.
Die probiere ich gleich Mal aus.

> Kürze deine Kabel schrittweise ein. Im Idealfall mißt du mal an den
> Sensoren mit einem Oszilloskop.

Es ist schwierig die Kabel einzukürzen, wenn sowohl die Sensoren als 
auch der ansteuernde Mega8 fest verbaut sind. ;-)
Entweder klappt es mit der neuen Firmware oder dieser Teil der 
Gesamtfunktion fällt flach.
Alternativ könnte ich höchstens noch einen weiteren Mega8 direkt an die 
Sensoren setzen und anbinden.

> 5m sind schon recht viel, da muss man
> einen möglichst kleinen Pull-Up Widerstand nutzen, so 1,5kOhm.

5m sind viel?
Für den 1Wire-Bus ist eine maximale Länge von 100m angegeben!

Den Pullup-Widerstand kann ich natürlich noch Mal herabsetzen.
Ich hatte allerdings bereits schon erfolglos einen 1K Widerstand 
ausprobiert, der keine Verbesserung erbracht hatte.

von Karsten W. (lsmod)


Lesenswert?

Falk B. schrieb:
> Auch das ist Unsinn, die 100nF gehören DIREKT an die 3 Sensoren, 10mm
> Abstand und weniger!!!

Das ist mir schon klar - aber zeige mir Mal wie Du das bei vergossenen 
Sensoren bewerkstelligen willst? :-)

von Falk B. (falk)


Lesenswert?

@ Karsten M. (lsmod)

>Die aber leider bereits fest verbaut ist.
>Z.B. in Form von verklebten vergossenen Sensoren.

Zumindest kannst du erstmal das 5m CAT-Kabel weglassen und neu testen.

>Die hatte ich vorher selbstverständlich einzeln getestet und die liefen
>problemlos.

Wie hast du EXAKT getestet? Immer nur einen Sensor am Bus oder alle 
drei?

>> Ist es diese Software nicht?

>Leider nicht.

Was fehlt denn?

>Es ist schwierig die Kabel einzukürzen, wenn sowohl die Sensoren als
>auch der ansteuernde Mega8 fest verbaut sind. ;-)

Dann besorg dir einen 2. AVR.

>Entweder klappt es mit der neuen Firmware oder dieser Teil der
>Gesamtfunktion fällt flach.

So kann man ein Problem auch "lösen" 8-(

>5m sind viel?
>Für den 1Wire-Bus ist eine maximale Länge von 100m angegeben!

???
Kaum. Wo soll das stehen?

>Den Pullup-Widerstand kann ich natürlich noch Mal herabsetzen.
>Ich hatte allerdings bereits schon erfolglos einen 1K Widerstand
>ausprobiert, der keine Verbesserung erbracht hatte.

Ohne Oszi ist das ein Blindflug.

von Karsten W. (lsmod)


Lesenswert?

Falk B. schrieb:
> @ Karsten M. (lsmod)

> Wie hast du EXAKT getestet? Immer nur einen Sensor am Bus oder alle
> drei?

Ich hatte unter Laborbedingungen bis zu 3 Sensoren angeschlossen.

>>> Ist es diese Software nicht?
>
>>Leider nicht.
>
> Was fehlt denn?

Ein auslesen der Sensoren mit Match Rom.

>>Es ist schwierig die Kabel einzukürzen, wenn sowohl die Sensoren als
>>auch der ansteuernde Mega8 fest verbaut sind. ;-)
>
> Dann besorg dir einen 2. AVR.

Habe ich - aber mich interessiert nun die Frage ob das Problem mit einer 
anderen Firmware lösbar ist.

> So kann man ein Problem auch "lösen" 8-(

Ja - denn es ist nur ein Teil der Gesamtfunktionalität.
Daher kann ich die Steuerung auch nicht verlagern.

>>5m sind viel?
>>Für den 1Wire-Bus ist eine maximale Länge von 100m angegeben!
>
> ???
> Kaum. Wo soll das stehen?

https://de.wikipedia.org/wiki/1-Wire
1
Die Verkabelung kann über ein einfaches Kabel bzw. eine einzelne Leitung auf einer Platine erfolgen.
2
Mit einem passiven Pull-up-Widerstand sind so Leitungslängen von bis zu 100 m mit 150 1-Wire-Geräten möglich.

Ich habe hier einen sehr guten Link gefunden:
https://www.maximintegrated.com/en/app-notes/index.mvp/id/148
1
This interface works with large and small 1-Wire networks equally well,
2
and can reliably operate a network with high weight and radius values up to 500m.

>>Den Pullup-Widerstand kann ich natürlich noch Mal herabsetzen.
>>Ich hatte allerdings bereits schon erfolglos einen 1K Widerstand
>>ausprobiert, der keine Verbesserung erbracht hatte.
>
> Ohne Oszi ist das ein Blindflug.

Das stimmt - aber da ich das Kabel nun sowieso nicht mehr ändern werde 
muss auch ein Blindflug genügen.
Na gut - wenn Deine Firmware keine Verbesserung bringt dann werde ich 
wohl schon alleine aus Neugier den Blindflug gegen einen 
Instrumentenflug tauschen ...

: Bearbeitet durch User
von grundschüler (Gast)


Lesenswert?

ich habe circa 20 Sensoren in einem wirren Netzwerk mit mindestens 20m 
über das ganze Haus verteilt. das funktioniert ohne Kondensatoren 
zuverlässig.

Die Sensoren werden in einem Durchgang ausgelesen und die Messwerte den 
gespeicherten IDs zugeordnet. Interessieren würde mich die Reihenfolge 
der Meldung der einzelnen Sensoren. Ist das Zufall oder haben die 
Sensoren entsprechend der ID verschiedene Wartezeiten, nach denen sie 
einen Versuch starten, ob der Bus frei ist? Was passiert wenn sich zwei 
Sensoren exakt gleichzeitig melden?

von Falk B. (falk)


Lesenswert?

@ Karsten M. (lsmod)

>Ich hatte unter Laborbedingungen bis zu 3 Sensoren angeschlossen.

Aber ohne die 5m Zusatzkabel? Mensch, laß dir doch nicht jede Wort aus 
der Nase ziehen!!

https://www.mikrocontroller.net/articles/Netiquette#Klare_Beschreibung_des_Problems

" Daran denken, dass die Leute im Forum nicht neben einem sitzen und 
alles so vor sich sehen wie der Fragesteller"

>> Was fehlt denn?

>Ein auslesen der Sensoren mit Match Rom.

OK.

>Habe ich - aber mich interessiert nun die Frage ob das Problem mit einer
>anderen Firmware lösbar ist.

Deine Hardwareprobleme löst eine andere Software auch nicht.

>Ja - denn es ist nur ein Teil der Gesamtfunktionalität.
>Daher kann ich die Steuerung auch nicht verlagern.

Sollst du auch gar nicht. Aber man kann Übertragungsstörungen finden und 
beheben, wenn man denn Know How und Ausdauer hat.

>https://www.maximintegrated.com/en/app-notes/index...

>This interface works with large and small 1-Wire networks equally well, >and can 
reliably operate a network with high weight and radius values up >to 500m.

Das geht aber nur mit diversen Anpassungen und Treibern.

Egal, 5m sollten trotzdem funktionieren.

>Das stimmt - aber da ich das Kabel nun sowieso nicht mehr ändern werde
>muss auch ein Blindflug genügen.

Es muss gar nichts. Du willst ein Problem lösen, ohne etwas dafür zu 
tun. Das wird nicht funktionieren.

>Na gut - wenn Deine Firmware keine Verbesserung bringt dann werde ich
>wohl schon alleine aus Neugier den Blindflug gegen einen
>Instrumentenflug tauschen ...

Eine weise Entscheidung.

von Karsten W. (lsmod)


Lesenswert?

grundschüler schrieb:
> ich habe circa 20 Sensoren in einem wirren Netzwerk mit mindestens 20m
> über das ganze Haus verteilt. das funktioniert ohne Kondensatoren
> zuverlässig.

Mit welcher Firmware?

> Die Sensoren werden in einem Durchgang ausgelesen und die Messwerte den
> gespeicherten IDs zugeordnet. Interessieren würde mich die Reihenfolge
> der Meldung der einzelnen Sensoren. Ist das Zufall oder haben die
> Sensoren entsprechend der ID verschiedene Wartezeiten, nach denen sie
> einen Versuch starten, ob der Bus frei ist? Was passiert wenn sich zwei
> Sensoren exakt gleichzeitig melden?

Soweit ich es verstanden habe wird die ID Bit für Bit ausgelesen und der 
Master gibt jeweils bei einem Bit vor ob er gerade einen Sensor mit 1 
oder 0 hören möchte. Alle anderen schweigen dann.
So können alle Adressen durchgegangen werden.

Ich sehe zur Zeit nur:
28FFAFF1351603A5
281B9F5D05000015
Dieser hier wird nicht mehr erkannt:
28...0467

von Karsten W. (lsmod)


Lesenswert?

Falk B. schrieb:
> @ Karsten M. (lsmod)
>
>>Ich hatte unter Laborbedingungen bis zu 3 Sensoren angeschlossen.
>
> Aber ohne die 5m Zusatzkabel? Mensch, laß dir doch nicht jede Wort aus
> der Nase ziehen!!

Den Link auf meine Problembeschreibung hatte ich oben als erstes 
genannt!

> " Daran denken, dass die Leute im Forum nicht neben einem sitzen und
> alles so vor sich sehen wie der Fragesteller"

Dann hätte ich die Problembeschreibung hier noch einmal komplett 
wiederholen müssen.
Ich wollte die Redundanz vermeiden. ;-)
Es war nicht böswillig gemeint.

> Deine Hardwareprobleme löst eine andere Software auch nicht.

Man darf die Hoffnung nie aufgeben.
Auf jeden Fall möchte ich eine vollständige 1Wire Implementierung 
ausprobieren.

Bei der Library hast Du Dir Dein Bier auf jeden Fall schon verdient!
Allerdings ist das Beispiel für die Benutzung schon eher einen Tick zu 
ausführlich.
Wie kann ich denn erst einmal einen Sensorscan durchführen und die ID's 
ausgeben?

> Sollst du auch gar nicht. Aber man kann Übertragungsstörungen finden und
> beheben, wenn man denn Know How und Ausdauer hat.

Ein CAT5 Kabel hat sich bei der RS485 bereits sehr gut auf deutlich 
längeren Leitungen bewährt.
Ich bin eindeutig zu faul die Verdrahtung wieder auseinanderzudröseln. 
;-)
Einige Verbindungen sind zudem verdammt schlecht erreichbar.

>>https://www.maximintegrated.com/en/app-notes/index...
>
>>This interface works with large and small 1-Wire networks equally well, >and can
> reliably operate a network with high weight and radius values up >to 500m.
>
> Das geht aber nur mit diversen Anpassungen und Treibern.
>
> Egal, 5m sollten trotzdem funktionieren.

Meine Rede!

> Es muss gar nichts. Du willst ein Problem lösen, ohne etwas dafür zu
> tun. Das wird nicht funktionieren.

Da bin ich doch tatkräftig dabei oder nicht? :-)

> Eine weise Entscheidung.

Danke!

von Falk B. (falk)


Lesenswert?

@Karsten M. (lsmod)

>Soweit ich es verstanden habe wird die ID Bit für Bit ausgelesen und der
>Master gibt jeweils bei einem Bit vor ob er gerade einen Sensor mit 1
>oder 0 hören möchte. Alle anderen schweigen dann.
>So können alle Adressen durchgegangen werden.

Ja.

>Ich sehe zur Zeit nur:
>28FFAFF1351603A5
>281B9F5D05000015

OK.

>Dieser hier wird nicht mehr erkannt:
>28...0467

Defekt? Wackelkontakt? Kalte Lötstelle? Kurzschluß?

Kannst du den Sensor auslesen, wenn du die anderen abklemmst? Hast du 
mal den Anschluß geprüft bzw. getrennt und neu verlötet?

Ich hab hier gerade mal mit meinem Testaufbau einen DS1820 an 5m Kabel 
geklemmt, geht problemlos. Pull-Up ist 4k7. Wie das Signal aussieht weiß 
ich nicht, hab im Moment kein Oszi parat.

von Falk B. (falk)


Lesenswert?

@Karsten M. (lsmod)

>Allerdings ist das Beispiel für die Benutzung schon eher einen Tick zu
>ausführlich.

??

>Wie kann ich denn erst einmal einen Sensorscan durchführen und die ID's
>ausgeben?

Steht doch ziemlich weit oben im Programm. Dort wird der gesamt Bus 
gescannt und die IDs ausgegeben.
1
  // multiple devices on bus, access only with ROM code
2
3
  rc = scan_bus(roms, ONEWIRE_SEARCH_ROM);

>Ein CAT5 Kabel hat sich bei der RS485 bereits sehr gut auf deutlich
>längeren Leitungen bewährt.

Das bezweifelt doch keiner. Trotzdem kann dort ein Problem liegen, vor 
allem in den Verbindungen.

>Ich bin eindeutig zu faul die Verdrahtung wieder auseinanderzudröseln.
>;-)
>Einige Verbindungen sind zudem verdammt schlecht erreichbar.

Nur mit Handauflegen wird das nix. Du musst die die Hände auch ein 
bisschen schmutzig machen.

: Bearbeitet durch User
von Karsten W. (lsmod)


Lesenswert?

Falk B. schrieb:
> Defekt? Wackelkontakt? Kalte Lötstelle? Kurzschluß?

Er lief problemlos bis der 3. Sensor hinzugekommen ist.
(281B9F5D05000015)

> Kannst du den Sensor auslesen, wenn du die anderen abklemmst? Hast du
> mal den Anschluß geprüft bzw. getrennt und neu verlötet?

Nein kann ich nicht.
Die Verbindung liegt an einer Stelle die sehr schwer zugänglich ist!

> Nur mit Handauflegen wird das nix. Du musst die die Hände auch ein
> bisschen schmutzig machen.

Schmutzig ist nicht das Problem.
Um da drann zu kommen handelt man sich eher derbe Verspannungen ein. ;-)

> Ich hab hier gerade mal mit meinem Testaufbau einen DS1820 an 5m Kabel
> geklemmt, geht problemlos. Pull-Up ist 4k7. Wie das Signal aussieht weiß
> ich nicht, hab im Moment kein Oszi parat.

Unser lieber grundschüler kann auch 20 Sensoren auslesen.

> Steht doch ziemlich weit oben im Programm. Dort wird der gesamt Bus
> gescannt und die IDs ausgegeben.

rc = scan_bus(roms, ONEWIRE_SEARCH_ROM);
Sorry - das kann ich in dem "onewire_demo.ino" nicht finden!

Habe ich das falsche Archiv heruntergeladen?

von Falk B. (falk)


Lesenswert?

@Karsten M. (lsmod)

>> Defekt? Wackelkontakt? Kalte Lötstelle? Kurzschluß?

>Er lief problemlos bis der 3. Sensor hinzugekommen ist.
>(281B9F5D05000015)

Na dann liegt die Vermutung wohl nah, daß dort das Problem liegt!

>> Kannst du den Sensor auslesen, wenn du die anderen abklemmst? Hast du
>> mal den Anschluß geprüft bzw. getrennt und neu verlötet?

>Nein kann ich nicht.
>Die Verbindung liegt an einer Stelle die sehr schwer zugänglich ist!

Ja und? Glaubst du mit Jammern und "geht nicht, zu schwierig" wird sich 
das Problem in Luft auflösen?

>rc = scan_bus(roms, ONEWIRE_SEARCH_ROM);
>Sorry - das kann ich in dem "onewire_demo.ino" nicht finden!

Bitte? Zeile 221!

>Habe ich das falsche Archiv heruntergeladen?

Hmm, stimmt. Mein erster Link ist die alte Version. Das hier ist die 
aktuelle. ;-)

Beitrag "Re: Onewire + DS18x20 Library"

: Bearbeitet durch User
von Karsten W. (lsmod)


Lesenswert?

Falk B. schrieb:
> Ja und? Glaubst du mit Jammern und "geht nicht, zu schwierig" wird sich
> das Problem in Luft auflösen?

Ja! :-)
Nun lasse mich doch bitte erst einmal Deine Firmware ans laufen bringen 
...

>>Habe ich das falsche Archiv heruntergeladen?
>
> Hmm, stimmt. Mein erster Link ist die alte Version. Das hier ist die
> aktuelle. ;-)
>
> Beitrag "Re: Onewire + DS18x20 Library"

GRRRR!
Jetzt habe ich gerade angefangen alles ein wenig für mich anzupassen.

Hier ein paar kleine Verbesserungsvorschläge als Rache: :-)
1
/** \file
2
 * \brief   Main Project File
3
 * \details Diese Datei beinhaltet die Funktion main() und führt alles zusammen.
4
 */
5
6
7
#ifndef _STDIO_H_
8
  #include <stdio.h>
9
#endif
10
#ifndef _STDLIB_H_
11
  #include <stdlib.h>
12
#endif
13
#ifndef _AVR_IO_H_
14
  #include <avr/io.h>
15
#endif
16
#ifndef _AVR_INTERRUPT_H_
17
  #include <avr/interrupt.h>
18
#endif
19
#ifndef __PGMSPACE_H_
20
  #include <avr/pgmspace.h> 
21
#endif
22
#ifndef _UTIL_DELAY_H_
23
  #include <util/delay.h>
24
#endif
25
#ifndef _UTIL_ATOMIC_H_
26
  #include <util/atomic.h>
27
#endif
28
#ifndef _STRING_H_
29
  #include <string.h> 
30
#endif

Für das Doxygen fehlt bei Dir meine ich jeweils die File Deklaration, 
damit das Dokument gelistet wird.
Wenn es bei mir endlich läuft, schicke ich Dir Mal meine Version.

Die Libraries lade ich immer nur falls sie noch nicht geladen wurden.

von Falk B. (falk)


Lesenswert?

@Karsten M. (lsmod)

>Hier ein paar kleine Verbesserungsvorschläge als Rache: :-)

>#ifndef _STDIO_H_
>  #include <stdio.h>
>#endif

Das ist totaler Quark, denn dieser Schutz gegen doppelte Includes steckt 
schon in jedem Include Files drin.

>Für das Doxygen fehlt bei Dir meine ich jeweils die File Deklaration,
>damit das Dokument gelistet wird.

Kann sein, ich kenn mich damit nicht sonderlich gut aus.

von Karsten W. (lsmod)


Lesenswert?

Falk B. schrieb:
> @Karsten M. (lsmod)
> Das ist totaler Quark, denn dieser Schutz gegen doppelte Includes steckt
> schon in jedem Include Files drin.

Auch wieder wahr.

>>Für das Doxygen fehlt bei Dir meine ich jeweils die File Deklaration,
>>damit das Dokument gelistet wird.
>
> Kann sein, ich kenn mich damit nicht sonderlich gut aus.

Ich auch nicht - das doxygen ist wirklich recht komplex.

Eine weitere gemeine Frage:
1
uint8_t scan_bus(uint8_t rom_list[10][8], uint8_t cmd) {

Bläht das den RAM-Verbrauch nicht ungemein auf?
Ich würde gerne ein statisches Array definieren, welches alle gefundenen 
Clients beinhaltet und dann einfach per Index benutzt werden kann.

von Falk B. (falk)


Lesenswert?

@Karsten M. (lsmod)

>uint8_t scan_bus(uint8_t rom_list[10][8], uint8_t cmd) {

>Bläht das den RAM-Verbrauch nicht ungemein auf?

Warum sollte es das? rom_list ist ein POINTER, kein echtes Array. Das 
gibt es nur einmalig als globale Variable.

>Ich würde gerne ein statisches Array definieren, welches alle gefundenen
>Clients beinhaltet und dann einfach per Index benutzt werden kann.

Genau DAS ist im Code vorhanden ;-)

von Karsten W. (lsmod)


Lesenswert?

Falk B. schrieb:
> Warum sollte es das? rom_list ist ein POINTER, kein echtes Array. Das
> gibt es nur einmalig als globale Variable.

Sollte ein Pointer nicht mit einem '*' beginnen?
Und ein Pointer vom Typ uint8_t?
rom_list ist auch nicht als static deklariert.

Welchen Sinn haben die Werte in dem Array?
1
uint8_t buffer[9] = {0x02, 0x1C, 0xB8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00};
Edit: Antwort gefunden. Es geht um den "speed test in simulator".

Leider bin ich kein guter C Programmierer und mit Pointern tue ich mich 
noch immer schwer ...
Dein Code ist auch für Arduino in C++ - nicht in C.

: Bearbeitet durch User
von Falk B. (falk)


Lesenswert?

@Karsten M. (lsmod)

>> Warum sollte es das? rom_list ist ein POINTER, kein echtes Array. Das
>> gibt es nur einmalig als globale Variable.

>Sollte ein Pointer nicht mit einem '*' beginnen?

Ja, aber wenn ich einen Pointer auf ein mehrdimensionales Feld haben 
will, muss ich die Größen der niedrigeren Dimensionen angeben, sonst 
kann der Compiler das nicht allein dereferenzieren. OK, die gezeigte 
Methode ist vielleicht nicht die schönste, ein Pointer auf einen 
passenden Typ wäre besser. Das hier ginge auch.

1
#define MAX_ROMS 10
2
typedef uint8_t rom_t[MAX_ROMS][8];
3
4
uint8_t buffer[9] = {0x02, 0x1C, 0xB8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00};
5
rom_t roms;
6
rom_t alarm_roms;
7
8
void print_header(void);
9
void print_rom(uint8_t *data, uint8_t index);
10
uint8_t scan_bus(rom_t rom_list, uint8_t cmd);


>Und ein Pointer vom Typ uint8_t?
>rom_list ist auch nicht als static deklariert.

Wozu auch? Es ist global.

>Welchen Sinn haben die Werte in dem Array?

>uint8_t buffer[9] = {0x02, 0x1C, 0xB8, 0x01, 0x00, 0x00, 0x00, 0x00, 0
x00};

Zum testen während der Softwareentwicklung, kann man auch 0 setzen.

>Leider bin ich kein guter C Programmierer und mit Pointern tue ich mich
>noch immer schwer ...

Dann musst du dir auch hier die "Hände schmutzig machen" und das lernen. 
Sooo schwer ist das nicht.

von Karsten W. (lsmod)


Lesenswert?

Falk B. schrieb:
> Dann musst du dir auch hier die "Hände schmutzig machen" und das lernen.
> Sooo schwer ist das nicht.

Doch - die ganzen Feinheiten halte ich für nicht so einfach.
Es gibt eine ganze Menge Sonderlocken die in der Syntax möglich sind.
Vor allem die Unterschiede zwischen C und C++.

Es hat schon einen Grund warum man versucht hat dies in Arduino zu 
vereinfachen.
Allerdings bringen diese "Vereinfachungen für den Benutzer" aus meiner 
Sicht wiederum zusätzliche Probleme, wenn man über die 
Standard-Funktionen von Arduino hinaus geht.
Ich bin total fasziniert davon wieviel Funktionalität mit C in den 8KB 
eines Mega8 untergebracht werden kann.

Nun muss ich allerdings ohne Arduino erst einmal die ganzen Arduino 
Library Befehle wie z.B. "Serial.println" in einem Teil Deiner Demo nach 
C "zurückschrauben".

In der Demo werden aber nicht mehrere Sensoren ausgegeben, wenn diese 
vorhanden sind?
Nur der erste Sensor der gefunden wird oder?
1
    while (!Serial.available()) {
2
      onewire_match_rom(roms[i_ds18B20]);
3
      ds18B20_convert_t(1);        // parasitic power
4
      _delay_ms(750);
5
      ONEWIRE_STRONG_PU_OFF                  // user must disable strong pull up after conversion
6
      onewire_match_rom(roms[i_ds18B20]);    // when using parasitic power
7
      rc = ds18B20_read_temp(&x);
8
      if (rc) {
9
        Serial.println(F("CRC error!"));
10
      } else {
11
        Serial.print(F("T: "));
12
        Serial.print(x / 10);
13
        Serial.print('.');
14
        Serial.print(abs(x) % 10);
15
        Serial.println(F(" C"));
16
      }
17
    }

: Bearbeitet durch User
von Karsten W. (lsmod)


Lesenswert?

So - ich habe fertig und es läuft nun im Labormuster wunderbar mit 6 
Sensoren problemlos.
Von ds18B20_read_temp lasse ich mir allerdings den gemessenen Raw-Wert 
zurückliefern.
Diesen rechne ich dann per Integer-Arithmetik in eine Fliesskommazahl 
um.
1
while (1) {
2
  dcount = scan_bus(roms, ONEWIRE_SEARCH_ROM);
3
4
  if (dcount == 255) {
5
    uart_string_P(PSTR("Error, no device found!" CR));
6
    uart_string(CR);
7
  } else {
8
    uart_string_P(PSTR("Scan finished, "));
9
    uart_int(dcount);
10
    uart_string_P(PSTR(" devices found." CR CR));
11
12
    for (i = 0; i < dcount; i ++) {
13
      uart_string_P(PSTR("Reading temperature of DS18S20 "));
14
      uart_int(i + 1);
15
      uart_string_P(PSTR(" : "));
16
      onewire_match_rom(roms[i]);
17
      ds18B20_convert_t(0);              // start conversion
18
      _delay_ms(750);
19
      onewire_match_rom(roms[i]);
20
      rc = ds18B20_read_temp(&x);            // read result
21
      if (rc) {
22
        uart_string_P(PSTR("CRC error!" CR));
23
      } else {
24
        uart_string_P(PSTR("T Raw: "));
25
        uart_int(x);
26
        uart_string_P(PSTR("  = "));
27
        int32_t Temp = (int32_t) x * 625;        // caclulate as floating point
28
        Vor = Temp / 10000;              // int8_t
29
        Temp = Temp - (int32_t) Vor * 10000;      // Rest
30
        if (Temp < 0) {
31
          Temp = -1 * Temp;            // Nachkomma immer positiv
32
          if (Vor == 0) {            // Minus für -0.x nicht vergessen
33
            uart_char('-');
34
          }
35
        } else {
36
          Temp = Temp + 500;            // Rundung auf 1 Nachkommastelle wenn positiv
37
        }
38
        Nach = Temp / 1000;              // int8_t
39
        uart_int(Vor);
40
        uart_string_P(PSTR("."));
41
        uart_int(Nach);
42
        uart_string_P(PSTR(" °C" CR));
43
      }
44
    }
45
  }
46
  uart_string(CR);
47
}

Das gesamte Programm benötigt 2342 Byte.
Es gibt folgendes aus:

1
Scanning OneWire bus for ROM codes.
2
Index : 7  6  5  4  3  2  1  0
3
ROM 01: 28 34 4D DD 03 00 00 52
4
ROM 02: 28 6F 5A DD 03 00 00 A9
5
ROM 03: 28 FF A5 BF 63 15 02 4C
6
ROM 04: 28 FF 6D E6 63 15 02 1B
7
ROM 05: 28 FF E3 A9 63 15 02 08
8
ROM 06: 28 FF A7 D4 63 15 02 CB
9
Scan finished, 6 devices found.
10
11
Reading temperature of DS18S20 1 : T Raw: 379  = 23.7 °C
12
Reading temperature of DS18S20 2 : T Raw: 379  = 23.7 °C
13
Reading temperature of DS18S20 3 : T Raw: 376  = 23.5 °C
14
Reading temperature of DS18S20 4 : T Raw: 373  = 23.3 °C
15
Reading temperature of DS18S20 5 : T Raw: 373  = 23.3 °C
16
Reading temperature of DS18S20 6 : T Raw: 377  = 23.6 °C

Das werde ich nun noch erweitern und in meine andere Firmware 
integrieren.
Dann bin ich gespannt ob es dort auch mit dem bösen langen Kabel 
funktioniert? :-)

: Bearbeitet durch User
von Falk B. (falk)


Lesenswert?

@ Karsten M. (lsmod)

>So - ich habe fertig und es läuft nun im Labormuster wunderbar mit 6
>Sensoren problemlos.

Das lief es vorher auch.

>Von ds18B20_read_temp lasse ich mir allerdings den gemessenen Raw-Wert
>zurückliefern.
>Diesen rechne ich dann per Integer-Arithmetik in eine Fliesskommazahl
>um.

Das ist wieder so eine Sinnlosigkeit, du erfindest das Rad neu. Die 
Funktion liefert schon eine Temperatur als Integer, berechnet durch 
Festkommaarithmik. Wenn man das das dann wieder in Fließkomma 
umrechnet, ist der Vorteil dahin.

>Dann bin ich gespannt ob es dort auch mit dem bösen langen Kabel
>funktioniert? :-)

DAS ist doch die Frage des Tages. Der Rest ist nur nice to have.

von Karsten W. (lsmod)


Angehängte Dateien:

Lesenswert?

Alter Mopperhannes!

Falk B. schrieb:
> Das lief es vorher auch.

Kann ich nicht bestätigen. Ich hatte nur mit max. 3 Sensoren getestet.

> Das ist wieder so eine Sinnlosigkeit, du erfindest das Rad neu. Die
> Funktion liefert schon eine Temperatur als Integer, berechnet durch
> Festkommaarithmik. Wenn man das das dann wieder in Fließkomma
> umrechnet, ist der Vorteil dahin.

Es ist nicht sinnlos, weil
1. Ich später nur den Raw-Wert übernehme und in eine Datenbank schreibe
2. Meine Umrechnung mit Rundung umrechnet

Anbei meine Ausgabe in doxygen.
Das bekommt man bei Bedarf auch noch schöner hin.

: Bearbeitet durch User
von Falk B. (falk)


Lesenswert?

@Karsten M. (lsmod)

>Kann ich nicht bestätigen. Ich hatte nur mit max. 3 Sensoren getestet.

Dann klemm doch das Ding jetzt an das Originalkabel und scan den Bus. 
Dann siehst du was Sache ist.

von Karsten W. (lsmod)


Lesenswert?

Falk B. schrieb:
> Dann klemm doch das Ding jetzt an das Originalkabel und scan den Bus.
> Dann siehst du was Sache ist.

Das ist zu einfach! :-)
Aber durchaus eine Idee!
Na dann bis gleich ...

von Karsten W. (lsmod)


Lesenswert?

Falk B. schrieb:
> DAS ist doch die Frage des Tages. Der Rest ist nur nice to have.

Die Frage kann ich nun endlich beantworten.
Es liegt nicht am Kabel, sondern nur an der Firmware!

Ich bekomme nun problemlos + extrem stabil die Werte ausgelesen:

1
Scanning OneWire bus for ROM codes.
2
Index : 7  6  5  4  3  2  1  0
3
ROM 01: 28 1B 9F 5D 05 00 00 15
4
ROM 02: 28 FF 0A 57 35 16 04 67
5
ROM 03: 28 FF AF F1 35 16 03 A5
6
Scan finished, 3 devices found.
7
8
Reading temperature of DS18S20 1 : T Raw: 343  = 21.4 °C
9
Reading temperature of DS18S20 2 : T Raw: 282  = 17.6 °C
10
Reading temperature of DS18S20 3 : T Raw: 289  = 18.1 °C

Damit steht fest:
1. Die Library von Volker U. bzw. von Peter Dannegger versagt bei 
mehreren Sensoren
2. Du hast Dir mit Deiner Library das Bier redlich verdient!
3. Die Verkabelung ist nicht kritisch

VOILA!
Herzlichen Dank für Deinen netten Support! ;-)

: Bearbeitet durch User
von Falk B. (falk)


Lesenswert?

@ Karsten M. (lsmod)

>Ich bekomme nun problemlos + extrem stabil die Werte ausgelesen:

Schön zu hören.

>1. Die Firmware von Volker U. bzw. von Peter Dannegger versagt bei
>mehreren Sensoren

Das kann ich kaum glauben. Irgendwas klemmt hier.

Aber wenn es mit meiner Software läuft, so what.

Njoy.

von Karsten W. (lsmod)


Lesenswert?

Falk B. schrieb:
>>1. Die Firmware von Volker U. bzw. von Peter Dannegger versagt bei
>>mehreren Sensoren
>
> Das kann ich kaum glauben. Irgendwas klemmt hier.

Der entscheidende Unterschied ist das hier jeder Sensor explizit mit 
seiner ID abgefragt wird!

1
      ds18B20_convert_t(0);              // start conversion
2
      _delay_ms(750);
3
      onewire_match_rom(roms[i]);
4
      rc = ds18B20_read_temp(&x);            // read result

Ich starte nun übrigens die Messung nur noch einmal und lese dann die 
Sensoren ohne Wartezeit alle hintereinander aus.

> Aber wenn es mit meiner Software läuft, so what.

Deine Firmware deckt eine viel größere Funktionalität des 1-Wire-Bus ab.
Daher vielen Dank für die Veröffentlichung!

> Njoy.

Das tue ich.
Vor allem das ich nicht in üblen Ecken einen Kabelfehler gesucht habe. 
;-)

: Bearbeitet durch User
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.