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
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
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 |
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 | '########### |
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?
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.
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ß.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.