Forum: Mikrocontroller und Digitale Elektronik DS18B20 multiplexen


von Uwe H. (uwe1981)


Lesenswert?

Hallo mal wieder :-)
Ich bastel grad mit vier DS18B20 rum und würde gern jedem Sensor seinen 
eigenen Pin am Controller geben, statt alle zusammen per 1wire an einen 
Pin. Meine Überlegung war, einfach den Pin für 1wire nach jeder Messung 
neu zu bestimmen und damit alle vier Sensoren in Reihe abfragen. In etwa 
so:


Do
CONFIG 1WIRE = PORTC.1

Temperatur messen

CONFIG 1WIRE = PORTC.2

Temperatur messen

CONFIG 1WIRE = PORTC.3

Temperatur messen

usw.

loop

Was meint ihr, haut das hin oder kriegt der Controller nen Koller dabei? 
:-)

Grüße

von Peter D. (peda)


Lesenswert?

Uwe Heydemann schrieb:
> Was meint ihr, haut das hin oder kriegt der Controller nen Koller dabei?
> :-)

Der Controller auf keinen Fall.
Aber Dein Bascom könnte meckern.
Probiers aus oder lies die Doku.


Peter

von Jörg S. (vitaminc)


Lesenswert?

Warum nicht alle gleichzeitig?

von sBronco (Gast)


Lesenswert?

Das geht, ich mach das mit einem M128 und 6 Sensoren:
1
SUB DSRESET
2
   For ch = 1 to Channels
3
      Select Case ch
4
         Case 1:
5
            1wreset PinG , 1
6
            1wwrite &HCC , 1 , Ping , 1
7
            1wwrite &H44 , 1 , Ping , 1
8
         Case 2:
9
            1wreset PinG , 0
10
            1wwrite &HCC , 1 , Ping , 0
11
            1wwrite &H44 , 1 , Ping , 0
12
         Case 3:
13
            1wreset Pind , 7
14
            1wwrite &HCC , 1 , Pind , 7
15
            1wwrite &H44 , 1 , Pind , 7
16
         Case 4:
17
            1wreset Pind , 6
18
            1wwrite &HCC , 1 , Pind , 6
19
            1wwrite &H44 , 1 , Pind , 6
20
         Case 5:
21
            1wreset Pind , 5
22
            1wwrite &HCC , 1 , Pind , 5
23
            1wwrite &H44 , 1 , Pind , 5
24
         Case 6:
25
            1wreset Pind , 4
26
            1wwrite &HCC , 1 , Pind , 4
27
            1wwrite &H44 , 1 , Pind , 4
28
      End Select
29
    Next
30
   Flag.0 = 1
31
End Sub
32
'##################################################
33
SUB DSREAD
34
   For ch = 1 to Channels
35
      Select Case ch
36
         Case 1:
37
            1wreset PinG , 1
38
            1wwrite &HCC , 1 , Ping , 1
39
            1wwrite &HBE , 1 , Ping , 1
40
            DsData(1) = 1wread(9 , PinG , 1 )
41
            1wreset PinG , 1
42
         Case 2:
43
            1wreset PinG , 0
44
            1wwrite &HCC , 1 , Ping , 0
45
            1wwrite &HBE , 1 , Ping , 0
46
            DsData(1) = 1wread(9 , PinG , 0 )
47
            1wreset PinG , 0
48
         Case 3:
49
            1wreset Pind , 7
50
            1wwrite &HCC , 1 , Pind , 7
51
            1wwrite &HBE , 1 , Pind , 7
52
            DsData(1) = 1wread(9 , Pind , 7 )
53
            1wreset Pind , 7
54
         Case 4:
55
            1wreset Pind , 6
56
            1wwrite &HCC , 1 , Pind , 6
57
            1wwrite &HBE , 1 , Pind , 6
58
            DsData(1) = 1wread(9 , Pind , 6 )
59
            1wreset Pind , 6
60
         Case 5:
61
            1wreset Pind , 5
62
            1wwrite &HCC , 1 , Pind , 5
63
            1wwrite &HBE , 1 , Pind , 5
64
            DsData(1) = 1wread(9 , Pind , 5 )
65
            1wreset Pind , 5
66
         Case 6:
67
            1wreset Pind , 4
68
            1wwrite &HCC , 1 , Pind , 4
69
            1wwrite &HBE , 1 , Pind , 4
70
            DsData(1) = 1wread(9 , Pind , 4 )
71
            1wreset Pind , 4
72
      End Select
73
74
      TempA = DsData(1) And 1
75
      If TempA = 1 Then Decr DsData(1)
76
      TempA = Makeint(DsData(1) , DsData(2))
77
      TempA = TempA * 50
78
      TempA = TempA - 25
79
      TempB = DsData(8) - DsData(7)
80
      TempB = TempB * 100
81
      TempB = TempB / DsData(8)
82
      TempA = TempA + TempB
83
      Currenttemp(ch) = TempA / 10
84
      glcd.0 = 1
85
      If Currenttemp(ch) > 999 then
86
         Currenttemp(ch) = 999
87
         Active.ch = 0
88
      else
89
         Active.ch = 1
90
      End If
91
   next
92
93
      glcd.2 = 1
94
95
96
End Sub

von sBronco (Gast)


Lesenswert?

zwischen DSRESET und DSREAD wartet er allerdings 8x 100ms lang und tut 
solang anderes

In der Main Loop steht der Teil so drin:
1
'###########  Sensor
2
      If cPoll >= tPoll then
3
         Set RED
4
         If flag.0 = 0 then
5
            tPoll = 8 : cPoll = 0 : Flag.0 = 1 : Call DSRESET
6
         else
7
            tPoll = 50 : cPoll = 0 : Flag.0 = 0 : Call DSREAD
8
            flag.7 = 1
9
         End If
10
         Reset RED
11
      End If
12
'###########

von Uwe H. (uwe1981)


Lesenswert?

Jörg Salzer schrieb:
> Warum nicht alle gleichzeitig?

Weil die Sensoren später austauschbar sein müssen OHNE 
Programmierer-Eingriff. Leider wird die Reihenfolge und die Zuordnung 
der Sensoren anhand der Seriennummer gesteuert. Wenn ich also aus dem 
bestehenden System einen Sensor tausche, ändert sich bedingt durch die 
neue Seriennummer automatisch die Reihenfolge und somit auch die 
Zuordnung der Variablen, was dann den Effekt hat, das Temp1 plötzlich 
bei Temp2 angezeigt wird, etc. Man muss also erst die Adresse des 
Sensors auslesen und das Programm entsprechend updaten oder dem Sensor 
eine Zuordnung ins Register sschreiben, um seinen Platz in der Reihe zu 
bestimmen. Sprich: Programmierereingriff. Wenn die Sensoren hingegen 
autonom auf eigenen Kanälen liegen, spielt das keine Rolle weil die 
Reihenfolge durch das Ansprechen der Kanäle festgelegt ist und nicht 
durch die Seriennummer.



sBronco

Ich bin noch Anfänger, so ganz blick ich noch nicht durch. Hast Du 
mehrere Ports als 1wire deklariert oder switcht Du die "Config 1wire" im 
Ablauf von Port zu Port?

von sBronco (Gast)


Lesenswert?

ohne deklaration, nur mit den geposteten Befehlen.


Der Grund für 6 verschiedene Pins war;
 wenn das Teil mal verbaut ist,
welcher Sensor gehört jetzt zu welchem Kanal?
Wenn mal einer Defekt ist, wie wird neu zugewiesen?

Ich hab mir dafür eine Routine geschrieben, die neue Sensoren sucht und 
fragt wo sie hingehören, war alles viel zu kompliziert und umständlich.
So ist absolut klar wo was dazugehört.

von sBronco (Gast)


Lesenswert?

Nachtrag:

Mein Gerät regelt die Lüfter in meinem PC, dh. der muß Multitasking
machen, egal welche Eingaben ich mach oder auf welcher Seite der Anzeige
ich bin, der Regelt immer weiter, das waren mir irgendwann zu viele
Steuerflags abzufragen, um im Programmablauf wieder an die Stelle zu 
kommen
an der ich meine Eingaben machen muß.

von Uwe H. (uwe1981)


Angehängte Dateien:

Lesenswert?

sBronco schrieb:
> ohne deklaration, nur mit den geposteten Befehlen.
>
>
> Der Grund für 6 verschiedene Pins war;
>  wenn das Teil mal verbaut ist,
> welcher Sensor gehört jetzt zu welchem Kanal?
> Wenn mal einer Defekt ist, wie wird neu zugewiesen?
>
> Ich hab mir dafür eine Routine geschrieben, die neue Sensoren sucht und
> fragt wo sie hingehören, war alles viel zu kompliziert und umständlich.
> So ist absolut klar wo was dazugehört.


So, hier sind meine fertigen 1wire-Multiplex-Routinen (haaaa, wie das 
klingt :-))

Beide Routinen getestet, funktioniert einwandfrei und lässt sich 
beliebig erweitern. Wer Interesse hat, da oben sind die Quellcodes. 
Danke für den Tipp sBronco, das war die Lösung, die ich gesucht habe.

Uwe

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.